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

ロビー案が Pha-jtd 氏から届いたのでちょいと掲載。最初入ったときはグローバルチャットになり,そこから各部屋に移動するというイメージ。

2002052701

 

ロビー,16 時 30 分くらいから 23 時までログイン出来ない状態だったようですみません。数日前からのこのバグについてはやっと原因が判明したので明日人が少ない時間帯に反映させる予定。ロビー動作報告板かなんか作った方がいいかな。


ロビーに参加しながらなのでだらだら書きます。後半から半分ウェザタイ会議(部屋とかレベル表示とかの話)になっていてかなり参考になりました。レベルを表示するというのと「初めて部屋」を作るというので同意した,のかな。多分。

レベル表示は今一番必要な機能のようで,ついでに細分化(4++ とか)についてはいらないという意見が多かったので保留で。

「初めて部屋」はちょっと試してみたい人が入りやすくなるようにって感じ。ただしそういう人が常にたくさんいて,初めてじゃない人が教えてあげられるという 2 つの条件が必須。でないと今より入りにくくなってしまうわけで。ロビーユーザー数が増えないとまだ無理かな,って気はするけど。

今の形態でも,初めての方に教えてあげて下さってる方々には感謝してます。

後でここ読んだ人のためにリンク。Vector 新着レビュー。なかなか好意的ですね。マニュアルも読んでもらってるみたいで。ということでdenasuトップページのアクセス,ランキングへの新規参加者がかなり増えている。ちなみに Vector の人気・注目ランキングって[人気]-[NEWS]-[PickUp]-[その他]の順番で並んでる,のかな? いきなり上の方にきてびっくり。


ロビー。今日 Pha-jtd さんと午後数時間入っていたが,初めての方が結構来ていたようだ。けど,初めての人には入りづらい感じがあったような。この辺掲示板で話し合って行けるといいんだけど…とりあえずご意見募集です。

未解決問題が多いが,また気付いたことをメモ。

  • メンバを右クリックしたところでメンバの名前コピーが欲しい
  • ロビー起動時に簡単な説明が欲しい,もしくは簡単なヘルプが出るようにしたい

近頃ちょっと時間がとれなさぎみ。というか早いところバージョンアップして開発版とロビーをすっきりさせた方がよいかなあ。

明日は Vector の新着予定日。というかロビーはこのまま明日を迎えていいのだろうか。一応ログインだけでもしておこうか,って私普通のテレホじゃん。


CPU 対戦については,FPS を 60 までに制限してるので 16ms が最小単位なのと,打ち始めと打ち終わりのずれや,CPU 側の時間計測とゲーム側の時間計測のずれなどがあってぴったり設定値と一致するというのは難しい。ただ,普段のマシン(PenIII 1G)だとせいぜい 5 くらいしかずれないのだが,別マシン(Cel 600M)だとかなりずれる上,ミスがでる。現段階では 1 箇所修正して Cel 600M の方でも同じくらいの精度にはなったのだが,もう少し精度を上げられないか試しているところ。なのでアップはまだです。


ついに KLEZ が来た。

そういえば昨日書き忘れたが,ロビークライアントで対戦時,「ホスト(4人)」等,接続人数が表示されるようになった。

ロビークライアントを更新。調整が中心なので新規機能は特になし。

ロビー初の土日が終わってみて,現状と問題点。

  • 現在の同時接続数は日中は1~5人,23時から27時くらいまでが7~11人くらい
  • 23時くらいに2度,ログインできない状態が発生し,ロビーの再起動をかけている。これについては原因の調査中。例外のリカバリがうまくいっていないようだが…
  • 私は23時から26時くらいにログインしているのでその時間の様子しか分からないが,ロビー内の感じとしては,やはり初心者部屋というか部屋分けは必要のようだ
  • 人のいない時間帯にやれば大丈夫,と思っていたロビーのメンテナンスは思ったよりできない。メンテナンス日を決めて強制シャットダウン機能を使うようになるかも
  • クライアントについてはいくつか改善点があるので近々修正版をアップする予定
    • ロビー上では4人以上参加できてしまう
    • キーワード追加で空の文字が追加されてしまうことがある
    • 音を鳴らす機能はONにするとかなり頻繁になるのでデフォルトではOFFに。
    • 自分以外の人を右クリックしたときの動作の変更
    • コピーアンドペーストが効かない時がある
    • リッチエディット上のログがスクロールして見づらい
    • 起動時に WeatherTyping.exe が存在するかのチェック,もしくはディレクトリの指定
    • 部屋作成機能

