なんかですねえ。music.c の 473 行目あたりなんですが、
#ifdef MP3_MUSIC if ( (ext && MIX_string_equals(ext, "MPG")) || (ext && MIX_string_equals(ext, "MPEG")) || magic[0]==0xFF && (magic[1]&0xF0)==0xF0){ /* 省略、 mp3 向けの処理。 } else #endif #ifdef MOD_MUSIC if ( 1 ) { /* 省略、 mod 向けの処理。 } else #endif { Mix_SetError("Unrecognized music format"); music->error = 1; }
とのことなんですが、これはちょっと頂けないのでは。 まず、拡張子の判断ですが、mp3 データに mpg とか mpeg とかの 拡張子を付ける人はどれだけいるんだろう? んで、magic[0]==0xFF うんぬんですが、 なんか最初によくわかんないヘッダが入った後に このデータが来る mp3 ファイルが結構ある。 そのデータが標準に準拠してないのかもしれないけど、 どっちにしろ拡張子 mp3 は mp3 データに決まっておろう。 で、
(ext && MIX_string_equals(ext, "MP3")) ||
を上記の3行目に加えたらとても幸せになれました。
あとデフォルトが mod っていうのもなんか。
ついでに。 SDL サブライブラリの中で、SDL_ttf だけドキュメントが無い、と思う。 でもヘッダにはいろいろ書いてあるからもったいない。 で、html 化しました。 mixer とかも同じスクリプトで html 化 できるけどドキュメントがあるからいいや。
■ [Program]: QNX でいろいろ。
SDL, smpeg, SDL_mixer, SDL_gfx は ./configure; make 一発でした。 sdljump もすぐに動く。さすがに C は簡単。 今は公開してない stetris もなんとか。 でも /usr/include/xstring の 1085行目に typename を付加。 あとは std::map がやばげ。 んで、 bpo。 math.h 558行、stdlib.h 239行、string.h 130行に、
#define __GCC_BUILTIN
を追加。その後 Internal Error が連打。 resource.(h|cc) がまずいっぽい。その場しのぎも通じず、断念。 とりあえず gcc を新しくて再挑戦しようと思う。
以上、QNX のメモというよりは gcc-2.95.2 のメモかもしれない。
■ [Program]: Bullet Philharmonic Orchestra
最近、 こんなもの を作っています、って言ったらもの凄くしょうもないことを している気がしてくるけど、 こ ん な も の を作ってると言えば少しはマシに見えるからやはりグラフィックは重要だ。
おたまをリスペクトして、音から弾幕生成。 ABAさんをリスペクトして、画像データ無しでなんとか。 adasさんをリスペクトして、途中で開発状況を公開してみる。 bpo-0.0.1。 Winバイナリ無し。コンパイルしなきゃならんです。
まだ当り判定すら無くてゲームでは無いっす。 音から弾幕生成と言いつつランダムにしか見えないのが現状。 xmms プラグインとかのソースで勉強すれば良いのかな… なんかわかりやすい教材が無いものか。 仮に見どころがあるとすれば、clear_screen.cc。 SDL_gfx の SDL_imageFilter 面白いです。 MMX 命令って凄いのね…などと、とんでもなく遅らばせながら、 ハードウェア機能の素晴しさを実感。
■ [Program]: ハードウェアアクセラレートのある生活
OpenGL がホットらしいから相乗りして… TOGEさんが 紹介されていた、 ベンチマーク を見ると、なんでノートにこんなビデオカード積むんじゃ、とびびりますね。 かくいう私は ATI Technologies Inc Rage Mobility P/M AGP 2x なとと言われても何のこっちゃわからず、のほほんと生活しとりました。
先日、うちの大学がゴミと称して使えるマシンを捨てまくるという、 なんとも嫌な体質でちょっと沈むイベントを行っていて、 それはそれとして、まあ「ゴミ」を漁るわけですが、 その時の収穫が、 Athlon 650MHz + M/B, PentiumIII 600MHz + M/B, PentiumII, メモリ 128MB*2, NVidia SGS Thomson (Joint Venture) Riva128, NVidia Vanta [NV6], Creative Labs SB Live!, あと細かいパーツを色々と、まあ後半の方は /proc/pci を見ただけで、 なんのことかわからんのですが、ありがたそうなものを沢山拾いました。 で、ビデオカードの比較を xengine と SDL の testgl でやってみました。
ATI Technologies Inc Rage Mobility P/M AGP 2x: | 4500rpm, 100FPS |
NVidia SGS Thomson (Joint Venture) Riva128: | 3500rpm, 75FPS |
NVidia Vanta [NV6]: | 4370rpm, 85FPS |
NVidia Vanta [NV6] with NVidia driver: | 58000rpm, 265FPS |
Matrox MGA 6400 AGP: | 3500rpm, 830FPS |
いやー、始めてハードウェアアクセラレートっつうものを見てびっくりしました。 またもとんでもなく遅らばせながら。 Matrox の 830FPS がよくわからんのですが、 testgl はベンチマークソフトってわけじゃないしなあ。
これまでの積み重ねで 1000 円もかけずに、 Athlon-700, 128MB*3, 6GB+4GB+..., ビデオカードとかプリンタとかスキャナとか… な環境ができていたりする。 本当にそれはゴミなのか?くそったれ。ありがたいんだけど、複雑だ。
■ [Book]: Game Programming Gems 2
ボーンデジタル、Mark DeLoura など著、12000円
3Dな本の話関連で。昔読んだ本だけど。 1 の方がまだ良かったと思います。 なんかどうでもいいネタが増えた感じ。 1 でさえ 5000円位ならなあ、とか思ってたのに、なんで買ったんだろう。 同じ頃に OpenGL 赤本買って死にかけて、 それ以来私は極力図書館に頼るようになりました。 結論としては、いやまあ面白いんですけど、とにかく値段が…ってとこです。
私もそんな感じで勉強しました。 と言ってもしっかり勉強したわけでも無ければ、 ましてや何の成果物の作れていないのですが。 OpenGL プログラミングコース(独習テキスト)読んで、 なんかわかった気がする、と思い、 いざプログラムを書いてみるとやたらと苦労して、 (その時はプレイヤー視点でダンジョンを徘徊するものを作りました) やはり細かいことを知るには本買わなきゃかな…と思って赤本書いました。 でも今にして思うと、そこで NEHE に移行すればリーズナブルで良かったかも…と思います。
■ [Book]: インサイド GNU C コンパイラ
啓学出版、FSF著、2300円。
図書館で借りて一日でざっと目を通す。 gcc のソースを見る時はこの本の 9章が役に立ちそうだと思いました。 後は RTL の仕様が結構でかくて面白いかも。
■ [Book]: ゲームプログラミング
共立出版、松原仁・竹内郁雄編、3500円。
本屋で興味を持ったから図書館で注文。 面白かった。 内容は 2D のエフェクトがどうとか 3D のエフェクトがうんたらとかでは全然なくて、 将棋・囲碁・チェスなどという有名どころから、 聞いたことの無いゲームとか、倉庫番などのパズルまで さまざまなゲームの CPU アルゴリズムについての 研究者が書いた/訳した論文の集大成な本。
最後の章の目次は「あなたもチャンピオン」「ゲームプログラミングと情報科学」 「ゲームプログラムと認知科学」「ゲームプログラムと人工生命」 「ゲームプログラムと社会科学」 と、ここだけ何故かゲーム全般について広く扱っていて、 囚人のジレンマ大会とか、コンピュータゲームなんかの分類とか、 日本でのゲーム研究に対する差別だとか、 それはそれで面白かった。
個人的にはリアルタイムゲームの 思考ルーチンについても研究して欲しいなあとか思いました。
CPU が動かなくなってたという嫌なバグを発見したので。 ついでに 変なキーコンフィグ設定ツール を作りました。
■ [Program]: SDL-HTML/HTTP
^C さんの日記の HTTP フレームワークの話を見てて、 昔 SDL-HTTP/HTML を作りたいなあと思ったことを思いだしました。 その時考えてたのは…
HTML ファイルを引数として渡し、 SDL_Surface に HTML をレンダリングして、 マウス・キーボード・ジョイスティックに対応した入力、 適当な設定値保存クラスで form タグの設定内容を返す。 つまり HTML を設定項目記述言語として用いる。
設定値保存クラスと同じフォーマットで入出力を行う CGI? できれば同じことを行う JavaScript も。 できれば同じことを行う GTK? アプリも。 まあ、ゲーム内で設定を行うのはめんどいですし。
SDL_Net を使って HTTP アクセスをして、 POST メソッドでインターネットランキングにスコア登録。
SDL_Net ごしにさっきのインターネットランキングから 順位表なんかを持ってきて、最初の HTML レンダラで表示。
なんてなことを考えててけど、一つ一つの機能が今一つちぐはぐだし、 そもそも HTML レンダラの辺りが工数的にムリってことでやめた。
要はゲーム用の設定 UI をゲームライブラリで作るのがめんどいんだから、 ややこしいことは考えず、GTK アプリとかで 設定するようにすれば良いとは昔から思ってるんだけど… 結構 Windows のゲームでも MFC アプリで設定するヤツがあるしね…
で… CGI, JavaScript ならすぐに作れるなと思ったのが、 これだったりします。 問題は使い勝手が悪すぎることだ。 誰がしょうもないゲームの設定をわざわざコピペするのだろうか。 やはり SDL_gui からマイフレームワークを作るのが良いかな。 ParaGUI テーマが魅力的だけどデカすぎるのが難点。
ちなみに私がバイト先で作ってるものはちょうどこんな感じで、 ブラウザでシステムの設定ができる。 でもそれはシステムが動いてるマシンと 設定 CGI が動いているマシンが同じだから通用する話で、 結局インハウスツールってことっすか。
うーんでもやっぱりブラウザの UI は魅力的だなあ。 なんかうまくローカルにデータを保存させられないものか。 ウィルスか。
■ [Wheel]: w3m から URL のコピー
車輪の再生産をしたような気がする時は自戒を込めて、 Wheelタグを使うことにする。 以前の再生産品もこのタグに変えておこう。 さて、今日も元気に再生産。
さて、また w3m。 w3m の現在の URL をコピーしたいのだ。 w3m から URL をスクリーンのレジスタにコピーする方法は zinnia さんが述べられている。 ただ問題は、私は emacs は違う Window で動かしているし、 screen のセッションもいっぱい動いていて、この方法は使えない。
じゃあ X のコピーバッファだろう。 コピーバッファに任意の文字列を転送するプログラムは…
ls /usr/X11R6/bin
うん、見つかんない。我ながら何も探してないに等しい。じゃあ再生産だ。 xbuf.c ひどい出来栄えだ。すばらしい。 .w3m/keymap に、
keymap m EXTERN "xbuf %s" keymap M EXTERN_LINK "xbuf %s"
次、タイトルを同時に取得したい。 URL から wget でとってきて title をパースしたらいいんだけど、 まあ w3m は知ってる情報なんだから w3m をいじる。
etc.c の myExtCommand をそのままいじると 変更個所がいっぱいでてきて面倒だから、
Str myExtCommand2(char *cmd, char *arg, char* title, char* word, int redirect)
をでっちあげ、main.c の invoke_browser で、
char* word = GetWord(Currentbuf); if (word != 0) word = shell_quote(word); cmd = myExtCommand2(browser, shell_quote(url), shell_quote(Currentbuf->buffername), word, FALSE);
こんな感じ。 これで、%t がタイトル文字列に、%w がカーソル下文字列にそれぞれ置換される。 %w はついでだから。DICT_WORD はちょっと使いにくいシーンがあるゆえ。 このへんは w3m-dev でも議論になってたと思うんだけど、 なんで実装されてないのかなあ。 それとも別の方法で実現されてる?
で、これを使ってみると、日本語がダメ。 カットバッファには日本語が通らんわな。 本当は X のセレクションを使うんだろうけど、 もうめんどくさいので、適当にエンコードすればいいだろう。 .w3m/keymap に、
keymap t EXTERN "echo \<a href=\\\"%s\\\"\>`urlcode %t e`\</a\>|xbuf"
ちなみに urlcode は URL encode-decode する小物。 そんで、.emacs.el に、
(defun url-decode-yank () "URL decode and yank." (interactive) (call-process "urlcode" nil t t (x-get-cut-buffer))) (global-set-key "\C-q\C-y" 'url-decode-yank)
終わり。
■ [Wheel]: formula-mode
出力は綺麗じゃなくても良いから、数式を高速に入力したいのです。 板書を写しとれる位の速度で。 かつ、それを見て思考ができるフォーマットで。 つまり、TeX はコンパイル前は可視性に低くてダメ。
で、 ここまで 書いて、分数どうすっかなーとか思ってて、 やっぱりもうちょっと探そうと思って中断した。 だいたい elisp なんて始めてなんだから再生産は分が悪い。
今のところ cc と入力すると γ になって、 もう一度 c を入力すると Γ になったりするらしい。 数式は連続で同じ文字はまず出てこないことを利用したわけ。
■ [Program]: gcc がんばれIsseiさん、 zinniaさん、 けんとさん、 zinniaさん 経由で。 Call for testers for pch-branch。 ちょっと遊んでみました。
g++ hoge.h
とするだけで hoge.h.pch ができる。 hoge.h を #include するだけで勝手に pch を読みにいく。 最初一生懸命オプションを調べてたのがムダ。 証拠。
i@u ~/test/pch> strace -f g++ -c test.cc | grep "\.pch" -A 2 [pid 12185] open("test.h.pch", O_RDONLY|O_NOCTTY) = 4 [pid 12185] fstat64(4, {st_mode=S_IFREG|0644, st_size=338156, ...}) = 0 [pid 12185] read(4, "gpchC010", 8) = 8
見つかんない場合。
i@u ~/test/pch> strace -f g++ -c test.cc | grep "\.pch" -A 3 [pid 12196] open("test.h.pch", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory) [pid 12196] open("test.h", O_RDONLY|O_NOCTTY) = 4 [pid 12196] fstat64(4, {st_mode=S_IFREG|0644, st_size=84, ...}) = 0 [pid 12196] read(4, "template <class T>\nclass A {\npub"..., 84) = 84
boost の下をかたっぱしから pch に。 まずびびったのが、
i@u src/boost_1_29_0/boost> ls -laH function.hpp.pch -rw-r--r-- 1 i 10M 12 6 17:20 function.hpp.pch
圧縮して欲しい。
i@u src/boost_1_29_0/boost> gzip function.hpp.pch i@u src/boost_1_29_0/boost> ls -laH function.hpp.pch.gz -rw-r--r-- 1 i 2.0M 12月 6 17:20 function.hpp.pch.gz
で、いろいろ今までのソースをコンパイルしてみるも、ほとんど失敗。 割と簡単そうな refTest.cc とか composeTest.cc もだめ。 確かに簡単な例なら上手くいくんだけどなあ。
とりあえず海の向こうの皆さんの努力に感謝。 これからもお願いします。
ところで gcc って cc1 とかの実行ファイルは バージョンごとに分かれてくれるけど、 gcc 本体は当然同じ場所だし、それはまあ、 gcc3 とか別の名前つけて対応できるんだけど、 できた実行ファイルの参照する libstdc++ を LD_LIBRARY_PATH で変えたりしなきゃならない。 私は、gcc を ./configure --prefix $HOME/local/gcc-pch とかして、 .zshrc に
swgcc () { d=/home/i/local if [ $* ]; then export PATH=$d/gcc-$*/bin:$PATH export LD_LIBRARY_PATH=$d/gcc-$*/lib:$LD_LIBRARY_PATH else export PATH=$OLD_PATH export LD_LIBRARY_PATH=$OLD_LD_LIBRARY_PATH fi } export OLD_PATH=$PATH export OLD_LD_LIBRARY_PATH=$LD_LIBRARY_PATH
とかして swgcc pch などと切り替えています。 手軽に切り替えれて結構便利。
■ [Program]: Sunprocppllのsunpro より。
as303 ~> g++ -o main main.cc /var/tmp/ccY1lpqw.o: In function `main': /var/tmp/ccY1lpqw.o(.text+0xc): undefined reference to `C<int>::C(void)' collect2: ld returned 1 exit status Exit 1 as303 ~> CC -o main main.cc as303 ~>
ほんとだ。面白い。 hoge.h に template<class T> class C があって、 main.cc が hoge.h を include してます。 そして、hoge.cc に class C のコンストラクタがあるのです…
■ [Update]: タグ分類
なんかいいかんじ。 まあ人様のためというより自分の回顧のためという感じですが。
ただこういう perl プログラミングは苦痛。 バイトで飽き飽きしているので。
Book というタグを増やしてそれを集めると書評一覧になるとかしてみたい。 本には高い金払ってるものが多いので、 自分なりに総括を出しとかんと損するし。
■ [Program]: C++言語カルトクイズ
突如考えてみた。
以下、コンパイラ、ライブラリヘッダ、各種参考書などを 参照してもいいけどその部分は点数が半分になるとする。
問1.
const キーワードは複数の意味があるが、 それぞれについて、サンプルコードを書き、 何を定数と宣言しているかを述べよ。
問2.
関数ポインタというものがある。
int func(); int main() { int (*fp) () = func; fp(); }
このように使うことができる、では、
struct C { int func() const; } int main() { C c; // todo }
todo部分に c について、先の関数ポインタの例のように メソッドポインタ越しに呼び出すコードを書け。
問3.
export キーワードの意味を全て述べ、使用上の注意を述べよ。
問4.
protected キーワードの意味を全て述べよ。
問5.
virtual キーワードの意味を全て述べよ。
問6.
typename キーワードの意味を全て述べよ。
問7.
例外仕様について述べよ。
問8.
テンプレート特別バージョンを利用したコード例を示せ。
問9.
template <template typename T> class C {};
と宣言されているクラス C がある。 クラス C をインスタンシエイトせよ。
問10. (予習問題)
次期 C++ への参入が期待され、既に複数のコンパイラで実装されている typeof キーワードの使用例を示せ。
いかがでしょう? 私が考えたんだから成績が良くなるのは当たり前だけど 私はたぶんボーナス点無しで90点位。
答え。 当然嘘が含まれている恐れがあります…
久々のバージョンアップ。総弾幕数100らしい。 ここからは ChangeLog の補足です。
エスプ話 を見ていると懐しくなってきて、原点回帰で100弾幕目付近はエスプを三つ。 やっぱエスプの弾幕は良いです。 この方向性でもう少し自機が小さくて遅いゲームを作ってくれんかのう。
Noiz2saからも。 ABAさんすいませんまた勝手に弾幕を奪いました。
あと前のケツイ弾幕をランク調整とか入れて入荷。 色々違うってのは知ってるけど所詮ロケテバージョンなので ばれないのが幸せ。
BulletMLのエラー表示。 不正な BulletML データが来たときに、 そのエラー内容を画面に表示する。 たぶん半分位のエラーは捕捉してくれると思う。 これ以上のエラーハンドリングは xerces 使わんときつい。 結構本気で xerces を使うことを考えていたりもする。 Unix版は tinyxml をデフォルトで使い、 xerces がインストールされていれば使うことも可とし、 Windows 版は DLL をくっつけて配布すれば良いと思う。 そういや tinyxml は Windows と Linux で動作が違う気がする。 Windows の方がエラー捕捉がぬるい?
省メモリ。 なんで私は 8Mバイト位の bmp ファイルを最初に読ませてたんだろう? とりあえず使用メモリが 3M 程度まで減った。 ただスクリーンショットのあり方が今のままではまずいのは明らか。 それぞれの弾の位置だけ記憶すれば良いのだから。
非 autoconf 化。何も configure してなかったし、 ファイルが散らかりすぎて、 Windows から見ると何が何やらよくわからなかったから。 後はソースは src に押しこめたり、そんな感じ。 もう少しこの方向で整理は続けようと思う。
■ [Update]: Robocodeについて
偽ジャパンカップとか小さなスクリプトとか。 ごにょごにょしているらしい。
■ [Update]: サイト名変えました。
いい加減トップページが崩壊していたので修正ついでに。 ちなみにサイト名決定の判断材料。
つまりなんとなくだ。
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。