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.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やブックマーク数、タグの一覧が表示されてるのがわかると思います。

以上

今回はここまです。
細かい部分はプログラムや元記事を見てください。
あと、間違ってる部分などありましたら教えてください。
次回の可視化で最後になります。