ロビーサーバを再起動しました。その場にいらっしゃった方,ご協力ありがとうございます。

でしばらくロビーにいたのだが,どうもWin98系で開発版を実行するとファイルダイアログ(参照ボタンを押したときのファイルを選ぶダイアログ)が出ないという報告を頂いた。

この辺は全くいじっていないので,コンパイラをVS.NETに変えたことが原因であることは明白。なのでとりあえずGoogleで検索してみるとずばり解決方法が載っている。詳しくは省くが,どうやらCFileDialogのコンストラクタの引数が増えていて,最後の引数をOSによって変えてやらなければならないらしい。この辺はMFCのソース(dlgfile.cpp)を参照。

早速修正したものを開発版にアップしておいた。しかしコンパイルし直しただけでこんなところが動かなくなると困ってしまう。


掲示板でのバグ報告。

時々Qwertyの時と同じ計算方法になっているようです。

こっちも.NETに変えたときに入り込んだバグだった。まあこっちは私がミスしただけなんだけど。

簡単にいうと,.NETはdoubleからintへの変換に警告を出してくれるようになったのだが,それを全部一気に直したときに,変なところでintにキャストしてしまったので入力形式の重みが全て1倍になってしまっていた。これも修正して開発版にアップしてある。


更新内容もかなりたまってきたしそろそろVer1.7にしようかな。

ロビー,スクロールバーが最下部になければスクロールしない機能がようやく実装完了。MFCを使用している場合,下のようなコードで OK と思われる。

// 元々選択されていた部分を保存
long org_start, org_end;
richEdit.GetSel(org_start, org_end);

// スタイルを変更するかどうか
bool modifyStyle = false;

// 変更前のスタイル
LONG style = ::GetWindowLong(richEdit.GetSafeHwnd(), GWL_STYLE);

// スクロールバーが存在
if((style & WS_VSCROLL) != 0)
{
    // スクロール情報を取得
    SCROLLINFO scrollInfo;
    if(richEdit.GetScrollInfo(SB_VERT, &scrollInfo))
    {
        // 選択されているか,最終行でなければスタイルを変更する
        if((org_start != org_end)
            || (scrollInfo.nPos < (scrollInfo.nMax - static_cast<int>(scrollInfo.nPage))))
        {
            modifyStyle = true;
        }
    }
}

if(modifyStyle)
{
    // ECO_AUTOVSCROLL スタイルを解除する
    richEdit.SetOptions(ECOOP_XOR, ECO_AUTOVSCROLL);
}

// カーソルを最後に持っていく
richEdit.SetSel(0x7ffffffe,0x7fffffff);

// 追加部分の開始位置を保存
long start_start, start_end;
richEdit.GetSel(start_start, start_end);

// メッセージを追加
richEdit.ReplaceSel(message);

// 追加部分の終了位置を保存
long end_start, end_end;
richEdit.GetSel(end_start, end_end);

// RichEdit 用フォントフォーマットを作成
CHARFORMAT2 format;
format.cbSize = sizeof(CHARFORMAT);
format.dwMask = CFM_COLOR | CFM_SIZE | CFM_FACE | CFM_BOLD | CFM_ITALIC;
format.yHeight = font_size;
format.dwEffects = (font_bold ? CFE_BOLD : 0) | (font_italic ? CFE_ITALIC : 0);
strcpy(format.szFaceName, font_name.c_str());
format.crTextColor = font_color;

// 追加文字を選択
richEdit.SetSel(start_start, end_start);

// フォントを設定
richEdit.SetSelectionCharFormat(format);

// 選択部分を元に戻す
if(org_start == org_end)
{
    // 選択範囲がなければカレットを最後に置く
    org_start = 0x7ffffffe;
    org_end = 0x7fffffff;
}
richEdit.SetSel(org_start, org_end);

if(modifyStyle)
{
    // ECO_AUTOVSCROLL スタイルを元に戻す
    richEdit.SetOptions(ECOOP_OR, ECO_AUTOVSCROLL);
}

