ブロック図生成ツール blockdiagを導入してみました

# はじめに

## ■blockdiagとは

公式サイトより
http://blockdiag.com/ja/index.html

> blockdiag シリーズはシンプルなテキストからブロック図などの画像を生成する画像生成ツール群です。


## ■今回試したこと
「テキストベースの定義ファイルから画像ファイルを生成」
こちらを試してみました。


## ■参考サイト
・公式サイトより、CentOS6.2の場合
http://blockdiag.com/ja/blockdiag/introduction.html#centos-6-2

・公式サイトより、実行方法、フォント設定
http://blockdiag.com/ja/blockdiag/introduction.html#id10

▽その他
マウスなしで図が描ける！blockdiagに惚れました
http://d.hatena.ne.jp/torazuka/20110620/blockdiag


# 導入

## ■環境
AWS EC2(CentOS 6.5)
Python 2.6.6


## ■インストール
```bash
# yum install python-setuptools python-imaging ipa-gothic-fonts
# easy_install blockdiag
```
※easy_installとは、pythonのsetuptoolsに含まれるコマンドラインツール。web上からパッケージをDLしインストールする。

▽エラー対処2より

```bash
# yum install python-devel zlib-devel libjpeg-devel
```

▽エラー対処4より

```bash
# yum install freetype-devel.x86_64
```

▽エラー対処1より

```bash
# easy_install pillow
# easy_install webcolors
# easy_install funcparserlib
```

▽エラー対処3より

```bash
# easy_install -U reportlab==2.5
```

▽インストール確認(pythonパッケージ)

```bash
# pip freeze | grep -i "blockdiag\|pillow\|webcolors\|funcparserlib"
```


# 設定

## ■フォント
▽実行時にフォントを指定する場合

```bash
$ blockdiag -f /usr/share/fonts/ipa-gothic/ipag.ttf simple.diag
```

▽$HOME/.blockdiagrcにて定義する場合

```bash
$ vi $HOME/.blockdiagrc
--------------------
[blockdiag]
fontpath = /usr/share/fonts/ipa-gothic/ipag.ttf
```

# 動作確認
ブロック図を生成するには blockdiag コマンドを実行する。
※公式サイトで謳っているexampleが格納されていないため手動で作成。

## ■ディレクトリ移動
まずは作成する画像が表示できるwebサーバのdocumentroot配下に移動する

```bash
# cd /var/www/html
```

## ■シンプルなブロック図より
http://blockdiag.com/ja/blockdiag/examples.html#simple-diagram

```bash
# vi simple.diag
-----------------
blockdiag {
   A -> B -> C -> D;
   A -> E -> F -> G;
}
```

・ブロック図を生成

```bash
# blockdiag simple.diag
# blockdiag -Tsvg simple.diag
# blockdiag -Tpdf simple.diag
※上からPNG形式、SVG形式、PDF形式
```

