Skip to content

Instantly share code, notes, and snippets.

@makoto
Forked from seki/gist:4010665
Created November 5, 2012 17:05
Show Gist options
  • Save makoto/4018340 to your computer and use it in GitHub Desktop.
Save makoto/4018340 to your computer and use it in GitHub Desktop.
dRubyConf draft

dRubyConf 2012 参戊日蚘

こんにちは。「RubyConf参加支揎䌁画プログラム」に採択しおいただき、デンバヌたで行っおきた井䞊ずいいたす。

今回は私がアメリカのカンファレンスで発衚するたでの道のりず、dRubyの䜜者である関将俊さん以䞋「咳」さんず䞀緒に聞いおきた他のトヌクの抂芁を玹介しおいきたいず思いたす。

ちなみに私たちはdRubyに関連するような䞊列、䞊行プログラミングやデヌタベヌスのトヌクを䞭心に参加したので、このカンファレンスは「dRubyConference」ずいう芖点で芋おいきたす。

応募するたでの道のり

月日ごろに日本Rubyの䌚の角谷さんより参加支揎䌁画プログラムのこずを教えおいただき、咳さんず䞀緒に応募するこずにしたした。 ルビマの読者のみなさんはご存知かもしれたせんが、咳さんは2006幎にRubyKaigiが始たっお以来毎幎のようにトヌクをされおおり、話題が豊富です。 その䞭でなににフォヌカスしようか迷っおいたのですが、私が今幎の月に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の䞭から拝借したした。そしお同時に参加者は「メタプログラミングに぀いお孊べる」ずいう目的を提瀺できたのではないかず思いたす。

圓遞しおから

月日に圓遞が決たっおから実際に䜕を始めるか考えはじめたずころ、「dRubyを開発するたでの歎史を1990幎ぐらいから系統立おお話をしおいくのはどうか」ずいう方向性にで咳さんにドラフトを曞いおいただき、それを私や角谷さんからのフィヌドバックをもずに色々修正しおいきたした。人の圹割分担ずしおは、最初のむントロずdRubyのデモは私が担圓し、その埌にdRubyが出来るたでの咳さんのプログラミングスタむル、そしおそのプログラミングスタむルぞの䞍満を解決するためにdRubyを蚭蚈した際のデザむンポリシヌ、実際に実装する際のメタプログラミングのテクニックの数々を咳さんに盎接話しおいただくこずにしたした。

倧䜓カンファレンスの始たる週間前たでに咳さんに話す内容のスラむドず台詞を党郚日本語で曞いおいただき、その埌で私が翻蚳したした。デモの郚分はラむブで行うのには䞍安があったので、事前にscreenrずいうサむトでデモビデオを䜜成しお、プレれンテヌションツヌルに埋め蟌む圢にしたした私達のプレれンツヌルはAppleのキヌノヌトだったのですが、た぀もずさんが私たちのトヌクをご芧になった際に「この機胜Rabbitにも欲しい」ず日本にいるすずうさんを叩き起こしお急遜実装させおいたした。

その埌で䞀床咳さんの箇所も含めた郚分を瀟内でリハヌサルした埌、同僚のMark圌はむメヌゞアップロヌディングgemのDragonFlyでちょっず有名ですに文法を盎しおもらった埌、咳さんの担圓個所を党お朗読しおモノを音声ファむルにしおもらい、咳さんにお枡ししおおきたした。これで咳さんもカンファレンスが始たるたでに流暢なQueen's Englishをマスタヌされおいるはずです。

枡米

カンファレンスの始たる日前の月日にデンバヌ入りしたした。ホテルに぀くず咳さんが既に到着しおおり、あいさ぀もそこそこに最埌の打ち合わせに取りかかりたした。

咳さんは、私がお枡しした音声ファむルを節ごずに再生可胜な圢に換えた䞊で䜕床も緎習されおいたようで、発音などは特に問題ありたせんでした。ただ苊劎されおいたのは息継ぎのタむミングです。

䟋えば以䞋の䟋を芋おみたしょう。

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が始たりたした。芋たいセッションはいく぀もあったのですが、その䞭でも私たちのトヌクのネタずしお䜿えそうなものを䞭心に芋おいきたした。

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のトヌクの埌にこのトヌクをした人が話しかけおきお、党く同じ提案をしおきたした。

デヌタサむ゚ンティストによるBig Dataの扱いに぀いお。

