yunomuのブログ

趣味のこと

普通のやつらの下を行け

慣らしでちょいと文章書いてみましょうかね。ビール片手に。

お仕事ではいわゆるアプリケーションレイヤのプログラムを書くことがおおい?かな? いや割と鯖缶的な仕事が多いので自分用のツールをシェルスクリプトでちょちょっと書くようなのが多いかな。まあでも開発系の仕事も時々やっていて、その時はJavaeclipseやらMavenを使っていかにもな感じでやるんですけど、
そういう事をやってると、たまにすごく低レベルな事をやりたくなることがあって。いや元々電子工作とか組み込みとかが結構好きなんですよね。真面目に開発したことはあんまし無いけど。あと、OSカーネルを開発してた事もあったし。
ってことで、タイトルは低レベル勉強会のサブタイトルからまんまパクりました。それも元ネタはポール・グレアムのコラムですけどね。
第16回 低レベル勉強会 ~ 普通のやつらの下を行け ~ : ATND

それでこんな本を買って遊んでみたりするんですけど、
Amazon.co.jp: ルーター自作でわかるパケットの流れ: 小俣 光之: 本
でもLinuxマシンを用意するのも、手持ちのMacBookAirのBPFで頑張るのも、どっちも面倒でちょっと手が出せてない。
FreeBSDドキュメント jman BPF

OSカーネルの開発が割と楽しいんだけど、環境作るのめんどいしー、VMwareとか入れるのすらもめんどいしー。とかなんとか言いながら、本当になんにもやってなかったんですが、

ある日いつものごとくなんぞお勉強をしていらっしゃったid:seizansが「B-Treeの実装が難しいんだけど!」っておっしゃいまして、あー確かにアレ面倒くさそうだよねぇ。っていうかあれってディスクI/OとメモリI/Oの圧倒的な速度差とかディスクのブロック毎のI/Oって特徴が無いとあんまし意味ないよね。Javaで実装してそこまで考えられるの? よーしじゃあここは私もCで書いてみますよ! って軽々しく言ったのが始まりで、なんか2ヶ月くらいかけて書きました。

btree at master from yunomu/exercises - GitHub
ディスクI/Oは面倒だったので、メモリでエミュレートしてます。レコードも考えるの面倒だったのでただの32ビット整数値です。
これ書いてて、私は単にCを書きたかったんだなというか、C言語みたいな面倒くさいのもたまには悪くないなと思った。いやどっちにしろCは書きたかったんですが。

これは、

# make
# make test

とかやると、なんかテストが動きます。レコードの内容やらノードのアドレスが出てくるので確認は目視です。テスト内容はソースを読め。
そういう感じです。ごめんなさい。

このプロジェクト、".depend"なんてファイルがあることからわかるかもしれませんが、一番頑張ったのはMakefileだったりして。
レコードの形式をハードコードしてるから全く意味は無いんですが、成果物はdynamic link libraryとして出来上がります。おかげでデバッグめんどくさくて途中からはstaticリンクしてたよ!
あ、あと結局関係無かったんだけどMacのXcodeに入ってるgccのバグに遭遇して、Mac使いにXcodeのバージョンアップが必要な事とかやり方だとかを教えてもらったりしましたけど、それはまた気が向いたら書くかもしれません。

やってみた感想は、確かにB-Treeのアルゴリズムを組む事自体が結構難しかった。いや元々苦手なんですよねアルゴリズムとか。
ただ、2ヶ月かかったって言いましたけど、毎週日曜に1~2時間ずつ遊んでた感じなので、まあ時間はかかりましたけど、間が1~2週間開いた程度では大丈夫なくらいコード自体はきれいなんじゃないかなぁと思っています。
コードのスタイルは、BSDスタイルを元にした私が前に関わってたプロジェクトのスタイルにさらに私の流儀を足したような、なんかそんな形式なので、似たようなコードを書く人がいたら私の仲間かもしれません。

あー、コーディングスタイルについて語るのも面白いかもしれないなぁ。

ということで、今後気が向いたらこのB-Treeをさらに実際にディスクI/Oさせるようにしてみるかもしれません。でもそれより最近Erlangにハマってるからそっちをやるかな。まあ、やる気が出たらやります。

と、ここまで書いた段階で缶ビール1300ml程消費しました。

低レベルといえばこんな面白そうなイベントがあるのを思い出しました。
(日程未定、会場提供者募集中!) スタート低レイヤー: printfからはじめよう - [PARTAKE]
実は私もFreeBSDのprintfを泣きながら2~3ヶ月かけて解析した思い出があって、なつかしいなぁとか言ってたらid:seizansに「じゃあ講師として出てください」って言われて面倒だから断った。
あーでもNetBSDかーほとんど使ったことないけど、自作OS立ち上げのためのブートローダの設定の参考として結構お世話になった気がするなぁ。とか言ってたらちょっとやってみたくなったけど、
でもどうせカーネルのソース読むなら改造したり自作カーネル書いたりしたいよねぇ。

ビールの消費量が1500mlになったところで、今日のところはおしまい。