irohiroki's blog

Ruby, Rails, and Web technologies

大江戸Ruby会議01に参加してきましたので、そこで感じたこと、考えたことなどを、コミュニティへの感謝を込めて書き記したいと思います。

会場は深川江戸資料館のホールで、広すぎず狭すぎず、ちょうどよい大きさだと思いました。もちろんもっと大きな会場ならさらに多くの人が参加できますが、雰囲気が変わってしまいそうなので、開催規模としてちょうど良かったのではないかと。近くには隅田川の支流が流れ、河畔の桜並木が満開でした。

ホールは地下だったのですが、ユナイテッド・デザインワークスによる無線LANが設営されているという周到さでした。

最初の基調講演は松田明さんによる「100.times { Asakusa.rb.meetup! }」で、Asakusa.rbの趣旨や活動、歴史などが紹介されました。

印象に残ったのは「Rubyを良くしたい」というAsakusa.rb結成、活動の動機でした。この言葉は一見簡単なようで実は意味がわからなくて、というのはRubyは言語であってツールですが、別にCRubyにパッチを送るとかいう意味ではなさそうだからです。確かにAsakusa.rbにはコミッタが参加していますが、松田さん自身はそういう活動はしてません(よね?)

ではどういう意味かというと、もちろん松田さんにお聞きすれば答が返ってくるでしょうが、自分なりの解釈でAsakusa.rbに参加するのも楽しいように思えるんですよね。

例えばRubyを使うことは、Rubyの応用事例を増やして信頼度を上げるでしょうから、Rubyを良くすることになりそうです。Gemを作ったりすればもっと直接的に貢献できるでしょう。

さらに「Ruby」に「Rubyコミュニティ」を含むと解釈すると、範囲は大きく広がります。「Rubyコミュニティを良くする」というのはもう本当にいろいろな解釈がありそうですが、書くと野暮になりそうだし、探求を続けていきたい領域なのでここには書きません。

結局、「Rubyを良くしたい」の解釈は様々に可能ですが、いずれにしても自分以外の誰かに利することなので、「あなたを幸せにしたい(Rubyを通して)」ぐらいに考えておいてもいいのではないでしょうか。いずれにしても、僕はこの基調講演を聞いて、Asakusa.rbに参加してRubyを良くしたい(Rubyを良くすることを探求したい)という思いを強くし、参加する決心をしたのでした。

続いて笹田さんの基調講演と6人のAsakusa.rbメンバーによるNinja Talk (Lightning Talk)がありました。

他の言語の場合は知らないんですが、RubyのLightning Talkはデータを見せるものよりストーリーを語るものが多い印象です。自分が通信技術の会社で「◯◯プロトコルに☓☓機能を加えて受信特性を3 dB改善」みたいな発表ばかり見ていたせいかもしれませんが、RubyのLightning Talkはカジュアルで、感情に訴えてくるところが見てて楽しいですね(そうでない、データを見せるものももちろんありますが)。Regional Ruby会議は学会ではなく、交流会の意味合いが強いので、そういう発表の方が理にかなっているし、モチベーションの源になったりします。

個々の発表の感想は省きますが、今日も6人のNinjaに楽しませていただきました。ありがとうございました。

懇親会は桜鍋の店で、珍しい、美味しい料理をいただきました。よくある飲み会の大皿料理でなく、コース料理だったのも嬉しかった。また、座敷だったので人が移動しやすいのも良かったんではないでしょうか(実際には僕はチキンなので移動せず、移動してくる人を待ち構えていた)。ただ僕は体が大きいので、席が狭いのだけが少し辛かったんですが。

周りには左手側から@tyabeさん、@konk303さん、@nahiさん、@junyaさん、@jugyoさんという席。最初にnahiさんのhttpclientの話から、Railsのthreadsafe!関連の話へ。この辺は実はよくわからないので、優先順位の高いものが終わったら調べ直そうと思います。

そのうち(よく聞いてなかったんですが)Ruby 1.8.7でGCが解放したメモリをOSに返せないのかという話になったようで、@nahiさんが@shyouheiさんのところへ。"そういう研究もあるが、閉じた組織がやってるので状況はわからない"という回答をもらってきました。こういう風に、リアルなユーザの要望がその場でメンテナに届いて回答が返ってくるのが面白い。さすがAsakusa.rbです。

途中、角谷さんに社内でやった『アジャイルな見積もりと計画づくり』読書会の話をできたのが嬉しかったんですが、あまりに個人的なので省略。

その他にもリアルにRubyで商用サービスを動かしてる人たちから、JavaScriptのテストの方針や、負荷とDBの勘所の話を聞くことができました。自分はいつも職場でたった一人のRubyistとして仕事をしていて、またコンシュマー向けのアプリをリリースしたこともなく、レスポンスのほとんどない世界で漠然とした孤独を感じていました。でも懇親会で話を聞くうち、自分が作ったものを公開すれば必ず見る人がいる、使う人がいる、もしかしたら喜ぶ人もいると思えるようになってきました。これは仕事以外で開発をする上でとても大きなモチベーションになります。懇親会で話を聞かせてくれた方、大江戸Ruby会議と懇親会を開催してくれた方には心から感謝します。ありがとうございました!

Published on 11/04/2011 at 15h10 under . Tags ,

