‘Weather Typing’のエントリ

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終了コードで囲むという処理。一応テストはしたけどあらゆるパターンで大丈夫なのか自信がない。

tomoemonさんがまとめているタイピングの同人誌。当選てことでいいんですかね。タイピングソフト作者インタビューというコーナーがあって,私も少し協力させて頂いた。

インタビュアーの方が技術者の方ということで,入力方式の実装の難しさとか,いろいろ深い話をさせてもらった。没になってなければウェザタイのマニアックな話が載っているかも。他にも興味深い記事がたくさんありそうで,冬コミが楽しみですね。

タイピングスレが面白い流れに。ちなみにウェザタイはWeather Typing開発裏によると,0から作って基本的なところまでが1週間,対戦含めて完成まで1ヶ月だったっぽい。

あと入力不能時間に関しては,よくある質問にある通り,ハンデを-9にするとなくなる。リズムが乱される人はその設定でプレイするといいかも。

Androidウェザタイのコメントで「2メートル」のひらがな文がカタカナになっていて変換しないと打てないというのが挙がっている。

あとAndroid Marketには落ちたときのログが表示されるのだが,こっちもいくつか挙がっている。この辺を直して一度バージョンアップするかも。

掲示板に発言したが,Android版ランキングの一部が文字化けしている。とりいそぎサーバ側で対応。あまりテストできていないので今週末にもう少しテストする予定。次のAndroid版ではクライアント側で対策するかも。

原因は,Javaの「URLEncoder.encode(s, “ISO-2022-JP”);」が,日本語とASCII文字列が混じっていた場合,JISの終了コードを途中の切り替わり部分で生成せず,最後にしか生成しないため。この文字列を送られたPerlのサーバが途中のASCII部分をJISにみなしてしまい,文字化けする。どうもJavaのバグのような気がする。

Android版ウェザタイは少しずつダウンロード数が増えている。シャドールームさんで紹介してもらいましたが,宣伝しないとAndroidのアプリケーションは数が多すぎて埋もれてしまいますね。

ちらほらランキングに登録して下さっている方もいてありがたい。30問に設定しないと得点がのびないのは気付いてもらえているんだろうか。設定には書いてあるけど,やっぱりQ and Aか何かを公開した方がいいかなあ。


Android Marketのひみつ

  • Android Marketは「公開」ボタンを押すと即Marketで公開される。ということはGoogleの中の人によるチェックは全くないということですね。
  • Marketに登録するとダウンロード数とアクティブインストール数が見えるようになる。が,更新される時間も頻度も不明。1日1回くらい? そしてダウンロード数よりアクティブインストール数の方が多いのは何故?
  • Androidの作者登録をすると,OS入れ替え可能な開発者用のAndroid実機が買えるようになる。どこから買うのか不思議だったけどこういう仕組みか。

Weather Typing for Android Ver1.0を公開。Android Marketでも「typing」で検索すると出てくる。ダウンロード数やインストールしている人の数とかも分かるようになっているようなのでしばらく様子を見てみよう。

Androidウェザタイ統合テスト中。テスト項目は130件作成して120件消化。累計バグ出し目標30件に対して25件修正完了。来月中旬くらいにはクレジットカードが来るのでそこでAndroidマーケットに登録する予定。

AndroidウェザタイはIMEを使用するので,少なくとも有名どころのIMEでテストする必要がある。ということで周りの人に頼んでNEC端末のATOK,SHARP端末のiWnn,XperiaのPOBox,フリーのOpenWnn,simejiを試した。結果はどのIMEでもOKぽい。記号とか入るともしかしたら打てなくなる機種があるかも・・・という感じではあるけど。

それとは別に,e-Token氏のXperiaはarcではないAndroid2.1だったのだが,矩形描画が塗りつぶされない。エミュレータで2.1にしてみても再現する。結局Style.FILL_AND_STROKEでは塗りつぶされなくてStyle.FILLにしたら塗りつぶされた。2.1以前ではサポートされてないってことなんだろうか。

