‘Weather Typing’のエントリ

Analog Book Readerのユーザさんから英文メールが。縦横が入れ替わっているドキュメントを読むことがあって,その場合に読みづらいという要望。電子書籍リーダーとして足りない機能の一つなので,次のバージョンで対応する予定。簡単かと思ったが,ブックマークとかマーカーとかも回転させないといけないので結構いろんなところを直さないといけない。

Weather Typingの画面デザインを進めている。プログラミングと違ってどこまでいっても終わりがないのでここが一番時間がかかる。最初にWeather Typingを作ったときはUI知識もデザイン知識もなかったし、DirectXで画面を作っていたので使いにくいところがたくさんある。ゲームを終わらせないと設定変えられないとか、その辺を洗い出して再設計しているのだが、進まない。

Weather Typing 3.0開発,とりあえずQwertyのシングルモードは打てるようになった。スマートフォン版をWindowsで使えるようになった感じ。ウィンドウを拡大縮小できるし,文字の拡大縮小もできる。

2014092801

というところで設定とか対戦の実装を始めるのだが,出張でしばらく空いてしまいそうなので,その間にデザインを考えている。タイトル画面はこんな感じか? アイコン適当だけど。

2014092802

C#版Weather Typingを作る上でどうしても性能が出ない部分がある。キーボード入力部分と打鍵音再生。キーボード入力はWindows Messageでもいいけど,どうしても遅延が発生するのと,ツール対策上もっと低レイヤーが望ましい。打鍵音再生は普通に再生すると音飛びが発生しまくるし複数音同時再生ができない。

ということでC#でゲームを作るときに今は何を使うのか調べてみたところ,予想以上に混沌としていた。まず現行のWeather Typingで使っているDirectXをC#から使うManaged DirectXだが,.NET 4.0以降では使えない。そしてDirectXの後継XNAだが,別途ランタイムが必要で,既に廃止が決まっている。その後は・・・あれ,何もないのか。どうすればいいのさ。

てことでもうC#からP/InvokeでDirectXを呼び出しちゃうことにした。

最近The Gamification Revolutionという本を読んでいる。いろんなことにゲーム的な要素を取り入れることでモチベーションを高められるというもの。Twitterなんか,フォローア数とか,最近一般に使えるようになったTwitter AnalyticsのImpressionsとか,あからさまにゲーム性を出してる感がある。こういうのをフリーソフト作りのヒントにしたい。

Weather Typingはランキング,ロビーや大会などでライバルに勝つというのがモチベーションにつながるのは分かるけど,それ以上何かないかな。TOD2は成績評価してたり,タイプウェルはアチーブメント的なのを導入してるのか。打鍵数とか練習時間が記録されるとか,全配列で一定の点数を出すと何か嬉しいことがあるとか,パッと思いつくのはそんなところかな。

Analog Book Readerも開発中から何かゲーム要素を付けたいとは思っていて,読書時間を記録するようにしたんだけど,もっと積極的に読書を面白くする方法はないだろうか。本を配布しているサイトを運営しているなら,やりようはありそうなんだけどなあ。

Windows 7問題が解決したところで新しいWeather Typingを少し考えてみる。まずは今までの要望を整理。サミットで頂いた要望も追加しておいた。

Analog Book Readerは一般向けに作ったので機能をできるだけシンプルにしたけど,Weather Typingはコアなユーザ向けなので多少複雑でも機能性とカスタマイズ性を重視するのが基本路線。といっても今のままのUIでは使いづらいのでUIは考えないといけない。

少し前からiOS/Android版をWindowsに逆移植し始めていて,C#+WPFではシングルプレイはある程度できた。ここにiOS/Android版では付けなかった対戦機能とカスタマイズ機能を付けると基本は完成するはず。

