2011-02-04(金) [長年日記]
■ 「東京Ruby会議05」でUnicode正規化の話を聴いてきた(えっ?)
そういえばRegional RubyKaigiに参加するのは初めてだ。今までは「大RubyKaigiの実行委員がRegionalに参加して(ただでさえ少ない参加枠を狭めるのも)申しわけないなぁ」と思って遠慮していたんだけど、今年は予告通りRubyKaigi2011の実行委員からは外れたので、遠慮するこたぁないのだった。というわけで東京Ruby会議05に参加。
場所は渋谷、ECナビの8Fにある「Ajito」という……なんだろう、そのビルに入っている各社の共同スペースみたいな? 趣向を凝らしたいろんな部屋がある、会議&イベントスペースというか。渋谷にこんな小洒落たフロアを持ってるなんて、ネット企業うらやましい!
冒頭は高橋さんによる「Rubyの楽しさ」に関する講演(台本なし、スライドなしの1時間)で、その後、事前に設定された9つのテーマに別れてテーブルごとのトーク。高橋さんの講演中、意外とWindowsでRubyを使っている人が多いということが判明したので*1、隣に座っていたartonさんと「Windowsの話をしよう」と「その他のテーマ」テーブルへ。
しかし、そこに川端さんがいたものだから話が予想外の方向に転がって、なぜかUnicodeの正規化の話に。Unicodeでは複数のグリフで構成される文字を、1文字でも表現できるし、グリフの組み合わせによる合成文字でも表現できるのだが*2、文字列を比較するにあたって、それをどっちかに統一してから(正規化)比較しないといけない。
で、正規化の手法には合成する方向(NFC、Windowsはこっち)と分解する方向(NFD、Macはこっち)があり、素人考えでもそうとう実装が面倒な世界だと思うのだが、「ruby 1.9にはNFCとNFDだけでなく、加えてNFKCとNFKDという4種類の正規化手法が実装されてるんです」「まじか」「成瀬さん変態すぐる」……みたいなやりとりが。その場では時間がなくて実機では確認できなかったのだが、帰宅してから調べてみた。
Encoding#normalizeとかEncoding#nfcみたいな安直なメソッドがあるわけではなく(内部的にはあるんだろうけど)、ユーザはいつものように万能メソッドEncoding#encodeを使うようだ。NFDされているMacOS Xのファイルシステム向けには「UTF8-MAC」のようなエンコーディングが用意されている:
% irb irb(main):001:0> s = 'がぎぐげご' => "\u304C\u304E\u3050\u3052\u3054" # が ぎ ぐ げ ご irb(main):002:0> s.encoding => #<Encoding:UTF-8> irb(main):003:0> s.encode 'UTF8-MAC' => "\u304B\u3099\u304D\u3099\u304F\u3099\u3051\u3099\u3053\u3099" # か ゛ き ゛ く ゛ け ゛ こ ゛ irb(main):004:0> s.encode('UTF8-MAC').encode('UTF-8') => "\u304C\u304E\u3050\u3052\u3054"
うわー、すげー。じゃあ、こんなのは?:
irb(main):005:0> u = "\u307e\u3099" => "\u307e\u3099" # ま ゛ (←ジャイアント・ロボの鳴き声) irb(main):006:0> u.force_encoding 'UTF8-MAC' => "\u307E\u3099" (←存在しない文字を分解された状態で表現したことになる) irb(main):007:0> u.encode 'UTF-8' => "\u307e\u3099"
おおー。合成できない文字はそのままなんや。すごいなぁ。
……とまぁ、あのテーブルはえらくフリーダムだったな。
第2セッションは「メタプログラミングRuby」のテーブルに入って、tDiaryのコードがいかにひどいかという話をするなど。みなさんメタプログラミングのデバッグで泣いていると。
これらのセッションの間は全員おしゃべりをしているので(名札には全員「talker」と書いてある)、この間Twitterにはなんの情報も流れなかった。当然Ustreamもないわけで、今回の東京Ruby会議05はその場にいないと得られない何かのために集まるという、Ust時代(以降)にあるべきカンファレンスの姿としていいモデルになるんじゃないでしょうか。