テストプレイ+バグ修正メモ

  • アプリケーションをバックグラウンドにしたときにスレッドを停止させるようにする。電池消耗の回避。
  • Androidでは30問は長いのでデフォルトを10にして設定可能にする。ぱじ氏の指摘
  • 入力方法を設定できるようにする。けーさく氏の指摘。
  • IME前提にしてるので基本的にミス入力を判定できない。何か方法はないかな。
  • 自分のAndroid入力スキルではスピード60くらい。プロ?の人は5倍くらい入力できたとしても300くらいか。ミス入力もほぼないので実質100種類くらいしか得点のバリエーションがないことになる。何か考えないと。
  • Bluetoothはプレイはできるけどランキング参加不可のような形にする予定。ハードウェアキーボードは判定不可能なので今のところ入力禁止にしてるけどここもランキング参加不可にできないか。
  • IMEの方式はFix。基本IMEを使うが,1問打ち切るごとに入力中の文字列を消すことで学習履歴が汚れるのを回避するようにした。

Androidマーケットに登録しようとして意外なところでつまる。VisaかMasterカードが必要なのか。.comドメインはなんとかなったけどこれは無理そう。急いでクレジットカード作らねば。

ひととおりAndroidウェザタイの実装は完了。ランキングにも登録してみた。

あとはAndroid使いの人にテストプレイしてもらいつつバグをとっていくか。

Android開発。タイトル→ワード選択→30問打つ→結果表示の一覧の流れはできるようになった。が,いくつか懸案が。

今考えている方式は,IMEを使ってひらがなを打ち込むという仕様。しかし,これで何度もプレイしてるとIMEにひらがなの学習結果が大量に作られてしまう。IMEの学習を一時的にオフにする方法もなさそうだし,どうするかなあ。漢字打ちにすればある程度解決するだろうけど,Android以外との対戦とか混合Webランキングが意味なくなっちゃう。

ATOKだと「・」が打てない。他にもIMEによっては打てない文字がありそうなので調査が必要。

# と思ったらキーボードの日本語のモード「/」を打つと「・」になるっぽい。

ゲームアプリはみんなそうなんだろうけど,常に30FPSくらいで動いているので電池の減りが早そう。特にホームボタンを押してバックグラウンドにいった場合,そのまま気付かないと電池が0に,なんてこともあるかも。

denasu.com@VPSなかなか調子が良い。どう考えても自宅サーバよりコストパフォーマンスがいい。仮想サーバなのでもっと重いかと思ってたけど,SSHでの接続は全く重くないし,Webサーバのレスポンスも悪くない。掲示板とランキングも移行しようかな。


Android開発。ウェザタイのコア部分の移植はだいたい終わった。リプレイとかCPU戦とかもめんどくさいから全部移植してみたけど,Ver1では動かないようにしておくか。それでも対戦については通信フレームワークをDirectPlayに頼っていたので,完全に作り直しになる。ゆっくり対応していきますかね。

画面はとりあえず今の状態を実機で撮ったもの。画面が狭くて苦労する。

20110503

入力方式は完全にはやりたいことを実現するのは難しそう。自作IMEは特許問題があるので避けるとして,IMEを使う方法は内蔵キーボードは防げそうだがbluetoothは防げない。いろいろなIMEを試してみたがIMEによって予測変換が出たり出なかったり。ネットランキングやるのに必要な公平性を確保するのが困難。てなわけでネットランキングはなんとなくでやるしかないか。

開発自体はとりあえずワードを選択するところまでできた。WindowsとAndroidの考え方の違いからUIを作り直しているので時間がかかる。

そういえばJavaのパッケージ名をどうするか。Javaはパッケージ名をドメイン名にするのだが,みんな真面目にドメインとってるのかなあ。以前ぱじ氏と取っていたドメイン名を復活させようかな。