というところでロビークライアントをアップ。変更点は,

  • 発言エディットボックスの自動水平スクロールを外し,俗に言う右端で折り返すようにする
  • スクロールバーが一番下にない,もしくは選択がある場合は自動スクロールしないようにする
  • ロビーに入るときのメッセージを表示
  • 部屋入室メッセージを指定,表示できるようにする
  • 新しいロビークライアントがあった場合,メッセージが出るようにする
  • ゲームクライアントのバージョンを表示するようにする

ただし,上の2つ以外は明日辺りにロビーサーバを再起動した後有効になる。また,旧ロビークライアントでも接続出来るが,メッセージは表示されない。

RichEditのスクロールは今だにうまくいかない。Codeguru に VB 用のサンプルがあって,それでは EM_SCROLLCARET をハンドルしていたが,こんなメッセージこないし。


久々に,というか忘れていたのだが,アクセスグラフをアップ。11月に上がっているのはやっぱりグッジョブ効果でタイピングソフトを探す人が増えた影響なのか。

TOD大会はなかなか面白かった。すっごい(気候が)寒かったけど。

TOD。気付いたこと

  • パーフェクトゲージが99を超えても3桁になってカウントが続く。ちなみに一度100以上になると3桁のまま。
  • ローマ字自動認識の「でぃ」とか「とっつぁん」とかがデフォルトでXを用いたものになってて打ちにくい。どうせなら「ん」の処理を見直してもらいたかった気も
  • 特殊キーの評価が甘くなっていて,私でもオールAが取れるようになった

てなとこ。

denasu.toの回線増強計画が一応完了。パスワードが…で…だったり,何故か外部からつながらなくなったりと問題はあったが,今はなんとか動いてる模様。問題の速度はというと,どうなんだろう。来週のグッジョブで分かるかも。


TOD2003を購入。早くランキングが欲しい。

本日の昼間,ロビーサーバの回線増強を行います。その間ロビーにアクセスできなくなるのでご注意を。結局新機能とかは忙しくてできなかったけど。

年に1度のデナスオフ会。一応発足5周年ってことで。

ロビーのスクロール拡張,つまり最終行にカーソルがなければ自動スクロールしないという機能のことだが,かなり難しい。メッセンジャーの挙動を調べたりしたのだが,フォーカスが消えたときにカーソルをあらかじめ下に持っていくとかスクロールする瞬間にスタイルを変えるとかは分かったのだが,そういう風に作ってもうまくいかないし。どうやればいいのか。


2002/11/12にちょっと触れた話。晋遊舎ムック「間違いだらけのパソコンソフト選び」という本にウェザタイが掲載されている。タイピングのページだけ読んだのだがよく分からなかった。

グッジョブ効果によりロビーも火曜日深夜は人が多い。で,ピークの42人は持ちこたえてたものの23:13:56から一斉落ち現象が発生し,どうにもならずロビーを再起動した。10日ほど前に多少改善してから結構安定してて,先週の火曜日の45人も持ちこたえてたのに残念。エラーログを見てると排他制御で行くはずのない場所に制御が行ってる気が。ともあれもう少し見直すか。

で,その後ロビーにいたのだが,ロビーのスクロールをなんとかせよとの要望が何人かから挙げられてたので考えてみるつもり。


リプレイ対戦。Win98で試したところ,通常のプレイで動かなかった。今の開発版では直ってますので昨日までにダウンロードした方で動かなかった方はお手数ですがもう一度ダウンロードして下さい。

TOD2003に対抗(?)して,Weather Typingにリプレイ対戦機能を追加。設定ダイアログで,[リプレイ]-[リプレイ対戦]にチェックを入れることで,リプレイデータと一緒にワードを打つことができる。対戦の練習としては今までもCPU戦があったが,これはあくまでシングルプレイの補助用の意味合いが強く,あまり対戦している気分はない。これに対してリプレイ対戦は,マルチプレイでの対人戦をかなりシミュレートできる。対戦したいけどロビーに行くのはちょっと,というような方はこれで対戦の面白さを知ってもらえるといいなあ,とか,あわよくばそのままロビーに来てみて欲しいなあ,とか。

