経過報告を忘れるのは自己満足のせい

終わった報告とか色々抜けているのはさすがだと思った。
自己満足日記万歳!
というわけで、色々事後報告的な物をいくつか


新星間戦記CIVILIZATIONのバグ(正確にはコミックプレイヤー2のバグですが)
これは、メモリー管理の方法がWindows9X時代から変更になったのが原因。

9X系ではアドレス上地続きならば、実際のアドレスも地続きであったらしく
別に予約したメモリーであっても他で確保したメモリーと地続きになれば一つの大きな領域として使用するコードにより実装されていた。
(おそらくはborlandのコンパイラのmalloc関数がそういう実装になっていたんだと思う、だからたぶんNT系で最新のコンパイラを使ってコンパイルすれば直るはず)
だがNT系では地続きに見えても地続きとして扱えないという制約があり、ユーザーランドの処理であれば何の問題も無いが、カーネルランドでそのメモリーを扱おうとするとこける。
そのため、画像よみこみにそういったメモリーを使用し(ここまでは問題ない)それをGDIオブジェクトとして使用しようとした段階でエラーしていたのが原因。

この問題はきわめて例外的で本来ならばエラーしないような箇所で起こるため、アプリがシステムリソース不足であると勘違いして誤ったエラーを表示しているのが混乱を招く原因となっていた。
どちらかといえばエラー原因を返さないWin32API側が悪いと言えるが、実際には何の関係も無いのにシステムリソースの増やし方を説明しているサイトの多さもちょっと問題に見える。
皆実際に確かめてみるぐらいしないのだろうか?
それとも、メモリーの混雑具合によって発生率が跳ね上がるので、システムリソースを変更するために再起動したことで改善したと勘違いしたのだろうか?
どちらにしろ、システムリソースのサイズとコミックプレイヤー2のシステムリソース不足エラーにはなんら関係はない。

で、直し方としては。
1:おそらくはreallocの実装であろう、隣接した次アドレスのメモリーを新規予約して確保しようとしているコードの無効化
2:メモリーの予約サイズを+1し、返却サイズはそのままにした
の二点。
本当は1だけで直る予定だったのだが、内部実装にアドレス指定なしで確保したメモリーが偶然隣接した場合も巨大な一つのメモリーとして扱う機能があったため失敗。
そこで、予約時に+1しつつ呼び出し元には伝えないようにした。
これで1ブロックサイズ分のメモリーが予約されているが割り当てられずに残るため決して地続きになることは無くなり、エラーも起こらなくなった。
前方のメモリーと同時に予約されるため、そちらのメモリーが解放されれば一緒に開放されるためゴミも残らずクリーン。
実メモリーは永遠に割当たることはないからメモリー使用量にも対して影響はでないしね。

というわけで、システムリソースエラーなしで2週ぐらいプレイしきれたので、この件をパッチにして公開しようと画策しましたが、
ちょっとパッチャーに不満があってパッチャー自作プロジェクトが新規稼動中。


レーザープロジェクター(レーザーポインターを高速で動かして壁に絵を書く機械)用のレーザー動作定義ファイルとしてILDAという規格があります。
また、動画のようなものを入れる事も可能で、どこぞの動画サイトでは影絵から変換した物を流すような動画もあります。
そのファイルフォーマットを知ったのが大体二週間ほど前。
そこで興味を持ち、FLASHで再生プレイヤーなぞ作って完成したのが先週の水曜日。
そして、先週の土日にやるイベント用に動画->ILDA化ツールを作ってくれとの話が持ち込まれたのも先週の水曜日。
要するに、先週の水~金は修羅場だったというわけです。

最初に95%の確率で間に合わないがそれで良いのかと散々念をおした上で引き受けました。
依頼者は友人Aと友人経由で知り合ったばかりの友人Bの二人、ハード担当は友人B。
友人Aは最初は作業に関わっていなかったはずですが、時間がなかったのと自分よりはるかに能力あることと暇そうで「やる事無いかなー(チラッ」していたので
適当に動画->二値画像化の部分を担当してもらう事にし、自分は二値化画像から効率的なILDAの作成をやることに。
予想通り予想外に(誤字にあらず)一日とたたずに二値化画像が上がってきてまた「暇だなー(チラッ」し始める友人A、予想以上に難航して金曜になっても動かないILDA化プログラム、そして判明するお金持ちなレーザープロジェクター作者というライバルの存在。
友人Aの優秀さと自分の無能さとライバルへの燃える対抗心によって暫定的なILDAプログラムが動き出したのが金曜の早朝(半徹夜)
その後、pps(秒間ポイント数)をハード性能内に抑えるための処理やら、線が飛んだりおかしくなるバグの修正などなどを行って無事金曜夜完成。
実機テストが0回であったにもかかわらずそのまま土曜日行われたイベント中で問題なく流れ、ほぼ一日中そればっか眺めてニヤニヤしていた自分なのでした。

こういう無茶はやっぱり楽しくて良いね。
あと一発感動教(?)、とはちょっと違うけれど、実際に使用される環境ではテストが出来ないなか、考えうる限りの対策をして
無事それが本番で動いた時の感動ときたらもうね、たまらないね。
あとプロジェクターが素晴らしかった、本当に一日中ニヤニヤしてたし。
ブースの半分を占領して延々話し込み続けるという妨害してごめんなさい>>友人B。

そのうち動画で上がるとの話なので、今からwktkが止まらない自分なのでした。

やれば出来る人とやった人の差

たとえ、やれば出来る人が一秒で出来るほどの高い能力を持ち
やった人は10年かけないと出来ないほど能力が低かろうと
結果としてはやった人の方が優れていると思う。

つまり何が言いたいかというと
自分は優秀だと思っていても実際には何も完成しない人は
たとえ改善点がいくつも目に付いても完成させる人よりもはるかに劣っているという事。

「やれば出来るのは普通なんだよ。
 本当に優秀な人はやらなくても出来る。
 出来ないなら優秀じゃないんだから死に物狂いでやれよハゲ」
そう自分に言い聞かせているのに一歩も進まない、そんな情けない現実。