読者です 読者をやめる 読者になる 読者になる

harry’s memorandum

おれおれメモ

ruby-graphviz で遊んでみる

ruby misc

ruby-graphvizで遊んでみました。

インストール

サーバはCentOS5.2 x86_64で。

$ cd /etc/yum.repos.d/
$ sudo wget http://www.graphviz.org/graphviz-rhel.repo
$ sudo yum list
  • 必要なものをインストール
$ sudo yum install graphviz graphviz-doc graphviz-gd graphviz-graphs
  • gemでruby-graphvizをインストール*2
$ sudo gem install ruby-graphviz

サンプル

指定したディレクトリツリーをruby-graphvizでグラフにしてみた。*3

#!/usr/bin/ruby

$:.unshift( "../lib" );
require 'rubygems'
gem "ruby-graphviz"
require "graphviz"

def usage
  puts "#{__FILE__} [directory]"; exit
end

usage if ARGV.size == 0
usage unless File.directory?(ARGV[0])
current = Dir.pwd

# :type => (graph digraph)
# :rankdir => (LR RL)
# :use( is layout) => (circo dot fdp neato nop nop1 nop2m, twopi)
$g = nil
$g = GraphViz::new("G", :type => "graph", :use => "dot", :rankdir => "LR", :output => "png" )

# :shape =>
#   (plaintext ellipse oval circle egg triangle box diamond trapezium
#    parallelogram house hexagon octagon note tab box3d  component)
$g.node[:shape] = "box"

def dirs(dir)
  Dir.chdir(dir)
  $g.add_node(("\"#{dir}\""))
  Dir.glob("*\0.??*").each {|o|
    st = "#{dir}/#{o}"
    #$g.add_edge($g.add_node(("\"#{dir}\"")), $g.add_node("\"#{dir}\/#{o}\""))
    $g.add_edge($g.add_node(("\"#{dir}\"")), $g.add_node("\"#{dir}\/#{o}\"")) if File.directory?(st)
    dirs(st) if File.directory?(st)
  }
end

dirs(File.expand_path(ARGV[0]))
Dir.chdir(current)
$g.output( :file => "result.png" )

こんな感じ。layoutやshapeを変更してみると何気に楽しめます。
f:id:dharry:20081207140456p:image

参考(Thanks!)

ruby-graphvizについているサンプルコードが非常に参考になりました。やっぱりパクるのが一番楽だね。

dot言語のほんの少しぐらいは見ておかないと。日本語チュートリアルのサイト。

*1:gemのruby-graphvizで依存関係があるのでdag版の新しいものを

*2:ruby-graphvizを使う場合、graphviz-rubyはインストールしていけないらしい。

*3:ファイルは無視するようにしています。ファイルまで含めるとグラフのサイズが膨れ上がってえらいことになりますからね。