注意事項

  • あくまでリプレイなので,リプレイ上で対戦が始まれば自分も勝手に始まるし,全員がリタイアすれば自分も勝手にリタイアする。
  • 何度も同じ文章で打てるので,ランキングには参加できない。
  • 4人対戦リプレイと対戦する場合,幻の5人対戦になる。
  • 対戦を行うたびに1人ずつ増えてしまうため,リプレイ対戦のリプレイはサポートしない。

ちなみにリプレイデータと対戦できるといっても,もちろんリプレイデータがなければ楽しめないわけで,できればいろんなところでいろんな人が自分のリプレイを公開してもらえると,初心者さんとかも楽しめていいなあ,と思うわけで。

いっそデナスサイト上でリプレイをアップロードできるシステムを作ろうかな。ちょうど今まで作ってたPHP+MySQLのファイル投稿システムも完成して,それを改造すればリプレイアップシステムにもなりそうだし。

Norton AntiVirusの定義ファイルの購読期限を延長。クレジットカードオンリーなのはちょっと不親切な気もするが,まあセキュリティ用のソフトを出している会社なのでその辺は一応信用しておこう。

ちなみに一応フリーソフトを出している身なので,ソフトをサーバにアップロードする際は最新のパターンファイルでウィルスチェックする,などはやってます。なのでNorton AntiVirusを信用している方は本サイトのソフトも安心してお使い下さい。

なかなか凄かった。とりあえず今のロビーの回線で40人は耐えられることが分かったというか。

ちなみに回線高速化計画は進行中なのだが,サーバ管理者の都合上,12月になる予定。それでもうまくいくかは分からないのだが。それまでに高速化を前提としてロビークライアントを強化しようかな。いろいろたまってるし。


ところで昨日はウェザタイも収録されているフリーソフト関係のムックが発売予定だったのだが,出版社のページを見る限り…以下略。


TOD。バグが少なくなってランキングが新たに開催されてLAN対戦で同期が崩れなくなってたら買おうっと。

火曜日はロビーで実況してるのかな,とか思いつつ,私は単なるテレホなので23時までロビーには行けず,残念。おとなしくキャプチャでもしておこう。

現在ロビーサーバの回線高速化計画が進行中。成功すれば今まで見たく細々とした運用から脱却できそう。サーバ管理者の心理的負担も減るし。てなわけでここ数週間のうちにロビーが一時的に使えなくなる日とかがありそうなので,そのときはよろしくお願いします(事前に掲示板に告知します)。

スタイルシートをちょっといじってデザインを変えてみる。

PHP+MySQL+Apache で作っていたシステムがほぼ完成。ウェザタイランキングも PHP で作りたくなった。けど,denasu.to の環境が改善されるまでは無理ということで。

情報試験のどれかを受けてきた。筆算と漢字が難しかった。

2002/10/18 12:32:35に掲示板に書き込まれた発言は,何がおっしゃりたいのかよく分からないのと,本サイトに全く関係ないと判断しましたので削除致しました。これからも関係ない書き込みはそれへのレスと共にバンバン削除しますのでご注意下さい。もちろんウェザタイへの批判などはいきなり削除したりしませんのでどんどん書き込んでもらって構いません。

機能アップした開発版を,ロビーにいらした方に宣伝し,試してもらったりしたのだが,DLL ダウンロードについては概ね大丈夫そう。いざとなったらインストーラ付きを公開するという手もあるが,Hi-HO に置ける容量も限界があるので厳しい。


ロビーで出ていた話で,入力形式のプラグインというのがあった。とりあえず DLL を追加すると入力形式が増える,というのはやりたいのだが,こういうのは最初に仕様をちゃんとしないとすごいことになるので時間をかけたいところ。とはいえ入力形式部分はちょっと複雑で全ソース公開しないと作者以外にプラグイン作れない気がする。CPU対戦プラグイン化とかだったら仕様公開すれば楽に作れるかな。これを機にリファクタリングか。


