Graphviz

先月のTVで、お菓子総選挙 なんてのをやってた。お菓子のジャンル別に一位を 決めようってやつ。衆議院選挙が近いから? (あいまいな国日本の首領、野田氏談) それとも発想が貧弱で、AKB48の総選挙のパクリ? こんな下らない、コマーシャルの延長戦とも思える番組で、盛り上がるって日本も終わりだな。

その前に、TV局終わっていいよ。まあまあ、そんなに意気がんなよ。お前だって、面白そうに 見てたくせに。おいらに分かったお菓子は、亀田の柿ピー だけだったかな。後は、よー知らんわ。 甘い物、意識的に避けているのか、母親ゆずりの味覚刷り込みの影響か知れませんがね。

女房は、出て来るお菓子全部知ってたよ。どういう幼少時代を送ったんだか? 甘やかされて、 甘い物を食べていたんだな。さすが、最近はダイエットの敵と言って、余り食べなくなったけど。

TV局、視聴者に甘やかされて、質がどんどん低下してる。クイズ番組も素人参加が無くなって (きっと、賞金とかを出す予算が無い、トレーニングが面倒って言う裏事情が有るんだろう)、 いつ見ても、同じ顔ぶれの芸人さんばかり。

質が低下したのは、TV局ばかりでは無い。親の新聞社もそうだ。世紀の大誤報とか、いろいろ あらーな。それと、最近とみに増えた、広告ページ。これじゃ、新聞じゃなくて、コマーシャル・ペーパー ですよ。

一体、全紙面のうちの何パーセントぐらいが広告で埋められているんだろう?そして、新聞社に よって、その比率のばらつきはどのぐらい有るんだろう? 今度、図書館にでも行って、調べてみてくるかな。

紙面の1/3とか、1/5が広告になってました、なんて事になると、分数の足し算が必要になるな。 えっと、分数のままで足し算出来る言語は?

gosh> (* (/. (+ 13 3/2 13/3 3/4 1/5) 36) 100)
54.9537037037037

Schemeって、数学の道具だな。 ああ、上記のS式は、とある日の新聞の広告率です。全36ページ中、全面広告が13ページ、半面広告が 3ページって具合です。半分以上が広告って異常な新聞だな。もう、こんな新聞取るの止めよう。 金払って広告を見せられるんじゃ、いい鴨だもんなあ。

graphviz

前回、C言語のソースの成分分析って言うか、フローの表示用に、cflowなんてのを見つけて使って みた。宿題だったTODOは途中までやったけど、それは、ほれ、秋っぽい性格なので、ちょいと 中休みしてるんだ。で、何気に、cflowのmanを見てたら、おいらの知らないオプションに出くわした。

     -g      Produce a dot(1) graph for graphviz output.

なんや、これ? dotってのは、コマンドだな、グラフ用の。graphvizって謎の言葉が出てきたんで ぐぐる先生に聞いてみた。そしたら、graphvizへ案内された。

グラフはグラフでも、EXCELに書かせる詐欺誘発用某グラフとか、折れ線グラフじゃ無くて、繋がりを 表す方のグラフなのね。思えば、mainの中から、getoptを呼んでとかは、確かに繋がりを表して いるな。cflowの一機能として有ってもおかしくは無い。果たして、どんな出力を出してくれるのかな?

[sakae@arch z]$ cflow -ACGP -g F.c
digraph "TODO" {
  main -> strlcpy [label="1"];
  main -> errx [label="2"];
  main -> usage [label="3"];
  main -> is_default [label="4"];
  main -> getprec [label="5"];
  main -> getformat [label="6"];
  main -> arc4random [label="7"];
  main -> putdata [label="8"];
  getformat -> errx [label="1"];
  getformat -> strlcpy [label="2"];
  getformat -> strlcat [label="3"];
  getformat [label="getformat"];
  getprec [label="getprec"];
  putdata [label="putdata"];
  usage [label="usage"];
  main [label="main"];
  strlcpy [label="strlcpy"];
  errx [label="errx"];
  is_default [label="is_default"];
  arc4random [label="arc4random"];
  strlcat [label="strlcat"];
}

