Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
dRubyConf draft

dRubyConf 2012 参戦日記

こんにちは。「RubyConf参加支援企画プログラム」に採択していただき、デンバーまで行ってきた井上といいます。

今回は私がアメリカのカンファレンスで発表するまでの道のりと、dRubyの作者である関政俊さん(以下「咳」さん)と一緒に聞いてきた他のトークの概要を紹介していきたいと思います。

ちなみに私たちはdRubyに関連するような並列、平行プログラミングやデータベースのトークを中心に参加したので、このカンファレンスは「dRubyConference」という視点で見ていきます。

応募するまでの道のり

8月10日ごろに日本Rubyの会の角谷さんより参加支援企画プログラムのことを教えていただき、咳さんと一緒に応募することにしました。 ルビマの読者のみなさんはご存知かもしれませんが、咳さんは2006年にRuby Kaigiが始まって以来毎年のようにトークをされており、話題が豊富です。 その中でなににフォーカスしようか迷っていたのですが、私が今年の3月にLondon Ruby User Group (LRUG)でdRubyについて話した時に、dRubyの初期バージョンのコードレビューをしながらdRubyの構造を解説した箇所が結構好評でした。

そこで今回は咳さん直々にdRubyの開発秘話を話していただくという方向性でトークプロポーザルを書くことにしました。

最初のバージョンは「The dRuby Begins (Metaprogramming rises)」というタイトルだったと思います。

しかしながら同僚にトークプロポーザルのレビューをお願いしたところ「そのタイトルでは話の中身は何で、参加者はどういうベネフィットを得られるかがわからない。あとタイトルはもっとキャッチーでちょっとあおりが入るぐらいがよい」 という指摘を受けました。そこで練り直したタイトルがこれです。

「Rails Is A Follower: what we can learn from dRuby’s metaprogramming magic」

Railsをフォロワー扱いしてしまうのはかなり大胆なタイトルだと思いますが、これはThe dRuby Bookの中でMatzに書いていただいたForewordの中から拝借しました。そして同時に参加者は「メタプログラミングについて学べる」という目的を提示できたのではないかと思います。

当選してから

9月5日に当選が決まってから実際に何を始めるか考えはじめたところ、「dRubyを開発するまでの歴史を1990年ぐらいから系統立てて話をしていくのはどうか」という方向性にで咳さんにドラフトを書いていただき、それを私や角谷さんからのフィードバックをもとに色々修正していきました。2人の役割分担としては、最初のイントロとdRubyのデモは私が担当し、その後にdRubyが出来るまでの咳さんのプログラミングスタイル、そしてそのプログラミングスタイルへの不満を解決するためにdRubyを設計した際のデザインポリシー、実際に実装する際のメタプログラミングのテクニックの数々を咳さんに直接話していただくことにしました。

大体カンファレンスの始まる2週間前までに咳さんに話す内容のスライドと台詞を全部日本語で書いていただき、その後で私が翻訳しました。デモの部分はライブで行うのには不安があったので、事前にscreenrというサイトでデモビデオを作成して、プレゼンテーションツールに埋め込む形にしました(私達のプレゼンツールはAppleのキーノートだったのですが、まつもとさんが私たちのトークをご覧になった際に「この機能Rabbitにも欲しい」と日本にいるすとうさんを叩き起こして急遽実装させていました)。

その後で一度咳さんの箇所も含めた部分を社内でリハーサルした後、同僚のMark(彼はイメージアップローディングgemのDragonFlyでちょっと有名です)に文法を直してもらった後、咳さんの担当個所を全て朗読してモノを音声ファイルにしてもらい、咳さんにお渡ししておきました。これで咳さんもカンファレンスが始まるまでに流暢なQueen's Englishをマスターされているはずです。

渡米

カンファレンスの始まる2日前の10月30日にデンバー入りしました。ホテルにつくと咳さんが既に到着しており、あいさつもそこそこに最後の打ち合わせに取りかかりました。

咳さんは、私がお渡しした音声ファイルを節ごとに再生可能な形に換えた上で何度も練習されていたようで、発音などは特に問題ありませんでした。ただ苦労されていたのは息継ぎのタイミングです。

例えば以下の例を見てみましょう。

You also spend time trying to come up with cool urls, but that’s not the core of your application.