Android開発で久々にEclipseを触っているのだが,Visual Studioで便利な部分が結構入っている。AndroidもWPFに近いし。どっちがどっちを取り込んでいるのか,いろいろ追求していくと似通ってくるのか,興味深い。

さらに調べていくと特開2009-266236でアップルからフリック入力に関する特許が出願(未請求)となっている。2009年4月出願てことはあと1年待ってから一気に訴えていく作戦なのだろうか。どっちみちhanabi入力が拒絶されているから請求しても成立しないだろうけど。Weather Typingフリック版は1年後とかじゃ遅いよねえ。

# ちなみに特許専門家ではないのであまり本気にしないで下さい。

結局IMEを使う方法はいろんな問題点があり,解決は難しい。ここはウェザタイらしく自作IMEの可能性を調べる。自作IMEはなんとかなるとしても1つ問題が。フリック入力って特許取られてるんじゃない? ということで調べてみると,知らぬいさんのページとNewton アロハ通信さんに詳しく書いてある。これによると原型の特許→Hanabi→iPhone→Androidと移っていて,結局のところグレーゾーンっぽい。でも普通にいろんなソフトで使われているところを見ると決定的な特許はないってことなのかなあ。Appleが特許取得してたらAndroidには許可しなさそうなイメージがあるし。タイピングソフトでQwerty+携帯キーボードのみだと魅力半減ですよね。

いろいろ技術的な課題を調査。課題1としてAndroidでタイピングソフトを作るとしたら基本的にIMEを使うことになる。そうすると入力確定とか変換中の文字列が表示されるとかいろいろな問題が発生する。IMEによって動作違うし。IMEを自作すれば解決だけどさすがにそこまでは。

課題2として,外付けキーボードの存在。フリック入力と外付けキーボードではどうしても速度が違うので分けるか,最低限禁止としたいところ。いろいろ調査したところちゃんと見分ける方法はなさそう。実際Bluetoothのキーボードを付けたり外したりしても通知はこない。

AndroidのOSのソースを見つつもう少し調査してみるか。

Androidウェザタイを目指して調査。まずは市場調査ということでAndroidタイピングソフトを試してみる。が,比べるほど多くは公開されてない。公開されているのもテキストボックスに入力するタイプなのでウェザタイとはちょっとイメージが違う。

入力について・・・ソフトウェアキーボードから直接入力は難しいのか,ってことで調べてみると,エディタ用のインターフェースで何とかなりそう。対戦について・・・まずは対戦なしのネットランキングのみで作ってみて,次の段階でBluetooth対戦,そしてWiFi対戦+ロビーですかね。3G回戦での対戦も調べてみたけど,例えばDoCoMoのSPモードだとプライベートIPという噂だし,Androidだと一般ユーザ向けになるからロビー対戦は敷居が高い。

とりあえずそのままタイトル画面だけ作ってみた。

20100403

ぱじ氏が飽きたとのことなのでロビー第1サーバは終了。そろそろウェザタイロビーの役割も終わってきた感じだし第2サーバだけでいいかな。

シャドールームさんのところでいくつかタイピングゲームの複数入力の方法について話題が出ていたのでWeather Typingのやり方を少しだけ書いてみる。 Weather Tytpingの自動ローマ字入力はオートマトンを使っている。シャドールームさんで紹介されてたHow To Become A Typerさんが「Tsuikyo 2.0 – 鎚鏡弐」で書いているのと同じ方法ですかね。以下の絵は,いつかタイピングソフトの作り方ページを作るときのために作ったネタだけど,多分今後も作らないだろうし,丁度良いので載せてみる。 2010090401