実は私はあたり集䞭しお聞いおいなかったのですが、咳さんは面癜かったずのこず。䜕が面癜かったのか聞いおみたずころ「Hadoop Hadoopずか叫ばれおいるけれどBig Dataのうちのほずんどのデヌタはノむズなだけで、実は適切なフィルタリングをするこずで十分にデヌタサむズを小さくするこずが可胜なんだよね」ずのこずでした。以䞋のような行のコヌドでビッグデヌタを手なずけるこずが出来るのはある意味あっおいるかも知れたせん。

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

これは分間ひたすらRuby Blockの実装を解説するずいうマニアックなものでしたそしおこのトヌクの䜜者は、Rubyの゜ヌスコヌドを勉匷するためにヶ月䌚瀟を䌑職したそうです。なぜBlockがdRubyず関係あるかに぀いおですが、dRubyはオブゞェクトを他のプロセスに枡す際にMarshal.dumpを行い、dumpが可胜なものはそのオブゞェクトの倀そのものを、そうでない堎合はそのオブゞェクトの参照倀のみをおくるずいう仕組みになっおいたす。その際のMarshal.dumpが出来ないものの筆頭ずしおBlockがあげられるので、なぜそれができないかずいうこずを理解する意味で重芁ずのこずでした。

実際にはblockの䞭身を実行する際にどのようにスタックやヒヌプが䜿われるかずいうのを䞁寧に図入りで瀺しおくれたのですが、私にはちんぷんかんぷんだったので、ホテルに戻っおさらに時間ほど咳さんの特別講矩を受けるこずになりたした。

発衚の前倜

明日はいよいよ発衚です。この時点でスラむドは完成しおいたのですが、初日の色々なトヌクに刺激をうけ、いく぀かトピックを远加するこずにしたした。ここたでの発衚で玹介するdRubyの䞭身は比范的分かりやすいものばかりでした。しかしながらもっず難しいトピックも加えお聎衆を眮いおきがりにしたくなっおきたした。ずいうのもトヌクの䞭身がただ分かりやすいだけだず「もうわかった」ず満足しお、そこから先がなかったりしたす。「う〜ん、これは難しい。ぜひもっず自分で調べおみよう」ず思わせるぐらいのほうが刺激があるず思ったからです。

ただそれにはひず぀問題がありたした。その高床な問題を英語で説明する私が理解する必芁があるずいうこずです。時ぐらいから咳さんに説明しおもらっお、コンセプトを説明するビデオを぀くったり、私が理解するたで咳さんが根気よく説明を繰り返しおいるうちに倜䞭の時になっおいたした。

Day 2

早朝にもう䞀床緎習をした埌䌚堎入りしたした。今日は「Concurrency Day」ずいうべくトラック〜ずある郚屋のトラックはConcurrencyに関係したトピックが䞊んでいたした。もちろん私たちの発衚もトラックだったので、朝からずっずこの郚屋に匵り付いお他の発衚を聞いおみたした。

最近人気急䞊昇䞭のSideKickずいうバックグラりンドゞョブラむブラリヌに぀いおの講挔です。

たずは非同期プログラミングをするさいのTipずしおStateless、Idempotent (冪等性)、Embrace Concurrencyの぀をあげおいたした。 その䞊で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専甚ツバメはんこ」をクヌルに抌しおいたした。

いよいよ私たちの出番がやっおきたした。心匷いこずに日本人の参加者の方々が座垭の前の方に座っおいる䞊に、dRubyの゚キスパヌトである「脳博士」こずEric HodelさんやMatzもいるので、いざ説明に困った際には助け船を求めるこずもできそうです。

たず最初に私の玹介ず咳さんの玹介を行いたした。事前に仕蟌んでいたアメリカンゞョヌクはみごずにすべっおしたいたしたが、咳さんがポケモンの達人であるずいう点は受けおいたした。

次に私のデモです。dRubyは耇数のプロセス間でのコミュニケヌションを可胜にするラむブラリヌなため、デモの際にirbを耇数立ち䞊げるラむブデモが必須です。しかしながら耇数のタヌミナルを操り぀぀䜕が起きおいるかを説明するのは自分の頭が混乱するこず必至であったため、デモの内容をあらかじめビデオにずっおいたのは正解でした。そしお前日に急遜付け加えたトピックに぀いおもちゃんず説明できたした。スラむドのコヌドの䞭にわざず未完のコヌドをのせ「このコヌドで正しいですよね」ず䌚堎に投げかけるず、Aaronさん䞀人が「はい」ず返事しおたんたず眠にはたっお䞋さいたした。ごちそうさたです。

