RubyKaigi2008 Lightning Talks
限られた時間の中、一発ネタに全てを賭け、惜しくも時間切れになったら鳴り響く銅鑼の音に諸行無常を感じる、おなじみライトニングトークスの時間がやってきた。今年も精鋭揃いだ。
「JavaからRubyへ」について、どうしても言いたいことがある
「JavaからRubyへ」というのは、JavaからRubyへ ―マネージャのための実践移行ガイドという本のことである。俺も持っている。
…と思っていたのだが、実は関係ないらしい(笑)
そもそもJavaからRubyへ、とはどういうことなのか?Javaで書いていたコードをRubyで書くことか。違う。変えるのはコードではなく考え方である。かつて、COBOL屋が書いたJavaコードがちっともJavaらしくないことが問題視されていた。そして今はJavaプログラマがRubyらしくないRubyコードを書く。
Javaは初心者に偏重しすぎている。Javaを教える講師は言う。「3項演算子はわかりにくいからif文を使いましょう。」間違っている。3項演算子も使えない初心者を、初心者のまま留め置いてはだめだ。彼らを教育して上級者にしていくのが正しい道。確かに上級者よりも初心者のほうが数が多い。しかし、そもそもパレートの法則からすれば、上級者が全体の8割を生産しているわけで、頭数だけを見て初心者にばかり目を向けてその8割の生産性を落とすようなことをしてはいけない。Rubyは上級者向けの言語である。そんな文化を持ち込んではいけない。
Rubyは大規模開発に向かないという。しかし、大規模開発を自慢するなど愚の骨頂である。規模が大きくなれば、そのぶんリスクが高まることは明白である。それゆえ、その前に設計やコードを最適化し、大規模にせずに済むようにすべきであろう。それゆえ、大規模であることを誇るのは愚かなことである。
…もう、言いたい放題。途中で何度も聴衆から拍手や「そうだそうだ!」という声が飛んだ。
dRubyとセキュリティ
dRubyを不特定多数からアクセス可能な環境に置くのは危険である、という報告。
INSECURE_METHODや$SAFEでは防ぎきれない驚異もあるという。例えば、外部から__send__を呼び出せてしまう!これができるなら、もうなんでもアリである。
RubyとODEでピタゴラ装置
予告編。
新しいプレゼンテーションスタイル登場。ODEなるものを利用して3Dの箱庭を作り、そのなかを歩き回るのだ。スライドは、箱庭に点在するキューブのテクスチャになっている(笑)
スライドを眺めていたら、その脇を巨大な球体が転がっていって、ボーリングのごとく柱をなぎ倒す。びっくりしたー、なんというエンターテイメント性。
最後に、箱庭内に作ったボール、坂道、キューブなどを組み合わせて、ピタゴラ装置的なギミックを動かしたが、やはり3D演算は重たいのか、動きがスローモーションだ。あぁ、時間はあまりに短いというのに!がんばれ!
でも、やっぱり時間切れで最後のスライドは見られず。
初級者は Enumerator の夢を見るか?
まとめ:みねーよ!
時間が限られるLTでは、言いたいことを最初に全部言っておくのは基本である。
Ruby1.9登場以来、ブロックなしeach_XXXがEnumeratorを返すようになっている今日この頃だが、そんなことはお構いなしにRuby初心者はeachが大好きで、なんでもeachで無理矢理処理しようとする。もちろん、使い方がおかしい!ちゃんとEnumerator使えば、もっとうまく書けるよ!
ということで、Enumerable#each_sliceとEnumerable#each_consをつかったコードを紹介していた。どちらも、n個ずつ取り出す、といったような処理を行うことができるメソッドだ。
ははは、おれ知らなかったなぁ、こいつら(汗)勉強になって困る。
Rubyで楽しむフォークプログラミング (Webアプリじゃないよ蝙)
フォークは英語で書くとFolkである。つまり、フォークソングのように、気楽に楽しくプログラミングしようよ、という趣旨。
最近アプリケーションといえばWebアプリケーションばかりだけど、そこじゃないところの楽しさを主張。プラグインを書くのがよい。いちから全部作るより簡単だし、人から使ってもらいやすい。でっかいものに寄生してしまう。
そんなわけで、Safariからはてブを操作可能にするやつとか、QuickSilverからtwitterにメッセージをポストするとか、VimからRefe2を呼び出す、といった拡張を紹介。
Rubyはグルー(のり付け)言語として優れているので、こういう用途には向くという。
スライドとプラグインはこちらで公開されている。
Ruby.pm - CライブラリとしてのRuby
PerlからRubyの関数を直接呼び出すモジュール、Ruby.pmの紹介。
なんかそのままRubyで書いた方がスッキリするのだが、生粋のPerlerとしては、「myがあると落ち着く」からGoodであるとか。
Ruby.pmを利用すると、Perlのコード内で定義した関数を呼び出すRuby関数を書くこともできて、そうして作ったRuby関数をPerlから呼び出してRubyごしにPerlの関数を呼び出す、というなんだかよくわからないことができるらしい。
toRubyでみつけた Rubyist人生再出発
toRubyは"栃木Ruby"を指しており、"とるびー"と発音するのだそうだ。
いつまでたってもRubyが上達しない発表者が、意を決して咳氏に「Ruby教えて!」とメールを送ったことをきっかけとしてtoRubyが立ち上がって勉強会を行うようになり、Rubyを理解しだしたという感動的なストーリー。ええ話やないか。
感動的なスライドはこちらで公開されている。
Ruby 1.9 on Rails 2.1による新時代DBプログラミング
DBプログラミングの歴史を紐解くと、これまでパラダイムの転換が2度起きている。これによって分けられたフェーズをそれぞれ古代、近代、現代とする。
古代は、PHPという言語があった(www)。直接SQLを書きまくる泥臭さ極まる代物であったが、古代言語の衰退とともに消滅。
近代になりO/Rマッピングが登場。オブジェクト指向とのすてきな出会いにより、人間らしいDBプログラミングが可能に。しかし、XMLとかXMLとかXMLとかにより嵩む設定にやはり人々は苦しむ。まぁこれも人がまだJavaを話していたころの話(wwwww)。
そして現代、ActiveRecordが登場。ARはすばらしい!ARは最高!
…しかし、やっぱりSQL文の生成が絡むと泥臭い。でも、2008年、Rails2.1においてnamed_scopeが登場!これを使うと実にエレガントに書ける!named_scopeすごい!
しかし、それにも欠点があって、そこをRuby1.9で何とかできるらしいのだが、惜しくも時間切れ。続きはBlogで。というか、こちらで公開されている。
テストベースコードリーディングのすすめ
新米Rubyコミッタの方による、新しいコードリーディングメソッドの紹介。
下積みとしてまずはコードを読まねばならないが、ただ読んでいるのはすぐに飽きてしまう。
そこで、まず既存のテストコードを使ってカバレッジを取り、カバーできていない部分のテストを実装するようにする。これにより、その部分の周囲のコードを読まざるを得なくなる。
この取り組みによってコードを読めるのはもちろん、うれしい二次効果としてRubyのカバレッジは85%まで上昇したし、バグも30個ぐらい見つけたそうだ。
ちなみに、ほかのLL言語のカバレッジはどうかというと、Pythonが80%, Perlが63%, そしてPHPが51%なんだとか。PHP低いなー(笑)
このメソッドの問題は、おもしろそうなコアの部分ほどテストコードが書かれてしまっているので、そういうところをちっとも読めない点なんだとか。
最後に、Ruby1.9にカバレッジ測定機能が欲しい、という要望があがる。そのパッチはもうあるそうなので、コミットしていいかMatz氏にお伺いを立てるんだとか。がんばってくれー。
A Jail Web Development with Rails 2008 でわっふるわっふる
AgileならぬA Jail、つまり堅牢なプログラムを作るぜ、というのがテーマ。
わっふるとか言っているが、中身は実にためになるっつーか。
通常、なにかしらの動的な値をWebブラウザ上に表示するときは、CGI.escapeHTMLを使ってXSSに使われそうなあぶない文字列をエスケープしてしまう。しかし、ここにマルチバイト文字が絡むと、話はそう単純で無くなる。
例えばページのエンコーディング指定がeucjpであるページでUTF-8の値を表示、なんてまねをしたりすると、エスケープしてもへんなところで文字列が終端されてしまい、XSSする隙を与えてしまう場合がある。つまり、正しいエンコーディングの値が渡されているのかちゃんと調べなければならない。
そこで、mod_waffleという、エンコーディングを調べてフィルタリングするようなApacheモジュールを作って公開しているのだそうだ。
なんか既視感が、と思っていたのだが、昨年のRubyKaigiのRejectKaigiでこのネタを披露していた気がする。