図は「しゃ」という問題文があったときの例。まず「しゃ」という問題がきたら,あらかじめ上のようなオートマトンを作成しておく。作り方はなんでもいいけど「しゃ」と上のオートマトンをテーブルで用意しておいてもいい。で画面に表示する文字列を作るときは,現在の設定に従ってオートマトンを処理する。例えば「CよりはSを使う」「SHよりはSYを使う」「LYAやXYAは使わない」設定であればS→1→7→Eを通って「SHA」を表示する。次にゲーム中ユーザ入力がきた場合,設定と画面表示を更新しながらオートマトンを処理していく。例えば「CILYA」と入力したときは2へ行って「SよりはCを使う」設定に変更。3→5へ行って「LYAやXYAを使う」設定に変更。最後に9→Eへ行って完了。上の矢印以外の入力が来たらミス扱い。 上の例は「しゃ」だが,問題文が長くなったらオートマトンをつなげていくだけ。例えば「しゃしゃ」だったら上のを2個つなぐだけでOK。「ん」「っ」が入ってくるとだいぶややこしくなるが,基本的には上のやり方でやればいい感じの自動入力ができる。 なお,TODでは多分「SHよりはSYを使う」のような系統立てた入力設定ではなく「SHAよりはSYAを使う」「SHUよりはSYUを使う」みたいな細かい入力設定になっているっぽい。「ん」の扱いも変。Weather TypingはTODを超えることを目指して作っていたので,この辺はTODより改善できているはず。

掲示板のDirectPlay初期化の件。エラー処理を除くと以下のようなコードになっていて,Initializeで止まっていると思われる。多分DirectPlayを使用するゲームは全て動かないのだろう。Dumpを送ってもらえば何か分かるかも知れないが,何百MBとかだし,DirectPlayが原因と分かってMSに聞いたとしてももはやサポート外で答えてくれない気もする。

LogOut(_T("DirectPlay: 初期化開始"));

::CoCreateInstance(CLSID_DirectPlay8Peer, NULL, CLSCTX_INPROC_SERVER, IID_IDirectPlay8Peer, (LPVOID *)&m_pDirectPlay);

m_pDirectPlay->Initialize(this, MessageHandlerStatic, 0);

LogOut(_T("DirectPlay: 初期化完了"));

一応流し読みしているタイピングスレで出ていたのだが,Weather TypingでJISかなを選んでいると「ヵヶヮ」が打てないという話。全然気付かなかった・・・。でもかな入力の仕様的に直すのは無理なんじゃないのか。とりあえず他にないか探してみよう。

掲示板に挙がっているが,第1ロビーサーバが1時くらい,第2ロビーサーバが6時くらいに止まったようだ。第1ロビーサーバはプログラムがフリーズしていたっぽい。今まで見たことないケース。第2サーバは,管理人にメールを出してみたが,しばらくは止まってるかも。

ロビーサーバが12時くらいから24時くらいまで落ちていた。原因はPC電源断。ロビーは諸事情で自動起動にはなっていないので,PCは起動してもロビーは起動されない。

とりあえず第2ロビーサーバを使用できるので大丈夫かとは思う。って第2ロビーサーバって知られているのだろうか。ロビー起動時に,コンボボックスを開くとサーバが2つ出てくるので,1つ目が落ちていて入れない場合,2つ目のを使用してみて下さい。

WeatherTyping2.2.1を公開。プレイヤー名などで「[]」を使うと設定が壊れる件の修正のみ。特に困っていなければダウンロードの必要はありません。

掲示板に出ているバグ。iniファイル読み込みクラスがバグっていて,値の中に「[」「]」が存在するとセクション名だと思っておかしくなってしまう。なんて基本的な。ていっても10年くらい前から使ってるソースだし他にもいろいろなところで使われている気がする。今更こんなバグが見つかるのかぁ,という感じ。さくらの人(誰)まだ使ってたら直しておいて下さい。

Weather Typing 2.2公開。追加機能はほとんどなくて,現在分かっているバグをたくさん直したバージョンという感じ。

Weather Typing 2.2のプログラムテストが完了。あとはトータルテストが終われば公開可能。今公開している開発版でいろいろバグが見つかった。特に大きいのはWindows 2000とWindows XP SP2なしで動作しないことか。今回,IPv6対応のためにGetAddrInfoW関数を使ったのだが,Windows XP SP2以降とWindows Vistaでしか使えない。いっそWindows2000をサポート外にするかとも考えたが,さすがに厳しいので直しておいた。

