或曰

土曜日, 12月 29, 2007

帰省

午後になり雨が上がったため、明日を待たずに帰省することに。

その前にバイクの修理。
帰省に使うバイクはこの一週間、ハイエースに積みっぱなしになっている。先週末に冨士スピードウェイ・ショートサーキットに走りに行った際、走行中にチェンジロッドのネジが外れて周辺パーツを破損したため。修理に必要なパーツはすぐに発注して火曜日には届いていたのだけれど、この一週間は年末で飲む機会が多かったためバイクを修理せずに電車通勤してた。
修理パーツ片手に駐車場まで移動し、ハイエースにバイク積んだままの状態で破損したパーツを交換。車の中でバイクにまたがってシフトペダルの位置を調整、ネジ止め。今度は走行中に外れないよう、しっかり締め付けておかないとね。
終わったところでハイエースを自宅マンション前まで持ってきて、バイクを下ろす。バイクから外していたミラーを取り付け、飛散防止用のテーピングもはがし、サーキット走行仕様から公道仕様に復帰。

ThinkPad X22 と分散システム本をシートバッグに詰め込み、着替えて出発。途中、首都高で事故渋滞があったがバイクには大して影響なし。こういうときは二輪は便利。東北自動車道で雨が降ってきて、急遽 PA に駆け込んで合羽を着込む。こういうときは二輪は辛い。

後は特にイベントはなく、無事に実家着。

ラベル:

木曜日, 12月 27, 2007

年末年始

12/29 にツインリンクもてぎのロードコースを走ろうと思ってたけど、雨が降りそうなのでキャンセル。残念だ。

年末年始はもてぎの ASTP (サーキットではなく交通教育センターの方) で年末年始特別プログラム開催ということで、1/1のコーナリング特訓コース(2輪)予約。

年末は 28, 29 と天気が悪そうなので 12/30 に帰省して1/3上京かな。1/3 は富士スピードウェイに走行枠があるけど、帰りの東名高速で渋滞に巻き込まれること確定なのでパス。冬休み中は、1/1 に走りに行く以外は本読んでゴロゴロしてる予定。

ラベル:

お買い物


今年の冬休み課題図書は、これに決定。分散システム本。

あと Amazon で使ってるデータストレージバックエンドである Dynamo と Google で使っている分散処理のためのプログラミングモデル MapReduce の paper も。

Google、調べてみたら 結構 paper 出してるのね。全部読む暇はないけど、どのあたりが面白そうかな?

ラベル:

火曜日, 12月 25, 2007

Sequoia

メモリ階層をプログラミングモデルに取り込もうという話。スタンフォード、面白いことやってるね。

今後マルチコアプロセッサシステムが一般的になると同時に、ネットワークが張り巡らされて多数のシステムが連携して動作する Grid/Cloud computing が浸透してくると、今のようにプリミティブな API 呼び出して排他制御・分散処理を制御していくのは難しくなってくる。

これまでは HPC やシステムプログラミングのような一部の分野でだけ意識されていたような話が広範な領域で必要になり市場が一気に拡大するわけで、そうなるとこの領域への資金や優秀な研究者といったリソース投入量も増える。しばらくはこの周辺、ホットな話題が多そうだ。

そういえば、個人的には面白いけどあまり使い途がなかった分散アルゴリズムの知識とかも(動的ルーティング制御の理解に役に立ったぐらい)、今後は役に立つ場面あるのかな。

ラベル:

日曜日, 12月 23, 2007

Good-bye ATL

ATL/WTL に依存していた部分を素の C++ で書き直し。これで VC++ Express Edition でも動くかな。

Windows プログラミングを C++ で行う際に面倒なのは、ウィンドウプロシージャに this ポインタを渡すこと。SetWindowLongPtr(), GetWindowLongPtr() を使ってウィンドウハンドルに this ポインタを関連付けるにしても、CreateWindowEx() した時点で WM_MINMAXINFO などいくつかのメッセージが飛んでくるため、それをメンバ関数で処理しようと思うと、結局は一度 this ポインタをグローバルな領域に書いておく必要がある。

ATL では 一度グローバル変数 _Module からたどれるデータ構造にスレッドIDをキーにして this ポインタを書き込んでおいて、後でウィンドウプロシージャを thunk に差し替える という方法を採用している。

