‘Weather Typing’のエントリ

ロビーサーバ復旧完了。


Silverlight。TextBoxのスクロールできないのかな,と調べてみた結果,ScrollView ElementにTextBox Elementを入れればいいことが分かった。これにVerticalScrollBarVisibility="Auto",ScrollView.ScrollToVerticalOffsetを組み合わせれば一通りのことができる感じ。

Silverlight版ロビーサーバをローカルではなくWebサーバ上に置いて実験してみた。でもロビーサーバに接続しようとするとAccessDeniedが返ってくる。Webで検索するとSilverlight 2 beta 1 and Socket Exception: Access Deniedというページに原因が書いてあった。どうもサーバのドメイン名の逆引きができないとダメらしい。まあIPアドレス指定すれば使えるから実験としてはいいか。Silverlightの正式版ではこの辺りの制限は緩くなるっぽいし,何か作って公開するまでには正式版が出てる,かなあ。


第1ロビーサーバが停止している間にロビーサーバの気になっていた箇所を修正している。Unicode正式対応とか英語化とかゲームごとにサーバを分離とか。なので第1サーバ自体が復旧してももうしばらく第2サーバをメインにしておくかも。

ロビーサーバ停止中。HDDが死んだらしい。OS入れ替えて設定して,ロビー動かして,になるので復旧はしばらく先。

Silverlightの実験として,ロビークライアントを作ってみる。Silverlight 2.0からは日本語入力とSocket通信がサポートされたので,なんとなくうまくいった。でも使用できるポートが4502-4532に制限されているので,そのままではウェザタイのロビーサーバには接続できない。まあSilverlightでネット対戦ゲームは作れそうってことで。

以下画面キャプチャ。IEの中でロビークライアントが動いている。ホントはぱじさんのFlashクライアントと同時接続して,JavaのサーバにC++/Flash/Silverlightクライアントから同時利用,というわけのわからない画面が欲しかったんだけどとりあえずここまで。

2008040601


Silverlightの開発環境があまりに混沌としているのでメモ。以下を使えばSilverlight 2.0開発,実行が可能(必須ではないが)。

だいぶ前からウェザタイの通信機能を再設計している。なんせウェザタイが使っているDirect Playは廃止が決まってるしIPv6対応予定もないし。ということで,どうせ互換性がなくなるならリプレイの分割とか途中ワード切り替えとか考えているのだが,いったいいつになるのか。

まあそれはおいておいて本題。P2Pのネット対戦の方式を自分で検討していると,今まで不思議だったDirect Playの挙動がよく分かる。今はもうないようだが,数年前,むなしいさんのウェザタイページに,私も知らないウェザタイの挙動が書いてあった。例えば,プライベートIPアドレスの人は1人なら混じっててもOKとかプライベートIPアドレスの人は2番目に入らないとダメ,とか。当時は理由が分からなかったが,今なら何となく分かる。

#簡単に今の憶測を書くと,4人対戦の場合,実は3人がホストになっていると思われる。というかP2Pの4人対戦だと,必然的に3人がポートを開かないと対戦ができないはず。で,DirectPlayの場合,2番目に入った人だけが本当のクライアント,つまり自分ではポートを開かず,他の人のポートにつなぎにいくだけ,になっているのだろう。つまりウェザタイのマニュアルとかFAQは少しウソが混じっているとも言えるわけだが,まあ今更ですよね。

昨日書いていたロビーから落とされる現象について。どうもファイルの入出力に時間がかかっていることが分かり,その辺を改善して,しばらく様子見。


様子見がてら,久々にロビーに入り浸ってみる。TOD2(サ・タイピング・オブ・ザ・デッド2)体験版の話題が多いのだが,スペックが足りない人が続出しているっぽい。多分ゲーマーにとっては当たり前のスペックなんだろうし,SEGAも普通のゲームと同じ感覚で作ってるんだと思うが,TOD2に関してはタイピング練習が目的の一般的なユーザも買うわけで,そこにずれが生じそう。製品版はどうなのだろう。

その他既にいろんなところで言われていると思うが,箇条書き。

  • Loadingが長い。家のノート(Core2 Duo 2GHz/NVIDIA GeForce 7950 GTX 512MB)だと37秒。ゲームが始まってしまえば快適なのだが,ドリルが一回終わる度にLoadingが必要なのでめんどくさい。
  • ドリルの途中キャンセルができない
  • 他のノート(Core2 Duo 1GHz/945GMS Express)だとカクカク。まあオンボードだからそれでもいいんだが,スペックが遅いとゲーム内時間も遅くなって,とんでもなくいい結果が出る。これだとネット偏差値とかとっても意味ない気が。

#その後製品版でAlt+F2でドリルキャンセルできるのを確認。体験版はどうだったかなあ。

ロビー。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のFAQだが,ふと読んでみると変な箇所が。「まず DHCP でプライベートアドレスを自動設定にしている場合は,手動設定にして IP アドレスを固定します。とりあえず現在設定されている IP アドレスに設定しておけばよいと思います。」いや,そりゃまずいだろう。勝手にDHCPのIPアドレス振っちゃったら他のPCとかぶってしまう。

