Rubyをしっかりと理解するために「パーフェクトRuby」を読んでみた
はじめに
こんにちは。
先日(といっても5月末の話なんですが)、関西Ruby会議2017に参加しました。
で、パーフェクトRubyの著者の1人であるjoker1007さんの発表の最後にパーフェクトRubyの第2版がプレゼントされるじゃんけん大会がありました。
- 作者: Rubyサポーターズ
- 出版社/メーカー: 技術評論社
- 発売日: 2017/05/17
- メディア: 大型本
- この商品を含むブログ (1件) を見る
貰えればラッキーと思い切って参加してみたところ、なんと最後まで勝ち残りました。(勝ち残れるとは思ってなかった・・・)
そこからコツコツと読み進めて先週ようやく読み終わったのでその感想とかを書いていきたいと思います。
※ちなみにこれは本の贈呈後にjoker1007さんにサインをもらってる時の写真です。(ふ、太りすぎや・・・)
本書の構成
Part2 Ruby言語仕様
2章 Rubyの基礎
3章 制御構造/メソッド/組み込み関数
4章 クラスとモジュール
5章 主な組み込みクラス/モジュール
Rubyの文法やよく使う組み込みクラスやモジュールについて書かれています。
こんな書き方もあったんだという発見が結構あります。
Part3 メタプログラミング
6章 Rubyのクラスオブジェクト
7章 動的なプログラミング
8章 Procオブジェクト
9章 Methodクラス
10章 Rubyでのリフレクションプログラミング
Rubyにおける動的にソースコードを生成するメタプログラミングについて書かれています。
メタプログラミングをどう使っていくかというよりはメタプログラミングをする上でのRubyの仕様が主に書かれています。
個人的にはここが一番重かったです。
Part4 標準添付ライブラリ
11章 ライブラリ
12章 組み込みツール
開発のうえで便利なライブラリや組み込みツールについて書かれています。
学んだこと・感じたこと
gemを読めるようになりたい、開発できるようになりたいという人にオススメの1冊
本書はRubyの文法や仕様が網羅されています。
またgemの開発方法に関しても記載されています。
そのため、「Rubyの基本はわかったけどgemが読めない」とか「gemって怖い」とかいう人にはオススメの1冊です。
メタプログラミングやRubyの実践的なテクニックに関しては別途他の書籍を読む必要がある
本書は主にRubyの文法や仕様をメインに扱っているため、「仕様はわかったけどどういう風に活かせばいいの?」というニーズには応えられないと感じました。
そのため「メタプログラミングRuby」や「Effective Ruby」を別途読む必要があると思います。(どっちもまだ読んでないのであくまで推測ですが・・・)
Rubyに限ると(Railsの学習を除くと)読む順番としては下記のような順番がいいのではと考えます。
オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方
- 作者: Sandi Metz,?山泰基
- 出版社/メーカー: 技術評論社
- 発売日: 2016/09/02
- メディア: 大型本
- この商品を含むブログ (1件) を見る
- 作者: Paolo Perrotta,角征典
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/10/10
- メディア: 大型本
- この商品を含むブログ (3件) を見る
- 作者: Peter J. Jones,arton,長尾高弘
- 出版社/メーカー: 翔泳社
- 発売日: 2015/01/09
- メディア: 大型本
- この商品を含むブログ (13件) を見る
誤字・脱字やサンプルコードが動かないというケースがたまにある
誤字・脱字やサンプルコードが書いてある通りに動かないというケースがたまにありました。
例えば383ページのコード。(他にもいくつか見つけたけどメモっていなかった・・・)
require 'webrick' require 'webrick/httpproxy' proxy = WEBrick::HTTPProxyServer.new( :BindAddress => '127.0.0.1', :Port => 8080, :ProxyContentHandler => ->(req, res) { puts body.scan(/<title>(.*)<\/title>/im).join rescue nil } ) Signal.trap('INT') do proxy.shutdown end proxy.start
書籍内ではこのプログラムを起動して別のプログラムでwww.ruby-lang.orgにアクセスを行うとターミナルに「オブジェクト指向スクリプト言語 Ruby」が出力されるとなってますが、実はうまくいきません。
レスポンスのエンコーディングがgzipになっているからです。
下記のようにするとうまくいきます。
require 'webrick' require 'webrick/httpproxy' require 'zlib' def gzip_response?(res) res['content-encoding'] == 'gzip' end def open_gzip_response(res) Zlib::GzipReader.wrap(StringIO.new(res.body)) { |gz| gz.read } end proxy = WEBrick::HTTPProxyServer.new( :BindAddress => '127.0.0.1', :Port => 8080, :ProxyContentHandler => ->(req, res) { body = gzip_response?(res) ? open_gzip_response(res) : res.body puts body.scan(/<title>(.*)<\/title>/im).join rescue nil } ) Signal.trap('INT') do proxy.shutdown end proxy.start
こんな感じでうまくいかない場合があるのでサンプルコードは適宜irbなどで動かして確認してみてください。
あとjoker1007さんによると、もし間違いを見つけた場合は下記リンク先のお問い合わせフォームから報告してくださいとのことでした。
gihyo.jp
1冊読み終えるのに時間をかけすぎたらダメというのを改めて痛感した
これは本書の内容とは関係ないんですが、今回は1冊読み終えるのに時間かけすぎたというのが反省点です。
技術書は完全に理解できなくてもまずは期間を決めて一通り読んだうえで、再度わからなかったところを読み直すとかQiitaの記事書いてどんどんアウトプットするとかした方がいいのかなぁと思いました。