それにしてもC#+WPFの開発効率はすごい。今までJava/Objective Cで作っていたUIをXAMLに移植するとコードが数分の1くらいになるイメージ。今までコードで表示していたユーザ情報やランキング情報も,Binding使えばほぼ何も書かなくていい。画面回転でレイアウトを変えていた部分もかなりめんどうなコードだったが,XAMLなら何もしなくても可変サイズに対応できる。ここまで楽ならより凝ったUIにするのも考える余裕が出る。

Weather Typing 2.2.3を公開しました。といってもWindows 7のフリーズを直しただけなので,今困っていない方はアップデート不要です。なお,Windows XPはサポート対象からは外しましたが,テストはしているので動かしてOKです。

前回原因は書いたので,解決策を書いておく。結局IMEとDirectPlayの初期化の競合は避けられず,IMEはウィンドウが作成されたときに自動でロードされてしまうので,DirectPlayの初期化をウィンドウが作成される前にやることにした。理論上はこれで競合する可能性はなくなったはず。

5年ぶりにバージョンアップしたけど,当時のビルド環境を揃えるのが大変だった。今のVisual Studio 2013でビルドしてもいいけど,XP SP2で動かなくなるし,新しい環境でのテストもしていないので,Visual Studio 2008を新たにインストールしたり,XPやVistaのテスト環境を作ったり,ついでにダイアログのバージョンとかReadmeとかマニュアルとか,結構めんどう。早いところC#版に移行しよう。

というわけで,協力して頂いた皆様ありがとうございました。

サミットに参加して一番言われたのがWindows 7で動かないという話。その中で調査に協力してくれるという方もいて,早速調査したところ,直接の原因は判明。Weather Typingの中で暫定対策したものを置いてみた。今までWindows 7で動かなかった方で,これでも動かない方がいたら教えて欲しい。

調査依頼は,Weather Typingがフリーズしたときのダンプファイルを取って送ってもらうというもの。掲示板だと相手の技術レベルが分からないのと,ダンプファイルが100MBとかになって送ってもらう手段がなかったのでなかなか依頼できなかった。今回は直接困っている方に会って見せて頂いたことで,多少複雑な操作でもやってもらえそうだったのと,WordPressを導入したことでアップロード手段も確保できたことで依頼ができた。

原因だが,WeatherTyping側はDirectPlayの初期化(CoCreateInstance CLSID_DirectPlay8Peer)で、dpnet.dllLoadLibrary中、cryptsp.dll!_CryptAcquireContextWで止まっていた。

さらに他のスレッドを見ると、IME14\IMJPAPI.DLLで、rsaenh.dllLoadLibrary中、cryptsp.dll!_CryptAcquireContextWで止まっていた。

両方とも最終的には_ZwWaitForSingleObjectで止まっていたので、典型的なデッドロック。

IME14はOffice 2010のIME。てことでOffice 2010のIMEを入れていて、デフォルトにした状態でWeather Typingを起動するとDirectPlayと初期化が競合してフリーズする。

どうやって解決しようか。とりあえず暫定版ではDirectPlayの初期化を遅らせただけなんだが、それでは根本的解決ではないのでいい方法を考え中。

第6回タイピングサミット,二日目に参加してきました。Weather Typing作者として貴重な時間になったのはもちろん,個人としても楽しい時間を過ごせました。参加者の皆さん,運営の皆さん,ありがとうございました。

全体

タイピングサミットは,タイピングが好きな人の集まりで,ルーツをたどっていくとかなり歴史があるオフ会。今までオフ会は作者が目立ちすぎるのもよくないと思って出てなかったのだが,今回は主催者のPocariさんから,ユーザと作者の交流もテーマとのことを伺って,参加することにした。当日まで秘密にしましょうということにしたため,日記に書くのを我慢していたが,ようやく書ける。

オフ会自体が初めてだったのだが,参加者のうち結構な人はTODエキスパートだったり,初期からのウェザタイユーザだったり,最近だとタイピング本で知った方だったりで,しかも相手も相手で私のことを知っているという,不思議な感覚だった。作者ということで優遇されすぎ感も多少あったが,そこは利用させてもらって,いろんな方に話をさせて頂いた。

