テスト書くのは嫌いだと思っていたがそんなことはなかった

自分は完璧主義者です。
ですが、テストコードを書くのはどうしても嫌で、趣味で書いたコードにテストコードが付いているものはひとつもありません。

嫌なのは仕事で書くときも同じで
テストを書かずにバグを直したが、その後再発しては叱られてばかりでした。
ですが、今関わっているプロジェクトでは自分が書いた範囲ではコードカバレッジ100%
バグも連結テストを除けばほとんど出ていません。

これは自分でもびっくりというか、テストを書くのが妙に楽しくなっている自分に戸惑いさえ覚える状態。
そこで色々物思いにふけってみたところ
そういえば今までのプロジェクトはどれもテストを書くのが大変で仕方なかったものばかりだと気づきました。

要するに、
自分はテストコードを書くこと自体は嫌いではなく、むしろ好きな人種だが
今まで関わったプロジェクトはすべてテストを書く労力が高すぎたため
テストに対する苦手意識が出来ていただけ、ということのようです。

今のプロジェクトはrubyで、やろうと思えば標準ライブラリまで含めて置き換えすり替え動作拡張思いのままです。
なのでHTTP通信、ログ出力、DBの読み書き、これらすべてモック(テスト用ダミーのこと)に置き換えられており
HTTP通信エラーのテストも6行で書けます、これはよい。

逆に今までのプロジェクトといえば
テストコードが一切なく、テストを組み込む設計すらされておらず
そもそも途中参加で内部に詳しくないアプリの拡張の仕事。
DBにべったり、HTMLにべったり、その上コピペコード満載で
やっぱりテストプロジェクトが存在すらしていないアプリの改良。
ネットワークとUIメインでコードは薄く、初の言語に初のプラットフォームに初の部下つき開発と、コード書くまでが大変だった仕事。
と、どれもテストを書くところにたどり着くまでが至難のプロジェクトばかりです。

やはり、テストは楽に書けなければダメだということでしょう。
テストを書くために実コードの10倍も20倍も労力かかるからこそ書きたくなくなるわけです。

というわけで、結局テストをかける環境がない自宅ではかけない自分なのでした。

規制解けていたので

改造ツールスレにtouhouSE投下してきた。

まさか書けるとは思わなくてろくにコメントつけずに書いちゃったが、まぁ通じるだろう。


テンドーブレードのtgaフォーマットは非常にわかりやすく、実装は簡単だったわけですが。
ググッタ先で出てくる資料が千差万別すぎて大変でした。
左右反転フラグとかデフォルトの左右方向とか場所によって真逆だったりするのはどういうことなの……


まったく関係ないですが、コンビニに電気代振込みに行く途中で自転車のチェーンが外れて盛大に横転し、そのまま振込用紙が行方不明になりました。
仕方がないので次の月のがくるまで待とうと思います。

テンドーブレードのデータファイル解析過程その1~眺めてみた編~

この記事は、同人サークル「特殊装甲隊」様作成の東方二次創作ゲーム「テンドーブレード」のファイルフォーマットを解析した際のまとめです。
本記事内に書かれたすべての文章の責任は「他人の空似」管理人にあり、「特殊装甲隊」様のサークル代表であるNnP氏は一切関係ありません。
また、本記事は「特殊装甲隊」様およびNnP氏の許諾を得ずに記述したものであり
テンドーブレード動作確認版および修正パッチおよび「特殊装甲隊」様サークルホームページのどこにもリバースエンジニアリングについての記載がなかったことを根拠として記述したものです。
問題があると思われる場合、コメント欄までご連絡をお願いします。
(非公開ブログでまで何書いてるんだろうね、自分。)


発端

東方改造スレにて要望があがっていたのを見かけたのが発端。
本来ならばすぐにでも投下したいぐらいなのだが、規制により書き込めないので断念。
他と違って改造スレは2chにあるからね、しょうがないね。

前提