というところで開発版の更新もたまってきたので,そろそろ WeatherTyping ver1.7 にしたいところなのだが,目玉機能が特にない。この状態だとわざわざダウンロードする人も少なそうなのでもうちょっと保留。

開発版をアップ。とりあえず .NET でコンパイルしたので,開発版のところに書いてあるように DLL を 3 つダウンロードしてください。一応ロビー関連でいくつか操作を改善してあるので,ロビーを使っている方は落としてみると少しは便利かも。


Windows100% のタイピングソフトのページにウェザタイを載せて頂いた。ありがとうございます。ところで,フリーソフトを載せている雑誌では作者の方に掲載誌を無料で配ったりしているのだが,これってメールで掲載ページだけ送ってもらうとかできないかなあ。掲載ページだけでいいんだけど1冊もらっとく,とか住所教えたくないから自分で買う,とか結構いそうだし。ま,全ページ分の作者が集まって1冊作っちゃうとコピーが氾濫するけど。

ウェザタイを VisualC++.NET でコンパイルしてみた。というわけで次期バージョンからは MFC70.dllとMSVCR70.dll が必要となる。一応 Denasu 内からダウンロードできるようにしておくつもりだけど。

# ま,折角買ってある VS.NET を使いたい作者の気持ちを汲んでもらえるとありがたいのです。

.NET関連を含めていくつか箇条書きでメモ。

  • 自動退席。WH_MOUSE グローバルフックをかけたとき,パケットを受信したときにも何故か WM_MOUSEMOVE が通知される。一応カーソル位置が同じなら無視するようにしておいた。
  • MFC7.0 を使用すると RichEdit2.0 がそのまま使える。EM_AUTOURLDETECT メッセージをビューに投げると URL が検出され,SetEventMask(ENM_LINK) を設定しておくことで EN_LINK が通知される。
  • 現在,XPで使用するとき用にXP用マニフェストファイルを配布しているが,次バージョンからはリソースに含めるのでダウンロードの必要はない。
  • 最初,何回ビルドし直してもMFC42.libが開けないというエラーで失敗していた。原因はワークスペース(ソリューション?)に入ってなかったライブラリがリビルドされてなかったため。
  • double->int へのキャストや int->unsigned int などのキャストに,デフォルトで警告が出るようになってて修正は結構めんどう。
  • unsigned char,signed char で 128 以上の値があるとデバッガ上で 0 に見える。なんか設定があるのだろうか。

あと問題は Win98 系でちゃんと動くかってところか。

ロビー,自動退席機能をサポートしてみた。まだアップしてないけど。技術的にはグローバルフックを使ってキー・マウス入力をフックし,何秒入力されていないかを返す外部DLLを作成する,という感じ。ただ,MSNメッセンジャーとか見てもそれらしいものが見あたらないので,違う方法があるかも知れない。


ついでに,チャットウィンドウでURLがリンクになる機能のためにRichEdit2.0を使いたいのだが,MFCでRichEdit2.0を使うにはVisualC++.NET(MFC7.0)を使うのが一番楽。しかしVisualC++.NETを使ってしまうとMFC70.dll等をダウンロードしてもらわないといけないわけで,どうしよう。

昨晩異常にロビーが重く,消えない部屋ができたりしていた。部屋関連にまだバグがありそう。とりあえず今日の昼間にロビー再起動を行った。

久々にロビーに行ってみたら VRAM の話が。今まで書いてない気がするので一応ここにも書いておこう。ウェザタイの動作速度は VRAM の量にかなり左右される。そのため,「ウェザタイがどうも重い」という方は以下の順に試してみると動作が軽くなっていくはずである。ちなみにウェザタイの動作速度は,[設定]の[画面]-[FPSを表示する]をチェックすると確認できる。

  • Windows の画面モードを16色にしてみる
  • [設定]の[画面]-[背景]を[背景色]にしてみる
  • [設定]の[画面]-[画面モード]を[フルスクリーン]にしてみる

