個人的にActiveSupportが大好きなわけですが。

1.1で追加されたwith_optionsがRouting以外でどーもカッコいい使いどころがなーとおもっていたんですが

with_options(:if => :validate_password?) do |me|
me.validates_format_of :password #...
me.validates_length_of :password # ...
me.validates_confirmation_of :password #...
me.validates_presence_of :password#...
end

こんなキモイ使い方があった。もちろん、ActiveRecordのバリデーション。よくあるパターンで、パスワードはハッシュで保存しあって、createしたときやパスワード変更したときはバリデーションするんだけどそれ以外はしない、みたいなとき。

まぁ、やっぱり一番カッコいいのはto_procなんですけど。


これはかなり嬉しい機能だなあ。 最近Prototype.jsの$$で属性セレクタが使用できるようになりました。

どんな風にかけるのか、コードをテストから引っ張ってきてみました。

$$('a[href="http://inforno.net/#"]')
$$('a[class~=internal]')
$$('*[xml:lang|="es"]')
$$('*[xml:lang|="ES"]')
$$('a[href!=#]')
$$('div[style] p[id] strong')
$$('a[class~=external][href="http://inforno.net/#"]')

こんな感じです。 値はクオートしてもしなくても大丈夫っぽいですね。

すばらすい。inputに対する操作なんかで特に便利。今までちょっとボタン操作するためだけに、そのボタンにIDふったりクラスふったりしてたんですけど$$(’#hoge input[type=submit]’)でいけるんだなあ。そんなにパフォーマンスに気をつかわなくて良いページでは使ってみよう。


最近prototype.jsではSelectorとDOMがよく動きます。 仕事でも使っているし、重要な部分なのでここのところウォッチしています。

最近、実は書こうと思ってたElement.extendの問題が解決されました。 問題:Incredible memory leak in IE

これは見る人が見ればパッと見で「これはヤバいんじゃね?」と思ったんじゃないでしょうか。 わからなかった人は上記のURLにも載っている http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ietechcol/dnwebgen/ie_leak_patterns.asp を見ておくと今後悩むことが減るかもしれません。

リンク先をみたらなにが問題かわかるのであえては書きません。

もう一個、興味深いのは Element.extend cripples $() performance での議論です。 前に書いた記事 と似た主張や議論がなされています。うちの会社にも英語苦手な人がいるので簡単に要旨を。

  • Element.extendはパフォーマンスに問題がある。前のままにしてほしい。

    • http://dev.rubyonrails.org/changeset/4094 でだいぶマシになっているよ?
    • 解説:以前はそれぞれのElementについてElement.Methodsのメソッドにelementをbindしてコピーしていた。つまりElementの数に比例してメモリを使用する。しかし4094でキャッシュを導入したので一定数のメソッドしか生成しない。
    • とりあえずElement.extendのパフォーマンスをあげることにフォーカスしよう。
    • Element.extend = Prototype.Kってかけばとりあえず大丈夫じゃね?

      • でもscriptaculousが完全にextendされてる前提でコードかいてるから動かなくなるじゃん。
      • 解説:scriptaculousは3月28日にprototype.js 1.5_pre1をバンドルしてバージョン1.6をリリースした。このバージョンではelement.setStyle({top: “})とかelement.show();みたいにガンガンElement.extendを活用している。まぁとりあえずElement.extendが必要ないときはPrototype.Kにしとけばいい。
    • FirefoxやSafariは高速化できる(前のエントリーとほぼ同じ)。しかしprototype.jsに組み込むとscriptaculousのElement.Methods拡張が反映されない。

というわけでElement.extendはこれでちょっと落ち着いた感じ。個人的にはElement.extend無効化して使っていきたいなーって思ってたりしてたんですけどscriptaculousがやっぱりガンガン使ってきたので、まぁ様子見てみます。