sperklinesを使ってsimpleグラフを描画
speaklinesっていうsimpleでcoolなグラフを描画するライブラリがあって。phpやpythonや.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