2017年6月

下記エントリで書いたように、最近は Linux やネットワークについて学んでいる。

itkq.hatenablog.com

具体的には、まず Unix の歴史や位置づけについてまとめた (Unix の歴史と思想, Unix 以外のオペレーティングシステム)。 その後 Linuxシステムプログラミング を読んだ。プロセスやメモリ関連の基本は理解していたつもりだったが、 システムプログラミング上で必要だが知らなかったこと (fork() するとファイルディスクリプタは引き継がれる、とか) を知った。 まとめとして、ファイル I/O について書いた (Linux におけるファイル I/O の基礎)。

これまでに得た知識を基に、実践的なネットワーク内容として、HTTP/1.0 サーバを C で書いてみることにした。 RFC1945 をまず読んでから、Macbook に入れた Ubuntu でおよそ5年ぶりぐらいに C を書いた。 可能な限り man を読んだ。man 7 はかなり役に立つことを知った。 前に読んだ Working with TCP Sockets1 を参考にして prefork を実装した。 しかし文字列操作などで消耗して、学びたかった本質ではなくなっているように感じたため、HTTP/0.9 ぐらいの実装で一旦終わりにした。

github.com

今後は HTTP/0.9 から HTTP/2 まで、どのように変遷してきたかを、RFC を読みながらまとめる予定だったが、 いいタイミングで Real World HTTP が出たので、購入して読んでいる。 まさに学びたかった内容が体系的に整理されており、参考になる部分が多い。

ところで、最近は Go 言語に興味がある。 正確には Go 1.6 ぐらいから興味はあって、Go で Web アプリケーションを書いたこともあったのだが、今回はシステムプログラミングという文脈である。 Go はその特徴から、現代でシステムプログラミングを学ぶいい教材と言われている[要出典]。 色々良し悪しはあると思うが、インフラレイヤーにおける Go 製のアプリケーションが増えていることから、今後まともに読み書きできるようになっておいて損はないと思うし、 Rust はまず学習が大変だと思った。

今は下記の特集を読んでいる。素直に面白い。 ascii.jp

今度は Go でなんか書くか読むかしようと思う。


  1. この本は英語で書かれており、Ruby を使って TCP ソケットを学ぶという内容だが、取っ掛かりとしてはわかりやすく、興味を持てるのでいい本だと思う。