3D mode!

Entries in 2007

RubyのWWW::Mechanizeの例外処理

こんな感じに書いて動かしているところです.

agent = WWW::Mechanize.new {|a| a.log=Logger.new('access.log')}

while # どんどんデータを集める!
  begin
    page = agent.get(url)
  rescue Timeout::Error
    puts "  caught Timeout::Error !"
    retry # タイムアウトしちゃってもあきらめない!
  rescue WWW::Mechanize::ResponseCodeError => e
    case e.response_code
    when "404"
      puts "  caught Net::HTTPNotFound !"
      next # ページが見付からないときは次へ
    when "502"
      puts "  caught Net::HTTPBadGateway !"
      retry # 上手くアクセスできないときはもう1回!
    else
      puts "  caught Excepcion !" + e.response_code
      retry
    end
  end
end

参考

RailsのPagenationとlink_toのhtml_option

最近ちょこちょこ触っているRailsの話を少しだけ書きます.検索してもあまり出てこない話なので,キーワードを散りばめつつ書いてみよう!

RailsのPagination

RailsにはPaginationという仕組みがあって,よくあるページング処理を簡単に実現できます.例えば,controller側で

# controllers/model_controller.rb

class ModelController < ApplicationController
  def index
    @model_pages, @models = paginate :models, :per_page => 10
  end
end

と書いておくと,viewの方では

# views/model/index.rhtml

  <ul>
    < %- for m in @models -%>
    <li>m.name</li>
    < %- end -%>
  </ul>

  <%= link_to 'Previous page', { :page => @model_pages.current.previous } if @model_pages.current.previous %>
  <%= link_to 'Next page', { :page => @model_pages.current.next } if @model_pages.current.next %>

と書くだけで1ページにper_page分ずつ表示してくれて,前後のページへのリンクも出せちゃうわけです.と,まぁここまではただのPaginationの話で,詳しい説明がWeb上にたくさんあるので見つかるでしょう.このPaginationはRails 2.0ではプラグイン扱いになるようですね!使い方が変わるでしょうから要チェックです.

link_toのhtml_option

さてさて,ページング処理を実装するようなサイトでしたら,AutoPagerizeに対応させたくなるのが人情ってもんです.そのためには次のページへのリンクに「@rel=”next”」を付与する必要があります.しかし! a タグは link_to メソッドで自動生成しているから,属性を付与できません!とか騒いでいたら,link_to メソッドには html_option なるものがありました.ちゃんとドキュメントを読めって話でした.

  <%= link_to 'Next page', { :page => @model_pages.current.next }, { :rel => "next" } if @model_pages.current.next %>

こうしてやればOKです.aタグにclassやidを振りたいときにもhtml_optionが必要ですね.覚えておこう.

del.icio.usのポストページを俺仕様にするユーザスクリプト

del.icio.usのポストページの構成が自分に合わない!と急に思うようになったので作った.「tags」の入力欄と「notes」の入力欄を入れ替えて,まずtagsにフォーカスするようにした.それだけ.

ボクはまずタグを入力して,次にコメントを入れて,そしてポストするので,これでストレスが減ると思う!

Custom del.icio.us post ( for Greasemonkey )

// ==UserScript==
// @name           Custom del.icio.us post
// @namespace      http://june29.jp/
// @include        http://del.icio.us/*?*url=*
// ==/UserScript==

(function() {
    tbody = $x('//tbody', document)[0]
    notes = $x('//tbody/tr[3]', document)[0]
    tags  = $x('//tbody/tr[4]//input', document)[0]
    save  = $x('//tbody/tr[6]', document)[0]

    tbody.removeChild(notes)
    tbody.insertBefore(notes, save)

    tags.focus()

    // thanks to cho45 (http://lowreal.net/)
    function $x(exp, context) {
        if (!context) context = document;
        var resolver = function (prefix) {
            var o = document.createNSResolver(context)(prefix);
            return o ? o : (document.contentType == "text/html") ? "" : "http://www.w3.org/1999/xhtml";
        }
        var exp = document.createExpression(exp, resolver);
        var result = exp.evaluate(context, XPathResult.ANY_TYPE, null);
        switch (result.resultType) {
            case XPathResult.STRING_TYPE : return result.stringValue;
            case XPathResult.NUMBER_TYPE : return result.numberValue;
            case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
            case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
                result = exp.evaluate(context, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
                var ret = [];
                for (var i = 0, len = result.snapshotLength; i < len ; i++) {
                    ret.push(result.snapshotItem(i));
                }
                return len != 0 ? ret : null;
            }
        }
        return null;
    }

}());

speedtest

随所で見かけたのでボクもやってみた!

Speedtest – how fast are you?

MacBookでやるよりThinkPadでやった方が得点が高かったりする>< 早くMacBookのキーボードに慣れたい!

環境整備中

久しぶりの更新!けっこうテンパっていて更新が滞っています.

twitterなどではさんざん言っていたけどここでは言っていなかった.MacBookを買いました!ただいま環境整備中です.なにせ初めてのMacですから,何も分からないボクは大変です.WindowsもMacもそこそこに使えるようになりたいのでガンバります.

はてなダイアリーの方で環境整備記録を付けていたりします.超絶に初歩的な内容です.

色々と整理していたら,自分でもよく覚えていないユーザスクリプトが出てきたので,なんとなくここに貼っておく.

// ==UserScript==
// @name           CNET Japan URL Normalizr
// @namespace      http://june29.jp/
// @include        http://japan.cnet.com/*?ref=rss
// ==/UserScript==

(function(){
        var href = location.href;
        location.href = href.replace(/\?ref=rss/, "");
})();

CNETのRSS経由のURLをなんとかするスクリプトだなあ.これのおかげで,間違えてref=rssの方をブックマークしたりせずに済んでいたのだな.しかしもっと良い方法がありそうだ.