部屋機能まで付けると多分クライアントが大幅に変わるので再 DL が必要かも。まあテスト中なのであらかじめご了承下さいって書いてあるので大丈夫かな。あとロビーで話を聞いていて分かったこともいくつか。

  • ルータを経由してインターネットに接続している人やファイアウォール設定をしている人は想像以上に多い。のでFAQのページに書いてあるような簡単な説明では不十分。
  • ルータによっては16342ポートを静的に割り当てられないものが存在し,デフォルトの設定では対戦できないことがある
  • 対戦者が多い時,ウェザタイ終了時にプロセスがゾンビ化することがある(ロビーではプロセス起動中かどうかが分かるので気付くようになった)
  • 掲示板にも(以前から?)出ているが,通信が異常に重いという方がいる
  • レベル分けが大雑把すぎるのでもっと細かく

むぅ。やることいっぱい…。


Vector に新着レビューの原稿を提出。Vector の方,もしここ見ててメールが届いてなかったら連絡下さい。(絶対見てないけど)

Vector から新着ソフトレビューへの掲載依頼が来た。以前ファイルを最新版に差し替えてもらったのが新着扱いで掲載される,のかな。5/25 掲載予定ということなので楽しみにしてましょう。

ところでこのタイミングだと,掲載日後,ロビー参加者が増えすぎる可能性があって心配なわけで,もしかすると人数制限をしなければならないかも知れない。まあ,今の形式だと数十人で 1 つのチャットは無理があるので最終的には部屋を分割する必要があるだろうが,それは通信環境がよくなってから,ってことで。

ロビー,排他制御の問題は原因が(多分)判明したので修正しておいた。こっちはサーバ側の問題なのでクライアントを DL し直す必要はない。

しかしクライアント側で大きな問題が…。右側のメンバ表示の何もないところをダブルクリックすると落ちるとかいう。これについては今手元にソースがないので,家に帰ったらすぐ修正してアップしておきます。


というわけでダブルクリックで落ちない版アップ。で今日もロビーにいたところ,想像以上に人が。ご意見は参考にさせて頂きます。ちなみにロビークライアントは結構頻繁にアップすると思いますので,気が向いたら落としてみてください(互換性はできるだけとっていくつもりですが)。

今はロビー開始したばかりかも知れないが,これ以上人が増えてくるとチャット内容が混乱しそうなので部屋を分割できるようにするかも。あと,レベル表示機能については,以前考えていたけどロビーがウェザタイ専用になってしまうと思ってやめた経緯があったり。ゲーム依存情報表示機能とか付けて,ウェザタイはレベルを表示する,とかすればいいのかな。


ついでにサーバの運用について。denasu.to はある方の厚意で運用しているわけだが,考えてみればその方のマシンは夜中ロビーとして動いているわけで,何か落とそうにもロビーを気にしなければならなかったりして。やっぱり高速サーバ計画を実現した方がいいかも。どっちにしろ 1 年後にはデナスの人々はみな生活が変わっているのでどうなるか分からないんだけど。

ロビーテスト公開。近頃は Pha-jtd 氏とメッセンジャ代わりに使ってるのでそうバグってはないはずってことで。使い方はウェザタイページに書いたのでここでは内部構造を少し。

  • ロビーが起動すると,Hi-HO の CGI を使ってアクティブサーバリストを取得する。
  • 現在サーバは denasu.to だけなので,denasu.to へ接続。ここで取得する IP を使って対戦を行うので,ルータ内であってもグローバル IP を認識出来る。(静的 NAT は必要だけど)
  • パスワードに関しては,パスワードを入れた人はサーバのデータベースに insert され,パスワードを知らないと同じハンドルでは利用できなくなる。
  • サーバ自体は java で動いており,サーバに常駐し,接続が来るのを絶えず待ち受けている。
  • ユーザが接続した後は,テキスト形式のコマンドをサーバ・クライアントで送り合う。
  • ホスト・接続機能では,ホストの IP をクライアント側に通知し,その後は P2P で通信しあう。
  • 無通信で切断されるのを防ぐため,一定時間ごとに小さなメッセージをサーバに送る。一定時間内にそれが届かなければ強制ログアウトされる。

このような流れになっている。あまり多人数で試していないので,どのくらいの通信量までサーバが耐えられるのか不明。ひょっとすると高速回線が使えるようになるかも知れないので,負荷が多いようであれば乗り換えるかも。