イベントとしては「WeatherTyping(団体戦)」とその後の「作者を囲む会」に参加して力尽きつつ,その後のTOD団体戦と懇親会まで過ごさせてもらった。

WeatherTyping(団体戦)

ここは私が書かなくてもよさそうかな。「チーム開発者」の下っ端として参加したが,最近練習してないのがたたって歯が立たず。0点じゃなくてよかった。チートコードを実装,じゃなくてもっと練習しておくべきだった。

団体戦ルールは,全員をレベル順に並べてチームに割り振り,毎回の対戦相手は同じレベル同士で対戦できるようにするという仕組み。毎回接戦になって見応えがあった。ウェザタイはレベルがちょっと違うと一方的な試合になることが多いが,ルール次第でこれだけ面白くできるとは。

作者を囲む会

団体戦の後,作者を中心にユーザが取り囲んで,好きなことを言う会が始まる。こんなことやってもらえるフリーソフトの作者なんてどれだけいるんだろう。というところで,リクエストを勝手にランク付けして10位まで紹介! 後で全部要望一覧に入れます。

  1. Windows 7で起動しない人がたくさんいるよ
  2. ロビーでレベル高い人と対戦するのは怖いけど観戦ならしてみたい
  3. シングルプレーの癖でESCを押すとマルチプレーのゲームが中断して微妙な雰囲気になるのをなんとかして欲しい
  4. Mac OSに対応して欲しい
  5. 高い解像度に対応して欲しい。それなら長いワードも使えるし。
  6. IPアドレスなんて難しいこと言わずに誰でも簡単に対戦できるようにして欲しい
  7. 対戦中にワードやルールを変えたい
  8. レベル分けがおおざっぱすぎる。力量差を測ったり達成感のためにも細かくして欲しい
  9. スマートフォン版は運ゲーすぎる
  10. 英語版が欲しい

一つ一つ見ていくといろいろあるわけだが,実際のところ,昔要望されたことがあって私が優先度を低くしていたものが半分くらいか。でも作者が思う必要な機能とユーザが思う必要な機能はずれていて,こういう機会があるとそのずれが分かるだけでも貴重。あとは,ここには書けないけど,そんな使い方してるの? みたいな話が聞けたりして。

でも,今回の参加で一番インパクトがあったのは,iOSとAndroid版タイトルのWeather Typingのスペルが間違っていたこと。気になる人はダウンロードして見てみましょう。すぐ直しちゃうので今のうちです。Yさん,ご報告感謝です。

総括

ウェザタイを作って12年,最近は,もういい加減作りが古くなっているし,新しいタイピングソフトに譲っていければいいんじゃないかと考えていた。

でも,2年ほど前,同人本「タイピング Professionals」に少し協力させて頂いて,そして今回,大会であんなに盛り上がっているのを間近で見ることができた。また,最近でもロビーに人が増え始めてるよ,とかコアな人達が満足できるソフトが未だなかったりという状況も聞くことができた。もう,やらざるをえないですよね。

実はタイピング本のときに新しいウェザタイを作り始めていたのだが,自分がタイピングから離れていたためどんなものにすればいいのかよく分からず,途中で止まっていた。今回の参加でいろいろなヒントをもらうことができて,開発スピードもあがるはず。ウェザタイとしてまだできることをやっていくので,よろしくお願いします。

開発状況は今後の日記で書いていきます。

何か急に「タイピング」というキーワードでアクセスしに来る人が増えた。と思って検索してみたら,Yahoo!で「タイピング」3番目だった。「物理シミュレータ」もいつの間にか2番目になっていた。ページランクが高くなったわけでもないのに何でだろう。「World Tester」はVectorの科学カテゴリトップだったり,紹介サイトからのリンク元からも結構アクセスがあって地味にページビューがある。

紹介するのが遅れたけど,タイピングサミットでも「Weather Typing」大会は今でも開かれていてとてもありがたい。

