『Rubyクックブック』

Rubyクックブック ―エキスパートのための応用レシピ集

Rubyでできること/したいことを、マクロな視点(データベースアクセスやウェブサービス構築)からミクロな視点(メソッドの削除や細かい言語仕様など)まで、一問一答形式で紹介した本。
Rubyの細かい知識を前提に書かれているのでRubyをはじめる人がいきなり読むには向かないと思うが、普段からRuby使っている人がもうちょっと知識を広げるためやRubyでの流行を把握するためには丁度良いレベル。
特に、帯にも書かれているが、リフレクション関係の説明が逆引きできる形でまとまっているものはあまり見たことがないので、リファレンスとして役立ちそう。

概要

最近なんだかベタな技術書を読んでいないと!と恐くなったので、近所の本屋で目をつぶって選んだruby関係の本を読んだ。一種のリハビリとして。

一年前の本だが、しばらく(転職してからだから4年くらいか)遠ざかっていたRubyのエレガント差や良い設計への情熱などを重い出して、少しカンが取り戻せた気がする。
しかし、細かいノウハウ本だから細切れに読み終えられたが、まとまったテーマの本や難易度が高い本、新しいパラダイムを学ぶ本を読めるかどうか、リハビリを進めないといかん、とも感じた。

細かい点では、Rails関係の知識がなんとなく得られたことと、標準ライブラリはやはり大事(使ううえでも、お手本としてでも)と認識した。
リファレンスとして見返したくなる本なので、職場におくか家に置くか悩むところ(2冊買う財力はないよ)。

詳細

  • 1章 日付と時間
    • TimeはUnix timeの制限あり、DateTimeはほぼ無限
    • 日付を書いた文字列のパースにはDate.parseやDate.strptimeが便利
    • 特定プロトコル向け表示は Time#rfc822, #httpdate, #iso8601がある(require 'time')
    • タイムアウト処理用の標準ライブラリがあるよ Timeout.timeout
  • 2章 コードブロックと反復処理
    • enumeratorはeachをカスタマイズしたEnumerableを生成する(破壊的ではないよ)
    • SyncEnumeratorで配列が2つの時は Array#zip と同じ
  • 3章 モジュールと名前空間
    • autoload はでかいライブラリを作る時に効率良さそう
  • 4章 リフレクションとメタプログラミング
    • メソッド取得用メソッドはいろいろ
      • public: methods, instance_methods, singleton_methods, method_defined?, respond_to?
      • protected: 頭に protected_ を付ける(singletonとrespond_to? 相当は無し)
      • private: 頭に private_ を付ける(singletonとrespond_to? 相当は無し)
    • メソッドをprocとして(ちょっと違うが)取り出して使うには #method, #arity, #call
    • instance_variable_setにbindingを渡して、インスタンス変数自由自在
    • メタプログラミング(evalみたいの)は、define_method, module_eval, instance_evalを使いける
    • メソッドの削除は undef_method(継承したメソッドもOk)とremove_method(自分がdefしたもののみ)
    • aliasはsymlinkじゃなくメソッドのコピーを作るので、元methodの再定義には影響を受けない
    • AspectRというライブラリでelispのdefadvice(beforeとafter)が可能(インスタンスもclassも対応可)
    • DbC(Design by Contract)の一部(引数オブジェクトのメソッドの確認)ができるライブラリ紹介
      • こういうのは、ライブラリを使う側の検証のために、デバッグ時に組み込んどくと楽ができるんだよね
      • EiffelスタイルのDbCライブラリもある(けどEiffelはしらん)
  • 5章 データベースと永続性
  • 6章 インターネットサービス
    • open-uriはお手軽
    • htpsはNet:HTTP#use_ssl=trueするだけで(インストールされていれば)Ok。
    • Net::Telnetは実は汎用的 ('Telnetmode' => false)
    • URI.parseは積極的に使うべき
    • Webrickの考え方はTomcatに似てると知った
  • 8章 テスト、デバッグ、最適化、文書化
    • retryは知らなんだ…
    • LoggerみたいなライブラリはCでもANSIで標準化すべきだ(え?)
    • 単体テストClassの命名ルールはこの本は XxxTest だが autotest では逆?
    • FlexMockは考え方が面白い。操作されるべきルールを作っておくのか
    • ruby-breakpoint gem 使いまくるべき。breakpintとassert
    • パフォーマンス測定には profile と benchmark
    • コールグラフアナライザは便利そう?これも標準lib化すべきじゃないのか
  • 10章 Rakeによるタスクの自動化
    • rakeはmakeに比べて気が効く標準ルールを作りやすい、てことか
  • 11章 マルチタスクとマルチスレッド
    • daemonizeはdaemon(3)の動作を忠実に再現?
    • each_simultaneouslyは凶悪だがEnumerable拡張とenumeratorはえらい柔軟だな
    • それはスレッドプールではなくて実行権の奪い合いでは?
    • Rubyにも条件変数があったのか!
    • popen3でstderrを別で取れるのは忘れないようにしよう
    • Net::SSH::session#popen3はリモートホストでpopen3実行!
    • lock_allの考え方は重要だ。RTOSでもこの仕組みは要るって
  • 12章 ユーザインターフェイス
    • OptionParserは適度に省エネになるのだがいかんせん行数が増えて困る(getopts比)
    • やっぱりどこでもreadlineは必須
    • GUI toolkitにはクロージャがやっぱり似合います
    • wxRubyがあるのか。マルチプラットフォーム対応を考える時にはこれだな
    • RubyCocoaIDE付きですか。