ScotlandOnRailsに行ってきました


4月4〜5日にスコットランドでScotlandOnRailsというイベントがあったので参加してきました。


(カンファレンス主催者はスコットランドの民族衣装であるキルトでお出迎え)

このイベントは去年プログラミング合宿に参加した(私以外の)メンバーが中心になって一年近くかけて準備してきたイベントで、地方開催の割には,Jim Weirich(Rake, Gem, Flexmock),Michael Koziarski(Railsコア開発メンバー),David Black(Ruby For Rails),Charles Oliver Nutter(JRuby)など大物Rubyist達もスピーカーとして参加していました。

参加者は100人ちょっとだったので、参加者の多くの人と気軽に会話に加われるサイズだったのが良かったです。

どのトークも興味深かったのですが、特に個人的にためになったトークのいくつかを紹介します。

  • Story Driven Development: The Next Generation of Rails Functional Testing(Bryan Helmkamp)

アジャイル開発手法の一つである「ユーザーストーリ」を実際に動くテストコードとして作成するためのRSpecツールの一つ「Story Runner」の紹介。
Story Runner自体は以前から知っていたのですが、Bryanが作成したwebratというツールが便利そうでした。これはtest内で以下のようにブラウザ内の挙動を記述可能なものです。

def test_sign_up
visits "/"
clicks_link "Sign up"
fills_in "Email", :with => "good@example.com"
select "Free account"
clicks_button "Register"
...
end

この方法のいい点としては、(A)モデルやコントローラなどの情報を書く必要がないので、ユニットテストを作成する前のアクセプタンステストを作るのに都合が良い(B)ブラウザ内の動きを確認するにはSeleniumを使う方法もありますが、Seleniumと違ってわざわざブラウザを立ち上げる必要がないので、テストの時間が短くすむ、などがあります。Seleniumと同様Javascriptのテストには使えないらしいです。

  • Code Generation: The Safety Scissors of Metaprogramming(Giles Bowkett)

 Rubyの重要な機能としてメタプログラミングを実装するための数々の手法があげられますが、パワフルな反面、Debugが難しくなりがちです。このプレゼンテーションでは、Lispの重要な概念である「code == data」という考え方をベースにコードジェネレーションの手法の数々を紹介していました。

おもしろい例としては、Ruby2Rubyというプラグインを利用して、RailsActiveRecordのコードをジェネレートする方法がすごかったです。

例えば以下のように、Userモデルの中でact_as_paraoidというプラグインが使われているとします。

class User < ActiveRecord::Base
acts_as_paranoid
def foo2
"foo"
end
end

通常act_as_paranoidが裏で何をしているかは「Railsの魔法」の陰に隠れていてよくわかりませんが、コンソール上から以下のようにtranslateすると、実際にダイナミックに作られているメソッドをあぶり出してくれます。

require 'ruby2ruby'
=> ["ProcStoreTmp", "Ruby2Ruby", "RubyToRuby"]
User.new
#
Ruby2Ruby.translate(User)
=> "class User < ActiveRecord::Base\n def deleted_attribute\n @@deleted_attribute\n end\n \n def deleted_attribute=(obj)\n @@deleted_attribute = obj\n end\n \n def destroy_without_callbacks!\n unless new_record? then\n connection.delete(\" DELETE FROM \#{self.class.quoted_table_name}\\n WHERE \#{connection.quote_column_name(self.class.primary_key)} = \#{quoted_id}\\n\", \"\#{self.class.name} Destroy\")\n end...


彼のプレゼンは各所に面白いネタがしこんであって、今回のカンファレンスのなかで一番面白かったとともに勉強になりました。同じ内容のプレゼンを他でもしているらしく、ビデオがアップされています。英語ですがぜひがんばって見てみる事をすごくおすすめします。

最後に彼が強調していたのは「ぜひCode Generation In Actionを読みなさい」とのことでした。なんでもこの本はもともとRuby用に書き下ろされたらしいのですが、当時はまだRubyOnRailsが出る直前で、Rubyを全面にだしても売れなさそうなのでC#Javaなどのサンプルも入れたのだそうです(Gilesはこの本の作者ではないので、どこからそんな裏ネタ仕入れてきたかは不明です)。

Code Generation in Action (In Action Series)
Jack Herrington
Manning Pubns Co
売り上げランキング: 8211
おすすめ度の平均: 5.0
5 プログラミング初級者のステップアップに

なんでも隠れた名著らしいです。私も早速アマゾンのWish Listに入れておきました。あとThe Art Of Unix Programmingという本もおすすめしていました。
この本は以前友達からかりたままほったらかしにしていたので、今回を契機に読んでみる事にしました。ちょうど第9章の「コード生成」という、このプレゼント同じトピックのところを呼んでいる最中です。ちなみにPerlハッカーのdankogaiさんもお勧めしています。


The Art of UNIX Programming
The Art of UNIX Programming
posted with amazlet at 08.04.16
Eric S.Raymond
アスキー
売り上げランキング: 113189
おすすめ度の平均: 5.0
5 Windowsの悪口がいっぱい書いてある痛快な本
5 UNIXの思想・哲学を知る本

  • Edgecase Dialog (Jim Weirich and Joe O'Brien)

Joe O'BrienとJim Weirichがペアプログラミングを通じてMockingを行っていく模様を寸劇形式で紹介。実際はJoeがEdge Caseという、
エンタープライズ企業へRailsの導入をコンサル会社でJimのボスなのですが、この劇の中ではちょっとお間抜けなDeveloperの役を演じ、Jim扮する先輩Developerが懇切丁寧に教えていました。

やっぱりテストって重要ですね。プレゼンの合間にかいま見たJimの壁紙が笑えました(テスト駆動開発する人しかわかってもらえないとは思いますが)。さっそく自分の壁紙にも自戒の意味を含め、同じのを設定しておきました。

"TESTING- I find your lack of tests disturbing = お前のテストのないコードは目障りだ!!"

つい前までitmediaで「レコメンデーションの虚実」という題でソーシャルレコメンデーションについての特集が組まれていましたが、「じゃあそれをどう実装すればいいのか」について、いろいろな方法を紹介していました。

このトピックは特に皆の関心が高かったらしく、カンファレンス参加者の人達に「どのトークに興味があるの?」と聞くと、これをあげていた人が多かったです。

なんでもNetFlixというオンラインビデオレンタルの会社は、自社のサイトのレコメンデーションの性能を既存のものより10%あげることが出来たチームに一億円の懸賞金をかけているそうです(詳しくはこちら)。コンテスト開始から1年以上立った今もまだ記録は達成されていないそうです。

プレゼンターの人は、NetFlixで公開されているデーターを元にいろいろ試してみた結果を説明してくれていました。

ちょうど今回のカンファレンスの前日にロンドンからスコットランドまで行く電車の中で、「Collective Intelligence」という本の最初の2〜3章を読んでいたので、大体は理解できましたが、難しい公式とか出てくるとちょっとチンプンカンプンでした。

Programming Collective Intelligence: Building Smart Web 2.0 Applications
Toby Segaran
Oreilly & Associates Inc
売り上げランキング: 134

なので、カンファレンス後のパブでスピーカーの人を捕まえて、色々説明してもらいました。

最初に軽く触れた「レコメンデーションの虚実」のなかでは「ベイジアンはAmazonを超えたのか?」というセンセーショナルな見出しの記事もありますが、Collective Intelligenceの本には実装方法が懇切解説してあります(RubyではなくPythonですが)。こういった最新技術がすぐにカンファレンスは本などで知識として一般化されてしまうのが、今の時代の楽しくもあり、恐ろしい世界だなと思いました。