という感じで,新しく公開したソフトに注力している間も以前の作品は使われていて,メンテしたり機能追加したりしたいのだが,時間が足りない。何か面白いことを思いつけばやるかも,くらいになっている。

iPod touchにiOS7をインストール。Weather Typing for iOSは,アイコンが暗すぎる以外は問題なし。

Xcodeのバージョンを上げてからWeather TypingをビルドしてiOSに入れてみたが,設定とかのUIがiOS7っぽく変わる。タイトルバーが上に出てくるし,アップデートするなら少し直さないと。

2013092101

Weather TypingのランキングをREST Webサービスで表示できた。これからデザインをしないと。今回は開発環境にEclipseとMaven, サーバにApache, Tomcat,mySQL,サーバフレームワークにServlet, JSP, Axis2,Hibernate,クライアントフレームワークにStruts2とjQueryを使ってるんだけど,使うテクノロジ多すぎ。

Weather Typing for Android version1.2をアップロードした。Google Playからダウンロードしてください。

連休中はWeather Typing Androidの開発をしていた。iOSと同じ機能を実装完了。テストした後,Google Playにアップロードしよう。

12日に書いた,パスワードが違っていてランキング更新できない問題が解決した。原因はPerlのCrypt関数。パスワードを暗号化するのにPerlのCryptを使っているのだが,ソルトとして秒を使っている。しかし,この関数はソルトとして0,1,…,8,9を指定すると00,11,…,88,99を返すようだ。このため,認証をしようとするとソルトとして00~99を使ってしまい,パスワード間違いと判定する。

難しいのは,0,1,2,3,4,5秒と00,11,22,33,44,55秒の見分けがつかなくなっているところ。今回は,運良くDBの中にユーザ登録時の日時が入っていたので,なんとか見分けることができた。

この問題は多分2002年頃(Perl5にしたとき)から起こっていたはず。多分,新しく記録を登録する人は多いけど,記録を更新する人はそんなに多くないから今まで誰からも報告がなかったのではないかと思う。

Weather typing for iOSリリース。昨日の夜中にAppleからレビューが始まったというメールをもらって、3時間後にレビュー完了のメールが来た。はや。朝、リリース日を今日(US時間で昨日)に変更したら、App Storeに公開された。

Weather Typing for iOSのApp Storeでの公開をAppleに申請した。リジェクトされなければ数週間で公開されるはず。

Weather Typing for iOSのテストが完了した。11Kステップ書いて,テストケース344件,バグ摘出11件。明日Appleに申請しよう。

サポート掲示板をdenasu.comへ移した。これでついに正式にHi-HOからdenasu.comへ移転。メールアドレスも地味に変えておいた。Hi-HOで唯一残っているのはウェザタイのランキングサイトなんだけど,これも数週間の内にはdenasu.comへ引っ越す予定。ウェザタイ作るときにランキングサイトを引っ越せるように作っておいて本当によかった。

Weather Typing for iPhone。ようやくゲームができるようになった。でも完成まではまだまだ遠い。

2012111801

Weather TypingのAndroidからiPhoneへの移植作業を進める。iPhoneもMacも知識が少ないのでかなり進みが遅い。

3日間Macを使っていたのでWindowsを使うのに混乱する。スクロールさせようとすると逆になっちゃうし,Ctrl押そうとするとWindowsキー押しちゃうし。

ついにiPhone版Weather Typingの開発に着手。iPhone Game Development の本を買ったんだけど,既にWindowsのゲーム開発経験がある人にはすごく役立つ。本屋で日本の本もいくつか見てみたが,開発者アカウントの取り方とかxcodeの使い方とかAPIリファレンスばっかり。この本はゲームループの作り方とか2D/3Dのレンダリングの方法とか知りたいことが書いてあってよい感じ。

