‘プログラミング’のエントリ

ウェザタイ。4 人対戦の機会ができたのでテストしてみる。まずアナログ 2 人 + フレッツ ADSL。これは ok で,3 人対戦はできた。次に フレッツ ISDN の人を加えて 4 人対戦(全員 Windows2000)。だが,フレッツの 2 人がホスト以外に見えず,現象は変わらず。


とりあえずログをとって,ちょっと変な部分を修正してみる。

ウェザタイ。Microsoft のサンプルを見ながら,ちょっとでも違う部分をかたっぱしから直してみる。一応いくつか気になる部分があったので修正してみる(Connect の非同期化と排他制御,ポート指定を Host,EnumHosts 前にやるようにする)。

さらに,ルータの設定等を少しでもいらなくするため,ホストとクライアントのポートを同じポートにする。このため,1 台のマシンで複数立ち上げることはできなくなったが,ルータの設定は

  • UDP ポート2234
  • UDP ポート16342

だけになった(はず)。


まっちーさんからの報告で,MIDI 再生時におかしな部分があるとのこと。調査中。

ウェザタイ。私の周りで,3 人以上でつながらない人に WindowsMe の方が多いので,Mebius MN-390-X26 に Windows Me を入れてみた。前試したときはインストールできなかった気がしたが,今回は何の問題もなくインストールできた。

最初,LAN カードを入れずに試すが,TCP/IP では起動できなかった。てことは,LAN カードを持っていない場合,TCP/IP ではダイアルアップで IP が割り当てられるまでは使えないということである。一応 Serial Service Provider 等を選べば起動はするので,この辺はマニュアルに書いておこうと思う。

で,Windows Me でのテストだが,とりあえずローカル対戦は問題なかった。今度,他の安定している人とこの環境でテストしてみようと思う。

DirectPlay で使用されているポートを調査。ルータ経由で対戦する場合,以下のように静的マスカレード設定すればウェザタイは動くと思われる。

  • UDP ポート2234
  • ホストの場合,UDP ポート16342
  • それ以外の場合,UDP ポート2300-2400

3 人以上対戦でつながらない問題,原因らしきものが 1 つ判明。セッションの列挙をキャンセル中に,セッション情報を破棄していた。キャンセルが早い場合は動きそうだが,ホストが多くてキャンセルに時間がかかる場合,おかしくなっていたのではないかと考えられる。が,今日のところは開発者がつかまらないので未テスト。


Hi-HO で WAP 対応ページを見るときの .htaccess について,追加

AddType text/x-hdml;charset=Shift_JIS .hdml
DirectoryIndex index.html index.shtml index.hdml

としておけば,ファイル名を指定しなくても,hdml を読んでくれる。

ウェザタイランキングに参加されている方と,IRC #weathertyping でチャット & 対戦を行う。4 人で対戦を試みるもことごとく失敗。3 人対戦は何回か成功した。皆,開発者組の私と Pha-jtd さんより速いので,歯が立たず惨敗。最後に,現在ランキングトップの Sakku さんと対戦させてもらったが,対戦であっさり 50000 点以上出すなど,とにかくすごかった。とりあえず,速い人との対戦にもっと慣れないといけないというのを実感。

開発者的には,対戦ができないのがどういう環境なのかが少し分かったのでよかった。現在,パケットアナライザで 3 人対戦以上の場合のパケットを解析中。

CGI(掲示板,ウェザタイランキング,アクセスカウンタ)を大幅作り直し。といっても見た目には全く分からないが,今まで非効率だった部分を幾分効率的にしてみた。これで多少アクセスが多くなっても耐えられると思う。ま,まだそんなにアクセス多くないけど。

というわけで数日間この CGI 直しとかバイトとか学校のレポートとかをやっていたのだが,ようやくウェザタイの開発が再開できそうである。とりあえず対戦中落ちるバグと,DirectPlay の挙動の調査かなあ。

