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

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

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

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

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

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

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


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

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

Dena’s Image,Pha-jtd 氏の助言により,

  • サポートされてないファイルを開いたときに落ちるバグを修正
  • 「画像サイズにウィンドウを合わせる」メニューを追加

バイト先の MK 氏に触発され,Dena’s Image の最新版を公開。このソフト,いきなり MDI 化したらバグが出まくってたため公開は見送っていたのだが,氏から「減色すると落ちるよ」という指摘を頂いたため,急いでバグを直し,公開してみた。MK 氏にはこの場を借りてお礼を申し上げたい。

あとくまのおえかきアルバムで,アルバムファイルを開くときに BMP を開くと落ちるという指摘を頂いた。で,修正しようと思ったら,当時のソースの一部は既に新たなソースに生まれ変わっていて,コンパイルすら出来ない状態になっていた。ので,当分このままかも。

XML4C を使って XML を出力することを試みる。が,XMLPlatformUtils::Initialize で,「XML4C Panic Error」というエラーで終了してしまう。で,トレースしてみると,エラーコード U_FILE_ACCESS_ERROR というエラーを返している。

結局,Unicode 変換用データベース icudata.dll がない,ということだった。何か,VC のデバッグ用作業ディレクトリに入れといただけじゃダメで実行ファイルのあるディレクトリに置かないと認識してくれなかった。まあいいや。

VC++ MFC で作ったアプリケーション。Form View でコントロールをはると,Ctrl+C などのショートカットを何故か受け付けてくれない。以下のように自分でメッセージをとばして一応解決はした。

void CXXXView::OnEditCopy() 
{
    GetFocus()->PostMessage(WM_COPY);
}

brpuzzle Java アプレット・アプリケーション版を公開


ライブラリのリンクで

fatal error LNK1202: "xxxvc60.pdb" には参照モジュールに対するデバッグ情報がありません

と言われる。これはライブラリを作成したときの vc60.pdb を削除していたからだが,ライブラリのプロジェクトの設定で [C/C++]-[デバッグ情報] を「行番号のみ」等 pdb を使わない設定にしておけば vc60.pdb がいらなくなる。

Java で jar ファイルをダブルクリックで起動する方法。

Main-Class: mainclass

のようなファイルを作成し,

jar cvfm app.jar manifest *.class

のように jar ファイルを作成する。

KVM。Graphics.drawBorder で思うように描画されない。いろいろ試してみると,このメソッドの引数の,幅,高さはそれぞれボーダーをいれない大きさらしいことが分かった。


Java。今までコンパイル時に -J-Djavac.pipe.output=true を使ってエラー出力をファイルに出力していたが,JDK1.3 になってできなくなったらしい。別アプリでパイプ入出力を介してやるしかないんですかね。

brpuzzle をとりあえず公開してみる。


J2ME でのコンパイル方法。

set PATH=%PATH%;c:jdk1.3bin;c:j2me_cldcbin
set CLASSPATH=.;c:j2me_cldcbinapiclasses;c:j2me_cldctoolspalmclasses
javac name.java
preverify -d . name
java palm.database.MakePalmApp -bootclasspath c:j2me_cldcbinapiclasses -icon name_32.bmp -smallicon name_16.bmp -creator NAME name

こんな感じ。

15 パズルを Palm + KVM で作る。PalmIIIc に付いてくる 15 パズルでは Brandish で鍛えた私には暇つぶしにもならないので 4~100 パズルを作成したわけだが,やはり C で作るのと違って簡単にできた。

「Palm で動く電卓を作ろう計画」を立ち上げていたのだが,挫折。

  • デストラクタや throw を使うとリンクエラーが出たりする。
  • 構造体にクラスを入れるとリンクエラーが出る。
  • sin,cos などが標準では未サポート。
  • double がきちんと使えない。
  • CW Lite のエディタが変。

などが理由。もちろん単に自分が使い方を知らないだけというのもあるだろうし,いくつかはライブラリを使えば解決するものもあるが,そのライブラリもなんか…ということで。

標準ライブラリなしの C 言語と API だけで開発することもできるが,作ってて全然楽しくない。ということで,はっぱ氏お勧めの KVM もやってみようという感じ。

VS に VSS のプロジェクトを挿入するときに,VSS と関連づけてくれない場合がある。その時はプロジェクトの挿入ダイアログの,「ソースコード管理のプロジェクトを開く」で追加すればいい。

Code Warrior Lite for Palm,デストラクタを作ると delete がない,というリンクエラーが出る。デストラクタを定義しなければいいんだけど…。うーん。

今まで j-sky 用の Web ページ(MML)の情報がなかなかなかったような気がするが,いろいろと公開されてきたようだ。特に j-phone の絵文字の仕様がやっと公開されていてよかった。

ちなみに EzWeb には「マイデッキエディター」,「マイデッキエディター Pro」という公式ソフトがある。これはなかなか素晴らしいソフトで(以下略)。


はっぱ氏がある SDK を使っていたが,へッダ内に以下のような記述が。