製品版は手元にない。
動作確認版および修正パッチから解析した。
また、exeファイルに対して起動および逆アセンブラなどによる解析は一切行っていない。
(いわゆるバイナリエディタのみを使ったファイルフォーマット解析)

始めのいろいろ

製品版を持っていないのでまず解析可能か否かから検討したりとか、解析にHaskellを使おうとしてみて諦めたりとか、そういった細かいイベントがいくつかありましたが、関係ないので省略。

バイナリを適当に眺めてみる@ヘッダ編

まず、パッチに付属しているtnbpatch.datをバイナリエディタで開いてみます。

まず目に付くのは、
* いきなりデータ部と思わしきものが始まっている
* 目に見える形で文字列が残っている
* 通常文字列とバイナリが入り乱れている
この3点です。
では、順に推測していきましょう。

いきなりデータ部が始まってる

なぜいきなり生のデータが並んでいてはおかしいのか。
それは、ファイルの情報がヘッダとして付いているはずなのに見当たらないから、です。

対象とするファイルはアーカイブファイル(複数のファイルをまとめたもの)だと推測されるので当然ファイルとしての情報(ファイル名、ファイルサイズなど)が保存されているはずです。
さらにいうなら、実データより先に手に入れることが可能なように格納されているはずなのです。

なぜなら、基本的にデータファイルは巨大であり、常時メモリー上に配置してはおけないためで
アプリはファイルのリストだけを保持しておき、必要に応じて読み出す形で運用するのが通常想定される使用法だからです。

ですが、このファイルは2byte目からはどう見てもテキストデータにしか見えないデータが続いています。
つまり、このファイルにはヘッダとしてファイル情報が付いていないものだと判断せざるをえません。

とすればおそらくファイルの情報はフッタ(ファイル末尾に位置するデータ)から引けるようになっているのでしょう。
まだ手元の情報だけでは推測できないので、この場はとりあえずファイル情報に関してはスルーして次に進みます。

目に見える形で文字列が残っている

データファイルには暗号化がかかっていることが多々あります。
その場合、データファイルをバイナリエディタで開こうとも意味のある情報は拾えないのが普通です。
少なくとも、ここまであからさまに読み取り可能な文字列が並ぶことはありえないと断言してもいいでしょう。

一応、読み取り速度が重視されるファイルなので暗号化がかかっていない恐れもありますが
基本的にこのサイズのファイルでそういったことが重視されて暗号化が解かれることはありえません。
さらにいうならば、このファイルは圧縮されていると推測されるため(後述)、もし速度が重視されるならば圧縮もされていないはずです。
なので、このファイルは少なくともデータ部に関しては暗号化をしていないと推測できます。

通常文字列とバイナリが入り乱れている

これはある種の圧縮ファイルによく見られる特徴で、バイト単位で入出力する圧縮アルゴリズムを用いたデータだと推測されます。

たとえばdeflate(標準的なzipファイルの圧縮アルゴリズム)であれば、データはビット単位のストリームとして処理され
基本的に人が読める状態のデータは残りません。
また、生データであれば非テキスト文字が入る事は基本的にありえません、ましてや文章の途中で断ち切れるわけはないでしょう。

なので、こういう形のデータが残るとすれば
バイト単位で入出力し、圧縮しても短くならないデータはそのまま生に書き出し、短くなるデータは圧縮データで置き換える。
そんなアルゴリズムで圧縮されたデータぐらいしかありえません。

おそらくは辞書参照方式かそれに類するアルゴリズムによるものでしょう。
とりあえずこの場はここまでにして先に進めます。

バイナリを適当に眺めてみる@フッタ編

ファイルの先頭を眺めた結果、おそらくファイル末尾に何かしらの情報が付加されていることがわかりました。
なので、今度はファイル末尾をざっと眺めてみましょう。

