gihyo.jpの「具体例で学ぶ!情報可視化のテクニック」のプログラムを勝手にRubyで書き換えてみた。その3
前回、前々回に引き続いて今回も勝手にRubyで書き換えたプログラムの簡単な説明をします。
プログラムのダウンロードは以下のリンク先のdownloadからご自由にどうぞ。
GitHub - ombran/gihyojp-visualization-ruby: The Ruby version of the information visualization introduced by gihyo.jp.(unofficial)
今回はvisualization5フォルダのプログラムについての説明になります。
visualization5の説明
元記事だと第5回にあたる内容になります。
このプログラムは、はてなブックマークが提供するWeb APIにアクセスし,人気エントリーの情報を取得するプログラムになります。
詳しいことは元記事を見てもらったほうがわかりやすいと思います。
visualization5フォルダの内容
visualization5のフォルダ内容は以下のようになっています。
visualization5
-- Demo.rb | |
-- Visualization | |
-- Bookmark.rb | |
-- BookmarkDetail.rb | |
`-- HatenaBookmarkAPI.rb |
元記事のプログラムと拡張子の違いはありますが、ファイル名と内容を対応させてあります。
Visualization.rbを読み込むことだけで、Visualizationフォルダ以下のファイルを全て読み込めるようにしてあります。
Demo.rbがデモ用のプログラムとなります。
JSONライブラリのインストール
今回はJSON形式のデータを扱うので、JSONライブラリをインストールしておきます。
gemを用いて以下のようにインストールできます。
# gem install json
プログラムの説明
まずデータ格納用のクラスですが、Bookmarkクラスはエントリ情報を格納するクラスで、BookmarkDetailクラスはブックマーク数やタグの一覧などエントリの詳細を格納するクラスとなっています。
次に、今回のメインとなるHatenaBookmarkAPIクラスについて説明します。
プログラムは以下のようになります。
# HatenaBookmarkAPI.rb require 'rss' require 'open-uri' require 'uri' require 'rubygems' require 'json' module Visualization # はてなブックマークのAPIにアクセスするクラス class HatenaBookmarkAPI # 人気エントリーの情報を取得 # @return:ブックマーク情報のリスト def getHotEntries bookmarks = [] content = nil # 人気RSSフィードを読み込む open("http://b.hatena.ne.jp/hotentry.rss"){|u| content = u.read } rss = nil # RSSをParseする begin rss = RSS::Parser::parse(content) rescue RSS::InvalidRSSError rss = RSS::Parser::parse(content, false) end # 各エントリの情報を取得 rss.items.each do |item| bookmark = Visualization::Bookmark.new bookmark.url = item.link bookmark.title = item.title bookmarks << bookmark end return bookmarks end # ブックマークの詳細情報を取得 # @param url:ブックマーク対象のURL # @return:詳細情報 def getDetail(url) encodeUrl = URI.encode(url) # エントリ情報取得APIのURL apiUrl = "http://b.hatena.ne.jp/entry/json/?url=" + encodeUrl json = nil # URLを開き、データを読み込む open(apiUrl) do |f| # JSONをパース if f.read =~ /^\((.*)\)$/ json = JSON.parse($1) end end # 詳細情報を作成 detail = Visualization::BookmarkDetail.new detail.bookmarkCount = json["count"].to_i detail.tags = [] # bookmarks配列を読み込む bookmarks = json["bookmarks"] bookmarks.each do |item| # tags配列を読み込む tags = item["tags"] tags.each do |tag| detail.tags << tag end end return detail end end end
getHotEntriesメソッドは、はてなブックマークの人気エントリの一覧をVisualization::Bookmarkオブジェクトの配列として返すメソッドです。
RSSフィードを取得するためにopen-uriライブラリを、RSSフィードをパースするためにRSSライブラリを使用しています。
getDetailメソッドは、特定のURLからブックマークエントリの詳細情報を取得するメソッドです。
JSONデータのパースのためにJSONライブラリを使用しています。
ちなみに、JSONのパースの際に
# JSONをパース if f.read =~ /^\((.*)\)$/ json = JSON.parse($1) end
として、取得したはてなブックマークのJSONデータの最初と最後にある括弧を取り除いてあげないとパースの際にエラーになってしまうので気を付けてください。
デモプログラムの実行
プログラムのデモを行うDemoクラスは以下のようになります。
# Demo.rb require File.dirname(__FILE__) + '/Visualization' class Demo include Visualization def run api = HatenaBookmarkAPI.new bookmarks = api.getHotEntries puts bookmarks.size.to_s + " entries." bookmarks.each do |bookmark| puts bookmark.title puts " [url] " + bookmark.url # サーバの負荷を抑えるため呼び出し間隔を空ける sleep(1) detail = api.getDetail(bookmark.url) if (detail != nil) puts " [bookmarkCount] " + detail.bookmarkCount.to_s puts " [tags] [" + detail.tags.join(", ") + "]" end end end end demo = Demo.new demo.run
Demoクラスを実行すると,実行時点での最新の人気エントリーの情報が,例えば次のように出力されます。
$ ruby Demo.rb 30 entries. ベア速 日本SUGEEEEEEEEEEEEEEEE!ってなるコピペくれ [url] http://vipvipblogblog.blog119.fc2.com/blog-entry-248.html [bookmarkCount] 373 [tags] [2ch, neta, ネタ, 2ch, あとで読む, ... SEOやSMMのためにブログを作ったらまずやることリスト - ソーシャルメディアマーケティング(SMM).jp [url] http://www.socialmediamarketing.jp/2008/12/seosmm.html [bookmarkCount] 265 [tags] [SEO, Webサービス, seo, web制作, まとめ, ... Color of Book - 雑誌の色からhtml,cssで利用できるカラーチャートの紹介 [url] http://colorchart.jp/ [bookmarkCount] 362 [tags] [color, webデザイン, webサービス, css, ... ...
エントリのurlやブックマーク数、タグの一覧が表示されてるのがわかると思います。
以上
今回はここまです。
細かい部分はプログラムや元記事を見てください。
あと、間違ってる部分などありましたら教えてください。
次回の可視化で最後になります。