Python
Windows10
seqdiag
シーケンス図
BashOnWindows

こんな人に向けた記事

シーケンス図を作りたいけど爆速でテキストだけで作図できるツールあったらいいよね、Githubでプルリク作って同僚と編集合戦できるしテキスト作図最高って思っている人向け。
宗教上やライセンスの理由などでエクセル方眼紙やastahが使えない(使いたくない)人にも。

前提

この記事を読む前にWin10のBash on Windows をインストールを先にどうぞ。

seqdiag のインストール

sudo apt-get install python-seqdiag

所定の書式でテキストを作成

"/mnt/c"がWindousOSのCドライブとなります。そのため、"c:\work"というディレクトリを作成しそこに"test.txt"というファイルを配置すると"/mnt/c/work/test.txt"としてBash on Windows側で認識されます。以下の内容でUTF-8でファイルを作成してください。

サンプル (test.txt)

seqdiag {
  # 実線の矢印
  A -> B [label = "日本語のコメント"];
  # 破線の矢印
  A <-- B [label = "english comment"];

  # こうも書ける
  A => B

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

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

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

cmdで生成

cmdファイル内に以下を記述する。こちらもUTF-8でファイルを作成します。
日本語を使用する場合、フォント指定が必要になります。(自分のOSで入っているフォントを指定してください。Win10であればメイリオはあるはず。)
フォントはコマンド実行時に -f オプションで指定できます。
--no-transparencyは、PNGが透過処理させないための指定です。Win10のデフォルトビューアーで見ると黒背景で残念なことになるので指定します。

bash `seqdiag -f /mnt/c/Windows/Fonts/meiryo.ttc --no-transparency ./test.txt`

上記のCMDを実行(WinddowsOSのエクスプローラーでcmdファイルをダブルクリック)すると、/mnt/c/work/test.png が生成されます。WindowsOSのパスだと c:\work\test.pngが生成されます。コマンドプロンプトは自動で閉じませんので、毎回手で閉じてください。

以下のファイルが生成されたはずです。
test.png

PDFを出力する

-TpdfオプションをつければOK。このときは--no-transparencyはエラーになるので外してください。

bash `seqdiag -f /mnt/c/Windows/Fonts/meiryo.ttc -Tpdf ./test.txt`

image.png

使い倒す(ここからがこの記事の本題)

どんなツールも上手く使わないと生産性は上がりません。ではこれを使う場合のポイントは?というと2つ。

  • コピペ元を用意する

  • テキストで置換して仕上げる

まず、ラベルが無い状態で矢印だけささっと作成します。

seqdiag {

"aa" -> "bb" [label = ""];
"bb" -> "cc" [label = ""];
"bb" <-- "cc" [label = ""];
"aa" <-- "bb" [label = ""];

"aa" -> "dd" [label = ""];
"aa" <-- "dd" [label = ""];
"aa" -> "dd" [label = ""];
"aa" <-- "dd" [label = ""];
"aa" -> "dd" [label = ""];
"aa" <-- "dd" [label = ""];

"aa" -> "bb" [label = ""];
"bb" -> "cc" [label = ""];
"bb" <-- "cc" [label = ""];
"aa" <-- "bb" [label = ""];

}

次にラベルを書きます。ラベルを書く前に矢印の図をPNGで出力しておき、それを見ながらやると早いでしょう。

seqdiag {

"aa" -> "bb" [label = "SAS付きURL発行要求"];
"bb" -> "cc" [label = "ファイル情報の登録"];
"bb" <-- "cc" [label = ""];
"aa" <-- "bb" [label = "SAS付きURL"];

"aa" -> "dd" [label = "ファイルアップロード(1/n)"];
"aa" <-- "dd" [label = ""];
"aa" -> "dd" [label = "ファイルアップロード(2/n)"];
"aa" <-- "dd" [label = ""];
"aa" -> "dd" [label = "ファイルアップロード(n/n)"];
"aa" <-- "dd" [label = ""];

"aa" -> "bb" [label = "ファイルアップロード完了報告"];
"bb" -> "cc" [label = "ステータス変更"];
"bb" <-- "cc" [label = ""];
"aa" <-- "bb" [label = ""];

}

最後にaa~ddの箱の名前をそれぞれ一括置換します。これで完成です。
いきなり名称で書こうとすると時間かかりますが、置換前提で作業をすると時間短縮できます。

最終形

ついでにフォントサイズなど、オプション指定で整えてみました。

seqdiag {

edge_length = 150;      // default value is 192
span_height = 15;       // default value is 40
default_fontsize = 10;  // default value is 11

"Gateway" -> "REST API" [label = "SAS付きURL発行要求"];
"REST API" -> "SQL Database" [label = "ファイル情報の登録"];
"REST API" <-- "SQL Database" [label = ""];
"Gateway" <-- "REST API" [label = "SAS付きURL"];

"Gateway" -> "BLOB Storage" [label = "ファイルアップロード(1/n)"];
"Gateway" <-- "BLOB Storage" [label = ""];
"Gateway" -> "BLOB Storage" [label = "ファイルアップロード(2/n)"];
"Gateway" <-- "BLOB Storage" [label = ""];
"Gateway" -> "BLOB Storage" [label = "ファイルアップロード(n/n)"];
"Gateway" <-- "BLOB Storage" [label = ""];

"Gateway" -> "REST API" [label = "ファイルアップロード完了報告"];
"REST API" -> "SQL Database" [label = "ステータス変更"];
"REST API" <-- "SQL Database" [label = ""];
"Gateway" <-- "REST API" [label = ""];

}

sasurl.png

※このシーケンス図の具体的な説明は別の記事で。