blockdiag

blockdiag シリーズで色々な作図をしてみる

作図をするときに使うソフトというと PowerPoint とか Visio とか色々あるけど、大抵は GUI で素材をチマチマとドラッグアンドドロップしていく系が多いと思う。 ただ、保存形式がバイナリだとバージョン管理なんかと相性悪いし、なにかをひとつ追加するだけで周りを全部移動させたりーとか考えると結構めんどいこともある。 それに対して blockdiag シリーズはテキストベースの設定ファイルを図に変換することができるツールだ。 blockdiag シリーズは作成する図に応じて blockdiag、seqdiag、nwdiag、actdiag と分かれていて、それぞれブロック図、シーケンス図、ネットワーク図、アクティビティ図を作成することができる。

まずはブロック図を作成できる blockdiag から使ってみよう。 OS X だと、まずは Homebrew で依存パッケージを入れておく。 それ以外のプラットフォームであればこちらの公式ドキュメントを見てほしい。

$ brew install freetype

依存パッケージが入ったら Python のパッケージマネージャ PIP を使って blockdiag をインストールする。 システムにインストールする場合は適宜 sudo したりスーパーユーザでログインする。
$ pip install blockdiag

もし PIP が入っていない場合は easy_install や get-pip.py を使ってインストールしよう。
$ sudo easy_install pip

まずはシンプルなブロック図から作ってみよう。 ブロック図の元となるテキストベースの設定ファイルを作成する。 下記を blockdiag1.diag という名前で保存しておく。
diagram {
  A -> B -> C, D
  C, D -> E
  A -> F -> G
  G -> F
}

設定ファイルを保存したら、それを blockdiag コマンドを使ってビルドする。
$ blockdiag blockdiag1.diag

上手くいけば同じディレクトリに blockdiag1.png ができるはず。



上記では右方向の矢印しか作っていなかったけど、左方向や両方向または矢印のない線をつくることもできる。
diagram {
  A -> B
  B <- C
  C -- D
  D <-> E
}

上記をビルドした画像は以下の通り。



ただ、この矢印の方向にはちょっと問題があって、混乱を招く場合もありそうだ。 次の設定ファイルには A から B への矢印と C から A への矢印があることを意図している。
diagram {
  A -> B
  A <- C
}

以下が上記の設定ファイルをビルドした画像だ。 あたかも B から A への矢印もあるように見えてしまっている。



次はブロックや矢印にラベルをつけたり色を変える方法について。 ラベルや色の指定をする場合は右側に角括弧を用意する。
diagram {
  A [label = "Browser"]
  B [label = "Web Server"]

  A -> B [label = "GET /index.html", textcolor="red"]
}


ただこれにもちょっと問題があって、あまり長いラベルは省略されてしまうようだ。 これくらいの長さのものは残ってほしいなあ。



ブロックの形を変える場合も、ラベルなどをつける場合と同様に右側の角括弧の中に shape を指定すれば良い。
diagram {
  box [shape = box]
  square [shape = square]
  circle [shape = circle]
  diamond [shape = diamond]
  ellipse [shape = ellipse]
  roundedbox [shape = roundedbox]
  actor [shape = actor]
  cloud [shape = cloud]
}



それぞれのブロックをグループ化することもできる。
diagram {
  A -> B -> C
  group {
    A, B
  }

  group {
    color = blue
    label = "outer"

    C -> D, E

    group x {
      shape = line
      color = green
      label = "inner"

      D, E
    }
  }

  F [group = x]
}



ここまではブロック図が横方向に伸びていったけど、縦方向に変えることもできる。 ブロックの形として flowchart.* を組み合わせればフローチャートも書けそうかな?
diagram {
  orientation = portrait

  begin [shape = beginpoint]
  end [shape = endpoint]

  if [shape = flowchart.condition, label = "X ならば"]

  func_a [label = "処理1"]
  func_b [label = "処理1"]

  begin -> if
  if -> func_a [label = "Yes"]
  if -> func_b [label = "No"]
  func_a, func_b -> end

}



blockdiag はこれくらいにして、次は seqdiag を使ってみよう。 seqdiag はその名の通りシーケンス図を作るためのツールだ。 インストールは先ほどと同様 PIP を使う。
$ pip install seqdiag

基本は blockdiag と同じで、できるのがシーケンス図だったりブロック同士のつながりに順序関係があるくらいの違いしかない。 実線の矢印と破線の矢印、ネストした呼び出しのやり方をひと通り紹介する。
$ cat  seqdiag1.diag
seqdiag {
  # 実線の矢印
  A -> B
  # 破線の矢印
  A <-- B
  
  # こうも書ける
  A => B

  # ネストした呼び出し
  A -> B
    B -> C
    B <-- C
  A <-- B

  # こうも書ける
  A => B {
    B => C
  }

  # こうも書ける
  A => B => C
}
EOF

今度はビルドに使うのが seqdiag コマンドになる。
$ seqdiag seqdiag1.diag

できたシーケンス図が以下。



blockdiag と同様、ラベルをつけたり色を変えることができる。 シーケンスの途中で呼び出しに失敗したことを表すには failed をつければいい。
seqdiag {
  A => B [label = "Foo", color="red"]
  A -> B [failed]
}