うむ、何となく分かるよ。で、このデータをgraphvizに喰わせると、図が出来るんだな。 graphvizの使い方を探してみた。

Graphvizの使い方メモ

Graphviz 使いかた

dottyの使い方

Graphvizによる有向グラフの自動生成

有名なソフトみたいで、バンバンヒットするよ。日本語化したいとかね。AAじゃかっこ悪いって 風潮は、日本に健在なのね。

おいらも、お遊びで入れてみるか。きっと、ArchLinuxにも有るはず。。。。問題なく入ったよ。 Graphvizの代表コマンドは、dot っていうんだ。で、ノードとリーフをどういう風に配置させるか いろいろエンジンがあって、dotコマンドの、-Kで指定出来るけど、それぞれ専用なのが用意 されてるのね。

DOT(1)                                                                  DOT(1)

NAME
       dot - filter for drawing directed graphs
       neato - filter for drawing undirected graphs
       twopi - filter for radial layouts of graphs
       circo - filter for circular layout of graphs
       fdp - filter for drawing undirected graphs
       sfdp - filter for drawing large undirected graphs

mainが有って、そこからいろいろなやつを呼び出しているような場合、twopi(放射状配置)とか、 fdp(重ならないように佳きに計らえ)とかが、いいのかな。

[sakae@arch z]$ dot -v
dot - graphviz version 2.28.0 (20120524.1256)
libdir = "/usr/lib/graphviz"
Activated plugin library: libgvplugin_pango.so.6
Using textlayout: textlayout:cairo
Activated plugin library: libgvplugin_dot_layout.so.6
Using layout: dot:dot_layout
Activated plugin library: libgvplugin_core.so.6
Using render: dot:core
Using device: dot:dot:core
The plugin configuration file:
        /usr/lib/graphviz/config6
                was successfully loaded.
    render      :  cairo dot fig gd map ps svg tk vml vrml xdot
    layout      :  circo dot fdp neato nop nop1 nop2 osage patchwork sfdp twopi
    textlayout  :  textlayout
    device      :  bmp canon cmap cmapx cmapx_np dot eps fig gd gd2 gif gv ico imap imap_np ismap jpe jpeg jpg pdf plain plain-ext png ps ps2 svg svgz tif tiff tk vml vmlz vrml wbmp x11 xdot xlib
    loadimage   :  (lib) eps gd gd2 gif jpe jpeg jpg png ps svg

gifとかjpegとかpngとかいろいろサポートしてるみたいだけど、これから流行するであろうEPUBは まだ未対応な所が、残念ですな。

早速、お試しをば

[sakae@arch z]$ cflow -ACGP -g F.c > z.dot
[sakae@arch z]$ dot -K fdp -T png -o z.png z.dot

はて、出来た z.png をどうやって表示させよう。余りこういうのの表示機って知らないのよね。 3秒考えて、firefoxを思い付いたけど、大げさすぎるな。こういう時は十得ナイフなemacsが 佳きに計らってくれるに違いない。。。おお、表示したよ。ついでに、モザイクを消す機能を emacsに付けて欲しいぞ。天下のeditorを自認するなら。rmsにリクエストしれ。 ここで、結果を表示せいとなるけど、面倒なのでPass。私の代わりに、 あの方の力作をご覧ください。(ページの下の方に有ります)

と、ここまで書いてみて梯子を外すような発言をします。面倒くさい。綺麗にレイアウト するの、気が狂うよ。やっぱり、おいらはCUIな人。

gviz

GUIな人に怒られそうなんで、上記のgraphvizをぐぐってた時に、たまたま見つけたのを 拡散します。それは、 GvizというRubyのGraphvizインタフェースを作りましたので、ここで紹介させて下さい^ ^; です。

今流行りのgemで一発導入らしいです。