Markはかなりゆっくりめに話してくれていたのですが、それでも英語を母国語でない人が話すには長過ぎて、途中でつまってしまいがちです。あと「that’s not the | core of your | application.」といった変な位置で区切ってしまうと聞きづらくなってしまいます。

そこでMarkの音声ファイルを一緒に聞きながら、以下の要に息継ぎのタイミングを紙に記入していきました。

You also spend time | trying to come up with cool urls, | but that’s not the core | of your application.

これで準備もバッチリのはずです。

この日の晩はBuppa Gumpというレストランでエビ料理を堪能しつつ万葉の五十嵐さんと卓球対決をしました。

Day 1

いよいよRubyConfが始まりました。見たいセッションはいくつもあったのですが、その中でも私たちのトークのネタとして使えそうなものを中心に見ていきました。

Allow me to reintroduce myself. My name is MagLev. 11:30am - 12:15pm (45m)

SmallTalkのオブジェクトデータベースをRubyで使うことの出来るMagLevの紹介。

Maglevの売りはデータもコードもまとめて「Stone」というデータベースに格納し、各バーチャルマシーンはトランザクションを使って保存できるのが売りです。

サンプルファイルはこのような感じです。

# VM #1
PROOT = Maglev::PERSISTENT_ROOT
pierre = Cat.new("Pierre")
pierre.object_id
# => 1234567
PROOT[:pierre] = pierre
Maglev.commit_transaction

トランザクションの始めは暗黙的に行われており、commit_transactionを打った時点でStoneの方に保存します。 またMaglevの軌道モードを帰ることでトランザクションの範囲をRubyブロックの中で明示的に指定することも出来ますし、また「transient」というブロックの中で「この部分はStoneに保存せずLocal VMの中だけで持っておきたい」と指定するのも斬新でした。

Maglev.transient do
  # Will only be persisted locally
  # Won't be written to the stone
end

MagLevはどんなデータ構造を扱えるのでオブジェクトデータベースのように使うことも可能です。

また比較としてRedisのSorted Setの例を持ち出していました。Redisは多くのデータ構造を持っているのですが、例えばランキングボードを計算したい時にSorted Setを使うとします。しかしながらSorted Setは一つの値に大してしかソートできないので例えば「ポイントが同順位の場合は日付で順位決めができない」という問題が起きてしまうそうです(RDBMSだとorder by a, b, cと複数指定可能ですが)。 そういった際にデータベースの機能に縛られるのではなく素直にRubyでできると言っていました。

このトークを聞いてみての感想を咳さんに聞いたところ、「Maglevはオブジェクトデータベースとして使うには良いかもしれないが分散処理で同期をとるための機能としては向いていないのでは」とのことでした。 「でも逆にMaglevをdRubyで分散かしたら良いんじゃない?」とのこと。面白いことに私たちのdRubyのトークの後にこのトークをした人が話しかけてきて、全く同じ提案をしてきました。

Building Data Driven Products with Ruby 3:30pm - 4:15pm (45m)

データサイエンティストによるBig Dataの扱いについて。

実は私はあまり集中して聞いていなかったのですが、咳さんは面白かったとのこと。何が面白かったのか聞いてみたとろろ「Hadoop Hadoopとか叫ばれているけれどBig Dataのうちのほとんどのデータはノイズなだけで、実は適切なフィルタリングをすることで十分にデータサイズを小さくすることが可能なんだよね」とのことでした。以下のような3行のコードでビッグデータを手なずけることが出来るのはある意味あっているかも知れません。

STDIN.each do |line|
  p puts line if line.match(/user_id=&/)
end

Dissecting a Ruby Block Pat Shaughnessy - 5:30pm (45m)

これは45分間ひたすらRuby Blockの実装を解説するというマニアックなものでした(そしてこのトークの作者は、Rubyのソースコードを勉強するために6ヶ月会社を休職したそうです)。なぜBlockがdRubyと関係あるかについてですが、dRubyはオブジェクトを他のプロセスに渡す際にMarshal.dumpを行い、dumpが可能なものはそのオブジェクトの値そのものを、そうでない場合はそのオブジェクトの参照値のみをおくるという仕組みになっています。その際のMarshal.dumpが出来ないものの筆頭としてBlockがあげられるので、なぜそれができないかということを理解する意味で重要とのことでした。