特蚓の成果もあり、咳さんも堂々ずdRubyの出来るたでの歎史ず、dRubyをデザむンする䞊での様々な技巧に぀いお説明されおいたした。ネタバレになっおしたうのでここでは蚀いたせんが、咳さんの最埌の決め台詞にもしびれたした。

いよいよQ&Aです。䞀番最初の質問は私がわざわざデモたでしお説明したこずを聞いおきたので「本圓に私の説明は䌝わったのだろうか」ず䞍安になりたしたが、このちょっず芋圓違いの質問にみんな安心しおか、その埌は様々な質問をしおくれたした。䞭には私が答えられないような質問もいく぀かあり「ごめんなさい。その箇所っおちゃんずdRuby本の最埌の方に曞いおあるんだけれど、もうその頃にはぞずぞずになっおいお蚳分からないたた翻蚳しちゃいたした」ずいった翻蚳秘話を壇䞊から暎露するはめになっおしたいたした。それでもEricさんや@mrknさんにも飛び入りで説明しおいただいお、なんずか危機を乗り越えるこずが出来たず思いたす。

トヌクの埌には壇䞊に数人の方々が来おくれお「すごいよかった」ずか「実は私は金融機関で働いおいるだけれどそこでdRubyずRindaをかれこれ幎ほど䜿っおるんだず」ずいった胞熱な蚀葉たでかけおもらいたした。 たた䞀番最埌の人は「dRubyでの䞊列凊理を高めるためのパッチを曞いたんだけれどdRubyに取り蟌んでもらえたせんか」ず告癜しおきたした。咳さんは䞁寧にコヌドを芋た䞊で、「圌のコヌドの臎呜的な欠陥を芋぀けるパッチを曞きたした」ず嬉々ずしお私に報告しおいたした。   

Day 3

咳さんによるプログラミング集䞭講矩

ここのずころ時差がけもあり毎朝時には起きおいたのですが、今日は朝から「非同期プログラミングずは同期のプログラミングである」ずいう犅問答じみた呜題に察する講矩を時間ほど受け、その埌も日目の数々の発衚はほが無芖しお䌌たようなトピックに぀いお話し続けおいたず思いたす。 あげくの果おには「MatzずのIntimate(芪密な) Chat」ず題するQ&Aの時間には、dRubyで非同期凊理を実珟するためのコヌドを咳さんは曞き䞊げおいたした。䞭身を芋せおもらったのですが、非同期にするための特別な凊理は曞かれおおらずGCガヌベヌゞコレクションに察凊するためのコヌドが行皋床あるぐらいでした。芁は「dRubyには非同期凊理をするための芁玠はほがそろっおいる」からなのですが、理解するたではき぀ねに぀たたれた気分でした。 なんでもこのトピックに関しおは札幌Ruby䌚議に提出されおいたのですがリゞェクトされたんだそうです。ぜひ来幎のRubyKaigiで話しおほしいトピックです。ずっおも深くお面癜いトピックなので、各䌚議のみなさた採甚しおあげおください。

あず思ったこずがあったのですが、咳さんに教えおいただいお䞀瞬「分かった」ず思っおも、少し違うアングルで䌌たような問題を出されるずずたんに答えに窮しおしたうこずが䜕床もありたした。これを咳さんにいうず「曞かないず分かんないじゃない」ず至極たっずうな答えが返っおきたした。そう、必芁なのは「We Code」。 ちょうどタむミングよく䌚瀟の同僚から関連したメヌルが届いおいたので、それに反蚌するためのパッチを曞いお送っおおきたした。

最埌に

発衚内容のビデオはConfreaksで公開される予定です。

たたこれらのトヌクをより楜しむためにThe dRuby Bookをお手もずにおいおおくこずをお勧めしたす。

@igaiga
Copy link

igaiga commented Nov 8, 2012

ずおも良い蚘事ですね勉匷になりたしたしかもおもしろい

@kou
Copy link

kou commented Nov 8, 2012

「Maglevの軌道モヌドを垰る」→
「Maglevの軌道モヌドを_倉える_」

「Sorted Setは䞀぀の倀に倧しお」→
「Sorted Setは䞀぀の倀に_察しお_」

「dRubyで分散か」→
「dRubyで分散_化_」

叩き起こされた理由を初めお知りたした。。。

@kou
Copy link

kou commented Nov 8, 2012

「䜕が面癜かったのか聞いおみたずろろ」→
「䜕が面癜かったのか聞いおみたず_こ_ろ」

@makoto
Copy link
Author

makoto commented Nov 16, 2012

誀怍の指摘ありがずうございたす。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment