2週間ほど前に、秋葉原でATXケースを買って持ち帰ったのだが、大きすぎて予定の場所に収まらなかった。 メジャーを店まで持っていって測った上で買ったのだが、PCの前後に必要なスペースを甘く見ていた。大失敗。
で、通販で別のATXケースを買った。今日はそれが届いたので組み立て、Windows98をインストールした。 昔のゲームは95系のWindowsでないと動かないものがあるからね。
昨日組み立てたマシンに、UNIX USER 2月号の付録CDでVine Linux 3.1をインストールした。
Vine Linux 3.1にはApacheは最初から入っているがPHPとMySQLは入っていない。 インストールの手順を検索する。で、大変驚いたのだが、
apt-get upgrade apt-get update apt-get install MySQL-server MySQL-Max MySQL-client MySQL-shared apt-get install php php-apache php-mysql /etc/init.d/httpd restart以上のコマンドを打ち込むだけでパッケージをどこかからダウンロードしてきてインストールまでやってくれるのである。 たったこれだけでWebサーバでPHPを実行してMySQLまで使えるようになってしまうのだ(最後のコマンドはインストールに関係ないけど)。 もっともこれが分かるまで何度も試行錯誤したが。
日本語は最初から何不自由なく使えるし、GUIもWindows並みになっていてクライアントOSとしても非常に使いやすい。 自治体や学校でLinuxを使う所が増えている理由がよく分かった。 もっともこんな便利な代物を使っていたのではLinuxの勉強にはならないだろうが……。
しかし正直、キーボードとマウスを2組使うのは疲れるので結局telnetとftpでだけ使うことにした。 95系のWindowsしか持っていなかった頃ならばメインに使うOSを乗り換えたかもしれないが、Windows XPから乗り換えるほどのメリットがないのだ。
正月、「タイムマシン」という映画をレンタルで見た。 前半は面白かったが後半がつまらなかったので、ネットでレビューを検索した。 するとその中に、「タイム・アフター・タイム」の方がずっと面白いのでお勧め、というコメントがあったので、 今日はその「タイム・アフター・タイム」をレンタルで見た。
今回は予備知識を持たずに見たので、これが1979年の映画であるということを知らず、せいぜい5年ぐらい前の映画と思っていた。 見終わった後検索してようやく知った。どうりでやけに映像の描写がレトロだと思った。
とにかく大変面白い映画だった。 ひとつ気になったことは、公衆電話から警察に電話をかける時、「警察の電話番号は911よ。小銭は持ってるの?」という台詞があり、実際に小銭を入れて電話しているシーン。 アメリカでは警察に電話をかけるのに電話代が要るのであろうか。日本では要らないが。
logicoolのコードレスマウス「MX-700」の充電池に寿命が来た模様。 電池切れを示す赤いランプが点滅し、充電台に乗せても赤い点滅が高速になるだけである。 充電中は本来、緑のランプが点滅するはずである。
新しいニッケル水素充電池を買ってきて交換したら直った。 なぜ電池の寿命切れの現象をわざわざ記述したかというと、ネットで報告されている寿命切れの現象がかなりまちまちだからなり。
ATOK用の軍事用語辞書はないものかとふと考えた。 例えば「翔」という字を出すために「しょうかく」を変換しても「翔鶴」が出てこないのは、なかなかに寂しいものと気が付いたのだ。 「ATOK 辞書 軍事」でGoogle検索。うーん見つからない……。
以前から作ろうと思っていたプロフィールのページをヒューレットパッカードに追加した。 本来個人ヒューレットパッカードでは重要なコンテンツのひとつであろうが、面倒臭いので作っていなかった。 正直に言えば、せっかく新調したPCのスペックを誰かに見て貰いたいというのが動機。
歯石がたまっているので歯医者に行く。 超音波スケーラを使って歯石を取るのは毎度おなじみの体験であるが、 その後「塩の粒を飛ばして汚れを取りますよ〜」と何やら見慣れない器具を見せられる。
するとこれが痛い。歯は痛くないが塩の粒子が歯茎や唇に当たって痛い。終わった時には口の中が血まみれであった。 帰宅後ネットで調べると、歯石を取るものではなくヤニや茶渋を取るための手法らしい。 塩の粒が飛び散るので顔や唇にカバーをかけることが多いようだが、私の場合はそんなカバーはなかった。顔と口の周りが塩パウダーだらけである。
Windows XPには何故かzipファイルをフォルダみたいに扱える便利な機能がある。 で、zipファイルをフォルダみたいに開いた状態で中身を他の所にコピーする、という操作をよくやるのだが、 コピーしている時にコピー元のウィンドウを閉じると、コピー操作がエラー終了することが分かった。
コピーされている時は根性で開いたままで居んかい!と理不尽かもしれない怒りをWindowsにぶつける私。
先日、友人とその彼女に会う機会があった。 「今主流のプログラム言語って何?」という話になったので、C,C++,Java,C#を挙げたところ、 「どうして他の言語はCで始まるのにJavaはCavaじゃないの?」と言われた。
「さても面白い発想をする女よ」と感心したが、とりあえず「Cが並んだのは偶然だ」と真面目に流す。
Effective C++(Scott Meyers著)が面白かったので、同じ著者の Effectiv STL を読む。 そこで、
[category] key1=value1 key2=value2 ...というファイルを読み込むプログラムをSTLを用いて書き直すことにした。 多分そんなライブラリ探せばあるはずだが、STLの勉強、趣味用なのであまり効率重視ではない、探すの面倒という理由で自作で。
このプログラム、6年前に書いた物を使い続けているのだが、衝撃的な恐怖の事実が! 恥ずかしすぎることなので、この日記に書くのもためらったのだが、自戒と自分への罰への意味をこめて公開。
class TStringTable { private: char *Data; public: TStringTable(int size){ Data = new char[size]; } ~TStringTable(){ delete Data; } };強調部はdelete[] Data;と書かなければならない。 で、このクラスで1MBのメモリを確保するような使い方をしていたので、6年間の長きにわたって 生成と破棄のたびに1MBメモリリークするようなクラスを使い続けてきたのだ。 修正や機能拡張がなかったので、このあまりにも初歩的なミスが残っていたのだ……!
STLを用いた新版ではvector<char>に置き換えたので、そもそもnewがなくなった。
まいと〜くFAX7を使ってFAXを送る。 このバージョンを使うのは初めてなのだが、テキスト入力の使いづらさが前バージョンからまるっきり変わっていない。 シート(?)の上にテキストや画像を配置するという仕組みになっているのだが、 テキストの入力文字数に一定の上限があって、それを超えた分は切り捨てられてしまうのだ。 内部で固定バッファを取っているとしか思えない。
次に新しいバージョンを入れる時は他のFAXソフトを試してみるかのう……。 と言ってもWindowsのメジャーバージョンが変わった時しか入れ替えないので、そうすると次はLonghornなわけだからまだ3年は先であろうよのう……。
Windows XPが起動しなくなった。 最後にやったのはDVDの再生で、シークしようとしたらフリーズし、Ctrl+Alt+Delも効かないのでリセットボタンを押したら起動しない状態になっていた。
そんなわけで今日は一日復旧作業だった。Windows XPを再インストールした後SP2を入れたのだが、何てこった、SP2を入れると画面の設定やらIEの設定やらが色々初期状態に戻ってしまう。 ついでにA.K OfficeのSP+メーカーでWindows XP SP2のインストールディスクを作成。 しかしこれはSP2や修正プログラムを300MB近くダウンロードしなければいけないので、ついでにやるものではない。
久しぶりにLuaの話題を。Luaから呼び出されたCの関数で、Luaの現在実行中の行番号を調べる方法。 マニュアルに書いてあるのだが、結構試行錯誤したのでせっかくだから書く。
static int LF_testfunc( lua_State *L ) { lua_Debug ar; if(lua_getstack(L, 1, &ar)){ lua_getinfo(L, "l", &ar); printf("Line:%d\n", ar.currentline); } lua_settop(L, 0); return 0; } ... lua_register(L, "testfunc", LF_testfunc); ...これでLuaの側からtestfunc()を呼び出すと、呼び出した側の行番号が出力される。 関数の引数が間違っている時にエラーメッセージを出す時、行番号がないとスクリプトのどこでエラーになったか分かるわけないからね。
いい年をしてまだ週間少年ジャンプを読んでいる。
時々手の指が増えることで有名な「テニスの王子様」だが、
今週のテニスの王子様、また増えてないか?に笑った。
特に
世界で一番美しい指を作ったと思う。に爆笑。
同じく著名漫画家が描いた原稿に対して
ネームのような描き方がおかしいと難癖をつける人はいない。
それと同じこと。(談.許斐剛)
しかし一部で有名な「当ててんのよ」については、読みきりが掲載されたのが忙しい時期だったため、読みきりを読み飛ばしてしまった。すぐ捨ててしまうので手元にも残っていない。 読みたかった……。しかもWebで調べてみたらこの台詞は一度ならず何度も使われるらしい。ああ読みたかった……。
D言語でyaneSDK4thを使ってみることにする。すると、コンパイルエラー
C style cast deprecated, use cast(type)が出る。最後の更新が1年前だから、その間にDコンパイラのバージョンが上がっちゃったのね。 高速化のためか、ポインタを別の型へのポインタにキャストして参照先にアクセスしているコードが大量にある。 yaneSDKはVisual C++ .NETのmanagedオプションを有効にするとコンパイルできないそうだが、さもありなん。 こう書くと悪口を書いているようだが、managed codeとyaneSDKの思想は全く逆なのでそれが当然なのだ。
仕方ないのでキャストの書き方を修正して再コンパイルしてみた。
すると今度は
cannot implicitly convert expressionが大量に出る。「floatをintに暗黙変換することはできん!」などと怒られているわけだ。
大量に出るコンパイルエラーを直してまで使うのも気が進まないので、いさぎよく挫折することにする。 何でこんな今さらなことをしたかについてはいずれ明らかにされるであろう。
無線マウスMX-700の左ボタンがおかしくなった。 やけに沈み込みが深くなり、押すとき「ガチッ」という激しい違和感がある。 調べてみるとこの症状になることは割と多いようで、表面のボタンと内部のマイクロスイッチの間隔が開いてしまっているのが原因らしい。 ボタンの裏にテープなどを貼れば直るらしい。 しかしこのマウス、外側にネジがひとつたりとも無い。どうやって分解するんだ。
買ってから8ヶ月であり、保証期間内なのでロジクールに修理を依頼しようと考えた。 2chで「運が良ければMX-1000との交換になることがある」という書き込みを見かけたし。 ところが保証書に店名と購入日が書いてない。ではレシートを……と探すと何故か見つからない。 5千円以上の買い物のレシートは必ずとっておくことにしているのだがなぁ……。
マーフィーの法則「保証書やレシートをなくした品物は故障率が高くなる」
秋葉原で有線マウスMX-510RDを購入。使ってみたところ、自分はどちらかといえば無線マウス派であることが分かった。 多少重くても無線の方がいい。いや、MX-510RDはいいマウスなんだけどね。
ついでに初めて神保町に行ってみる。 神保町への行き方を調べるため、MapFan住所で検索してみると、千葉県船橋市神保町がヒット。 なるほど神保町は船橋にあったのか……ってそんなわけはない。 書店街の神保町の住所は「神田神保町」であることを初めて知る。
さらには駅名表示を見て、神保町は「じんぼうちょう」と読むことを初めて知る。 ずっと「じんぽうちょう」だと思っていた。
さて神保町駅を降りて歩き出すと、行けども行けども書店はちらほらとしかない。 持参の地図を確認した結果、書店街とは反対の方向に歩いていることが判明。 例えて言えば秋葉原駅から神田の方向に向かって歩いて「電気街が無い!」と怒るのと同じだ。 苦い思い出がまたひとつ……。
とにかく神保町は不案内であり、雨のせいもあって成果はなかった。行き方が分かっただけでも成果としよう。
私はVisual Studio .NET 2002を使っている。これでLuaをビルドしようとするとエラーが出てできなかった。 http://lua-users.org/wiki/BuildingLuaに、 いくつかのコンパイラに対応したプロジェクトファイルなどがあるが、私の環境に合う物はない。 Visual Studio .NET 2002でVisual Studio .NET 2003のプロジェクトファイルを開こうとするとエラーになる。
そんなわけで、Visual Studio .NET 2003のプロジェクトファイルをテキストエディタで開いてコンパイルできるオプションを探した。 プロジェクトのプロパティで、
さて会社では暇な時にこっそり自分のプログラムを書いている。今は全然暇じゃないからやってないが。 開発環境としては、Microsoft Visual C++ Toolkit 2003に含まれているコンパイラと Platform SDK UpdateにあるWindows XP SP2 SDK(名前にWindows XPが付いているがWindows 2000でも使用可)に含まれているライブラリを使用している。 これらはフリーで使用できる。 勿論IDEだのデバッガだのは付いてない。 他に、スタティックライブラリ(libファイル)が作れないとか、makeコマンドが含まれていないなど地味な制限がある。
SDLとLuaを使用するプログラムをビルドする場合、こんな感じになる。 libファイルが作れないという地味な制限のおかげで、Lua関係のプログラムは全てobjファイルとして列挙しているところが情けない。 しかし今気が付いたのだが、Luaのlibファイルはhttp://sourceforge.net/projects/lua-users/のWin32 Binaryの所からダウンロードできるので、それが使えるかもしれない。
cl -c foo.c bar.c ..\SDL-1.2.8\src\main\win32\SDL_win32_main.c -I"C:\Program Files\Microsoft Visual C++ Toolkit 2003\include" -I"C:\Program Files\Microsoft Platform SDK for Windows XP SP2\include" -I"..\SDL-1.2.8\include" -I"..\Lua-5.0.2\include" /MT link foo.obj bar.obj SDL_win32_main.obj lua\lapi.obj lua\lauxlib.obj lua\lbaselib.obj lua\lcode.obj lua\ldblib.obj lua\ldebug.obj lua\ldo.obj lua\ldump.obj lua\lfunc.obj lua\lgc.obj lua\liolib.obj lua\llex.obj lua\lmathlib.obj lua\lmem.obj lua\loadlib.obj lua\lobject.obj lua\lopcodes.obj lua\lparser.obj lua\lstate.obj lua\lstring.obj lua\lstrlib.obj lua\ltable.obj lua\ltablib.obj lua\ltests.obj lua\ltm.obj lua\lundump.obj lua\lvm.obj lua\lzio.obj SDL.lib /LIBPATH:"C:\Program Files\Microsoft Visual C++ Toolkit 2003\lib" /LIBPATH:"C:\Program Files\Microsoft Platform SDK for Windows XP SP2\Lib" /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:uuid.lib /SUBSYSTEM:WINDOWSこのフリー開発環境でビルドすると問題なく実行できるのである。 そんなわけで、Visual Studio .NETを持っているにも関わらず、これらを自宅のマシンにもインストールした。
テクニカルエンジニア・データベースの試験が終わった。 平日は23時まで残業、休日は試験勉強とどうにも疲弊する日々であったが、これでやや一息。
受ける前は、午前は無問題、午後Iは楽勝、午後IIが難関、と考えていたが、 午後Iはどうにも時間が足りなくて7割程度しか埋められなかった。今年も落ちたか。 大体90分で3問もできるかっつうの!!(逆ギレ) ここで必要なのはとにかく迅速に回答する訓練であった。
午後IIはやたらに簡単でほぼ回答できた。 午後Iで落ちた場合は午後IIは採点されないので、ひたすら虚しい。
1月、突如タイピングゲームを作りたいと思った。 となればFlashでしょうと思って、フリーのFlash作成ツールParaFlaを使ってみた。 アクションスクリプトの使い方が分からず挫折した。
ではまあD言語+yaneGameSDK4thでやってみましょう。と思ってやってみた。 D言語のコンパイラのバージョンが上がっていてコンパイルできなかった。挫折した。
結局C言語で作って公開した。 ついカッとなってC言語を選んだ。今は反省している。 開発中にC++に乗り換えたいと思ったこともあるが、Cで作り始めた物を途中でC++にしたら負けかなと思った。
Luaでイベントを制御している点、一応技術習得の成果はあった。 でも、やっぱりC言語は過去の言語だと思う。次はC++かC#かDだね。
この前、MX-510RDを買った時に、自分には無線マウスの方が向いていると書いた件について。 私がマウスを評価する際は主にドット絵の描きやすさで評価する。 というか、それ以外の面では比較できるほどの差が無い。 ドット絵描く時はある程度マウスが重い方が都合がいいというのもある。
そこで、
動きの激しいマウス操作ゲームやる→有線マウス
ドット絵描く→無線マウス
そんな感じで選ぶと良いのではないかと思う。
SDLで半透明描画をすると結構重い。 打打打ー打・打ー打打では、フェードイン・フェードアウト時に SDL_gfxのboxColor()関数で画面全体に黒の半透明描画をしているのだが 職場にあるPentium III 550MHz のPCで試すと、本来30のFPSが20を切るぐらいまで落ちる。
何の変哲もない2Dゲームを作る場合でも、OpenGLとか使うべきなのだろうかと悩んでいる。 Pentium III 550MHz クラスのメーカー製PCだとかえってそっちの方が遅そうでもあるが。
SDL_gfx の半透明描画は遅いような気がするので、久しぶりにOpenGLを使ってみた。 並行投影で2D描画をするようにし、640*480の矩形の半透明ポリゴンを表示し、 フェードイン・フェードアウトに使用できるかどうか調査。
すると、PentiumIII 550MHz (ATI 3D RAGE PRO) のマシンでは、FPSが8〜9ぐらいしか出ない。 SDL_gfx の boxColor()で640*480の半透明矩形描画を2回行った時でFPSは20前後なので、 単純に考えて4倍以上遅い。
古いPCもターゲットとする、純粋な2Dゲームを作る場合、下手に OpenGL 使わない方がいいかも? と言っても今回の実験対象PCは古すぎるかもなあ……。
Vectorにタイピングゲームを登録したら、「学習&教育→キーボード練習」に分類されてしまった。 ゲームのつもりなのだが。
何の気無しに購入した棟田博著「陸軍よもやま物語」を読んでいたら、「拙著『拝啓天皇陛下様』……」というくだりがあった。 「拝啓天皇陛下様」といえば、渥美清主演の邦画であることは知っていたが、思いがけなくそれに原作があることを知った。 近く読んでみたいと思う。
ところで、この本には昭和5年の特別大演習で大元帥陛下(昭和天皇)を著者が目撃した際の挿絵が入っているが、眼鏡をかけていない。 はて昭和帝は眼鏡をかけていなかったかと調べてみたら、確かに若い頃はかけていなかったようだ。 インターネットは便利だ。
テクニカルエンジニア・データベースは合格していた。 採点結果は午前 680,午後I 610,午後II 630で、合格最低基準が600点なのでぎりぎりであった。 午後Iで落ちたと思っていたのだが、午後IIの採点が同じぐらい低かったのにはいささか複雑さを感じる。
2〜3年で問題がかなり変わるネットワークに対し、データベースは何年も同じような問題が出るので 後者の方が難易度は低いような気がするのだが、なぜか合格率は同じぐらいである。 ……そうした感想は両方合格してから口にすべきことであろう。
今日は、C++Builder6のVCLで悩むことがあった。 TForm のOnPaintイベントで、以下のようにHDCからBitBlt()していたのだが、 初期状態だとこのイベントの前にTForm全体が背景色で塗りつぶされてしまうため、ちらつく。
void __fastcall TForm1::Form1Paint(TObject *Sender) { // hdcBufferからBitBltする。 HDC hdc = GetDC(Handle); BitBlt(hdc, 0, 0, ClientWidth, ClientHeight, hdcBuffer, 0, 0, SRCCOPY); ReleaseDC(Handle, hdc); }
この現象はDelphiユーザーの間では割と常識らしく、Delphiでは以下のように書けば塗りつぶされなくなるとのこと。
ControlStyle := ControlStyle + [csOpaque];しかしC++Builderではどう書けばいいのか。
ControlStyle = ControlStyle + csOpaque;と書くとコンパイルエラーになる。
色々な演算子で試行し、ようやく次のように書くことが分かった。
ControlStyle = ControlStyle << csOpaque;C++BuilderのHelpには書いてない。いや、TControlStyleという型はSetをこのようにtypedefしていますよ、 という説明はあるから、私がDelphiとC++の文法に習熟していれば悩むような問題ではないのだろう。 Setというのは、Helpによれば
Delphi 組み込み型 Set を実装する C++ クラステンプレートなので、演算子<<はSetでその動作が定義されているわけである。
「陸軍よもやま物語」の著者の作品「陸軍いちぜんめし物語」を読む。 「陸軍よもやま物語」は著者の陸軍での体験を綴るものだったが、「陸軍いちぜんめし物語」は 著者が直接体験したことでない事柄も、陸軍関係で面白いエピソードなら書くという形式で、これはまた別種の面白さである。
本著を読んで初めて知ったのだが、日華事変が始まる昭和12年頃までは眼鏡をかけた現役兵や金歯の現役兵は皆無だったそうである。 つまり眼鏡や金歯の男子は甲種合格できなかったわけだ。 それが戦争が長引く内に眼鏡や金歯の兵隊は段々増え、ついには珍しくも何ともなくなったとのことである。 我々が日本兵と聞いて思い浮かべる眼鏡の兵隊さんは、皮肉にも兵隊の質の低下の象徴であったわけだ……。
「坂の上の雲の真実」(菊田愼典著)を読む。 読む前は、司馬遼太郎は誇張癖があるが、まさか事実と全然違うことは書いていないだろう、と思っていた。
本著は主に「坂の上の雲」における秋山真之の虚像を指摘している。
坂の上の雲 | 指摘 |
(日本海海戦の前)あらたまった会議を開かなかった。 | 東郷司令長官は各艦隊司令官および各艦隊参謀長を招集して会議を開いた。秋山参謀は参加どころか陪席もできなかった。 |
真之の心気はこの時期みだれつづけ、敵のコースを予測するについて不動の判断というものがなかった。 | 秋山参謀は津軽海峡に敵が来るとする北進論者であり、先の会議で対馬海峡で待つことに決まった後も、持論に固執した。 大本営に「いついつまでに敵影を見ざれば、北海方面に移動す」という電報を何度も打ちさえした。 |
島村の考えでは作戦は天才がやるべきで、階級が上位だからといって自分のような者が小知恵を働かすべきではない | 作戦計画は嶋村参謀長が有馬作戦主任参謀と協議して大綱を定め、(中略)秋山参謀に文案を作成させるのを常とした。 |
ロシア側のマカロフ中将が戦死した機雷の沈置は、真之が提案した。 | 「吾妻」艦長藤井較一が上村彦之丞第二艦隊司令長官および加藤友三郎第二艦隊参謀長に進言した。 秋山参謀は誰が機雷沈置を進言したかさえ知らなかった。 |
他にも山本権兵衛が「秋山の名文はよろしからず」と語った噂があるとか、 「三笠」艦上の東郷長官の絵の秋山参謀は後年に描き足されたものであるなど色々あるが、興味のある向きはぜひご一読されたい。
また著者は、司馬遼太郎は何故事実と異なる秋山賛美を行ったのか、について推測している。 秋山真之は50歳の若さで亡くなったが、嶋村速雄が悼辞で「秋山は天才だった」と誉め称え、 また東郷長官の幕僚が機密事項や秋山を含む他人の短所を全く語らなかったことで、 「秋山伝説」が作られ司馬遼太郎はそれに基づいた小説を書いてしまった……と結論している。
もっとも私は、司馬遼太郎はたとえ真実を知っていても「坂の上の雲」をああいう内容にしたのではないか、と思うが。 ところで本著は海軍の話だけで陸軍の話は全く出てこない。同じように陸軍の描写に突っ込んだ本はないものだろうか。
DelphiおよびC++BuilderのVCLと呼ばれるライブラリには、Graphics::TBitmapという画像管理クラスがある。 DDBまたはDIBのビットマップを管理して画像の取り扱いを容易にするクラスだ。
ではTBitmapとWindows APIであるCreateDIBSection()の親和性はどんなものだろう? 以下のようにすることで、ピクセル領域を直接操作できるTBitmapを作成できる。
Graphics::TBitmap *bitmap = new Graphics::TBitmap(); BITMAPINFO biBMP; LPDWORD lpdwPixel; ZeroMemory(&biBMP, sizeof(biBMP)); biBMP.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); biBMP.bmiHeader.biBitCount = 32; biBMP.bmiHeader.biPlanes = 1; biBMP.bmiHeader.biWidth = 256; // サイズは何か任意の値。 biBMP.bmiHeader.biHeight = 256; HBITMAP hbmpBuffer = CreateDIBSection(NULL, &biBMP, DIB_RGB_COLORS, reinterpret_cast<void **>(&lpdwPixel), NULL, 0); // 持っているハンドルの所有権を放棄する関数だが、不要かも? // この関数は持っていたハンドル(HBITMAP)を返すが、作成直後の場合はNULLが返る。 bitmap->ReleaseHandle(); bitmap->Handle = hbmpBuffer;
TBitmap::ScanLineでピクセルにアクセスできるのでこういうことをする必然性は低いかもしれない。 今回このようなことをしたのは、自作のピクセルを直接操作する関数をそのまま使いたかったためである。 また、CreateDIBSection()で作成されたピクセル領域を操作するライブラリを使用できるかもしれない。
CreateDIBSection()を知っている人には蛇足であろうが、lpdwPixelが指しているピクセル領域は下から上に行が連なっているので注意。
横山信義「東京地獄変」を読む。東京の市ヶ谷に1メガトン水爆が落ちたら、というパニック小説だ。 何やら陳腐な設定にも感じられるが、非常に面白く、この土日で上下巻を読み終えてしまった。
作品群を調べてみると、著者はパニック小説よりは歴史イフ小説の分野で有名らしい。 十巻近くある架空戦記小説が多く、「東京地獄変」は著者にすればむしろ短編の部類のようだ。
検索で、架空戦記の作品評(無断リンク) を見つけた。これは大変役に立ちそうだ。 多分著者は戦記ファンには有名なのだろうが、私はこういうページを参考にしないことには、 例えば「修羅の戦記」が「修羅の波涛」の続編であることなど分かるはずもない……。
Windows XPのzipファイル作成機能で、末尾が「.zip」で終わる名前のフォルダをzipファイルにしようとすると、 「zipファイルをそれ自体にすることはできません」というエラーメッセージが表示される。 名前の後ろにさらに「.zip」をくっつけてzipファイルを作成すればいいと思うのだが。
フランスのビール「DESPERADOS」を飲む。妙に甘ったるい感じなので、 「はて間違えてジンジャエール風アルコール飲料でも買ったか」 と思って調べてみたら、確かにビールのようだ。 自分が日頃考えているビールと全く違うので驚いた。
とあるサイトで、久しぶりにJavaアプレットの脱衣ブロック崩しゲームをやる。 クリア後、記念に画像をとっておこうとHTMLのソースを見てURLを打ち込んだ。が、ファイルが見つからない。
5分ぐらい首をひねって考え込んでしまった。 何のことはない、jarファイルにclassファイルと一緒に入れてあった。 jarを解凍するためにわざわざJ2SDKをインストールした。 そういえばもう半年以上JavaをWindowsで使ってないなあ。
そうめんを作ろうと思って近くのスーパーに麺とつゆを買いに行ったが、 そうめんのつゆが見つからなくて悩む。
少し離れた大きなスーパーに行くと、そのものずばり「ストレートそうめんのつゆ」が幾つか見つかった。 つくばに居た頃は自転車で少し走れば何でも手に入ったものだが、 今は「あのペンはあそこの店にしか見あたらない」「あのパスタソースはあの店にしかない」 と面倒臭いこときわまりない。
つくばを離れてからは、当然に、富士泉で飯を食うことができない。 麻婆豆腐は無理でも豚汁ぐらいは自分でも似たようなものを作ることができないかと考え、 キャベツ、もやし、韮、豚肉を炒めた後、豆腐を加え、 インスタント味噌汁の味噌2食分を水100ccに溶いたもので煮てみた(もやしと豆腐から水が出るので水は少なめ)。
富士泉の豚汁は玉葱と人参も少し入っていたような気がするが、何となく似てるんじゃないかというものができた。
大学時代の友人と久しぶりに会う。 幸いにFF10について話題が合ったので、私の考案した必殺のギャグを披露したが、ことごとく不評であった。
「饒舌」「寡黙」の「寡黙」……ってよォ〜〜。 「饒舌」ってのは、わかる……スゲーよくわかる。 「舌」が「饒(ゆたか)」ってことだからな……。
だが、「寡黙」ってのはどういう事だああ〜〜〜っ!? 「黙」が「寡(すくない)」ってのはお喋りってことじゃねーのかよーーーーーッ!
どういう事だ!どういう事だよッ!クソッ! 寡黙ってどういう事だッ!ナメやがってクソッ!クソッ!
試用版が公開されているペイントツール「sai」を本格的に使ってみた。 かなり以前に試した時は「openCanvas」に似ているかな?という程度の感想しか抱かなかったが、 どういう理屈かわからないけれども非常にスムーズに描ける。 そういうわけで非常に久しぶりに時間を掛けて絵を描いた。
電波の届かない所に置いていた電波時計と、NTPで定期的に時計合わせしているパソコンの時計が10分ほどずれていた。 当然ずれているのは電波時計の方と思って電波の届く位置に置いて電波受信させたのだが、 実際には電波時計のずれは1分半ほどの遅れで、 パソコンの方が8分ほど進んでいた。
最後にNTP自動同期したのは今日の午前10時になっており、NTPといえども(NTPだからこそ?) ネットワーク状況が悪いとかなり時刻がずれるようだ。
テクニカルエンジニア・ネットワーク。 データベースと同じで午後Iで時間制限が苦しかった。午後Iが120分で午後IIが90分だとちょうどいいと思う。
Luaスクリプトを動かしていると、Luaを実行しているC++プログラムごと落ちた。 そこで何が悪かったかというと、C/C++からLuaを呼び出す時は lua_getglobal() の後 lua_call() か lua_pcall() か lua_resume() するわけだが、 存在しない関数を呼び出そうとすると、lua_getglobal() はスタックに nil を積んでしまう。 その状態で lua_resume() すると落ちるようだ。
そういうわけだから、当たり前だけど lua_getglobal() が関数を引けたかどうかの判定が必要である。
int call_lua(lua_State *L, const char *funcname) { lua_getglobal(L, funcname); if(!lua_isfunction(L, -1)){ lua_pop(L, 1); /* 関数じゃない何かの値だったら捨てる。 */ return -1; } /* 関数が引けたら実行。 */ int result = lua_resume(L, 0); if(result == LUA_ERRRUN){ if(lua_isstring(L, -1)){ /* 実行時エラーメッセージ出力。 */ printf("%s\n", lua_tostring(L, -1)); } } return result; }
今まで割と決まり切った名前のLua関数だけを呼び出していたのでこのような基本に気が付かなかった。
C++の些細な話題。 C++にはconstメンバ関数があり、このメンバ関数はインスタンスのメンバを変更しないことが保証される。
constが付いてない純粋仮想関数をconstメンバ関数で実装しようとするとコンパイルエラーになった。
class A { public: virtual void f(void) = 0; }; class B : public A { public: virtual void f(void) const { cout<<"foo\n"; }; };この例では class A の純粋仮想関数にも const を付けないといけないようだ。 子クラスに実装を全面的にまかせるという意味で、 const の付いてない純粋仮想関数を const 付きの仮想関数で実装できてもいいんじゃないかと感じたが、 まあ言語仕様上のきちんとした理由があるのだろう。
Geforce2 MXの付いたWindows98マシンのビデオカードドライバを久しぶりに更新した。 すると、SDLを使用したプログラムが無条件にブルースクリーンで落ちるようになってしまった。
最初は自分が何かプログラムに変な処理を入れたせいと思ったが、どうも初期化処理でいきなり落ちているようである。 HighColorにしてみたりTrueColorにしてみたりしているうち、リフレッシュレートが ドライバの更新前は「60Hz」だったのが「最適」になっていることに気が付いた。 使用している液晶ディスプレイでは「60Hz」より大きくしても意味無いのだが、何故か「75Hz」になっている。
リフレッシュレートを「60Hz」に戻すとSDLプログラムは正常に動くようになった。 しかし……何故であろうのう……。 vsync待ちとかはしてないし、いや、そもそも初期化処理で落ちたのだからvsync待ちは関係ないか?
2005/2/8付の日記の内容に間違いというかまずいところがあることに気付いたので修正。 ついでに今日の日記に再掲する。 修正内容は、lua_getstack() が成功(失敗時は0)したことを確認すること。 lua_getstack() が失敗した時に lua_getinfo() するとCプログラムごと落ちることがある。
lua_getstack() が失敗するのはどんな時かというと、 具体的には lua_sethook() で登録した関数の中で行うと失敗する場合があるようだ。 というか割合失敗しないことが多いので今まで気が付かなかった。Luaから呼び出されたCの関数で、Luaの現在実行中の行番号を調べる方法。
static int LF_testfunc( lua_State *L ) { lua_Debug ar; if(lua_getstack(L, 1, &ar)){ lua_getinfo(L, "l", &ar); printf("Line:%d\n", ar.currentline); } lua_settop(L, 0); return 0; } ... lua_register(L, "testfunc", LF_testfunc); ...これでLuaの側からtestfunc()を呼び出すと、呼び出した側の行番号が出力される。
Vine Linux 3.1上のphp 5.0.5でpcntl系の関数を使おうとすると 「Call to undefined function: pcntl_fork()」というエラーになった。 マニュアルによると
PHPがサポートするプロセス制御機能は、デフォルトでは有効となっていません。 プロセス制御機能を有効にするには、PHPをコンパイルする際に configure のオプションに --enable-pcntl を付ける必要があります。
といってもapt-getとかGUIのパッケージ管理ツールで楽してインストールしているので、 ソースからのビルドなどやっていない。 新たにインストールすると競合したりして何かまずいことになりそうで恐い。
検索するとPHPの標準拡張モジュールを後から追加する方法が見つかった。 パッケージ管理ツールでPHP5-develをインストールして、現在入っているバージョンと同じバージョンのソースを用意し、
tar xvzf php-5.0.5.tar.gz cd php-5.0.5/ext/pcntl phpize ./configure make su make installするとpcntl系の関数が使えるようになった。
今日はLuaの変数をTinyXMLを使用してXMLに保存し、再び読み込むプログラムを作成した。 入れ子になっているLuaテーブルの内容も保存できる。
……が、考えてみればLua自身がファイル読み書きの機能を持っているのだから、local function save(fp, tbl) local count = 0 fp:write("{\n") table.foreach(tbl, function(key, value) if count > 0 then fp:write(";") end if type(value) == "table" then save(fp, value) else fp:write(key.."=".."'"..value.."'\n") end count = count + 1 end ) fp:write("}\n") end function save_to_file(filename, savedata_table) local fp = io.open(filename, "w") if fp == nil then return false end fp:write("return\n") save(fp, savedata_table) fp:close() endというようにテーブルをLuaスクリプトに出力するLuaスクリプトを書いて、ロード時は
loaddata = dofile(savefile)とすればよいことである。 (セーブデータをLuaスクリプトにする)。
XML出力プログラムを作成してから上記のことに気が付いた。ひたすら虚しいので、公開は保留。
たまたま現在開発中のゲームが、ほとんどLuaで制御されているために先走ってしまったが、 セーブデータがLuaの変数だけとは限らないので、 Lua変数をXMLのひとつのelementに保存する手法は、やはり多分、有用だろう。
TinyXMLは、JavaとC++に同じ名前のライブラリがあるが、全く別物であるようだ。 昨日使用したのはC++の方のTinyXMLである。 UTF-8を扱うためにbabelを導入したりもして疲れた。
本当は、何か違う条件でビルドしたライブラリを間違えてリンクして、 実行中にメモリ内容が壊れる実行ファイルを作ってしまうという下らないミスの方で苦しんで疲れた (C++BuilderのIDEでビルドしたlibファイルをコマンドラインツールでリンクしただけなのだが)。
Lua変数をXMLに保存する方法を公開した。 XMLのelementの名前を数字で始めてはいけないことを初めて知った。
非常に今さらながら、プレステ2のソフトをHDDにインストールして動作させる方法があることを知ったので、 HDAdvanceとネットワークアダプタと日立の160GB HDDを購入してやってみた。
FFXとドラクエ8で、共に戦闘画面とフィールド画面の切り替えが劇的に速くなった。 しかしFFXは既にデア・リヒターを倒すほどにやり込んだのでいささか虚しい。 ともあれ今後はDVD-ROMドライブの消耗も抑えられるわけでまあ良かった。
せっかくなので、やりかけたまま放置していたドラクエ8を再開。 前回は変身後ドルマゲスとの戦いでMPが切れて全滅したのでそこでやめていた。
攻略ページを見ると、対戦前に回復の泉に寄らなかったのがまずかったようだ。 このゲーム、視点をあちこち動かしてみないと気が付かないことが多い。
また全滅するのも面白くないので、攻略ページの錬金レシピを見て卑怯にもケイロンの弓(道具として使うと全員回復の効果)を作成。 するとあっさり勝った。
朝起きてメインマシンを起動すると、インターネットに繋がらなくなっていた。 というかネットワークに繋がらず、ルータや他のPCへのpingも通らない。
当然最初はケーブルやスイッチングハブを疑ったが、他のPCは正常にネットワークを使用できるし、 ケーブルを変えてもスイッチングハブのポートを変えても状況に変化はない。
ふと、pingをうちながらスイッチングハブを見ると、LEDが全く点滅しない。 他のPCでpingをうつと、送受信のLEDが点滅するので、どうもこれはパケットが送出できていないようだ。
そこで今度はソフト的な障害を疑ってドライバを再インストールしたりWindowsまで再インストールしてしまった。 しかし、ハードウェアの障害と結論せざるを得なかった……。 ARPテーブルだけは不規則ながら更新できているところを見ると、送信機能だけが故障して受信機能は生きているのだろうか (他のノードが定期的に送出するARPメッセージを拾っている?)。しかし全く何の役にも立たない推測である。
結局、新しいNICを買ってきて付けると、何の問題もなく通信できるようになった。 ところで新しいNICは秋葉原のドスパラで850円だったが、BUFFALOのPCI用10BASE-TのNICが新品500円で売っていた。 今時PCIで10BASE-TのNICというのは探してもない代物なので気づかず危うく買うところであった。
テクニカルエンジニア・ネットワークに合格。
午前:715点
午後I:700点
午後II:665点
午後Iが800点満点で700点というのは不思議だ。 何しろ時間が足りなくて答えの2割ぐらいは空欄で出した。埋めた回答にしてもあまり自信はなかった。
boost::regex をC++Builder6で使う際、今まではディレクトリ/条件の条件定義に BOOST_REGEX_NO_LIB と書いてプロジェクトにライブラリファイルを追加していた。 しかし、Boost.Regex: Installationによると makeコマンドでライブラリをインストールできるようだ。
私は軟弱なので、Windowsユーザー向けにGUI操作でboostライブラリをインストールしてくれちゃう インストーラがあれば良いのにと思った。