予想通り、ファイル名やファイルサイズらしき情報がリスト状に並んでいます。
どこまで続いているのか追ってみたところ、だいたい0x0001E440ぐらいまで続いていました。
ファイル情報が一個当たり大体45byte前後で並んでいるので、大体45ファイルぐらい格納されている計算です。
おそらくこれがファイルリストと見て間違いないでしょう。

また、ファイル名を見た範囲ではデータの断片化やバイナリと文字列の混同などは見られないため
ファイルリストは圧縮も暗号化もかかっていないことがわかります。

問題はフッタのサイズやファイル数といった情報がざっと見では見当たらないことですが、
この件については後で考えるとして、この場はファイルリストの所在が判明しただけでよしとすることにします。

その1まとめ

まだざっと眺めた段階ですが、この段階でもわかったことはかなりの量にのぼります。
いったんまとめてみましょう。

* ファイルリストはフッタに格納されている
* 暗号化はかかっていない
* データ部のみ圧縮されている
* 圧縮アルゴリズムは辞書参照方式かそれに類するもので、バイト単位で入出力できるよう実装されたもの
* 大体45ファイルぐらい格納されている。

推測を多分に含んでいるので一つ位外れているかもしれませんが、大体概要はつかめたといっていいでしょう。
その2ではファイルリストの詳細を詰めていきます。

USB式のヘッドセットはダメでした

ヘッドセット壊れたので同じの買おうと思ったんですが、すでに生産終了していたのでしぶしぶ別のを買ったんですね。
そのヘッドセットはUSB式で、買ったときは特に考えずに選んじゃったんですが、よく考えてみるとUSB式にはいろいろデメリットがあるわけです。

たとえば、ハードウェア処理ではないのでCPU負荷次第でおかしくなる恐れが比較的高い。
サウンドボードと共存させると優先設定しても物によってはサウンドボード側を認識してしまうことがある。
動作や音のよしあしがデバイスドライバーの出来に強く依存する。
抜き差しするとアプリ再起動するまで認識されないことが多い。
このあたり。

で、自分が買ったものは(おそらく)デバイスドライバーがダメだめで、CPU負荷が高い状態が続くと唐突に砂嵐のような音しかならなくなり、
一度抜き差ししない限り元に戻らないという動作が目立つ状態に。
しかも東方は一度抜いちゃうと再起動するまで再認識してくれないので無音プレイ状態に……
やってられるか!!

というわけで、今度はきちんとイヤホン端子を使う物を買いなおしました。
このUSB式のものはサウンドボード乗ってないPCを使うかもしれないときのために封印しておきました、出来れば二度と使うことがありませんように。

もうアンチウイルスソフトなんて信じない

OllyDbgで例外をトラップすると、時折OSごと固まって帰ってこなくなり、そのまま強制終了するしかなくなることがあったんですね。

といっても最初のころは極稀で、一年ぐらいかけて徐々に頻度が増していき、特定状況ならば確実に発生するようになったのはここ最近。
さすがにこれではおちおち解析もしてられないとPC買い替えすら検討していたわけですが
ふとアンチウイルスソフトの影響なのでは?と思いついたのが発端。

結論としては、アンインストールしたら無事解消しました。
まったく何の問題もなくトラップできます、OllyDbg立ち上げるときはビクビクしていた頃が嘘のよう。
以前からアンチウイルスソフトなんて信用していませんでしたが、もはや完全に愛想が尽きた感じ。
もう自衛するからいいよ、二度といれてやるもんかこんちくしょう!

目標は目標

やりたいことは色々ある、やらねばならない事も結構ある、やるべき事も結構ある。
けれど何一つ手が付かない、理由はただ一つ、どれから手をつければ良いか判らないから。

というわけで、当面の活動目標を考える会。
とりあえず自分の技術力を上げるのが根本目標で、そのためにはどうするかを考える。

1:勉強する。

数学力、英語力、その他諸々の基礎学力。
これらはひたすら不足しているので、多少身につけるだけでも世界が変わるはず。
でもぶっちゃけやる気は出ない、後なんか違う気がする。

2:何か作る。

