Twitter 関連サービスの SBM ランキング

ふと Twitter 関連の Web サービスの SBM ランキングを作成してみようと思い立ちました.ググって見ると,つい最近 本日決定!Twitter関連サービス全201サイトはてブ順ランキング - パパパパ と言う記事が人気を集めていたようなので,このリストを使用して はてなブックマーク 以外のブックマーク数も合算した値でランキングを作成し,ランキングがどのように変わるかを観察してみました(Topsy など海外の有名なサイトをいくつか追加しています).作成したランキングは以下のページ.

ざっと見た感じでは,Delicious のブックマーク数の影響でで上位の顔ぶれがだいぶ変わっています.基本的には,はてブと Delicious の影響力が大きくついで Yahoo! ブックマーク,だいぶ離されて livedoor クリップBuzzurl と言う感じになっています.

目についた所では,ツイナビ | ツイッター(Twitter)ガイドYahoo! ブックマーク数が(Yahoo! ブックマークの中では)何故か突出していて,SBM サービス毎の性質の違いが垣間見たような気がしました.

各種 SBM からブックマーク数を取得する部分は,いろんなソーシャルブックマークサービスのブックマーク件数を数値で取得するRubyのクラス書いた - What is Normal 〜 もはや普通がわからない 〜 を参考にして記述したものを github に公開しています.

これを使用した Twitter 関連の Web サービスの SBM ランキングを作成するためのクラスが以下になります.

module Twitter
    class SBMCounter
        require 'net/http'
        require 'uri'
        require 'kconv'
        require 'crown/hatena/bookmark'
        require 'crown/livedoor/clip'
        require 'crown/delicious'
        require 'crown/buzzurl'
        require 'crown/yahoo/bookmark'
        
        Entry = Struct.new(:uri, :score, :hatena, :livedoor, :delicious, :buzzurl, :yahoo)
        
        def initialize()
            @entries = Array.new
        end
        
        def add(uri)
            entry = Entry.new
            entry.uri = uri
            
            # 各種 SBM サービスからブックマーク数を取得する
            entry.hatena    = Crown::Hatena::Bookmark.count(uri)
            entry.livedoor  = Crown::Livedoor::Clip.count(uri)
            entry.delicious = Crown::Delicious.count(uri)
            entry.buzzurl   = Crown::Buzzurl.count(uri)
            entry.yahoo     = Crown::Yahoo::Bookmark.count(uri)
            
            entry.score = entry.hatena + entry.livedoor + entry.delicious + entry.buzzurl + entry.yahoo
            @entries.push(entry)
            
            return self
        end
        
        def each()
            @entries.sort { |x, y| y.score <=> x.score }.each { |entry|
                yield(entry)
            }
            return self
        end
    end
end

メイン部分は以下のような感じ.

counter = Twitter::SBMCounter.new

File.open(ARGV[0]) { |file|
    file.each { |line|
        begin
            line.chomp!
            counter.add(line)
        rescue Exception
            $stderr.puts(line)
            next
        end
    }
}

counter.each { |entry|
    printf("%5d %4d %4d %4d %4d %4d %s\n", 
        entry.score,
        entry.delicious,
        entry.hatena,
        entry.livedoor,
        entry.buzzurl,
        entry.yahoo,
        entry.uri
    )
}