#define Stop 0xFC
#define Active 0xFE

こんなよく使うものを define するとは,とはっぱ氏はお怒りであった。

はっぱ氏作の Unix/Win 用ソケットラッパーを使う。FTP オープンができずに困ったが,アプリケーションの最初で AfxSocketInit() を行うことで解決。

CCalc をバージョンアップ。


F1 キーでのヘルプを出ないようにする方法。CWinApp::WinHelp() をオーバーライドする。


コンボボックスでの Enter キーを取得する方法。今まで コンボボックス内のエディットボックスをサブクラス化し,WM_USER を発行して以下のように取得していた。

WM_CHAR->WM_USER->処理関数

だが,よく調べてみると,WM_CHAR の部分が呼ばれてなく,何故か 1024 番(=WM_USER)のメッセージが直接とんできて結果的に処理されていただけだった。コンボボックスで Enter が押されたときに MFC が勝手に 1024 番のメッセージをとばしているようだ。

で,気持ちが悪いので改善。CComboBox から派生したクラスを作り,その中の PreCreateWindow メッセージ内で処理するようにした。これでうまくいって,さらに,今まで Ctrl+Shift+H で勝手にバックスペースになってしまう,となっていたのも回避することができるようになった。

i-mode C-HTML。フォームの URL に何も書かないと,IE5.0 ではそのディレクトリのインデックスを表示するが,i-mode ではボタンを押しても反応しない。

STL。ある vector に他の型の vector の要素を insert しようする。

vector<A> a;
vector<B> b;
b.insert(b.end(), a.begin(), a.end());

こんな感じだが,VC++ ではコンパイルエラーになった。これは多分メンバ関数テンプレートを完全にサポートしてないからなワケだが,なんとかならないのか。

ある Web ページで占いをやっていたのでやってみる。生年月を選んでスロットを止め,そしてボタンを押す。すると,見慣れたものが! というか Perl のソースが表示された。なんかの設定が変なんだろうが,これって 1 回でもテストすれば分かるのでは…。

VC で Resource View を追加する方法。

リソースを追加し,.rc を保存。で,[プロジェクト]-[プロジェクトへ追加]-[ファイル] で .rc と resource.h を追加する。

static なコールバック関数を呼ぶ。が,動作がおかしい。いろいろ調べてみたところ,基底クラスと派生クラスで同じ名前のメソッドを作っていた。

XML4C を使う。この中に XMLString をローカルな文字列に変換する関数,transcode というのがあるのだが,この関数は内部で new した文字列を返す。当然後で delete しなくてはならないのだが,ここで問題が発生。XML4C のライブラリは DLL になっているので,DLL で new したメモリを exe 側で delete しなくてはならず,デバッグ版(だけ?)ではメモリ管理の不整合が起きて assertion されてしまう。

結局こんな感じで無理矢理解決。

DOMString dom_str("aaa");
const XMLCh *xml_ch = dom_str.rawBuffer();
char local_str[255];
XMLString::transcode(xml_ch, local_str, dom_str.length());

STL。vector::back() でコンパイルエラー。これは begin(),end() と違って iterator じゃなく reference を返すのか。

ワーカースレッドからスレッドの作成元の CDialog::UpdateData() を呼び出したりすると Assert が発生する。これは CWnd のポインタが複数スレッドでの共有を許していないからで,PostMessage とかでウィンドウハンドルを使ったメッセージ経由でやりとりすれば大丈夫。

メモリリーク。

AAA *p = NULL;

try
{
    AAA *p = new AAA;

    // 例外を throw する関数呼び出し
    func_with_exception();

    delete p;
}
catch(exception &)
{
    if(p != NULL)
    {
        delete p
    }
}

つまり p というポインタを例外ハンドラで削除しようということだが,p が try ブロックで再定義されている。ので,例外ハンドラで delete しようとする p は当然外の p なので,必ず NULL って感じで。2 日くらい気付かなかった。

VC のデバッガのクイックウォッチ等に独自文字列を入れる方法。

例えば CString では中身の文字列が,CPoint では x と y が表示されるが,これらは実は visual studio ディレクトリ内にある autoexp.dat に指定されている。ヘルプにも載っているが,これを編集すれば自分で作ったクラス等で好きな文字列を表示させられる。

これが java だったら toString メソッドを実行させて表示,とかもっときれいにできるんだろうなぁ。

ダイアログ内でのエディットボックスでの改行。そのままだとリターンが押された時点でデフォルトボタンが押されてしまうので,エディットボックスプロパティの [スタイル]-[改行を許可] をチェック。

ユーザー定義メッセージの作り方

  1. メッセージを必要とするクラスに const static UINT のメッセージ用メンバ変数を用意。
  2. メッセージ番号を ::RegisterWindowMessage(“XXX”); で初期化。
  3. LRESULT OnXXX(WPARAM wParam, LPARAM lParam); を .h のメッセージマップに追加。
  4. ON_REGISTERED_MESSAGE(XXX, OnFilterStart); を .cpp のメッセージマップに追加。