いわば実地訓練的な。
だけどプログラムって実地訓練必須というか、脳内だけでは何一つ得られないというか。
要するに武道と一緒、実践あるのみ主義なので、ある意味これが一番かも。
やるならば具体的に何をどうやって作るかが問題か。

3:集中できる環境作り。

ぶっちゃけ、技術力つけるのに集中できない理由が多すぎる。
仕事は仕方がないとして、対人関係やらその他諸々がひどい。
せめてストレスなく過ごせる程度に対人能力つけたりする。


書いてみて思ったけど、あんまり悩む必要もない気がするね。
自分は短所埋めるなら長所伸ばす人だし、2一択だ。

なら、何を作るか。

たぶんだが、自分は静的言語、それもC系統に依存しすぎている。
ぶっちゃけこれ以外で作ったアプリはたいしたものがない。
仕事でもさんざ色々な言語使っているにもかかわらず、最終的にC系統が多めなのもでかいか。
なので、C系統ではない言語を使ったものが良い。

今まで関係しなかった分野が良い。
ツールというか、他のアプリに依存する系統はダメだ、確かに好みだし得意だが、そればかりで視野が狭まっているという事実がある。
というか、なんだかんだで創作物がほとんどないのは問題だ、一から何か作ることが苦手すぎる。
ついでに、UIとかグラフィックとか3Dとか、そういったものに触れていなさすぎる傾向もある。
というわけで、オリジナルな物が良い、できればグラフィック関係が良い。

んー、二つあわせるのは凄く難しいな。
C系統じゃない3Dってなんだ、動的言語で3Dって死亡フラグしか見えないぞ。
やはり今までと同じ事をしたくないって言うのも、ある程度は今までに基づいているべきなのか。

ならば、前者だけを重視した場合に何が考えられるか。
rails/per/phpあたりを使ったWebアプリ、javaを使ったスタンドアロンなアプリ、haskellあたりを使った何か。
この中ではhaskellが一番やってみたいんだけど、haskellだと作れるアプリに制約がありそうな気がしたのでちょっと調べてきた。
結論としては、STGとか作っている人がいるので問題なさそう。
性能は問題あるかもしれないが、今回は気にしないことにして
やるならHaskellで何かを作る、かな。

後者だけを重視した場合。
作るならばDirect3Dを直に使った3Dな何か、3Dって時点でゲームしか思い浮かばないからたぶんゲーム。
OpenGLも考えたけれど、Direct3D系の解析でいつも知識不足のためDLLの中には踏み込めずにいたので、その点を克服するためにDirect3Dで。
一応こっちは数学がないとやっていけないはずなので、1の理由も含められる。
ただ、データファイルなどで趣味に走りそうなのでどうにもこうにも。

あーでも、案外組み合わせ効く気がしてきた。
目標:Haskell使ったDirectXな3Dゲーム。
すぐ無理だって投げるだろうけど、とりあえず不可能判断できるぐらいはやるか。

政治話とか

以前も同じような事を書いたけど、改めて書きたくなったので。

自分は投票権なぞ放棄した上、政治話にもまったく持って興味ありませんし出来ません。
理由は簡単で、今の国政に対する不満も変えたいという気持ちもないからです。

単純に無知から来る楽観なのでしょう、実際問題として改善点がないものなんてこの世の中を探してもそうはありません。
例えば、プログラマーであればどれほど完璧に見えるシステムでも「アレをこうすればもっと……」といった感想を多少は持ってしまうのと同じです。

だからといって知る努力をしようとも思いません。
自分が干渉をしてはいけないと思えるのと、今現在不満はないからです。

ひどい話をすれば、自分は民主主義なんて間違っていると思っています。
多数派が勝つというのは、正しい方が多数派になりやすいという原理に基づいているだけで、実際に正しいか正しくないかを基準にしているわけでは無いからです。
もちろん、民主主義よりも正しい道を選べる方法なんて知りません、けれど何も知らない素人が口を出せる状況は間違っていると感じている事は確かです。