あそこまで作りこむのは面倒なので、多少パフォーマンスが落ちるがお手軽なところで手を打っておく。次のような内容の thunk を作成し、これを最初からウィンドウプロシージャとして登録。
  1. 第一引数に渡ってくるウィンドウハンドル (hWnd) をメンバ変数に保存
  2. hWnd を this ポインタに差し替え
二回目以降は最初の処理が無駄になる。第一引数の hWnd は、関数が呼ばれた時点では %esp + 4 の位置にあるので、コードはこんな感じになる。
push %eax
movl 8(%esp), %eax ; %eaxをスタックに退避した分だけ +4 ずれてる。
movl %eax, pThis->m_hWnd
pop %eax
movl pThis, 4(%esp)
jmp WndProc
IA32 のコードをハンドアセンブルする気にはなれなかったので、それっぽいコードを書いて GNU as でアセンブルし、出力を逆アセンブルして thunk の雛形に。
IA32 だと scratch register どれか忘れたので、とりあえずスタックに保存して %eax 使用。%eax, %ecx あたりは呼び出された側で値壊して OK だったような気がするけど、資料どこにいったかなぁ…。

2007/12/25 追記

ABI の資料を HDD から発見。eax, ecx, edx は callee 側で破壊して OK ということで、私が書いた thunk は push, pop 命令を消して、その間に挟まれている 8(%esp) を 4(%esp) にすれば良いね。

ABI は今だと SCO のサイトからダウンロードできる。Intel386™ Architecture Processor Supplement Fourth Edition の p.37-38 あたり。

ラベル:

月曜日, 12月 17, 2007

ico for win32 (3)

土曜出勤の電車移動中と日曜日一日使って、久しぶりにザルガラー多面体の表示プログラム作成に手をつけて、終わらせる。

今回はどちらかというとライブラリのテスト的な意味合いが強く、純粋にユーザから見た場合、既存の ico for win32 の方がデキが良いので、実行ファイルのリリースはしない方向で。タイマ同期にしてるのでティアリングが目立つ。

ファイル I/O や DirextGraphics 周りの処理は別途書いたライブラリに任せてるので、固有のコードは 500 行ぐらい (該当部分のソースコード)。このぐらいの量で意味がある処理が書けると、まぁサンデープログラマでも何か動くもの作れる。
issei@pc-xpp ~/My Documents/work/game/GameObj
$ wc ico/*.{cpp,h}
478 1202 12560 ico/TaskIco.cpp
8 13 381 ico/stdafx.cpp
29 203 1338 ico/TaskIco.h
64 135 1951 ico/stdafx.h
579 1553 16230 total

ソースコードのファイル数がそれなりに増えてきたので、依存関係を洗い直して、複数プロジェクトに分割。メインの exe を作るプロジェクトを一つと、あとは静的リンクライブラリのプロジェクトにする。

CSCriptVM
コンパイラ・インタプリタ型スクリプト言語用の仮想マシン。
GameLib
汎用ライブラリ。3D関連やファイル処理、タスク管理など。
GameLibTest
CScriptVM, GameLib のテストコード。
TaskIco
ザルガラー多面体表示プログラム。
TaskGalaxian
実装中の簡単なシューティングゲーム。
GameApp
プログラムのエントリポイント、ウィンドウ処理など。

コードはファイルのアーカイブ用ツールやスクリプトコンパイラなど全部まとめると、だいたい30,000行ちょっと(一部重複やコードによって自動生成してるものがあるので、単純に wc でとってきた数字よりは減る)。
issei@pc-xpp ~/My Documents/work/game/GameObj
$ wc `find . -regex '.*\.\(cpp\|cc\|h\|inl\|y\|l\|m4\|pl\)' | grep -v /data/ |
grep -v /contrib/ ` | tail -1
35898 114131 1057634 total

これでもまだコリジョンは球形だけだし、サウンドやシェーダー処理、スプライト・モーション関連は何もない状態。まともに何か作ろうと思ったら、まだライブラリも 50% ってトコロだ。

ただ、今あるパーツ+αでも簡単なシューティングゲームあたりなら書ける。曲線補完アルゴリズムを用意すれば、ギャラクシアン程度はいけるだろう。