Ruby会議2010 2日目2010/08/28

基調講演からのつもりが、少し早く到着したのでコミッタ会議の質疑応答あたりから入場。

「たこやき仮面の名前の由来は?」「わからな〜い」

基調講演

Matzの基調講演。Ruby2.0について。

会場をおいてけぼりにするぐらい突っ走ると言う宣言のわりには普通の話。

"mix".length < "include".length はまあ確かにそうだけど……。どうなんだろうなあ。あとインスタンス変数の衝突回避の手段は提供されない?

ircで流れていたようにmoduleでインスタンス変数なんて使うなとか言う話になるんだろうか。

(詳しくは後で)

レジュメ

  • 2.0は1.9からそう遠くない場所。
  • 今1.9.3と呼んでいるものが、2.0と名前を変える可能性さえある。
  • キーワード引数はやる。
  • あともう少しのちょっとしたこと。

超絶技巧プログラミング

こういう話は好物。

空白の含まれない任意のrubyコードに対して、

eval %w(任意のコード).join

とすることで、任意のコードの任意の場所に空白文字を挿入することができるという話は、目から鱗だった。

一つ一つのテクニックとしては、主にゴルフ方面で見ていた技術ではあるのだけれど。この組合せはなかった。

ペアプロ異文化交流

ちょっと覗いただけ。

rspec風のjsテスティングフレームワークがちょっと興味をひいた。昨日のセッションで発表があったものらしい。 あとで調べる。

Emacs 対 Vim

実際に闘っている訳ではないですが、隣り同士の部屋で同じ時間帯にセッションを行っていた。

Vimの方が立ち見の人が溢れるくらいの盛況ぶりで、Emacsを圧倒している感じが意外だった。