で,今 Pha-jtd 氏に頼んであるタイトルと背景,はっぱ氏に頼んであるものが上がったら Ver1.3 を公開,という形にしたい。

3 人対戦テスト。って論文明日までに書かないといけないのだが,せっかく Pha-jtd 氏と,バイト先のまっちー氏・Happa 氏が来てくれたのでやってみた。環境は,私とまっちー氏が普通の電話回線,Pha-jtd 氏・Happa 氏がフレッツ ISDN。このうち Happa 氏はセキュリティを高めているせいか,つながらなかった。残り 3 人は 1 回目はワード送信時に落ちたものの,2 回目はうまくいった。もう少し見直してみる必要がありそうだが,なんとか 3 人以上の対戦もできるようになったように思う。

久々に 3 人の開発者が集まったので 3 人対戦をテスト。私は普通の電話回線,1 人は ISDN,もう一人はフレッツ ISDN でルータ経由。ルータ経由の人はウェザタイポートを全てそのマシンに行くように設定済み(のはず)。

で結果だが,タイトルまでは行くものの,そこからスタートできない。リターンを押しても反応なし。2 人対戦や,ローカル 4 人対戦では可能なので原因不明。で,とりあえず詳細ログを取り,解散。

いろいろ見ていると,どうやらユーザー情報(ハンデとか)を送る部分で止まっているらしい。これは ver1.0 のときはなかったので,あの頃はうまくいっていたというのも納得だ。詳しく言うと

IDirectPlay8::SendTo()

から返ってこないらしい。ので,その後のメッセージ交換が一切行われなくなるらしい。とりあえずこのユーザー情報送信部分を移動させ,回避するようにしてみた。

しかし,再び 3 人対戦でのテストをしなければならないので,直ったとは言えないのである。一人は帰省中だしなかなか難しい。LAN とかで再現してくれればすぐ解決できると思うんだけどなあ。

ウェザタイ,ワード送信機能を搭載した版を開発版に公開。Pha-jtd さんによると「夢の機能」だそうだ。氏は ver1.0 の時からこの機能を欲しがっていたのである。今までは,自分でワードを作った場合,相手にあらかじめメール等で送り,同じファイルを使ってもらわなければならず,非常にめんどうだった。で,今回の機能によって,自分のマシンに入れておけば自動で相手側にも反映されるようになる,ということである。

ちょっと試してみたが,自分の知らないワードが出てくるのはなかなか新鮮でいい感じだった。

ウェザタイにワード送信機能を搭載する。これは問題文章として,各プレイヤーのワードを順々に出題していくものだが,かなりプログラムを変更したので,少し安定するまで開発版には載せないでおく。

これを含めて安定したら,マニュアル等を整備して v1.3 公開にしようという感じ。ランキングに参加できる版を早く正式公開したいというのがあるので。

ウェザタイ(長いのでこれから略してこう言います)のおかげで毎日日記に書くことがあっていいなあ。

昨日 Hi-HO でランキング CGI のテストしてたら,数十秒反応がなくなって,hoge.pl.core を吐いて復活した。Hi-HO には内緒。だいたいうちの CGI も,昔に作った効率の悪いものなので本格運用に耐えられるのかちょっと心配。サーバに負荷かけまくってる気もするし。Hi-HO で,Perl じゃなくて使い慣れた C++ か Servlet が使えればもっと効率のよい & 安全な & 携帯でも使えるとか,そんなのが作れるのだが。

知り合いのサーバに移転するか,Pha-jtd さんがサーバ立てるのを待とうか,Perl CGI を構築し直すか検討中。

すごいバグを発見。今まで,画面を初期化するときは背景を読んで書き直す,画面全体を書き直すだけのとき(モード変更時等)は背景サーフェスから転送,としていたのだが,この条件分岐が間違っていた。ので,画面全体を書き直すときも,背景画像を読んで初期化していた。今まで,たかが 1 画面書き直すになんでこんなに時間がかかるのかずっと不思議だったが,こういうことだった。