最後に今後の機能としては,

  • アイコンなどのデザインをもっとよくしたい
  • ロビークライアントが lobby.exe では素っ気なさすぎる
  • チャットでの URL リンク(RichEdit2.0 を使えば楽にできるらしいが,DLL が古いなどの問題が出やすくなるので保留)
  • 指定時間 PC を操作しないと「アイドル」状態になる機能(グローバルフックをかけるためには外部 DLL を作り,配布する必要があり,これも保留)

てなところ。

ロビーのテストが終わったらウェザタイ本体と一緒にして,新ワードも含め,正式バージョンアップ予定。1.6 というよりは 2.0 かも。


その後,ロビーを公開して早速何人か来て下さったのだが,どうもロビーが落ちることがある。恐らく排他制御関連だと思うのだが,原因はまだ不明。それ以外は一応動いているようだった。

昨日書いた CPU 戦,一通りテストが終わったのでアップしてみた。シングルプレイを選び,設定ダイアログの 1 番右のタブで速度を指定すると CPU と擬似対戦ができる。速度一定・ミス無しなので人と打ってる感じではないし,「CPU」戦というのも過言のような気もするのだが,まあいい。「CPU500に勝率8割」とかいう楽しみ方もあるし,「全員が打ち切るまで待つ」ルールにして,純粋に速度の目安にしてもよいし,まあそんな感じで。ちなみに CPU はシングルプレイでしか対戦できません。


ロビーは 1 つバグ修正。Pha-jtd 氏が早く公開しろと言ってくる。

ウェザタイ。何故か CPU 戦なる機能を付けてしまった。相当ソースを変更して少々不安なのでアップはしてないけど,なかなかいいかも。CPU 戦といってもスピード一定ミスなしなので,あくまでもガイドなのだが。究極的には,ユーザーのクセを反映した CPU キャラを自動生成して,それをどこかで配布して,その人と仮想対戦とか仮想トーナメントとかやったら面白そう。


ロビーは昨日から変わらず。バグも落ち着いてきたか。というかそろそろたくさん人を呼んでテストする時期かも。

Vector。何故か new 扱いで更新されている。そういうものなのか。


リプレイターボ機能を搭載。TAB を押している間はターボモードとなり,リプレイを3倍速程度で見られる。対戦開始前の待ち時間とかをとばせるのは結構便利な気がするが,どうだろう。

掲示板から。

ホントはロビーで内部バージョンを表示できるといいんですが。
結構めんどうな問題が出てきたりして,悩むところです。

WeatherTyping.exe から lobby.exe にバージョンを渡す方法。考えてる方法としては,

  1. version.txt などを一緒に配布して,そこからバージョンを得る
  2. WeatherTyping.exe を一度起動すると,バージョン情報をファイルに書き出す
  3. WeatherTyping.exe のファイルのバージョン情報を得る

だが,version.txt は作者側が変更し忘れそうなのでやめるとして,2つめの方法は一度起動しないといけないというのはちょっと無理がある。あとファイルのバージョン情報を使う場合,例えば Ver1.5 なら ver1.5.1 とか内部バージョンを含めた形にするというものだが,Ver1.6 にしたときには Ver1.6.0 になって内部バージョンが変わってしまう。一応今の Ver1.51 は何もなければ Ver1.6 と一緒に対戦できるようにしたいので問題がある。かといって Ver1.5.1 のままにするとロビーにはそう表示されるわけで,「何故?」っていう質問がきそうである。なかなか難しい。


ところでロビーサーバは今のところ denasu.to で稼働しているが,Pha-jtd 氏経由で高速回線が使えるかも知れない。まだまだ未確定だけど。

ロビークライアントのスクリーンショット。

2002050801

久々に開発版をアップ。ロビー完成までアップしないつもりだったが,アップローダ半角カナ対応のためにアップすることにした。主な修正内容。

  • セッション選択時,今まで WeatherTyping セッションを自分で選んでいたが,自動で選択されるようにした。これはロビー起動時に選択がうっとおしかったため。
  • ネットワークがなくても起動する,または起動を早くするため,ネットワークが必要になるまではネットワーク関連を初期化しないようにした。シングルプレイが中心の人にとってはかなり起動が早くなったと思う。
  • 今までそのままにしておいたが,ランキング時に半角カナが混じると文字化けすることがあった。現在のランキングで半角カナで登録している方が結構いるようなので,とりあえずの対応として,半角カナがあったら全角になおすようにした。(JISで表示しているため,半角カナをそのまま表示するのは無理)