Weather Typingのマニュアルも結構前に作ったものなので今見返すと結構変なことが書いてある。ということで次バージョンで全面見直しが必要か。って次っていつになるんだろう。

何故か夏休み。今月最初にロビーサーバをバージョンアップして様子を見ていたのだが、今日ロビーを覗いてみるとログインしにくくなった方がいる模様。それっぽい箇所を直しておいたのでしばらく様子見。

Weather TypingもWorld TesterもせっかくUnicode化したんだし,ってことでロビークライアントを英語対応にしてみた。あとは…Weather Typing本体は英語化むずいけど,World Testerは英語化できるかな。

CPU対戦の入力方式,まだおかしい。入力方式を同期するにしておいて,CPU対戦ページを一度も開かずにプレイヤーの入力方式を変更してOKを押すとCPUの入力方式が変わっていない。ver2.1.1でも同様。なんか,CPU同期機能は仕様が複雑になりすぎてどうにもならなくなってきてる気がする。いっそver2.1.1のときに互換性を切って入力方式同期なしで統一してしまった方がよかったのかも。まあちゃんとテストしろって話ですけど。

一応,プレイヤーの入力方式を変えた後CPUページを一度開けばOKという回避ができるので,対策版を出すのはもう少し後にしようかと思う。


そういえばver2.1から一部の文字列に日本語以外の文字が使えるようになったというのを,マニュアルに書き忘れていた。ちなみに使えるのはファイルのパスくらいで,プレイヤー名とかワードの中身とかロビーの発言とかはまだ。現ロビーでハングル文字とかを入れるとサーバから強制切断されてしまうので注意。

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弾が届いたので入れ替えておいた。

久々にロビーに行ってみた。そこでいくつかバグ報告を受けたのでメモ。2番目は結構大きいので対策版を出す予定。

  • CPU対戦の入力方式をユーザに同期させないようにし,CPUの入力方式を変更し,ルールタブ,CPU対戦タブの順に移動するとCPUの入力方式が元に戻っている
  • ロビーからWeather Typingを起動した場合,ゲームを開始しても「対戦中」にならない

Weather Typing 2.1.1を公開。変更点は以下の2点。

  • 入力方式がQWERTYの場合,キー配列のaiueonがカタカナになっていたのを修正
  • プレイヤーの入力方式とCPUの入力方式が中途半端に同期していたのを改善

Weather Typing 2.1World Tester1.2を公開。Weather Typingについては,かなり長い時間をかけて大幅に変えたのだが,機能的にはほとんど変えていない。98系を対象外にしたのが一番大きい変更点かも。とりあえず今回のバージョンでの変更が今後のバージョンのベースになっていくとかそんな感じ。World Testerはいろいろいじってみた。ホントはデフォルトのフィールドを増やしたかったのだが,そこまでは間に合わなかった。

Weather Typingのテスト項目を消化しているのだが,いくつかバグを発見。元々あったバグもあるけど。そのうちの1件はなかなか興味深いのでメモ。

例えば以下のコードがあったとする。"abcあ"はSJISなら半角5文字なので6文字書式に入る。

printf("%-6s", "abcあ")

しかし,これを何も考えずにUnicode化すると

wprintf(L"%-6s", L"abcあ")

L"abcあ"は(多分)8文字分になるので6文字書式からオーバーしてしまう。…という記述はMSDNには見つからなかったんだけど,実験上そんな感じになっているっぽい。結局桁がずれることになる。

# その後実験してみると,上に書いたのとはちょっと違って,%6sはUnicodeで6文字,足りない分は半角スペースで埋めるという微妙な動作だった。つまりいわゆる全角文字が含まれると固定幅にはならないので,位置合わせに使うときは注意が必要。

解決策は…どうやるんだろう。結局文字列引数を1個ずつ分けて描画するみたいな非効率な方法にしてしまった。

すっかり忘れていたのだが,LobbyのPocketPC版をWeather Typing 2.1に入れなければならない。でVisual Studio 2005でビルドしてみたのだが,.NET Compact Framework 2.0に対応させないとうまくビルドできない。てことで.NET Compact Framework 2.0を調べてみたら,前に作ったときに困ってたInvoke,Splitterがサポートされている模様。もう少し作り込んでみようか。

Weather Typing 2.1とWorld Tester 1.2をゴールデンウィーク辺りにアップロード予定。Weather Typingの方は新機能はなし。最後に公開して以来内部的にいろいろ変えているのだが,新機能がないので公開はしないでいた。で,今回は一応Vista対応という大義名分があるのでこの辺りで公開しようか,てな流れ。World Testerは割といろいろ追加している。画面サイズ変更と効果音の追加が主なところか。