で,これをなおしたらゲーム開始時や終了時も早くなって,「背景画像なし」モードも「背景色」モードもあまり変わらない速度になってしまった。今まで画面の再描画が遅いせいで対戦に負けていた人すみませんでした,って感じである。

まあ,背景色モードも,仕事中にやるときなどに役立つので一応残しておく。

お詫び(?)にランキング表示時にもう少し詳しい情報と,スクロールして多くの情報を表示するようにした。


掲示板に出ていた 3 人対戦の話。確認したいんだけど開発者が全然つかまらない。ここ読んでたら連絡欲しいなあ。まあみんな忙しいからしょうがないんだけど。


(Hi-HO じゃないアカウントでの)メールが 1485 通来る。携帯に転送してたらどうなってたことか。とりあえずメールボックスごとリネームして見なかったことにしておく。

Weather Typing。フルスクリーン時に Alt+TAB で最小化したのを戻す際,DirectDrawSurface7::Restore() を使っていたが,タイミングによっては失敗することが判明。どうやら画面モードが戻る前に Restore してしまっていたらしい。とりあえず成功するまでやってみることにした。こんなのでいいのかなぁ。

ネットランキング。段々人が増えてきてありがたい限り。そろそろデータを消すわけにもいかなくなってきたので,正式公開とします。アップロードのしかたをちゃんと書かねば。

Weather Typing ネットランキングを仮公開。やっぱりランキングがあると面白い,ということでネットランキングを作ってみた。

詳しくはWeather Typingのページを見てもらうとして,ここでは技術的なことを。

登録方法としては,CGI を使ってみた。専用のアップローダーが Hi-HO の Web サーバにつないでデータを送信する,といった感じ。

一応利点としては,

  • 自動的にアップしてくれるからユーザー,管理者共に楽。
  • CGI ならば Hi-HO で可能。

で,欠点は,

  • 自動的にアップしてしまうから,陰でユーザー情報を送信しているかも知れないという不安がどうしてもある(だろう)。
  • ユーザー数が多くなると,Hi-HO に負担を掛ける。

というのがある。一応送信している情報は,タイピング情報と IP アドレスだけなので安心して欲しい,というしかない。ネットワークに流れる情報を全て監視するソフトとかあれば確認できるかも。

Weather Typing 開発版。

  • ウィンドウのサイズが微妙にずれていて,拡大・縮小するようになっていた。これを直したので,ウィンドウモードでは多少早くなった & 見やすくなったと思う。
  • FPS の表示を 10 回計測毎の平均値に変更。
  • ハイスコアデータを大幅に変更。今までのハイスコアは消えるが,今後ネットランキングをするようになったら,このデータで参加できるようにしようと思う。(但しまだ開発中なので,また変更するかも知れません。)

GANGAS – Type Well Fanさんから Weather Typing を紹介してもらいました。ありがとうございます(ってこんなところに書いても誰も気付かないけど)。ここのサイトは,私が今ほぼ毎日やっている「タイプウェル」というタイピングソフトのページですが,参加者のレベルが高すぎてなかなかついていけません。頑張らねば。


参考までに私が普段プレーしているタイピングソフトについて。

The Typing of The Dead PC 版(ゾンビ打)
少し前に学校のマシンで毎日やっていたソフト。学校ではやりにくい状態になったのと自宅のメビウスでは起動しないために,現在は休止中。言うまでもないのですが,Weather Typing はこのソフトの影響をかなり受けています。
タイプウェル
英語のタイピング練習のために始めたソフト。現在はこればっかりやってます。
美佳のタイプトレーナ
これも英語のタイピング練習のために始めたソフト。英語の文章を長々と打ち込めるのがよいです。
Weather Typing
一応。近頃は周りの人が対戦しようと言ってこないので 1 人で練習中。

あとは市場調査と銘打って適当にネットでタイピングゲームを探してきてはプレイしてますが,なかなかずっとやり続けてるソフトはないですね。