・ブラウザから確認
http://example.com/simple.png
![20141006_blockdiag_sample01.png](https://qiita-image-store.s3.amazonaws.com/0/50310/e8a1e51c-6700-7fba-982a-8633208d66e0.png)

http://example.com/simple.svg
![20141006_blockdiag_sample02.png](https://qiita-image-store.s3.amazonaws.com/0/50310/9bda2c83-4393-b714-c483-ee41197b0f5c.png)

http://example.com/simple.pdf
![20141006_blockdiag_sample03.png](https://qiita-image-store.s3.amazonaws.com/0/50310/f169ff55-13d9-15c7-2583-5f260550d14f.png)


## ■日本語の利用より
http://blockdiag.com/ja/blockdiag/examples.html#mutlilingualization

```bash
# vi nippon.diag
-----------------
blockdiag admin {
   // Set M17N text using label property.
   A [label = "起"];
   B [label = "承"];
   C [label = "転"];
   D [label = "結"];

   A -> B -> C -> D;

   // Use M17N text directly (need to quote).
   春 -> 夏 -> 秋 -> 冬;

   // Use M17N text including symbol characters (need to quote).
   "春は 曙" -> "夏 = 夜" -> "秋.夕暮れ" -> "冬 & つとめて";
}
```

・ブロック図を生成

```bash
# blockdiag nippon.diag
# blockdiag -Tsvg nippon.diag
# blockdiag -Tpdf nippon.diag
※上からPNG形式、SVG形式、PDF形式
```

・ブラウザから確認

http://example.com/nippon.png
![20141006_blockdiag_sample04.png](https://qiita-image-store.s3.amazonaws.com/0/50310/cb690789-6944-fd18-e401-e7431ddd67f9.png)

http://example.com/nippon.svg
![20141006_blockdiag_sample05.png](https://qiita-image-store.s3.amazonaws.com/0/50310/d4abafcd-54c2-ace7-2cd3-00bd6737dbb6.png)

http://example.com/nippon.pdf
![20141006_blockdiag_sample06.png](https://qiita-image-store.s3.amazonaws.com/0/50310/d7a213f3-cc8c-b04f-c573-b862b6a355a4.png)



# 補足

## ■エラー対処1
・diagコマンド実行時に下記エラーが出力された場合

```bash
# blockdiag simple.diag
--------------------
Traceback (most recent call last):
  File "/usr/bin/blockdiag", line 5, in <module>
    from pkg_resources import load_entry_point
  File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 2655, in <module>
    working_set.require(__requires__)
  File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 648, in require
    needed = self.resolve(parse_requirements(requirements))
  File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 546, in resolve
    raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: Pillow
```

・pillowがインストールされていないことを確認

```bash
# pip freeze | grep -i "pillow\|webcolors\|funcparserlib"
※pipとは、Pythonにおけるパッケージ管理システム
```

・pillowのインストール

```bash
# easy_install pillow
```

▽pillow導入後だと下記エラー

```bash
pkg_resources.DistributionNotFound: webcolors
```

・webcolorsのインストール

```bash
# easy_install webcolors
```

▽webcolors導入後だと下記エラー

```bash
pkg_resources.DistributionNotFound: funcparserlib
```

・funcparserlibのインストール

```bash
# easy_install funcparserlib
```

・導入確認

```bash
# pip freeze | grep -i "pillow\|webcolors\|funcparserlib\|reportlab"
Pillow==2.6.0
funcparserlib==0.3.6
webcolors==1.4
```

## ■エラー対処2
▽pillowインストールにて下記エラーが出力された場合

```bash
(省略)
_imaging.c:3570: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘init_imaging’
error: Setup script exited with error: command 'gcc' failed with exit status 1
```

・下記パッケージを導入する(フォーラムより)

```bash
# yum install python-devel zlib-devel libjpeg-devel
------
zlib-devel-1.2.3-29.el6.x86_64
libjpeg-turbo-devel-1.2.1-3.el6_5.x86_64
python-devel-2.6.6-52.el6.x86_64
```

・対処、下記パスを通す(フォーラムより)

```bash
# export CFLAGS=-Qunused-arguments
# export CPPFLAGS=-Qunused-arguments
```

・改めてインストールコマンド実行

```bash
# easy_install pillow
```


## ■エラー対処3
▽PDF形式のブロック図を作成出来ない場合

```bash
# blockdiag -Tpdf simple.diag
ERROR: unknown format: PDF
```

▽reportlabをインストールする

```bash
easy_install -U reportlab==2.5
```
※注釈: 最新版reportlab3.1.8は、下記より私の導入しているpythonをサポートしていないようなので古いversionを導入しています。

```bash
# python
Python 2.6.6 (r266:84292, Jan 22 2014, 09:42:36)

>>> import reportlab
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/site-packages/reportlab-3.1.8-py2.6-linux-x86_64.egg/reportlab/__init__.py", line 11, in <module>
    raise ImportError("""reportlab requires Python 2.7+ or 3.3+; 3.0-3.2 are not supported.""")
ImportError: reportlab requires Python 2.7+ or 3.3+; 3.0-3.2 are not supported.
```

## ■エラー対処4
▽日本語を含むサンプルブロック図を作成しようとした際

```bash
# blockdiag nippon.diag
ERROR: The _imagingft C module is not installed
```

▽参考サイト
[python]PILで_imagingftのインポートエラーが出た場合
http://d.hatena.ne.jp/pashango_p/20110919/1316408103
> 要はPILのコンパイル時にFreeType2がインストールされていなかった事が原因。
> Linux(OpenSuse)ならば、「freetype2-devel」パッケージをインストールしてから、PILをインストールすれば解決する。

▽freetype-develをインストール

```bash
# yum install freetype-devel.x86_64
```

▽PILをアンインストール・インストール
(公式サイトより)PIL パッケージの再インストール

```bash
# easy_install -m PIL
# \rm -rf /usr/lib/python2.6/site-packages/PIL-1.1.7-py2.6-linux-x86_64.egg

# easy_install PIL
```

▽pillowも再インストール

```bash
# easy_install -m pillow
# \rm -rf /usr/lib/python2.6/site-packages/Pillow-2.6.0-py2.6-linux-x86_64.egg

# easy_install pillow
```

▽上記設定後、再度コマンドを実行すると無事PDF形式にて出力出来ました。

```bash
# blockdiag nippon.diag

# ls -l nippon.pdf
-rw-r--r-- 1 root root 20415 10月  6 16:47 2014 nippon.pdf
```

以上になります。