あと、Vimのセッションでは「俺の考えた最強設定」を語っている感じが好印象(ぇ?

Cucumber hands on

昨晩、portsまわりの環境が壊滅して、修復が間に合わなかったので、ほとんど聞いているだけになってしまったのが残念。

基本をおさえた良い教材だったと思います。

Lighting Talk

まず総括として、5分以内に終わるプレゼンをしちゃ駄目だろ。 なんか後を引く感じが残らないとものたりない。

ARTooikitのrubyバインディングを作りました。

タイトルが全て。Qtの話の方が面白かったので、こっちがメインの方が良かったかも。

Ruby/Tk-Kitの汎用適用

標準添付ライブラリでありながら、依存ライブラリの関係であまり日の目を見ないRuby/Tkの配布問題を解決するための、Ruby/Tk-Kitの技術を汎用に適用することで、Exerbのようなことが(プラットフォーム不問で)できるんじゃないか。

fewについて

String#pripend 中学生すげえ。 few自体はあまり興味が湧かなかった。

Ruby VMの高速化についてのアイディア

ささだ氏は来月から国外脱出。

MessagePack

(あとでちゃんと調べる。というか、ブックマークは残している記憶が……)

軽量高速なシリアライズ/デシリアライズのためのライブラリでRPCの実装もある。なんか無敵じゃね?

暦日ライブラリ

つくったよ。

Lingo Projectについて

文章の作成時に、英語の文章としておかしい箇所があるとサジェストを出してくれるプログラム。

単文の評価だけでなく前後の文脈も見ているっぽい。すげえ。

babushka

ごめん、ネイティブの英語は辛い。

ネストによる見栄えの悪化を解消するためのライブラリ?

Google Waveに冥福を

2009年はクリスマスリリースがなかったので、勝手にオレオレrubyをリリースしておいた。

  • X-Ruby:xmlリテラル記法を持ったruby(REXML::Documentができる)
  • O-Ruby:object-rubyと言いながらS式で記述できるruby(従来の記法と混在可能)
  • F-Ruby:fuzzy-ruby、if〜thenのかわりにmaybeとか書けて確率で分岐

電子出版の未来

(社外秘で他言無用らしいので削除)

Ruby Summer Codeについて

学生さんうらやましす。

Ruby会議2010 1日目2010/08/27

基調講演がドタキャンされるという新種のネタを披露

今回のテーマは"Conflict and Resolution"(衝突と解決)と言うこと。

諸注意

wifiは完備されているけど、ust見たりすんなよ。あと、無線の輻輳とかが起きると面倒なので、wifiルーターとかの使用は禁止。会場の無線装置との相性が悪いので、アドホックモードの運用も禁止。

基調講演の代わりのなにか

(あとで書く)

to_ruby出張版

druby関連のハンズオンセッション。

DRbUndumped と、Hash.new(ブロック付き)の話が収穫。

特に、Hash.new(ブロック付き)が、Array.new(ブロック付き)とは異なり、最初の参照時にブロックが評価されるというのが意外だった。

(詳しくはあとで書く)

Head First ふつうのシステム開発

(あとでry)

外人さんの「webフォームに日本語を入力していると、変換確定のつもりで押したenterでフォームがpostされたりして面倒臭くね?」という質問と「うちの公用IMはSKKなのでそのような問題はありません」という角谷氏の返答はどちらも吹きそうになった。

惚れる。

erb 中の case2010/06/18

理由が良く判らないのだけれど

 <% case @status -%> 
 <% when Status::OK -%>
   OK
 <% when Status::NG -%>
   NG
 <% else -%>
   Uncleared
 <% end -%>

だと Syntax Errorになる。(Ruby 1.8.7, Rails 2.3.5)

 <% case @status 
 when Status::OK -%>
   OK
 <% when Status::NG -%>
   NG
 <% else -%>
   Uncleared
 <% end -%>

は通る。 何故?

Ruby Kaigi 2010 チケット購入2010/06/16

6月15日から発売だったのをすっぽり忘れていて、ヤベぇとか思ったけど、普通に購入できた。

ここ二、三年瞬殺と言っても良いぐらいの勢いだったけど、今年は販売数が多いのかな?

Nokogiri で名前空間のprefixの付いた要素を検索する2010/04/20

概要

タイトルのとおり(ぇ

某所のOpenSerach APIを叩いてatomで結果を得たと仮定。 レスポンス中の、

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/">
  (略)
  <opensearch:totalResults>21</opensearch:totalResults>
  (略)
</feed>

この要素を取り出したいとする。

doc = Nokogiri::XML(atom)
doc/'openserch:totalResults'
#=> []

むむう。

原因は以下の2点

  • /(Nokogiri::XML::Node#searchのエイリアス)に名前空間の情報が与えられていない
  • 引数の'openserch:totalResults'がCSSセレクタの記述と曖昧(少なくともNokogiriにとって)

名前空間を指定する。

Nokogiriは(バックエンドであるlibxmlの機能により)名前空間を結構真面目に扱う。

Nokogiri::XML::Node#at, #search, #xpath では、引数の最後に名前空間情報のHashを取る。

see also http://nokogiri.rubyforge.org/nokogiri/Nokogiri/XML/Node.html#M000241

doc.at('.//opensearch:totalResults', {'opensearch' => 'http://a9.com/-/spec/opensearch/1.1/'}).content
#=> "21"

キーが名前空間のprefix、値がスキーマのURI、これはxml中で指定されるものと一致しなくてはならない。 逆にprefixの方は引数の間で整合性が取れていれば、xml中の記述と一致する必要は無い。 (そんなことをする必要があるとも思えないが……)

doc.at('.//os:totalResults', {'os' => 'http://a9.com/-/spec/opensearch/1.1/'}).content
#=> "21"

引数の最初の'.//'はxpathであることを明示するための指定

厳密には、Nokogiri::XML::Node#at, #search では、引数が'./'または'/'で始まる場合、引数はxpathだと見なす。 './/'なのは子ノードも検索対象にするため。

めどい

とりあえず、最初の目的は達成されたのだが……。

'.//' だとどこか他に opensearch:totalResults と同名の要素が存在した場合に曖昧になるので、pathをきっちり書きたいと思うと、 もうひとつ面倒に直面することなる。

doc.at('./feed/opensearch:totalResults', {'opensearch' => 'http://a9.com/-/spec/opensearch/1.1/'})
#=> nil

見付からない……。

実は名前空間を指定するHashを省略した場合は、内部で document.root.namespace が補完されているのだが、引数で名前空間を明示された場合は引数のHashにマージしてくれたりはしないのだ。 そのため、rootの名前空間も明示的に指定する必要がある。

doc.at('./atom:feed/opensearch:totalResults', {'atom' => 'http://www.w3.org/2005/Atom', 'opensearch' => 'http://a9.com/-/spec/opensearch/1.1/'}).content
#=> "21"

これが正解。

後でパッチでも書こう。