処理の間に区切りたいときは === や … を使うといいかんじ。
seqdiag {
  A -> B
  === separate A ===
  A <-- B

  A -> B
  ... separate B ...
  A <-- B
}



ラベルとは別に呼び出しにノートをつけることもできる。
seqdiag {
  A -> B [label = "A to B"]
  A <-- B [note = "B to A"]

  A -> B [leftnote = "A to B"]
  A <-- B [rightnote = "B to A"]
}



さて次は nwdiag でネットワーク図を作ってみよう。 インストールはこれまでと同様 PIP で。
$ pip install nwdiag

だいぶ blockdiag シリーズの設定ファイルの書式にも慣れてきたと思うので一気に色々と書いちゃう。 基本は各ネットワークをグループっぽく定義して中にブロックとしてホストを置いていく。 間にネットワークを挟む必要のない P2P 接続の場合は “–” で要素同士をつなぐ。
nwdiag {
  internet [shape = cloud];
  internet -- gateway;

  network dmz {
    address = "203.0.113.0/24"

    gateway [address = "203.0.113.1"]
    lb01 [address = "203.0.113.2, 203.0.113.10(vip)"]
    lb02 [address = "203.0.113.3"]
  }
  network private {
    address = "192.168.2.0/24"

    lb01 [address = "192.168.2.2"]
    lb02 [address = "192.168.2.3"]
    web01 [address = "192.168.2.4"]
    web02 [address = "192.168.2.5"]
    db01 [address = "192.168.2.6"]
    db02 [address = "192.168.2.7"]
  }
}


ビルドは nwdiag コマンドを使う。
$ nwdiag nwdiag1.diag

できあがる図はこんなかんじ。



nwdiag にはパケットフォーマットを図示するための packetdiag というツールも同梱されているので、試しに IPv6 ヘッダを図示してみる。
packetdiag {
  colwidth = 32

  0-3: version
  4-11: class of traffic
  12-31: flow label
  32-47: payload length
  48-54: next header
  55-63: hop limit
  64-191: source address
  192-319: destination address
}


もう法則性が見えてきていると思うけどビルドには packetdiag コマンドを使えば良い。
$ packetdiag packetdiag1.diag

上記からはこんな図ができる。



nwdiag には packetdiag 以外にも rackdiag というラックを図示するためのツールも同梱されてる。 わりと適当な感じだけど、こちらもサンプルを書いてみた。
rackdiag {

  rack {
    20U

    description = "Tokyo East/01";

    1: L2 Switch
    2: Express 5800
    3: Express 5800
    4: Primergy
    5: Primergy
    6: ProLiant
    7: ProLiant
    12: N/A [9U]
  }

}


ビルドは rackdiag ね。
$ rackdiag rackdiag1.diag

するとこんな図ができる。



最後に actdiag でアクティビティ図を書いてみる。 インストールはもちろん PIP で。
$ pip install actdiag

アクティビティ図の場合は一連の処理の流れを書いてから lane に処理を当てはめていくかんじ。
actdiag {
  start -> write -> processing -> image -> end

  lane user {
    start [shape = beginpoint]
    write [label = "設定を書く"]
    image [label = "画像を取得する"]
    end [shape = endpoint]
  }

  lane actdiag {
    processing [label = "画像に変換する"]
  }
}


ビルドは actdiag コマンドで。
$ actdiag actdiag1.diag

こんな図ができあがる。



今回は blockdiag シリーズを使って色んな図を書いてみた。 ちょいちょい気になるところはあるものの、マウスを使って 1px をジリジリと動かすような時間は減らすことができそうだ。
Install blockdiag for Mac OS X

blockdiag is an awesome text based diagram image generator written in Python.

Installation on Mac OS X is bit confusing. Here is summary to install it without headache.

Dependencies

FreeType 2 on Mac OS X

FreeType 2 must be installed before PIL is installed. And it actually has already been installed on Mac OS X 10.7 under;

/usr/X11/lib

However PIL doesn’t look at this path when it is installed, so you should make symbolic links to the path where PIL look at:

sudo ln -s /usr/X11/include/freetype2 /usr/local/include/
sudo ln -s /usr/X11/include/ft2build.h /usr/local/include/
sudo ln -s /usr/X11/lib/libfreetype.6.dylib /usr/local/lib/
sudo ln -s /usr/X11/lib/libfreetype.6.dylib /usr/local/lib/libfreetype.dylib

PIL on Mac OS X

easy_install should be available, but I chose pip to install PIL:

sudo pip install pil

blockdiag on Mac OS X

There are 4 packages that should be installed:

sudo pip install blockdiag seqdiag actdiag nwdiag

Whoa! That’s all. Now blockdiag, seqdiag, actdiag, and nwdiag commands should be available for you!

d.hatena.ne.jp
Tracのwikiに図面を入れる(BlockDiag編) - Basic

Tracのwikiでblockdiagを使うためのプラグインを導入した。直線や円と言ったプリミティブな図形ではなく、開発現場でそのまま使えるような図面を描けるのが特徴だ。利用環境は下記の通り。

* MacOSX 10.6.7 (Snow Leopard)
* Trac 0.12.2 (MacPorts)
* Python 2.6.6 (MacPorts)
* BlockDiagPlugin 0.4.0
* * TracBlockDiagPlugin - Trac Hacks - Plugins Macros etc. - Trac