とある京大生の作業ログと日々の雑記

コンピュータサイエンスについて学んだことを可視化したり日々の雑記をまとめてます。

最近読みきった技術書のレビュー

こんにちは!コミさん([@komi3__](https://twitter.com/komi3__) )です!




今回は本のレビュー企画です!




今までずっと機械学習とかデータサイエンス系をゴリゴリやってたんですけど、SVMとか主成分分析とかのCPUメインなやつはまだしも、ニューラルネット系に関してはやっぱGPUがないとめちゃくちゃしんどいんですよね...




いかに機械学習とかの知識があるといってもぼくは所詮はただの大学生なわけで、しかも狭いワンルームに一人暮らししてるのでGPUを買うお金も置く場所もないわけです(普段のコーディングとかはMacbook Airを使ってて、デスクトップは持ってません)




まあそんなこんなで機械学習に携わるのはバイトだけだったんですけど、今は留学の関係でバイトはもう退職してしまったのでもうしばらく機械学習はやってないんですよねw




で、そんな経緯で最近は低レイヤへ手を出しまくってます!




まあもともとコンピュータアーキテクチャとか色々興味があったのでいい機会なのかもしれません(?)



紹介する本



ということで今回は掲題の通り、オライリージャパンから出てる『コンピューターシステムの理論と実装』『HACKING : 美しき策謀』を読み終えたので、今回はそのレビューを行いと思います。



  • コンピュータシステムの理論と実装

https://images-na.ssl-images-amazon.com/images/I/91Kc8DrSmfL.jpg

[Amazon](https://www.amazon.co.jp/dp/4873117127/ref=cm_sw_r_tw_dp_U_x_BDIjBb16SC6C7)




  • HACKING : 美しき策謀


http://www.oreilly.co.jp/books/images/picture_large978-4-87311-514-6.jpeg

[Amazon](https://www.amazon.co.jp/dp/4873115140/ref=cm_sw_r_tw_dp_U_x_KFIjBb5M137A0)



両方ともオライリー出版なのはぼくがややオライリー信者みたいなとこあるからなんですけど、とりあえず2つともよかったのでシェアさせてもらいます!




コンピューターシステムの理論と実装



ぼくもともとコンピュータアーキテクチャについて興味があって、別に研究したいとかそういうわけではないんですけど情報系を志す人間としてコンピューターアーキテクチャについて一度はしっかり勉強しておくべきだろうと思ってたんです。




色々探してたところ、この本が結構いいぞというレビューを散見したのでぼくもこれに挑戦してみました。




結論から言うと、この本は最高でした。




買ってよかったなぁと思える一冊でしたね。



本の構成

  1. AND回路やOR回路などを用いた単純なブール論理
  2. ブール論理を用いた加算器や算術論理演算器
  3. レジスタやメモリ、カウンタなどの順序回路の構成
  4. A命令とC命令など機械語を構成
  5. ノイマン型コンピュータのアーキテクチャ解説
  6. アセンブラ
  7. バーチャルマシンでのスタック操作
  8. バーチャルマシンでのサブルーチン呼び出しなどのプログラム制御
  9. サンプルの高水準言語の解説
  10. コンパイラにおける構文解析
  11. コンパイラにおけるVM言語の生成
  12. OS実装


といった内容となっています。




この本の掲げるスローガンが「NAND2TETRIS」というもので、「NAND回路という最もプリミティブな回路からスタートして、だんだんと積み上げていって最終的にテトリスを実装する」というメッセージが込められています。




実際に本の構成としても、最初は単純なブール論理から始まって、それがだんだんと積み上がってバーチャルマシンを構成するところあたりになるとめちゃくちゃ楽しくなってきます。




書評

ぼくがコンピュータアーキテクチャコンパイラの知識が比較的浅かったのですが、この本を読んで非常に勉強になったと思いました。



非常に解説方法も丁寧で、時折おもしろい例えなどをあげてくれるので直感的に理解しやすいと思います。



内容としてはコンピュータシステムを最小限で構成するということもあって最短経路をとった感じの説明でしたが、裏を返せば最小限のことしか書いてありません(よってGPUなどの分散コンピューティングに対する言及などはありません)




また、バーチャルマシンについても.NETについての詳しい解説などは特になく、最小限の構成のみを紹介しています。




ただ、こうした「最小限の解説」は良いポイントもあり、途中でくじけずに常に全体像を意識できるので勉強のモチベーションが保ちやすいです。




コンピュータシステムについて初学の場合はこうした簡単で全体像が意識できるものは非常にいい教材であると思いました。




さらに踏み込んだ内容についてはパタヘネやヘネパタを読めばいいのかもしれません....!!



注意

コンピュータシステムについての勉強に非常にいい本書ですが、本書で扱う高水準言語としてJavaをシンプルにしたようなJackという言語を用いており、構文解析などの章ではこれらの知識をフル活用しますのでオブジェクト指向型のプログラミング言語の経験がないと少々厳しいかもしれません。



裏を返せば、Javaの経験があれば非常にわかりやすいと思います。




** まとめ

是非ともおもしろい一冊ですのでオススメです!



HACKING : 美しき策謀

続いて策謀本。




これはもう最高でした。




めちゃくちゃ面白かったです!!




ぼく自身セキュリティについて深く勉強したことがなくて、セキュリティについても知識も「DoS攻撃...? あぁなんかサーバーダウンするやつだっけ...?」というようなもんで、従ってハッキングについての知識はゼロみたいなものでした。




この本を読んでセキュリティの知識が結構ついたし今後もセキュリティに関わっていきたいなぁって思ったくらいなので、マジでこの本はすごいですw


本の構成

  1. C言語の基礎
  2. プログラムの脆弱性
  3. ネットワークを介したサーバーへの侵入
  4. シェルコード
  5. 攻撃と防御の共進化(デーモンや暗号化など)
  6. 暗号学

といった内容です。




注目するべきが最初がC言語の解説から始まるということです。






この解説がすごい詳しく行われていて、今までC言語触ったことあるし大丈夫!って人も読んでみるべき内容だと思います。







例えばmalloc()関数とかのメモリ管理や、strcpy()関数などのポインタや配列の知識などをがっつり解説します。







今まで数値計算C言語を使ったことがあるくらい、という感じの人は非常に刺激を受ける内容だと思います!





書評

内容としては非常に洗練されています。




どういうロジックで脆弱性が生まれ、それがどのようにしてroot権限が奪取されるかなど、物語の構成がしっかりしているので非常にわかりやいです。




また、具体的なコードを載せてあるので実際に実装しなくても理解ができると思います。





ただ、ポイントとしてmacOSなどセキュリティに最適化された環境だと、本に載っているような脆弱性を再現できなかったりするので、そこは注意が必要です。



まとめ

以上、2冊を紹介させてもらいました。



とても勉強になったので、まだ読んだことないって人はぜひ書店で手にとってもらえればと思います!