マニュアルもどうせならVista対応ということで画面キャプチャしていたのだが,普通にキャプチャすると背景が透けてしまったりで都合が悪い。まずはキャプチャソフトから作るか,と思ったら「Window Clipping」といういい感じのフリーソフトがあった。透明なウィンドウ枠をPNGの透過色で表現してくれるという高機能さがいい。

ウェザタイとWorld TesterのVista 64bit版ネイティブ対応をやっていた。World TesterについてはDirectX9対応すればネイティブ動作可能だった。ウェザタイについてはDirectMusicが64bit非対応なのでできなかった・・・って古いバージョンは未サポートとかではなく完全に使えないですか。そうですか・・・。音なしでも起動できるようにしないと。

ちなみに64bitネイティブ化する利点は・・・特にない。てか多分公開すらしない。

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だとドライバにも電子署名必須だし。てことで現状こういう制限にするしかないと。

最近Vistaで休止状態やスリープから復帰するとブルースクリーンになっていた。カーネルメモリダンプをデバッグしてみてUSB関連ということは分かったので1つずつUSBデバイスを外していったら結局USBマウスが原因だったっぽい。このメーカーのUSBマウスなのかUSBマウス一般なのか分からないけど。

# その後マウスを抜いていてもブルースクリーンになったのでこれが原因ではないかも。


ウェザタイのUnicode化をやってみる。ライブラリとWorld TesterのUnicode化は既に終わっているのだが,ウェザタイは日本語をたくさん扱うのでかなり面倒。


MFCアプリケーションのデバッグをやっているのだが,以前はMFCのソースコードデバッグが行えたのだが,VC2005 SP1上ではアセンブリになってしまう。確か以前はMFCのソースの場所を聞いてきたのだが,VC2005 SP1ではPDBファイルに書いてあるパスしか読み込めないっぽい。XPのときはどうだったかなあ。

Weather Typingの記録が反映されないという指摘をメールで頂いた。これは不正ツール対策で,特定条件を満たすと記録を反映しないようにするという内部仕様のためだが,質問がくるということは通常でも発生するということなので,次バージョンでは緩和するか,他の対策をとる方針。詳しくは「よくある質問」のところに記載したのでそちらを参照。

結構前からランキングのCGIが頻繁に落ちていたのだが,原因判明。ランキングの一番下に,全記録を1ページで表示するリンクがあったのだが,それをクリックすると落ちる。多分処理に時間がかかってフリーズしたと思われたか,ページがでかくなりすぎたんだろう。なのでひとまずリンクを外しておいた。一応「表示数」を調整すれば1ページの表示数は調整可能なので,そちらで好きな数を入れて下さい。最大500件までに変更したのであんまりたくさん表示できないけど。

さて,ちゃんと対策するとしたらどうするのがいいんだろう。処理を速くするとかJavaにするとかはひとまず置いといて,HTTP+Perlでは一気に1ページ出力しないといけないし。CGIで206とか返してもいいのかな。

ウェザタイランキング。本人からのメールがあって重複記録を削除した。

ランキングに変動が。えと,重複削除してもよろしければ,掲示板にでも連絡を下さるとありがたいです。

ぱじ氏から,WeatherTypingのWord3に「パンダ」が2つ含まれているとの情報が。確かに。パンダを重点的に練習すれば高得点への道が開ける! とかではなくて,チェック甘かったか。

08/09の00:40くらいからロビー第1サーバが落ちているらしい。とりあえず第0サーバが使えているので影響は少ない方。

停電の影響ないかなー,って軽く見に行ったんだけど,全然関係なく落ちてるとは。

シャドールームさんのところで出ていたKanji2na。実は昔ちょっと作ろうとしたことがある。これとWebのロボット(クローラ)とウェザタイを組み合わせると,勝手にWebサイトの文章をもってきてひらがなに変換してウェザタイで打てるというステキな感じに。ウェザタイのワードサーバ機能を使えば誰でも作れるので,誰かそんなサービス作ってくれないかな,みたいな。

かなり久々にタイピングの話。昔ウェザタイを作る前,mp3の歌詞を打つソフトでも作ろうかなぁ,とか考えた時期があった。その時はMP3打!を見つけたので諦めたわけだが,ちょっとイメージと違う(変換じゃなくてローマ字を打つのが欲しかった)ので,誰か作ってくれないかなあ,とか思っていた。で,あれから数年,ちょっと探してみたところではType-Rがなかなかいい感じ。歌詞ファイルのフォーマットがおかしいと落ちるのが難点だけど。

ゴールデンウィークずっと仕事だったので何もできなかったが,とりあえずデナス第0サーバはぱじ氏の尽力により復活した。ロビーで下のサーバを選ぶと入れる。まあ必要になるのは上のサーバが止まったときだけだと思うが。

というわけで第0サーバ復活計画を始動。したのだが,今朝一応元のサーバにアクセスしてみたら何故か復活していた。見てみるとどうもIPアドレスが変わったけどDDNSへ登録されていなかった,ぽい? 真相不明。

まあ管理人が音信不通なので第0サーバ自体は復活の方向で。