A Day in the Life

sperklinesを使ってsimpleグラフを描画

speaklinesっていうsimpleでcoolなグラフを描画するライブラリがあって。phppython.NETにはライブラリがあってRubyには無くて悲しかったんだけど一ヶ月ほど前にGeoffrey Grosenbachさんが実装された
で、これ使ってみようと思ってたんだけど、グラフ化するいいサンプルが無かったので使ってなかった。んで先日FeedBurnerに実装されたAwareness APIを使って購読者数などを取得できるようになったので、これをグラフ化してみようと思ったら、ADT疑惑の人 *1が『ああ、それはてなグラフでやっちゃったよ』と云われてさきこされたー!と思ってまた放置になりそうだったので、そうならないうちにさくっと使ってみた。

rubyのsparklineにはsparkline_generatorというrails用のgeneratorもあって、簡単にhelperとして使えたりもする。でも今回はviewから呼び出ししないからhelperは使わずにアクションに実装。

def rss_sparklines
    require 'cache/cache'
    require 'sparklines'
    cache = Cache::FileCache.new
    unless cache['rss_sparklines']
      require 'open-uri'

      now = Time.now.yesterday.utc.strftime('%Y-%m-%d')
      a = []
      d = open('http://api.feedburner.com/awareness/1.0/GetFeedData?uri=http://wiki.rails2u.com/rss&dates=2005-08-08,' + now).read
      d.gsub(/circulation="(\d+)"/){ a << $1.to_i }
      min = a.sort.first
      max = a.sort.reverse.first
      a.map!{|i| ((i - min) / (max -min) * 100).to_i }
      a = a[-100..-1] if a.size > 100
      cache['rss_sparklines',1.day] = Sparklines.plot(a, :type => 'discrete',:height => 14)
    end
    @headers['Content-Type'] = 'image/png'
    render :text => cache['rss_sparklines']
  end

な感じ。cacheライブラリを使って一日キャッシュさせてる。実際に描画されたグラフは

↑な感じに http://wiki.rails2u.com/rss の購読者数をグラフ化。まだfeedburner初めて14日分しかないからちょっと寂しいけど、simpleでいい感じ。フィードのimageとしても登録したから、bloglinesなんかじゃ表示されるはず。

sparklinesで描画したグラフは使い勝手がけっこーいいんでいろんなところで使えそーだね。

*1:http://japan.cnet.com/interview/story/0,2000050154,20082117,00.htm

記事の一覧 >