(22日目) blockdiag 拡張の紹介(ノードレンダラ)

今日は blockdiag を便利にする blockdiag 拡張をご紹介します。
blockdiag では標準の機能に加え、あとから機能を追加するための拡張フレームワークを持っています。

blockdiag 拡張には 2つのタイプがあります。

  • ハンドラプラグイン(handler plugin)
    • ノードを定義する際の処理を追加する blockdiag 拡張です
    • ノードが生成されたとき、値が設定されるときにノードの定義を書き換えることができます
    • 現在は autoclass、attributes の二種類の拡張があります
      • autoclass はノード生成時に、node_id を元にクラスを自動的に適用します
      • attributes はノード生成時に、あらかじめ定義した属性を設定します
  • ノードレンダラー(node renderer)
    • ノードの shape を追加する blockdiag 拡張です
    • drawer モジュールで画像を生成する際に呼び出され、ノードの描画を担当します

以前の記事で handler plugin の autoclassattributes についてはご紹介していますので、
今日はもう一方のノードレンダラーについて説明していきます。

ノードレンダラーとは

ノードレンダラーは名前の通り、ノードを描画する際に利用される blockdiag 拡張です。
インストール直後の blockdiag では 20個のノードの形状(shape)が定義されています。
この 20個のノードの形状はそれぞれノードレンダラーになっているので、
blockdiag は図を生成する際にノードレンダラーを呼び出してノードを描画しています。

図を定義する際には「ノードレンダラー」モジュールを意識することはなく、
代わりにノードの形状である shape 名を意識します。
定義では shape 属性で指定して、ノードの形状を切り替えています。

blockdiag {
  A [shape = roundedbox];
  B [shape = diamond];
  C [shape = ellipse];
}

ノードレンダラーはプラグインの仕組みを持っているため、
あたらしいノードの形が必要になった場合は blockdiag の本体を修正するのではなく、
レンダラーモジュールを作るだけで新しい shape を追加することができます。

標準インストールされるノードレンダラー

blockdiag 本体に同梱されているノードレンダラーはよく使われそうなもの 14個と
フローチャートに使われるものが 6個収録されています。

マニュアルにも記載されていますが、どんなものがあるかおさらいしてみましょう。

よく使われそうなものは以下のものです。

  • box (長方形)
  • roundedbox (角丸の長方形)
  • square (正方形)
  • ellipse (楕円)
  • circle (円)
  • diamond (ひし形)
  • minidiamond (小さいひし形)
  • note (ノート型)
  • mail (メール型)
  • cloud (雲形)
  • actor (人の形)
  • dots (省略を表す点)
  • beginpoint (開始点)
  • endpoint (終了点)

それぞれを図示化すると次のようになります。

blockdiag {
  // standard node shapes
  box [shape = box];
  square [shape = square];
  roundedbox [shape = roundedbox];
  dots [shape = dots];

  circle [shape = circle];
  ellipse [shape = ellipse];
  diamond [shape = diamond];
  minidiamond [shape = minidiamond];

  note [shape = note];
  mail [shape = mail];
  cloud [shape = cloud];
  actor [shape = actor];

  beginpoint [shape = beginpoint];
  endpoint [shape = endpoint];

  box -> square -> roundedbox;
  circle -> ellipse -> diamond;
  minidiamond -> note -> mail;
  cloud -> actor -> dots;
  beginpoint -> endpoint;
}

フローチャート用のものは flowchart. という名前で始まります。

  • flowchart.condition (条件分岐)
  • flowchart.database (データベース)
  • input (入力)
  • terminater (処理の開始/終了)
  • loopin (ループ開始)
  • loopout (ループ終了)
blockidag {
  // node shapes for flowcharts
  condition [shape = flowchart.condition];
  database [shape = flowchart.database];
  terminator [shape = flowchart.terminator];
  input [shape = flowchart.input];

  loopin [shape = flowchart.loopin];
  loopout [shape = flowchart.loopout];

  condition -> database -> input;
  terminator -> loopin -> loopout;
}

blockdiagcontrib.cisco

blockidagcontrib.ciscoCisco Systems 社が提供しているネットワーク用のアイコン画像をパッケージ化したものです。
Cisco Systems 社はネットワーク機器の開発/販売をしていることもあり、
ネットワーク屋さんではこの Cisco アイコンを利用してネットワーク図を書くことが多いようです。

blockdiagcontrib-cisco は blockdiag 本体には同梱されていないので、別途インストールが必要です。

$ sudo easy-install blockdiagcontrib-cisco

あとは普通に blockdiag から cisco. から始まるノードの形状を指定するだけで利用できます。
blockdiagcontrib-cisco には大量のアイコンが含まれているので、ここでは一部だけ抜粋します。

blockdiag {
  router [shape = cisco.router];
  space_router [shape = cisco.Space_router];
  workstation [shape = cisco.workstation];
  ups [shape = cisco.ups];
  www_server [shape = cisco.www_server];
  storage_server [shape = cisco.storage_server];
  sattelite [shape = cisco.sattelite];
  firewall [shape = cisco.firewall];
  pc [shape = cisco.pc];

  router -- space_router -- workstation;
  ups -- www_server -- storage_server;
  sattelite -- firewall -- pc;
}

その他に利用出来るアイコンは blockdiagcontrib-cisco のマニュアルを覗いてみてください。

blockdiagcontrib.nationalflags

blockidagcontrib.nationalflags は各国の国旗のアイコン画像をパッケージ化したものです。
自分でも用途がいまいち理解できていないのですが、国旗を含んだ図を書くことができます。

blockdiagcontrib-nationalflags も blockdiag 本体には同梱されていないので、別途インストールが必要です。

$ sudo easy-install blockdiagcontrib-nationalflags

あとは普通に blockdiag から nationalflag. から始まるノードの形状を指定するだけで利用できます。
blockdiagcontrib-nationalflag には大量のアイコンが含まれているので、ここでは一部だけ抜粋します。

blockdiag {
  Japan [shape = nationalflag.japan];
  USA [shape = nationalflag.the_united_states];
  UK [shape = nationalflag.the_united_kingdom];
  Germany [shape = nationalflag.germany];
  Italy [shape = nationalflag.italy];
  Korea [shape = nationalflag.south_korea];

  Japan -- USA -- UK;
  Germany -- Italy -- Korea
}

その他のアイコンは blockdiag-nationalflags のマニュアルを覗いてみてください。

おまけ

その他にもジョークで作られた blockdiagcontrib-qb などがあります。
すでに風化しつつあるネタですが、こんな図をだすことができます。

まとめ

今日は blockdiag でよく使われる機能であるノードレンダラをご紹介しました。
Cisco 系の shape は nwdiag などと組み合わせて使われるケースが多いようです。
こんな形のノードが欲しい、という要望があれば協力していこうと思うので、是非アイディアをください :-)

また、ノードレンダラの作り方についてはちょっとした記事を書いていますので、
興味のある人は試しに作ってみてはいかがでしょうか。