RubyKaigi2010のA Metaprogramming Spell BookのスピーカーであるPaolo Perrotta氏が著し、@kdmsnr氏が訳した『 メタプログラミングRuby』を読みました。

大変面白かったのでご紹介します。

目次は以下の通り。第1部だけ少し細かく書いてあります。

第1部 メタプログラミングRuby

  • 第1章 月曜日:オブジェクトモデル
    • 1.1 ビルと一緒の月曜日
    • 1.2 オープンクラス
    • 1.3 クラスの真実
    • 1.4 クイズ:引かれていない線
    • 1.5 メソッドを呼び出すときに何が起きているの?
    • 1.6 クイズ:絡み合ったモジュール
    • 1.7 オブジェクトモデルのまとめ
  • 第2章 火曜日:メソッド
    • 2.1 重複問題
    • 2.2 動的メソッド
    • 2.3 method_missing()
    • 2.4 クイズ:バグ退治
    • 2.5 もっとmethod_missing()
  • 第3章 水曜日:ブロック
    • 3.1 水曜日の過ごし方
    • 3.2 クイズ:Ruby#
    • 3.3 クロージャ
    • 3.4 instance_eval()
    • 3.5 呼び出し可能オブジェクト
    • 3.6 ドメイン特化言語を書く
    • 3.7 クイズ:より良いDSL
  • 第4章 木曜日:クラス定義
    • 4.1 クラス定義のわかりやすい説明
    • 4.2 クイズ:クラスのタブー
    • 4.3 特異メソッド
    • 4.4 特異クラス
    • 4.5 クイズ:モジュールの不具合
    • 4.6 エイリアス
    • 4.7 クイズ:壊れた計算
  • 第5章 金曜日:コードを記述するコード
    • 5.1 道案内
    • 5.2 Kernel#eval
    • 5.3 クイズ:属性のチェック(手順1)
    • 5.4 クイズ:属性のチェック(手順2)
    • 5.5 クイズ:属性のチェック(手順3)
    • 5.6 クイズ:属性のチェック(手順4)
    • 5.7 フックメソッド
    • 5.8 クイズ:属性のチェック(手順5)
  • 第6章 エピローグ

第2部 Railsにおけるメタプログラミング

  • 第7章 ActiveRecordの設計
  • 第8章 ActiveRecordの中身
  • 第9章 安全なメタプログラミング

第3部 付録

  • 付録A よく使うイディオム
  • 付録B ドメイン特化言語
  • 付録C 魔術書
  • 付録D 参考書
  • 付録E から騒ぎ

本のタイトルは『メタプログラミングRuby』ですが、メタプログラミングに限らずRubyでスムーズにプログラミングするために必要な知識がどっさり載っています。例えば、複数のクラスに同じクラスメソッドを定義するにはどういう方法があるか?クラスインスタンス変数とは何か?クラス変数との違いは?など、曖昧に覚えていることや使うたびに調べているようなことが、整理されて論理的に理解できるようになりました。

Rubyのコードを論理的に読み解くには、オブジェクトモデルとスコープの理解が欠かせません。Rubyのオブジェクトモデルには"メタクラス"あるいは"特異クラス"と呼ばれる隠れたクラスが潜んでおり、重要な役割を果たしています。

例えばあるクラスAのインスタンスaを作り、その特異クラスにメソッドを定義すると特異メソッドになります。

class A
end

a = A.new

class << a
  def foo
    p 'foo'
  end
end

a.foo # => "foo"

しかしaのクラスであるAにはfooメソッドがありませんし、Aのスーパークラスにも特異クラスは現れません。

a.class # => A
A.instance_methods.grep(/foo/) # => []

A.ancestors # => [A, Object, Kernel, BasicObject]

では特異クラスはどこにあるのでしょうか?

次にスコープの例です。トップレベルでクラス変数@@aに値を入れたあと、適当なクラスAでも同様に@@aを使ったら、トップレベルの@@aは影響を受けるでしょうか?

@@a = 1

class A
  @@a = 2
end

p @@a

答えは"受ける"です。上のコードの結果は2になります。では、インスタンス変数@aや、ローカル変数aだったらどうでしょうか?またそれはなぜでしょうか?

以上のような質問に答えるために、それぞれの場合の答えを丸暗記する必要はありません。単純なスコープのルールを覚えておけば済みます。スコープを理解すると、class_evalやinstance_evalの使いどころや、クロージャの意味まで明確になります。『メタプログラミングRuby』にはそれらを理解するための例や解説が豊富に載っています。物語形式になっていて、リラックスして読み進めることができると思います。

『メタプログラミングRuby』を読んだ一番の成果は、上述のオブジェクトモデルとスコープの理解が深まったことでした。これだけでプログラミングが楽になったと実感したほどです。そのほかの良かった点は、第5章の連続クイズが段階的な理解度テストになっていて手頃な腕試しができることや、Proc.new, proc, lambdaの違いなど、オフトピックも面白かったことです。以上、購入を考えている方の参考になれば幸いです。

メタプログラミングRuby
メタプログラミングRuby
  • 発売元: アスキー・メディアワークス
  • 価格: ¥ 2,940
  • 発売日: 2010/08/28

Published on 09/09/2010 at 00h50 under . Tags ,

Powered by Typo – Thème Frédéric de Villamil | Photo L. Lemos