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の使い方を探してみた。
有名なソフトみたいで、バンバンヒットするよ。日本語化したいとかね。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色塗り分け問題を意識したものなんでしょうか。
嗚呼、脱線して、だいぶ遠い所まで来ちゃったな。
でも、似てる/似てない -> 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とΠが結び付くんです。世界で一番美しい数式、 オイラーの公式 を愛でましょう。