以上の手順をやると,CPU が Pentium266 程度,VRAM が 2MB 程度のマシンでも FPSは最大の 60 までは出る。

まあ,対戦を行う場合はウィンドウモードじゃないとチャット等に不便だが,シングルモードならこの設定でも問題ない場合は多いと思う。

# でも今日聞いた話だと,VRAM が 10MB 以上あってもウィンドウモードだと重くてフルスクリーンだとかなり早い,ってことだったので他に原因があるのかも。バグ?

1ヶ月ぶりに開発版をアップ。ロビーでレベル10以上の場合,かなりの場合で正常に表示されないというバグ修正と,成績ファイルの書き出しで失敗した時にファイルが壊れてしまう可能性を少なくする。


C++ の stringstream をバイナリで使いたかったのだが,0 がくるとそこで切れてしまう。以前 Windows 用にメモリストリームも作ったのだが,Linux だとうまくいかない。で,strstream の方を使ってみたら何故かバイナリもうまくいく。そういう仕様なのだろうか。

忙しかった原因の1つが終了。あと原因は5つほどあるのだが,そっちはまあ比較的楽しい事柄なのでよしとする。


で古い日記のリンク切れとか整理していたら,2002 年の日記の月が以前とは逆順になっていて(12~1 じゃなくて 1~12),とりあえず直しておいた。ところでもともと日記は中心コンテンツにするつもりはなかったので,あえてショートカットにもしないし最新の日記にダイレクトに飛べないようになっていたが,自分で確認するのにめんどうなのでトップに最新へのリンクを張ってしまった。下の方だけど。


ちなみにウェザタイの初速の話だが,ウェザタイのトータルポイント算出には初速は関係ありません。あまり浸透していないようなので一応。そもそも何故初速が関係ないかというと,まず入力不能時間の一連の複雑な事情があり(FAQ参照),また,ハンデ機能により入力不能時間も長い時間取ることができるので,

  • 初速を早くしてもどうせ入力不能時間以内にはならない
  • 初速を計算に入れたとするとハンデを大きくした方が得になる

という理由がある。まあ主な理由は前者で,後者は掲示板での指摘で気付いたのだが。

#入力不能時間の解決策の1つとして,入力不能時間中は問題が見えないようにする,というのもあるが,どうせハンデを設定すれば他の人が打っている間に見えてしまうし。通信対戦で初速を公平に計る方法ってないですかね。

締切がもうすぐのやつがあるのだが,多少先が見えてきたのでたまっているアップデートをする。XP SP1,Inspiron8100 の最新 BIOS,ビデオドライバ,Windows Update の重要じゃない更新等。XP SP1 は入れた直後は起動が遅くなって何だコレ,な感じだったが,何回か起動しているうちに普通の速さになった気が。気のせい? まあいいや。

ロビーサーバとして活躍している denasu.to がそろそろ契約延長の時期かな,とサーバ管理者に確認を取ってみるとまだ2年契約の1年しか経っていなかった。安心。ロビーサーバを立てる前はせっかく取った denasu.to もメーリングリストにしか使っておらずかなり無駄だったが,今では何となく有効利用してる気がしていい。

ところで to ドメインは結構料金がかかる。しかもうちはIPが1つなのでセカンダリDNSを立てることが出来ない。なのでドメイン取得代行サービスにDNSを任せているのでさらに高かったりする。.com にすれば少しは安いんだろうけど whois 情報が公開されるのが嫌だからしょうがない。

いろんな締切が迫っている。

近頃 PHP を使っているのだが,やっぱり HTML の中にプログラムを書くのはごちゃごちゃする。デザインは他の人に任せたいのにプログラムが邪魔しそう。とりあえず可能な限り関数にして分離しているが,他の PHP 使ってる人ってどうやってるんだろう。