自分にとって最高の国政は今現在の日本が未来永劫続く事、ですがそれは絶対にありえません。
であれば、今のまま続けたら日本はどうなるのか、変えねばならないならどのように変えていけば良いのか、そういったことは一切わかりませんし判ろうとも思いません。
理由は上で告げたとおり、素人が下手に干渉したほうが逆に悪くなる事が多いからです。

なので、仮に自分が政治といったものに多少なりとも干渉しようと考えるならば
それは無知な自分でも意味がある場合か、自分が納得できる程度に知識をもてたときでしょう。
前者は専門性を求められるような状況、後者は自分自身が政治家を志した時でしょうか。
少なくともそうなるまでは、下手に干渉したくならないよう無知を貫きたいのが自分です。

だって、ただ文句だけ連ねる人になんて成りたくないじゃないですか。
文句を言うならば、それに変わる代替案を出せる用になるべきか、何でもいいから聞かせて欲しいとお願いされた時だけです。
今は国政に文句言うだけで実際何もわからずに参加している人が多すぎる。
そりゃ興味持つ人が居なくなれば自制が聞かなくなってより悪化するという事もあるんだろうけど、さすがにちょっと適当すぎるんじゃないかなぁ。

推測閾値

推測しすぎれば勝手な判断で行動するなと怒られ
推測が足りなければそれぐらい判れと怒られる。

なら、推測するしないをどう判断すればいいのかと問えば
判断基準は千差万別なのだから正確に定まっているわけがない、なので言えないと返る。

では、皆はどうやって判断しているのかと問えば
常識的に考え、近似値を求めてそれに従って判断している、という。

この言い分は矛盾しているとしか思えないのは自分だけだろうか?
判らないのに判ると言っているわけで、お前もそれをしろと無理難題を押し付けられているように感じる。
もしくは、自分はわかってるけど100%正しい自信は無いので教えません、と意地悪でも言われているのだろうか?

凄く不思議だ、なぜあれで皆通じ合えているのだろう。
まるで、全人間が共有して使っている記憶領域に自分だけ繋げていないかのような違和感を感じる。
いや、実際そうなんだろう。
たぶん皆には一般常識というものがあって、自分には一般常識というものが無い、もしくは極めて劣っている。

ならどうすればいいのか?
他人と関わりあいを持たない、もしくは
可能な限り推測をした上で、一番時間を使わなくて済むだろう質問を行う。
という方法で、多少なりとも相手側の負担を減らすぐらいしか方法が浮かばない。

実は一般的な人間って常識共有の超能力でも持ってるんじゃね?

黙して語られるのは恐ろしい

とある議論を行い、最終的に自分の主張が正しかった(用に見える)終わり方をした際。
別に何も言わないが、非常に不満気に議論を終える人ばかりで非常に怖い。

そんな事は自分が参加するときだけで、最終的に自分が正しかろうが間違っていようが結局は皆そういう態度になる。
誰も原因は言ってくれないし、自分でも思い当たる節は無い。

たぶん、自分には理解できないだけで一般常識的な何かに沿っていないとかそういう話なんだと思う。
だけど皆言わずとも判れといわんばかりで、自分ではどうしようもなくなる。

だからと言って、言いたい事があろうと間違っていると思えようとひたすら黙っていれば
言いたい事があるなら言いなさいと責められる。
なら周囲の人にばれないように無言を貫けばいいんだろうか?
でも、それはそれで単なる問題の先延ばしにしかならないし、結局意味は無いのかな。

会話一つとっても考えるべき事が星の数ほどあってとてもじゃないが理解できない。
日本人怖い……

udp4th123

udp4th123
前回の記事で撃沈したコード、一応半日使ったし、技術的にも面白いコードなのでガラクタの一部に加えてみた。
動作原理諸々は散々書いたし、中のテキストにも書いたのでここではなし。
使い道が無いのを承知の上でコード見てみたい酔狂な人だけどうぞ。