Azureを契約してみた。MSDN Premiumなので最小セットが無料で使える。1ヶ月750時間までなんだけど,1ヶ月に750時間以上はどうやっても使えないとかいう。とりあえずSilverlight版の作りかけWeaqther TypingをAzureに入れてみた。Weather Typing Cloud。タイトルだけなので選択しても何も起きません。ただこれだけだとレンタルサーバと同じなのであんまり意味はない。


Weather Typing英語版に向けてワード自動生成を考えているのだが,英語だと難しい。名詞の単数形と複数形とか,三単現とか,前半と後半の組合せで単語の形が変わってしまう。はっぱさんと話したところでは,変な文法が出てきてもネイティブは気にしないという結論に。その後けーさくと話したところ,文章じゃなくて形容詞+名詞ならそんなに変にはならないのではないかという結論に。確かに日本語版は文章ではなく形容詞と名詞の組合せにしてたんだ。てことでなんとかなるかも。


英語のdenasuページの充実も図らないと。

今月に入ってからウェザタイランキング上位に変動が。JISもQwertyでも上位が入れ替わっていますね。

でタイピングスレでもネタ的な扱いになっているけど,現2位の方の扱いはどうするのが正しいのか。一応私が不正記録認定をした記録は裏ランキングに載せることにしているんだけど,この記録の微妙さで3年間迷っている。一旦裏ランキングに載せておいて,コンタクトがあるまでそのままとかそういう対応をしますかね。裏ランキングの判断規準をもう少し整理してからかな。

Weather Typingランキングで過去のランキングを公開してみた。タイピング本の影響で少しでも過去が分かるような資料を公開しておこうかな,というところ。

過去に公開してたものだから大丈夫とは思いますが,勝手に公開するな,消しておいてくれ,みたいなのがあれば個別に対応します。

Weather Typing for Android Ver1.1をAndroid Marketで公開。まだ更新されてないっぽいけどそのうち更新・アップデート通知が行われるはず。修正点は以下の通り。

  • 打ち込むワードにカタカナや全角英数字が混じっていたのを修正
  • 「,」を「、」で打てるようにする
  • 30ワード未満の場合ランキングに問題数を表示するようにする
  • プレイヤー名を8文字まで許可する
  • UIの改善

個々の修正の詳細は昨日の日記を参照。ワード数の選択については,今日一日いろいろテストしていたけどどうしても過去との互換性でどうにもならなくて諦めた。その代わり,例えばワード10問設定にしてランキングに登録すると「Android 10ワード」のようにワード数が表示される。一応10ワード内で何位,みたいには見ることが可能。

Android版ウェザタイ1.1。たまっていた修正項目を一通り実装した。明日1日テストして問題なければAndroid Marketに流そう。修正項目は以下の通り。

  • ワード数の選択を廃止。代わりにbeginnerモード(5問固定)とexpertモード(30問固定)を選択できるようにする。beginnerでランキング登録した場合はbeginnerと表示されるので,beginnerランキングでもやり混みが可能。
  • 例外は全てcatchしてログを吐いていたのだが,不明な例外はcatchせずに潔く落とすようにする。ハンドルされていない例外はAndroid Marketから参照できることが分かったので,独自のログをはくよりこっちの方が調査しやすい。
  • アップロードダイアログのボタンがIMEウィンドウで隠れて微妙に使いづらいのを改善。
  • ワードのひらがな行に,カタカナと全角英数字が混じっていたのを修正。Android Marketのコメントから。
  • プレイヤー名が6文字しか入らないのを8文字まで許可。tomoemonさんのtwitterから。
  • 分かりにくい文言を改善。tomoemonさん,typezukiさんのtwitterからヒントをもらった。
  • 画面周りの変更。移植中のSilverlight版から逆輸入。

プレイヤー名について補足。文字数を増やした代わりに,スピード1000以上またはトータルポイント10万以上になると結果表示画面で文字列が切れる。レベル10以上の人は気を付けて下さい。

Windows PhoneとWindows 8(Metro)開発の練習にWeather Typing Silverlightをちょこちょこ実装。どうせ作り直しなら入力方式プラグインとかランキングでリプレイアップロードとかやりたいよね,的なことを考え出すとなかなか進まない。