実際にはblockの中身を実行する際にどのようにスタックやヒープが使われるかというのを丁寧に図入りで示してくれたのですが、私にはちんぷんかんぷんだったので、ホテルに戻ってさらに2時間ほど咳さんの特別講義を受けることになりました。

発表の前夜

明日はいよいよ発表です。この時点でスライドは完成していたのですが、初日の色々なトークに刺激をうけ、いくつかトピックを追加することにしました。ここまでの発表で紹介するdRubyの中身は比較的分かりやすいものばかりでした。しかしながらもっと難しいトピックも加えて聴衆を置いてきぼりにしたくなってきました。というのもトークの中身がただ分かりやすいだけだと「もうわかった」と満足して、そこから先がなかったりします。「う〜ん、これは難しい。ぜひもっと自分で調べてみよう」と思わせるぐらいのほうが刺激があると思ったからです。

ただそれにはひとつ問題がありました。その高度な問題を英語で説明する私が理解する必要があるということです。10時ぐらいから咳さんに説明してもらって、コンセプトを説明するビデオをつくったり、私が理解するまで咳さんが根気よく説明を繰り返しているうちに夜中の1時になっていました。

Day 2

早朝にもう一度練習をした後会場入りしました。今日は「Concurrency Day」というべくトラック1〜3とある部屋のトラック3はConcurrencyに関係したトピックが並んでいました。もちろん私たちの発表もトラック3だったので、朝からずっとこの部屋に張り付いて他の発表を聞いてみました。

Asynchronous Processing for Fun and Profit 11:30am - 12:15pm (45m)

最近人気急上昇中のSideKickというバックグラウンドジョブライブラリーについての講演です。

まずは非同期プログラミングをするさいのTipとしてStateless、Idempotent (冪等性)、Embrace Concurrencyの3つをあげていました。 その上でResqueなどのライブラリーと比較した上でSideKiqの高性能をアピールしていました(主な理由はResqueではワーカーデーモンをプロセスで立ち上げるのに比べ、Sidekiqではスレッドを利用している分メモリを食わないとのことでした)。そして基本的な機能はLGPLでフリーですが、他の高度な機能やサポートサービスを有償で受けているそうです。

咳さんに意見を伺ったところ「dRubyでも同じの実装可能」とのことだったので「dRubyの有償サポートもお願いします」とお願いしておきました。

注:RubyConfのあとでNokogiri等で有名なAaron Pattersonさんより「Resqueは次のリリースでスレッドもサポートされる」とのことでした。そしたら再度ベンチマークを見る必要がありそうです。

DRb vs RabbitMQ Showdown 1:30pm - 2:15pm (45m)

「DRb vs Eventmachine Showdown 」というのがもともとのタイトルだったのですが、トークプロポーザルを出した後に予定が変わったそうです。 このトークが始まるまでは「あ〜、絶対なんでDRbからEventMachineに移行したかがメインのテーマで、DRbはものすごくDisられるんだろうな」と咳さんともどもびくびくしていました。

しかしながらこのトークの発表者のDavyさんはとっても良い人で、「使うのは適材適所、dRubyだと接続先のアドレスを指定しなければいけないけれど、複数のサーバ間でジョブをやり取りする際には適していないのでそこだけRabbitMQでメッセージバスを構築しました。でもそれ以外の箇所は今でもdRubyを使っています。だってとっても簡単で使いやすいんです」とおっしゃっていました。「その用途ならRinda(dRubyで作られた分散タプルスペース)で出来そう」という言葉はぐっと飲み込みつつ「咳さんが友達になってほしいと言っているので、後で一緒に写真を撮って下さい」と申し込んでおきました。

彼女は快く快諾しただけでなく、なんとすでにThe dRuby Book本を所持しており、咳さんだけでなく私にまでサインを求めてきました。サインを求められるなどということは今までの人生でなかったので私は舞い上がっていましたが、こういうことになれっこの咳さんは「咳さんdRuby専用青い鳥はんこ」をクールに押していました。

Rails Is A Follower: what we can learn from dRuby's metaprogramming magic 2:30pm - 3:15pm (45m)

Day 3

  • 5 ~ 10 am = 時差ぼけでベッドから起きた瞬間から「非同期プログラミングとは同期のプログラミングである」という禅問答じみた命題に対する講義を受けました。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.