‘Weather Typing’のエントリ
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に対応できている。ような気がする。検証中。
プログラミング
Weather Typing
コメント・共有する
ロビーサーバ復旧完了。
Silverlight。TextBoxのスクロールできないのかな,と調べてみた結果,ScrollView ElementにTextBox Elementを入れればいいことが分かった。これにVerticalScrollBarVisibility="Auto",ScrollView.ScrollToVerticalOffsetを組み合わせれば一通りのことができる感じ。
プログラミング
Silverlight, Weather Typing
コメント・共有する
Silverlightの実験として,ロビークライアントを作ってみる。Silverlight 2.0からは日本語入力とSocket通信がサポートされたので,なんとなくうまくいった。でも使用できるポートが4502-4532に制限されているので,そのままではウェザタイのロビーサーバには接続できない。まあSilverlightでネット対戦ゲームは作れそうってことで。
以下画面キャプチャ。IEの中でロビークライアントが動いている。ホントはぱじさんのFlashクライアントと同時接続して,JavaのサーバにC++/Flash/Silverlightクライアントから同時利用,というわけのわからない画面が欲しかったんだけどとりあえずここまで。

Silverlightの開発環境があまりに混沌としているのでメモ。以下を使えばSilverlight 2.0開発,実行が可能(必須ではないが)。
プログラミング
Silverlight, Weather Typing
コメント・共有する
だいぶ前からウェザタイの通信機能を再設計している。なんせウェザタイが使っているDirect Playは廃止が決まってるしIPv6対応予定もないし。ということで,どうせ互換性がなくなるならリプレイの分割とか途中ワード切り替えとか考えているのだが,いったいいつになるのか。
まあそれはおいておいて本題。P2Pのネット対戦の方式を自分で検討していると,今まで不思議だったDirect Playの挙動がよく分かる。今はもうないようだが,数年前,むなしいさんのウェザタイページに,私も知らないウェザタイの挙動が書いてあった。例えば,プライベートIPアドレスの人は1人なら混じっててもOKとかプライベートIPアドレスの人は2番目に入らないとダメ,とか。当時は理由が分からなかったが,今なら何となく分かる。
プログラミング
Weather Typing
コメント・共有する
昨日書いていたロビーから落とされる現象について。どうもファイルの入出力に時間がかかっていることが分かり,その辺を改善して,しばらく様子見。
様子見がてら,久々にロビーに入り浸ってみる。TOD2(サ・タイピング・オブ・ザ・デッド2)体験版の話題が多いのだが,スペックが足りない人が続出しているっぽい。多分ゲーマーにとっては当たり前のスペックなんだろうし,SEGAも普通のゲームと同じ感覚で作ってるんだと思うが,TOD2に関してはタイピング練習が目的の一般的なユーザも買うわけで,そこにずれが生じそう。製品版はどうなのだろう。
その他既にいろんなところで言われていると思うが,箇条書き。
- Loadingが長い。家のノート(Core2 Duo 2GHz/NVIDIA GeForce 7950 GTX 512MB)だと37秒。ゲームが始まってしまえば快適なのだが,ドリルが一回終わる度にLoadingが必要なのでめんどくさい。
- ドリルの途中キャンセルができない
- 他のノート(Core2 Duo 1GHz/945GMS Express)だとカクカク。まあオンボードだからそれでもいいんだが,スペックが遅いとゲーム内時間も遅くなって,とんでもなくいい結果が出る。これだとネット偏差値とかとっても意味ない気が。
プログラミング, ゲーム
Weather Typing
コメント・共有する
ロビー。1年くらい前から出ている,ロビーから落とされる現象を調査しているが,未だ原因分からず。とりあえずここにコードを載せてみる。いろいろ省略してるけど,イメージ的にはこんな感じ。ロビーのユーザ名とパスワードを管理するクラス。
public class LobbyTable
{
Map _users = new HashMap();
public LobbyTable()
{
// ファイルからユーザ名とパスワードを読み込んで_usersを初期化。
// 実装は省略
load();
}
public synchronized boolean login(String name, String password)
{
if(_users.get(name) == null)
{
_users.put(name, password);
// ファイルにユーザ名とパスワードを書き込む
// 実装は省略
save();
}
else
{
if(password.equals((String)_users.get(name)))
{
return true;
}
else
{
return false;
}
}
}
public synchronized void changePassword(String name, String password)
{
_users.put(name, password);
// ファイルにユーザ名とパスワードを書き込む
// 実装は省略
save();
}
}
で,発生するエラーが以下。
java.lang.NullPointerException
at Lobby.LobbyTable.changePassword (LobbyTable.java:91)
…
HashMap.putの引数は2つともNULL可なのでnameとpasswordは関係ない。実際デバッグコードを入れてもNULLにはなっていない。java.util.HashMapのソースコードを見ても特にNullPointerExceptionが発生しそうなところはない。残るのは_usersがNULLの可能性だけだが…。同期処理で失敗して,っていうのが考えられそうだが,それだとsynchronizedMapを使えば解決するのかもしれない。でも原因が分からないまま変えるのも気持ち悪い。
発生確率はかなり低め。ロビーが混んでるときに起こりやすいかも知れない。Javaのすごい人からのツッコミを期待して…。
プログラミング
Weather Typing
コメント・共有する
Weather TypingのFAQだが,ふと読んでみると変な箇所が。「まず DHCP でプライベートアドレスを自動設定にしている場合は,手動設定にして IP アドレスを固定します。とりあえず現在設定されている IP アドレスに設定しておけばよいと思います。」いや,そりゃまずいだろう。勝手にDHCPのIPアドレス振っちゃったら他のPCとかぶってしまう。
Weather Typingのマニュアルも結構前に作ったものなので今見返すと結構変なことが書いてある。ということで次バージョンで全面見直しが必要か。って次っていつになるんだろう。
プログラミング
Weather Typing
コメント・共有する
Weather TypingもWorld TesterもせっかくUnicode化したんだし,ってことでロビークライアントを英語対応にしてみた。あとは…Weather Typing本体は英語化むずいけど,World Testerは英語化できるかな。
プログラミング
Weather Typing
コメント・共有する
CPU対戦の入力方式,まだおかしい。入力方式を同期するにしておいて,CPU対戦ページを一度も開かずにプレイヤーの入力方式を変更してOKを押すとCPUの入力方式が変わっていない。ver2.1.1でも同様。なんか,CPU同期機能は仕様が複雑になりすぎてどうにもならなくなってきてる気がする。いっそver2.1.1のときに互換性を切って入力方式同期なしで統一してしまった方がよかったのかも。まあちゃんとテストしろって話ですけど。
一応,プレイヤーの入力方式を変えた後CPUページを一度開けばOKという回避ができるので,対策版を出すのはもう少し後にしようかと思う。
そういえばver2.1から一部の文字列に日本語以外の文字が使えるようになったというのを,マニュアルに書き忘れていた。ちなみに使えるのはファイルのパスくらいで,プレイヤー名とかワードの中身とかロビーの発言とかはまだ。現ロビーでハングル文字とかを入れるとサーバから強制切断されてしまうので注意。
プログラミング
Weather Typing
コメント・共有する
Weather Typing 2.1.2を公開。変更点は以下の4点。
- プレイヤー名に全角で12文字入力できるようになっていたのを半角換算で12文字に修正
- ロビーからWeather Typingを起動した場合,ゲームを開始しても「対戦中」にならなくなっていたのを「対戦中」になるように修正
- CPU対戦の入力方式をユーザに同期させないようにし,CPUの入力方式を変更し,ルールタブ,CPU対戦タブの順に移動するとCPUの入力方式が元に戻っていたのを,戻らないように修正
- ロビー,発言ボックスを縦に少しだけ広げる
現在Unicode化の第2段階とかコモンダイアログとアイコンのVista化とかしているのだが,安定していないので今回の修正版には入っていない。並行開発はなかなかめんどくさい。
ロビーで宣伝していたら,プレイヤー名についてつっこみが入ったので補足。ver2.1のときから,プレイヤー名の最大長がいわゆる半角12文字じゃなくていわゆる全角12文字になっていた。つまり全て全角で入力すると6文字長く入力できたことになる。これだと画面からはみ出てしまうので,今回のバージョンで以前の仕様に近い形に戻した。
で,ロビーでつっこみが入ったのはロビーのハンドル。こっちも12文字使えるようになっていたのだが,今回の版ではあえて対策はしなかった。長くなっても特に実害はないため。
ぱじさんからWeather Typing Flashの第2弾が届いたので入れ替えておいた。
プログラミング
Weather Typing
コメント・共有する
久々にロビーに行ってみた。そこでいくつかバグ報告を受けたのでメモ。2番目は結構大きいので対策版を出す予定。
- CPU対戦の入力方式をユーザに同期させないようにし,CPUの入力方式を変更し,ルールタブ,CPU対戦タブの順に移動するとCPUの入力方式が元に戻っている
- ロビーからWeather Typingを起動した場合,ゲームを開始しても「対戦中」にならない
プログラミング
Weather Typing
コメント・共有する
Weather Typingのテスト項目を消化しているのだが,いくつかバグを発見。元々あったバグもあるけど。そのうちの1件はなかなか興味深いのでメモ。
例えば以下のコードがあったとする。"abcあ"はSJISなら半角5文字なので6文字書式に入る。
printf("%-6s", "abcあ")
しかし,これを何も考えずにUnicode化すると
wprintf(L"%-6s", L"abcあ")
L"abcあ"は(多分)8文字分になるので6文字書式からオーバーしてしまう。…という記述はMSDNには見つからなかったんだけど,実験上そんな感じになっているっぽい。結局桁がずれることになる。
解決策は…どうやるんだろう。結局文字列引数を1個ずつ分けて描画するみたいな非効率な方法にしてしまった。
プログラミング
Weather Typing
コメント・共有する
すっかり忘れていたのだが,LobbyのPocketPC版をWeather Typing 2.1に入れなければならない。でVisual Studio 2005でビルドしてみたのだが,.NET Compact Framework 2.0に対応させないとうまくビルドできない。てことで.NET Compact Framework 2.0を調べてみたら,前に作ったときに困ってたInvoke,Splitterがサポートされている模様。もう少し作り込んでみようか。
プログラミング
PocketPC, Weather Typing
コメント・共有する
Weather Typing 2.1とWorld Tester 1.2をゴールデンウィーク辺りにアップロード予定。Weather Typingの方は新機能はなし。最後に公開して以来内部的にいろいろ変えているのだが,新機能がないので公開はしないでいた。で,今回は一応Vista対応という大義名分があるのでこの辺りで公開しようか,てな流れ。World Testerは割といろいろ追加している。画面サイズ変更と効果音の追加が主なところか。
マニュアルもどうせならVista対応ということで画面キャプチャしていたのだが,普通にキャプチャすると背景が透けてしまったりで都合が悪い。まずはキャプチャソフトから作るか,と思ったら「Window Clipping」といういい感じのフリーソフトがあった。透明なウィンドウ枠をPNGの透過色で表現してくれるという高機能さがいい。
プログラミング
Weather Typing, World Tester
コメント・共有する
ウェザタイとWorld TesterのVista 64bit版ネイティブ対応をやっていた。World TesterについてはDirectX9対応すればネイティブ動作可能だった。ウェザタイについてはDirectMusicが64bit非対応なのでできなかった・・・って古いバージョンは未サポートとかではなく完全に使えないですか。そうですか・・・。音なしでも起動できるようにしないと。
ちなみに64bitネイティブ化する利点は・・・特にない。てか多分公開すらしない。
プログラミング
Weather Typing, World Tester
コメント・共有する
I・O DataからUSB2-PCADPGのVistaドライバが公開されていた。さらにVista x64版も公開されていたのでついでに入れてみる。これでx64でもある程度生活できるかも。やる意味があまりないけど。
新ノートが来てからWeather TypingとWorld TesterのVista対応,Visual Studio 2005対応,Unicode対応,64bit対応をやっている(つまり機能追加の全くないバージョンアップ)のだが,Vista対応はちゃんとやろうとすると難しい。問題は主に2つ。
1つ目はUAC。管理者権限でもProgram Filesなどが書き込み禁止になるというもの。MS推奨的にはユーザごとに異なるデータはAppDataに入れよ,とのことなんだろうが,フリーソフトとしてはアンインストールが面倒になるので辛い。市販ソフトは普通アンインストーラがあるのでMS推奨通りにやればいいんだろうけど,フリーソフトはたいていデスクトップとかドキュメントフォルダにダウンロードしてその場で展開,いらなかったらそのまま削除,といった手順になると思う。でも設定をAppDataに入れてしまうと,まずデータを消してからプログラムを削除になって面倒になる。結局今は中途半端な策として,プログラムがProgram Filesなどに入っていたら設定は書き込まない方針で実装中。つまりVistaに仮想化されて変な場所にファイルができたり,ファイルに書き込めなくて落ちるといったことだけはないようにする,と。インストーラのないフリーソフトのためのもっといい方法はないのかなあ。
2つ目はUIPI。アプリケーションごとに(というかカーネルオブジェクトごとに)権限が決められていて,自分より高い権限には手出しできないというもの。これに影響を受けるのは…ロビーの自動退席機能。ロビーを起動しておいて,例えば1分間マウス,キーボード操作がなかったら状態が「退席」になるという機能だが,UIPIによって,ロビーを起動中に管理者権限のアプリケーションで作業をしていると,マウス,キーボード操作をしていても「退席」になってしまう。対策するとしたらどうやるんだ。電子署名とManifestでいいようなことも書いてあったりするけど,フリーソフトで電子署名は無理っぽいし,マウスとキーボードドライバでも書くしかないのか。って64bitだとドライバにも電子署名必須だし。てことで現状こういう制限にするしかないと。
プログラミング
Weather Typing, World Tester
コメント・共有する
最近Vistaで休止状態やスリープから復帰するとブルースクリーンになっていた。カーネルメモリダンプをデバッグしてみてUSB関連ということは分かったので1つずつUSBデバイスを外していったら結局USBマウスが原因だったっぽい。このメーカーのUSBマウスなのかUSBマウス一般なのか分からないけど。
ウェザタイのUnicode化をやってみる。ライブラリとWorld TesterのUnicode化は既に終わっているのだが,ウェザタイは日本語をたくさん扱うのでかなり面倒。
MFCアプリケーションのデバッグをやっているのだが,以前はMFCのソースコードデバッグが行えたのだが,VC2005 SP1上ではアセンブリになってしまう。確か以前はMFCのソースの場所を聞いてきたのだが,VC2005 SP1ではPDBファイルに書いてあるパスしか読み込めないっぽい。XPのときはどうだったかなあ。
プログラミング
Weather Typing
コメント・共有する
Weather Typingの記録が反映されないという指摘をメールで頂いた。これは不正ツール対策で,特定条件を満たすと記録を反映しないようにするという内部仕様のためだが,質問がくるということは通常でも発生するということなので,次バージョンでは緩和するか,他の対策をとる方針。詳しくは「よくある質問」のところに記載したのでそちらを参照。
プログラミング
Weather Typing
コメント・共有する
結構前からランキングのCGIが頻繁に落ちていたのだが,原因判明。ランキングの一番下に,全記録を1ページで表示するリンクがあったのだが,それをクリックすると落ちる。多分処理に時間がかかってフリーズしたと思われたか,ページがでかくなりすぎたんだろう。なのでひとまずリンクを外しておいた。一応「表示数」を調整すれば1ページの表示数は調整可能なので,そちらで好きな数を入れて下さい。最大500件までに変更したのであんまりたくさん表示できないけど。
さて,ちゃんと対策するとしたらどうするのがいいんだろう。処理を速くするとかJavaにするとかはひとまず置いといて,HTTP+Perlでは一気に1ページ出力しないといけないし。CGIで206とか返してもいいのかな。
プログラミング
Weather Typing
コメント・共有する
かなり久々にタイピングの話。昔ウェザタイを作る前,mp3の歌詞を打つソフトでも作ろうかなぁ,とか考えた時期があった。その時はMP3打!を見つけたので諦めたわけだが,ちょっとイメージと違う(変換じゃなくてローマ字を打つのが欲しかった)ので,誰か作ってくれないかなあ,とか思っていた。で,あれから数年,ちょっと探してみたところではType-Rがなかなかいい感じ。歌詞ファイルのフォーマットがおかしいと落ちるのが難点だけど。
プログラミング
Weather Typing
コメント・共有する