Code Ijiri

なんか最近 TCC いじってて思ったのですが、他人のコードいじるってのは、自分でスクラッチからなんか作るのとか、ちょっとした emacs lisp とかプラグインとかを書くとか、他人のコードを読むとかとまた違った趣きがあるなぁと。ていうか私の場合、コードをただ読むってなかなかできなくて、くだらなくいことでもいいから、ちょっと挙動を変えてみる必要があるらしく。やってみないとわからん系の脳味噌らしい、というか。

で、そいう観点で自分の観測圏の人々を思い出すと、 patch とか見る比率少ないかなぁとか。 coderepos とかは色々楽しいそうなことになってる人もいるみたいだけど。例: http://twitter.com/hogelog/status/1029812782

そいう意味で id:hzkr さんとかは、コード読みつつ何か作ってみてたりしてていいなぁとか。 Scheme on YARV とか LuLu とかそいうの。

で、こいうのをやるコツとして、自分ができない程度のコードを対象にする、ってのが一番重要なんじゃないかと思う。自分の役に立つか、も二の次にした方がいいし、まして社会の役にとかはどうでもいい。動作の概要は説明できる気がするけど、情報から遮断された状態で膨大な時間を与えられたとして、自分で作れるだろうか…という程度のものを対象にして、「まぁ膨大な時間があればなんとか作れるかなーいやキツイかな…」という程度に進化する程度が、目標として良いと思う。途中で挫折するのは全然 OK 。小感動は得られないけど、まぁほどほどの経験にはなるし、挫折するかしないかのギリギリあたりが一番面白いし。

対象とするコードは、(自分にとって)大きすぎるのはヤメた方がいいと思う。大きいコードはそのプログラムの開発者にとって都合が良いように適切に抽象化されてるから、その世界に馴染めば便利なんだろうけど、馴染むまでに時間がかって、最初に小感動を覚える程度の変更ができるまでに飽きてしまう。少なくとも私は。「大きすぎる」っていうのは個人個人によって違うから、まぁ自分で書くと数ヶ月やらから数年かかりそうなもの、とかそんな感じかなぁと思う。

少しは手動かすから Code Reading というわけではないし、かといって hack とか開発とかいうのは大袈裟すぎる程度なので、しっくりする言葉があまり無いので Code Ijiri と勝手に呼ぶことにしました。

というわけで思い出を語ってみるとか。

そいう系で記憶に残ってる最初のものは、 IceWM いじったことだと思う。たぶんアレが本当に最初だったんじゃないかな。 sevilwm に実装してある、 hjkl でウィンドウスイッチするのが欲しくて、そんでいじった。結果としては、正確に記憶が残ってないけど patch とか転がってないということは、かなり時間がかかったけど、挫折したんだったと思う。当時の私には大きすぎたという話。

そんなこんなで、自分の程度にちょうどいい evilwm を見つけて、これは自分に欲しい機能はギリギリある程度で、まぁなんせ /bin/ls より小さいとかそういう次元なので、当時の私でもギリギリやりたいことができた。で今も使ってるわけです。

ゲームとかで思い出すと、 ABA さんの業平の SDL 化、 xjump の SDL 化、 TGB Dual の SDL 化、片っ端からザウルスだの MacOSX に移植、なんかを思い出す。それぞれ色々印象に残ったことがあると思う。業平見ててああ当たり判定ってこうやるんだなぁとか、 xjump 見て X は大変だなぁとか、 TGB Dual はエミュレータの世界がちょっとわかったし。そうそう、移植はコードいじり対象としては、始まってしまえば淡々と作業ができて、挫折率が低くてまぁ良いんじゃないかと思う。

SDL 自体も結構いい遊び相手だった。コードの分量は多いけど、ドライバがほとんどで、しかもディレクトリが video とか audio とか、これ以上無いくらい明解にわかれてるから、いじる対象をしぼりやすい。 event 関係のドライバが events ディレクトリじゃなくて video の中に入ってるとかだけ最初ちょっとびっくりした記憶があるけど。やったことは SDL のウィンドウの中に SDL のプログラムを走らせる SDL_nest とか、 xterm 上に SDL のゲームを表示する SDL_xterm とか。他にもやった気がするけど覚えてないってことはたぶん挫折したんだと思う。ああリナザウの SLB500 対応とかほんの1ミリだけやったような。あああと Thinkpad の振動検知機能で作ったジョイスティックドライバ。

あとゲームというと nethack か。あれは抽象化とか何それおいしいの系のスタイルで書かれていて、ゲーム中にメッセージが出てきたらその単語で grep すればだいたいコードの位置が特定できるという、ちょっといじるのにはもってこいの物体でした。でも nethack はたいしたことやった記憶が無いな。敵に与えているダメージを直感的に知るためにダメージ量表示するとかやったくらいか(それはチートです)。チートで思い出したけどゲームのチートもいいと思う。クリアできないゲームはとりあえず残機無限とかにするといい。

nethack というとなぜか w3m を思い出すのですが、 w3m も抽象化のレイヤーは薄くて、ちょっとしたハックを入れるのはすごくやりやすいと思う。一時期は私の w3m には自分のパスワードがハードコーディングされてた。アホか。あと w3m は JS 対応をやろうとして軽く 10 回は挫折したと思う。スクラッチから書きなおすぜ! という野望も数回はあったと思う。だいたい curses ちょっといじったところで終了する超短命プロジェクト。

TCC も hacky だけどいじるのにはコンパクトで、何度かいじったように思う。まともにやったのは1時間 hack のポインタの別記法を parser に加えるとかパーサだけ切り出してライブラリ化したりとか。あと CHoPTCC の影響をモロに受けまくりだったと思う。

あと最近だと valgrind とか Ruby とかにどうでもいいことやったりしてたなぁとか。 mlterm 256 色かとか自分で使う気ないのに何故あんなことやったのか不思議ではある。まぁ端末いじってみたい年頃だったというだけの話。とふりかえると、まぁ最近の方がいじれるコードの難易度とかは上がってきてるのかなぁとか思う。

あと挫折の象徴としては Firefox だか Mozilla だかがあって、まぁアレはデカすぎる上に依存がよくわからんすぎてよくわからんかった。あと X もよくわからん。

linux kernel とか Emacs はなんでかいじる気が起きない系。なんでだろう。 kernel は使ってるバージョンの kernel に自分の NIC が対応してなかったので適当にコピペしたら動いた記憶はあるな。

というわけで、

  • コード読むのも書くのもいいけど、いじるのもそれなりにいいよ
  • たぶん勉強になってるし
  • 挫折してもまぁいいでしょどうせ完成してもゴミだし
  • 適切な難易度、適切な大きさのプログラムを選ぶといいよ

というようなことを漠然と書きたかったのでした。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h