[sakae@arch ~]$ sudo gem install gviz
WARNING:  You don't have /root/.gem/ruby/1.9.1/bin in your PATH,
          gem executables will not run.
Successfully installed gviz-0.1.1
1 gem installed
Installing ri documentation for gviz-0.1.1...
Installing RDoc documentation for gviz-0.1.1...

幾らおいらがrootさんと兼業してるかと言って、それはまずいよね。ひょっとして、gemで入れる やつは、自分専用って事なの? 何も知らないgem初心者なのであります。

はいはい、自分用にやり直しましたよ。そしてPATHも通しましたよ。指定された .gemの下の方を 覗いてみたら、gvizなんて言うrubyスクリプトが鎮座してました。後は、例に倣って

require "gviz"

gv = Gviz.new
gv.graph do
  route :main => [:init, :parse, :cleanup, :printf]
  route :init => :make, :parse => :execute
  route :execute => [:make, :compare, :printf]
end

gv.save(:sample1, :png)

こんなsample.rbを作り、走らせるだけ。結果は、

[sakae@arch gviz]$ cat sample1.dot
digraph G {
  main;
  init;
  parse;
  cleanup;
  printf;
  make;
  execute;
  compare;
  main -> init;
  main -> parse;
  main -> cleanup;
  main -> printf;
  init -> make;
  parse -> execute;
  execute -> make;
  execute -> compare;
  execute -> printf;
}

こんな中間ファイルを経由して、sample.pngが出来上がっていました。これって、gviz版の こんにちわ世界なんだな。

なお、 dot言語の日本語マニュアル で詳細を知る事が出来るし、上記のgvizの作者さんによる 楽しい解説 も公開されてたりします。日頃から、亡グラフしか使っていない人は、こういう文化に 触れてみるものも悪くないと思うよ。

ああ、gvizを使ってるかどうかは分からんが、tracerouteをrubyでやって、それをグラフに してにやにやなおじさんがいました。 TraceViz: Visualizing traceroute output with graphivz

rubyじゃなくて、awkを使ったのも有るよ。これ、良く呼び出されるルーチンを赤く表示して くれるみたいで、文字通り、hotspotが一発で分かるらしいです。

NAME
       cgprof - generate colored call graph for profiled executables

EXAMPLE
       to  print  a report from execution of test_hash, run the following com-
       mand:

             $ cc -pg -o test_hash test_hash.c
             $ test_hash < test_data
             $ gprof test_hash | cgprof -Tps | lpr

4色問題

上記の紹介URLには、日本地図の県の繋がり具合をグラフにした力作が載っていますが、 これって、地図の4色塗り分け問題を意識したものなんでしょうか。

四色定理

四色問題 どんな地図も4色あれば塗り分けられるのか?

隣の区画と異なる色で地図を四色に塗り分ける

嗚呼、脱線して、だいぶ遠い所まで来ちゃったな。

でも、似てる/似てない -> cflow -> Graphviz -> gviz -> 4色問題 って具合に ちゃんと繋がってる(ストーリィーが出来ている)からいいか。逆方向へは多分行けないけど!

おまけ

先日、歯医者へ行ったら、11月8日は、いい歯の日ですって、ポスターが貼られていた。昨日の9日は、 119番の日ってニュースで言ってた。じゃ、今日11月10日は何の日? 今日は何の日その1や、 今日は何の日その2を見れ!

でも、バイナリアンは、11月10日を、1110 として、e と読みます。人によっては、これを E と 思うかも知れません。そうすると、 E = mc^2 と連想して、世界で一番美しい物理法則を発見 したアインシュタインを連想するかも知れません。

eと連想した人も悲観に暮れる事は有りません。3月14日のパイの日 と、合せて考えましょう。11月10日は、新年から数えて314日の日です。e(ネイピア数)とΠ(パイ)が結び付き ましたねぇ。

でももっと強烈にeとΠが結び付くんです。世界で一番美しい数式、 オイラーの公式 を愛でましょう。