2014年8月14日木曜日

Rubyでグラフを描画してみた

Graphviz というAT&Tが開発したオープンなグラフを描画する仕組みを使ってグラフを描画してみました
dot言語という独自の言語で記述します
せっかくなので自分の身の回りのツールやシステムを可視化してみました
やっぱりソースコードで管理できるというのはいいですね

■環境
Mac OS X 10.8.5
Ruby 2.1.2p95
Gem 2.2.2n


■graphvizのインストール
http://www.graphviz.org/pub/graphviz/stable/macos/mountainlion/graphviz-2.36.0.pkg
からgraphvizをダウンロードします
ダウンロードが完了したらpkgファイルを実行してインストールしてください
利用規約に同意する以外、特に気にする部分はないと思います

インストールが完了すると /Applications/Graphviz.app/ が作成されていると思います

■gvizのインストール
gem install gviz

■サンプルコード
# -*- coding: utf-8 -*-
# sample.rb
require 'gviz'

gv = Gviz.new
gv.graph do
  # グラフ全体のレイアウトを定義
  global layout:'dot', overlap:false

  # 共通のサービスを宣言
  cloud_storage_services = [:Dropbox, :GoogleDrive, :Evernote, :Github, :codeBreak]
  local_storage = [:disk200a, :disk200b]
  net_services = [:Twitter, :Facebook, :Blogger, :Cacoo]

  # 起点となるノードからのつながりをここで定義
  ## ここですべてを定義しなくても後からedge等を使ってつながりを作成することは可能
  route :yoshi0 => [:Internet]
  route :yoshi1 => [:yoshi0] + cloud_storage_services + net_services + local_storage
  route :yoshi2 => [] + cloud_storage_services + net_services
  route :yoshi3 => [] + cloud_storage_services

  # すべてのノードに対するルールを定義
  nodes color:'black', fillcolor:'white', style:'filled'
  # 特定のノードに対するルールを定義
  cloud_storage_services.each {|k|
    node k, fillcolor:'green'
  }
  node :yoshi0, fillcolor:'gray99', label:'yoshi0\n(gateway)'
  node :yoshi2, label:'yoshi2\n(Jenkins)'
  node :fndb, fillcolor:'orange'
  net_services.each {|k|
    node k, fillcolor:'lavender'
  }
  node :Internet, fillcolor:'lavender'

  # 特定のエッジに対するルールを定義
  ## routeで定義したつながりを「_」で区切ることでエッジを特定して設定できる
  edge :yoshi1_yoshi0, color:'lightslateblue', label:'wi-fi'
  edge :yoshi1_yoshi2, style:'dotted', label:'rdp'
  edge :yoshi1_yoshi3, style:'dotted', label:'ssh'
  edge :yoshi2_yoshi3, style:'dotted', label:'ssh'
  edge :yoshi2_Github, style:'dotted', label:'git clone'
  edge :yoshi2_codeBreak, style:'dotted', label:'git clone'
  edge :yoshi2_fndb, style:'dotted', label:'xmlrpc'
  edge :fndb_Twitter, style:'dotted', label:'api-tweet'
  edge :fndb_Facebook, style:'dotted', label:'api-post'

  # ノードをグループにまとめる
  subgraph do
    global label:'cloud'
    node :yoshi2
    node :yoshi3
  end
  subgraph do
    global label:'home_net'
    node :yoshi0
    node :yoshi1
  end
end

gv.save :my_system, :png

■実行
ruby my_system.rb

と実行するとmy_system.dot と my_system.png というファイルが作成されます
pngを直接開いても問題ないですが、dotファイルを開いてもgraphvizが立ち上がりグラフを見ることができます

もしdotファイルを開いたときにgraphivzで開かない場合にはFinderでsample.dotのところまで開き
Cmd+i でファイルの情報を開き「このアプリケーションで開く」の部分をGraphvizに変更してください

※クリックすると拡大します

簡単に凡例を説明すると(完全にUMLは無視していますが。。)
  • 点線のつながりはTCP接続
  • 緑はストレージサービス的な
  • 薄い青はWebサービス的な
  • 白はマシンノード
的な感じを表しています

■Tips
gviz man
gviz man layouts
で各メソッド名を指定すればそのメソッドで指定できる属性情報を調べることができます
使用できる命令はほぼこれで網羅できると思います

■参考サイト

0 件のコメント:

コメントを投稿