みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

blockdiagを試す

テキストから図を生成するツールの一つにblockdiagがある。 次のような特徴を持つ。

パケット図の生成は他のツールを使用していた時に、微妙に困ったのでこれは良さそう。 また、日本人が開発していることも都合が良さそう。日本語への対応もある。

plantumlやgraphvizとかぶっているところもあるが、たとえば、ブロック図ではgraphvizに比べてノードシェイプの種類やスタック属性が書けるなど、比較的こちらのほうがやりたいことに近いかもしれない。

インストール

$ sudo pip install blockdiag actdiag seqdiag nwdiag

ブロック図

blockdiag {
    A -> B -> C 
}

実行方法

$ blockdiag simple.diag -Tsvg 

emacsとの連携

blockdiag-mode

blockdiag-modeがmelpaからインストールできる。

M-x list-packages -> blockdiag-modeを検索しInstallする。

プレビュー

blockdiagのプレビューは次のようなelispで行う。

(defun blockdiag-buffer ()
  (interactive)
  (let ((blockdiag-output "/tmp/blockdiag-buffer.png")
        (current-file (buffer-file-name (current-buffer))))
    (call-process "blockdiag" nil nil t "-o" blockdiag-output current-file)
    (switch-to-buffer-other-window
     (get-buffer-create "*blockdiag*"))
    (erase-buffer)
    (insert-file blockdiag-output)
    (image-mode)))
  
(push '("*blockdiag*") popwin:special-display-config)

出典はここ

pandocから使用する

フィルタを入手

matthiasbeyerさんのpandoc-paper-templateから使用させてもらう。

$ ~/bin
$ wget https://raw.githubusercontent.com/matthiasbeyer/pandoc-paper-template/master/scripts/blockdiag-filter.py
$ chmod +x blockdiag-filter.py

日本語対応パッチ

labelなどに日本語を食わすと「UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 」とエラーを吐くので、パッチを当てる。

--- blockdiag-filter.py.orig 2016-11-01 13:06:12.199636652 +0900
+++ blockdiag-filter.py   2017-04-12 09:17:00.707985814 +0900
@@ -13,7 +13,7 @@
 from pandocfilters import toJSONFilter, Str, Para, Image, attributes
 
 def sha1(x):
-  return hashlib.sha1(x).hexdigest()
+  return hashlib.sha1(x.encode('utf-8')).hexdigest()
 
 imagedir = "blockdiag-images"
 
@@ -22,7 +22,7 @@
 
 def save(data):
     fd, name = tempfile.mkstemp()
-    os.write(fd, data)
+    os.write(fd, data.encode('utf-8'))
     os.close(fd)
     return name
 

使用方法

次のように使用する。

$ pandoc -F blockdiag-filter.py [PANDOC-OPTIONS] [FILE-NAME ...]

次のようなマークダウンから

```rackdiag
rackdiag {
    7U;
    1: MAC
    2: IP
    3: TCP
    3: UDP
}
```

このようになる。

rackdiag {
    7U;
    1: MAC
    2: IP
    3: TCP
    3: UDP
}