Vector の件,メールで報告しておいた。登録したときはきちんと中身をチェックしようということですね。当たり前か。

まっちーさんとロビーのテスト。一応静的NATの場合も問題なく対戦できるようだ。しかしいろいろと細かい問題が出てきているので本格稼働はまだ先。

ランキング,条件の絞り込みをしたときに 50 位単位で切れる処理がバグっていた模様。とりあえず直しておいた。

ロビーはチャットの GUI に凝ろうとすると結構大変。Messanger は RichEdit 使ってるようなので同じようにやってみたが,URL のリンクってどうやるのさ,とか。

昨日「明日あたり開発版をアップすると思う」と書いたが,多分ロビー対応時にもう少し本体に変更が必要になりそうなので保留。ロビーの状況としては,一応稼働するようにはなっていて,細かい部分の作り込みをやっているところ。

ロビーのアイコン,どうしよう…。

ロビー。チャット部分についてはほぼ完成。簡単なホスト・接続機能もできているので,残るはウェザタイとロビークライアントのプロセス間通信。ゲーム開始とか終了とかの通知ですね。あと安定化すれば一通り完成。ユーザー登録とマルチプレイランキングは,今のところロビーが軌道に乗ったらやっていくつもり。ちなみにロビー構築に伴ってウェザタイ本体も少々変更したので明日あたり開発版をアップすると思う。


ちょっと書いておきたいんですが。ウェザタイでワードが表示されたときに一定時間打てない時間がありますが,これについて補足。あれは作者の趣味でつけたというよりも,仕方なくそうなっているという部分が大きいです。入力不能時間を 0 にすると分かりますが,自分が問題文を打ち終わる前に対戦相手が打ち終わった場合,瞬間的に次の問題に行ってしまうと,どうしても前の文章の続きを打ってミス入力になってしまうことが多くなります。TOD なんかの場合,ワードの最初の文字はミス入力にしないというルールで回避してますが,それでもたまたま最初の文字がヒットしてしまった場合,ミス入力になります。でウェザタイも最初はそうしてたんですが,最初の文字がヒットするというのが想像以上に多く,結局入力不能時間を作ることによって回避することにしました。これ以外で何かいい方法があれば変更してもよいのですが。ま,それだけです。

ロビー。とりあえずログイン・ログアウト・チャット・ホスト起動・クライアント起動をサポートしてみた。一応動いてはいるようだ。本格稼働させるためには安定化と例外的な状況への対処,UI の向上が必要。UI についてはチャットだけを考えても結構奥が深い。改めてみるとメッセンジャなんかはかなり使いやすいと感じる。

マルチプレイランキングまでサポートできるかな?

ロビーサーバについて詳しく。掲示板に書くには長すぎるのでこっちに書きます。

とりあえずロビーサーバ実現には2通り方法があって,既存のサービスをそのまま使わせてもらう方法と自力で構築する方法がある。

  • 既存のサービスを使う場合,特に DirectPlay を使えば構築は比較的簡単で,サーバを用意する必要もなくてお手軽。その代わりチャットと対戦のサポートしかできない。
  • 自力で作る場合,自力でサーバを用意し,自分で全て実装する必要がある。その代わりいくらでも付加機能を付けることができる。

で,今考えてるのは自力でロビーサーバを構築する方法。やっぱりせっかくやるんなら付けてみたい機能もあるし。ということで,ここ 1 月ほどいろいろ考え,実際に実験も行ってみて,ロビーサーバ自体については実現可能な感じがしている。まあ基本的には人の管理とチャットができればいいだけなのでそこまでは大変ではない。

現在の問題点としては,

  1. もし人数が多くなってくると今の denasu.to の通信環境では荷が重いかも知れない。
  2. 個人のサーバ,個人で作ったプログラムだと,情報の扱いに少々不安を感じるかも知れない
  3. 今まで IRC やメッセンジャーなどでウェザタイを使っていた人にとっては,今更ロビーができても来ることはないかも知れない

といったところ。1 については,とりあえず実験的に運用してみて,人が増えてきたら通信容量が十分な環境に乗り換えればよいだろう。