Android版ウェザタイ,そろそろ修正したい項目がたまってきた。追加機能なくてもバージョンアップした方がいいのかな。

Denasu新年会。ぱじ氏にタイピング本を見せてみたが,反応薄。もはや脱出ゲームの人なのか。

とりえずインタビューのところだけは確認してもらったのだが,ロビーに関して「ぱじ氏が絶対必要と言ってきて」というのが「そうだっけ?」と反論。家に帰ってチャットのログを見てみた。以下2002/3/17のチャット抜粋。

モルタルコ の発言 : ウェザタイ大会を開くらしいですよ
パジャ の発言 : 参加しれ
モルタルコ の発言 : 掲示板によると20人ぐらいでやるとか
やらないとか
モルタルコ の発言 : 本当は我々が主催しないといけ
ないんだけどね
モルタルコ の発言 : ネットワーク対戦は初心者には敷居が
たかいらしいね
モルタルコ の発言 : ロビー欲しいね
パジャ の発言 : 欲しすぎ
パジャ の発言 : 全然告知しないである日いきなり
「ロビーできました」ってのがイカス

ウェザタイ大会ってのは当時むなしいさんがオンライン開催していた「WT大会」で,ロビーがあれば楽だったのに,という話。これを見るとどっちに責任があるのかは・・・?

タイピング本をだいたい読み終わった。第I部にウェザタイの初速に関しての分析があって,なるほどこのソフトはそういう性格のソフトなんだというのが今更分かったり,いろいろな発見があった。

あとは配列系も興味深い。ウェザタイとしては一通りの有名どころの配列をサポートして以来満足していて,新配列系は重視してなかった。でも,もし新しい配列が一定のユーザ数を獲得して要望が挙がってきたらウェザタイのポリシー的には正式対応するのかなあ,とか。サポートするかどうかの基準がすごく難しいし,いろんなバージョンがあってサポートしきれないとか考えないといけない点はいろいろあるよね。


この本と直接は関係ないけど,もはや連絡先はメールアドレスじゃなくてtwitterアカウントなんだなあ,ってのを実感。私もtwitterアカウントは持ってるけど,元々ぱじ氏と連絡とるためだったので最近放置している。今までDenasuサイトで告知してはいなかったけど,そろそろ公式アカウントとして有効に活用しますかね。とりあえず@Mortarcoです。使い方よく分からないし,日記とどう使い分けるのかが微妙だけど。

Android版Weather TypingのランキングをAndroidで見ると名前の最後が文字化けすることがある問題を修正。Android JavaのURLEncoderがバグっていた。以前1つ対策したのだが,もう1つバグがあった模様。

URLEncoder.encode(s, "ISO-2022-JP")

のようにUnicodeからJISコードに変換した場合,以下の2点がバグっている。

  • 全角半角が混在した場合,全角半角の切り替えポイントで「%1B%28%42」が入らない
  • 最後に「%1B%28%42」が入るべき箇所が「%1B」になってしまう

なんていい加減な。それともJISがそういう規格なのかなあ。クライアント側を直しても既にアップロードしている人はバージョンアップしないといけなくなってしまうので,サーバ側で対策。しかもAndroidのバグがいきなり直った場合でもうまく動作しないといけない。結局以下のPerlコードで対策した。

if(($value =~ /%1B%24%42/) && !($value =~ /%1B%28%42/))
{
    $value =~ s/%1B([^%])/$1/g;
    $value =~ s/%1B%24%42((%[A-Fa-f0-9][A-Fa-f0-9])+)
              /%1B%24%42$1%1B%28%42/g;
}

JISの開始コードがあって終了コードが1つもない場合,「%1B」が単独で存在したら消しておき,全角部分をJIS開始コードとJIS終了コードで囲むという処理。一応テストはしたけどあらゆるパターンで大丈夫なのか自信がない。