Pha-jtd さんとの話し合いの結果,ウェブサイトをもう少し派手に改装することに決定。というか今が地味すぎなのだが。

とここに書いておけばあきらめずにやるかな,ってことで。

Weather Typing1.2 をアップ。もう少し機能追加する予定だったが,諸事情により忙しくなっているので今までの分をアップし,しばらく凍結。多分 7 月になったらまた作り始める,と思う。


K.F 氏に,IE で Alt+(右,左)を押すと前のページ,次のページへ行けるというのを教えてもらう。これは便利。ちなみに BackSpace は何故か知っていた。

ファイルダイアログ。最初のディレクトリがカレントディレクトリの時とそうでないときがある。これは,*.bmp 等のフィルタをかけてある場合,実際に *.bmp のファイルがある場合はカレントディレクトリ,ない場合はそれ以外になるらしい。

CFileDialog::m_ofn::lpstrInitialDir にディレクトリを指定すればそのディレクトリで表示される。

Weather Typing 1.11 をアップ。「ん」と「っ」が連続している問題の修正のみ。今後は新機能をどんどん追加していくので,次の正式バージョンアップはかなり先になると思う。

Pha-jtd 氏の家にて Weather Typing をコンパイルしてみる。しかし,ワークスペースが開けず,VC が落ちてしまう。で,「サービスパックは?」と聞くと,なんだか分からない仕草をしていた。つまりサービスパックを入れていなかったわけだが,本人曰く,「サービスパックなんていうのがあることを教えてくれていたら入れてたのに。そんな当たり前のこと誰も教えてくれなかったからぁ。」ということで,Pha-jtd 氏の手元にずっとあった C マガ付属のサービスパックを入れ,無事にワークスペースが開けた。

「絶対他に知らない人いるよ」という Pha-jtd 氏の言葉を受け,ここに書いてみた。


Weather Typing。「ん」と「っ」が連続しているとき,ローマ字がおかしくなるバグを発見。修正し,開発版においておく。まあ付属のワードにはそんなのは出てこないので発見する人はあまりいないと思う。

#ちなみに TOD ワードを打ち込んだものを試していて発見した。


Weather Typing。一回 Pha-jtd 氏に Win95 での動作を確認してもらって「Win95 対応」としたのだが,Pha-jtd 氏の家にて対戦を試してみると動作しない。Pha-jtd 氏のマシンのせいなのかなんかのか分からないが,とりあえずもう 1 度非対応ということにしておく。

Weather Typing。背景・ワードを Pha-jtd 氏にちょっと変更してもらい,これまでの変更・修正を含めたVer1.1を公開。

Weather Typing。ワードを打ち終わったとき,両方同時に打ち終わると,両方とも点数が入る,仕様だったのだが,そうなっていなかった。のでそうなるように修正。まあこのせいで最後に出る完了ワード数が 10/20 vs 13/20 のように全員足すと合計を越えてしまうのだが,仕方がない。一応これで全プレイヤーが同条件になった。

というところでそろそろ新たに変更した点も含めて安定化してきたので,ver1.1 に正式バージョンアップしようと思う。後はタイピングスピードが各プレイヤーで同じ値になるようにしたら,公開する予定。

ほとんど毎日デバッグにつきあってくれている Pja-jtd 氏に感謝。


フリーソフトのページによくあるご質問を公開。とりあえず DLL をダウンロードできるようにしておいた。

Weather Typing の変更点をまとめて。

タイピングスピード測定だが,単位は(ローマ字)/(分)。つまり 1 分間にどれだけアルファベットを打ったか,としている。ちなみに私の場合正確性を 97~98% くらいに心がけたときで 430 くらいだった。

この速度,ローカルマシン上で計算しているので,相手に表示される数値と自分に表示される数値は異なる。さらに,遅延が大きいと一瞬でたくさんの文字が送られるため,恐るべき高速度になったり,逆に全然文字が送られてこなくて恐るべき低速度になったりする。将来的にはローカルで測定したスピードを他の相手に送るようにしようかと思っているが,今のところ電話回線を用いた対戦では信用できない。