掲示板に来ている,設定が読み込めないというのが気になるが…。

ロビーでSJIS以外の文字を使えるようにしていろんな文字が使われていたが,どうも変な文字が入るとGulimフォントなど(Vistaの場合)になってしまう。いろいろ実験してみると,VistaのWordPad(RichEdit 5.0)では,デフォルトのフォントをメイリオにしているとちゃんと変な文字もメイリオになるが,RichEdit 2.0だとGulimフォントなどになってしまってメイリオに変更してもフォントが変わらない。とりあえず致命的なわけでもないのでしばらくはこのままか。


ウェザタイのIPv6実験は成功。今のままでも,例えばVista-Vistaで対戦をするとIPv6アドレスで対戦ができる。これで通信部分を作り直す必要はなくなった。


ロビーに入り浸っていると,どうも対戦中に落ちる現象があるらしい。ちょっと調べてみて怪しい部分を修正。文字コードを変換するとき,変換前にいちいちsetlocaleして変換後にsetlocaleを戻していたのだが,そのあたりで落ちる。前のノートの時は起きてなかった気がするのでマルチコアで起きやすいのかも知れない。とりあえずsetlocaleはデフォルトでは全スレッドに効くので,プロセス起動時に行うようにしたら落ちなくなった。

Weather Typingの開発版をこっそり公開。経緯としては,掲示板に報告があがっている問題の対応が発端。掲示板に挙がっている問題は,NICOLAで高速打鍵が誤入力になってしまうというもので,右親指キーを使った入力から左親指キーを使った入力を高速に行うと,ミスになってしまう。これのせいでNICOLAでの入力が遅くなってしまう方も多いだろうということで急遽開発版を公開することにした。

注意点は以下の通り。

  • 公式版とは違いちゃんとしたテストはしていません。最悪の場合,スコア等が消えてしまう可能性があるので,必ず旧バージョンのWeatherTypingフォルダごとバックアップをとっておいてください。
  • 旧バージョンからバージョンアップする場合,旧バージョンのフォルダに新バージョンのファイルを上書きすることで,旧バージョンの設定を引き継ぎます。
  • 旧バージョンからバージョンアップする場合,既にその日のロビーチャットログがあれば,リネームしておいて下さい。(例:2008/6/8ならchat20080608.logをリネーム)リネームしない場合,バージョンアップした日のチャットログだけ文字化けします。

修正点は以下の通り。

  • ファイルオープンダイアログをXP/Vista標準のものに変更
  • アイコンを変更
  • 対戦開始時のプレイヤー情報表示画面で,IPアドレス表示部分にIPv6のアドレスも表示する
  • 右親指キーを使った入力から左親指キーを使った入力を高速に行うと,ミスになってしまうのを修正
  • スコアファイル名を変更した場合,スコアアップロードとロビーのレベル表示で正しいスコアファイルが使われないのを修正
  • CPU入力方式とPlayerの入力方式が同期しなくなる場合があるのを修正
  • 対戦の接続待ちの際,途中でエラーが発生しても待機し続けていたのをエラーメッセージを表示するように変更
  • ロビー。SJIS以外の文字を使えるようにする。但し旧バージョンのロビークライアントからは見えないので注意
  • ロビー。チャットのログファイルをUnicodeに変更

DirectPlayのヘルプを見ていると,どうもDirectPlayは9からIPv6をサポートしていることが判明。Weather Typingでも今のままでIpv6に対応できている。ような気がする。検証中。

ぱじさんのプロジェクトに対応して,ロビーサーバをほぼ作り直した。ユーザ関連をデータベースを使用するようにしたのと,永久部屋とかもろもろ。大分コードもすっきりした感じ。しばらくテストしたらウェザタイのロビーサーバを更新してみよう。