2 について説明すると,チャット内容等をサーバに記録・盗聴していないという保証ができないということ。サーバのソースを公開すればある程度安心できるかも知れないが,それでも不安なので参加しない,という人はいるだろう。ちなみにロビーサーバを使うと IP を直接指定しなくてもよくなるが,通常 P2P 型のネットゲームでは全てのデータをサーバ経由でやるわけではないため,対戦相手の IP は調べようと思えば調べられる,はず。これはまあしょうがない。

3 については,ロビーサーバを自作したならではの機能次第であると思われる。今考えているのは,マルチプレイランキング。自分の得点だけで順位を決めるシングルプレイと違って,どれだけ強い人に勝ったかでランキングの順位を決めるモードがあれば面白いと思う。

具体的には,ランキングに参加する人は名前登録を行い,その後,ランキング参加者同士で公式ワードで対戦するとサーバに対戦結果が残る。そして自分より上の相手に勝つとポイントアップ,負けるとポイントダウン,みたいなシステムを考えている。まあこれだと上位の人は下位の人と対戦するメリットがないとかトップの人は何もしなければトップを守れるとか問題が出てくるので対策が必要だが。

他にもこんな風にやったらいいんじゃないか,とかがあれば,掲示板に書いてもらえるとありがたいです。

denka 氏に書けと催促されたので書いておくと,USB HDD 10GB を買った。USB1.1,バスパワー,コンパクトなのでどこに持っていってもたいがい使えるというのが利点。少々遅いけど。ちなみに denka 氏は PC カード 5GB HDD を持っているのだ。


ランキング。テーブルが重いのでとりあえず 50 位ごとに分割するようにしてみた。

Visual Studio.NET Academic を購入。まだインストールしただけ。

Terrarium 日本大会が行われるらしい。上位商品は XBox とか。時間があればやりたいですな。

「c」が表示されない以来の大きなバグ。「っ」の後に数字・記号がくると「っ」が記号になってしまう。とりあえず直しておきました。公式ワードには存在しない組合せなのですが,自作ワードを使っている方は念のため落としてみてください。


ロビーサーバ。例えばユーザー登録を行った人は勝敗がサーバに記録されて,ユーザーごとの勝敗を元にしたランキングを作ったりすると面白いか,とか。さっぱり機能していない IRC #weathertyping をロビーのチャット部分として利用しようか,とか,かなり便利なものじゃないと今更ロビーを作っても誰も来ないよね,とか。いろいろ考えてることはあるのだが,暇がないなあ。

ウェザタイランキング。そろそろ一気に表示するのが重くなってきたので100位ごとにテーブル分割とかしようかな。ランキング開設当初は100位まで行くとは思ってなかったわけで,そこまで考えていなかった。時間ができたら実装しようと思う。

ワードとかリプレイをアップできるようにするというのを Pha-jtd 氏と話していたのだが,どうなんだろう。アップロードシステム自体は簡単かも知れないが,誰でも自由に自動的に,っていうとどうしても検閲みたいなのが必要で,なかなか実現は難しいという結論に。自動検閲システム? いやいや。

xn 対応完了。「ん」はローマ字自動認識の中でも最も複雑な部分なのでバグってないか少々不安。


「DirectAudioの初期化に失敗しました。[InitAudio(DSERR_ALLOCATED)]」のエラーについて。解決ではないのでここに書く程度にしておくが,調べたところ Real Audio 等を起動しているとこのエラーが出ることがある,という情報があった。が,手元のマシンで試してもそんなことはなくて,これが原因なのかはまだ不明。

掲示板の文字コードの話。具体的には

// (Unicode->SJIS 1 文字変換の例)
if(setlocale(LC_ALL, "Japanese") == NULL)
{
    if(setlocale(LC_ALL, ".ACP") == NULL)
    {
        // エラー
    }
}
int result = wcstombs(sjis, unicode, 3);

で,setlocale が 2 つともエラーになっている。これが通らないっていうのはどういう場合なんだろう。で,今開発版に上がっているのは,

// (Unicode->SJIS 1 文字変換の例)
int result = ::WideCharToMultiByte(932, 0, unicode, 1, sjis, 2, NULL, NULL);
if(result == 0)
{
    result = ::WideCharToMultiByte(CP_ACP, 0, unicode, 1, sjis, 2, NULL, NULL);
    if(result == 0)
    {
        // エラー
    }
}

である。wcstombs は内部的に setlocale されたコードページを使って WideCharToMultiByte を呼び出しているので,やっていることはほとんど変わらない。前者がうまくいかないならば後者もダメそうだが。他に手が見つからない。