現在の正式版では,

  • 相手が文字列を打ち終わる
  • 自分は文字列の途中で次の文字列へ問題が進んでしまった

場合,前の文字列での入力が次の文字列に持ち越されてしまい,その文字が偶然次の文字列の最初の文字と重なってしまうと,ミス入力になってしまう。

これは,LAN 対戦のような遅延の少ない環境だと,次の文字列を打ってしまったことが自分で分かるのでまだいい。しかし,遅延が大きい場合は,画面上は先行入力で打ち終わっているのに,実際には打ち終わってなく,入力が次の問題に持ち越されるので何故ミスになったか分からなくなる,ということになってしまう。(分かりにくくてすみません)

そのため,現在は

  • 次の問題へ行ったときに,その時点で先行入力を完了し送信待ちになっている文字を破棄する
  • 問題の最初で一定時間の待ち時間を用意し,その間は入力ができないようにする

という処理を行い,回避することにした(現在の開発版)。


ハンデ機能については,ハンデを指定したプレイヤーは最初に一定時間入力ができなくなる,という感じにしてある。基本的にはハンデ 1 に対し 0.4 秒くらいのハンデタイムになっていて,問題が短いと短く,問題が長いと長く,というようになっている。


Alt+Tab については,Win98(フルスクリーンモード)+ DirectX(Input?)では何故か Alt+Tab でのタスク切り替えができなかったので自分で最小化するようにした。Win2000 では問題なく Alt+Tab が効くし,Win98 でもウィンドウモードでは効くので,何故 Win98 フルスクリーンモードだけ効かないのかは分からない。

Weather Typing。得点が最大点を上回った際,プログレスバーがはみだしていた。最初はちゃんとやってあったが,いろいろあってこうなってしまっていた。修正。

Weather Typing。最後のランキングで,ミスが 1~2 回の場合,正確性 100% と表示される。これは printf が浮動小数点数を丸めているかららしい。一応修正。

BGM ファイルを置いてある場合,Type.wav もしくは Miss.wav がないと,BGM が止まってしまう。原因は,IDirectMusicPerformance8::StopEx を行ったとき,セグメントが NULL の場合に全てのセグメントの再生が止まってしまうためらしい(ドキュメントには書いてないので,おそらく NULL を渡してはいけないはず)。修正。

ネットワーク対戦タイピングソフト Weather Typing をアップ。

近頃ずっと「ネットワーク対戦タイピングソフト Weather Typing」というのを作っていた。一応完成のめどが立ったので予定だけアップしてみた。

ネットワーク対戦タイピングソフト Weather Typing

このソフトは,当初,電話回線を使ってタイピング対戦は可能なのか,という興味から作り始めたものだが,意外によくできたので完成させてしまった。

VC。F8 で選択(Shift)をロック,アンロックできることを発見。ってこれはどうでもいいか。

DirectPlay8 を使ってみる。DirectPlay4 とはえらく違ってていやな感じだが,なんとかセッションの作成までやってみた。で,たまたま電話回線(というかモデムか?)を使用中に立ち上げてみると,Windows 全体がフリーズした。何もできなくなる。DirectX8 SDK サンプルをやってみてもフリーズする。

どこでダメなのか調べてみると,EnumServiceProviders のところで,モデム関連を調べていて落ちている模様。そこで,レジストリエディタでモデムその他 TCP/IP 以外の設定を全削除してやってみたところ,うまくいった。なんなんでしょうか。


VC。アウトプットウィンドウにエラーが表示されているときに F4,Shift+F4 を押すと次々に該当場所へ移動できる(分かりづらい)ことを発見。

乱数。srand を使って乱数を初期化していたが,いつも同じ系列になる。原因は,乱数を初期化する方と使う方が別のスレッドであったため(だと思う…)。