PlantUMLとAtomを組み合わせる方法

PlantUML を使うとき、Atom と組み合わせると、とても便利だったので、メモ。

# 前提
- macOS Mojave
  - 10.14.4
- Homebrew
  - 2.1.1
- Java
  - OpenJDK 11.0.1
- Atom
  - 1.34.0

# インストールするもの
- PlantUML
- Atom パッケージ
  - [language-plantuml](https://atom.io/packages/language-plantuml)
  - [plantuml-preview](https://atom.io/packages/plantuml-preview)

なお、よく紹介されている [plantuml-viewer](https://atom.io/packages/plantuml-viewer) はエラーが出て、正常に動作しませんでした。[^1]

[^1]: Java のバージョンを 8 にすれば正常に動作するとかいう記事も見かけたけど、そこまでして使おうとは思わなかった。

# 手順
## Java
お好みの方法でインストールしてください。

## Atom
お好みの方法で（以下省略）

## PlantUML
Homebrew で PlantUML をインストールします。

```shell
$ brew install plantuml
```

シーケンス図とアクティビティ図以外も作成したい場合は `graphviz` が必要です。
ただし、Homebrew は `plantuml` をインストールすると、自動的に `graphviz` もインストールしてくれます。

```
==> Installing dependencies for plantuml: libpng, freetype, fontconfig, libtiff, webp, gd, pcre, readline, sqlite, python, glib, jasper, netpbm, gts and graphviz
```

`plantuml -version` でインストールに成功したかを確認することができます。[^2]

[^2]: ローカルホスト名（*.local）はアスタリスクで隠しました。

```shell
$ plantuml -version
PlantUML version 1.2019.05 (Sun Apr 21 01:45:36 JST 2019)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Java Version: 11.0.1+13
Operating System: Mac OS X
OS Version: 10.14.4
Default Encoding: UTF-8
Language: ja
Country: JP
Machine: ***************.local
PLANTUML_LIMIT_SIZE: 4096
Processors: 4
Max Memory: 2,147,483,648
Total Memory: 134,217,728
Free Memory: 127,336,976
Used Memory: 6,880,752
Thread Active Count: 1

The environment variable GRAPHVIZ_DOT has been set to /usr/local/opt/graphviz/bin/dot
Dot executable is /usr/local/opt/graphviz/bin/dot
Dot version: dot - graphviz version 2.40.1 (20161225.0304)
Installation seems OK. File generation OK
```

## language-plantuml
Atom は PlantUML ファイルを構文強調してくれません。
**Preferences -> Install** から [language-plantuml](https://atom.io/packages/language-plantuml) を検索して、インストールします。

インストール後は、とくに設定する必要なく、構文強調されるようになります。

## plantuml-preview
PlantUML ファイルをすぐにプレビューできるようにします。

**Preferences -> Install** から [plantuml-preview](https://atom.io/packages/plantuml-preview) を検索して、インストールします。 

インストール後、**Preferences -> Packages** から **plantuml-preview** を検索して、以下の項目を設定します。

- **Graphvis Dot Executable**
  - `/usr/local/opt/graphviz/bin/dot`
      - `plantuml -version` の実行結果の中にも記載されています。

- **PlantUML Jar**
  - `/usr/local/Cellar/plantuml/1.2019.5/libexec/plantuml.jar`
      - インストールした PlantUML のバージョンによってパスが変わります。
      - `find / -name "plantuml.jar" 2>/dev/null` で検索するのがオススメ。

# 使い方
- Atom で PlantUML ファイルを作成します。
- メニューの **Packages -> PlantUML Preview -> Toggle** をクリックします。
- プレビューが開きます。
- ファイルを保存するたびに自動的に再描画してくれます。
  - **ファイルを保存しないと再描画してくれないので注意**

## キーバインド
plantuml-preview では、デフォルトで以下のキーを使うことができます。

| キー | 動作 |
| ---- | ---- |
| ctrl + alt + p | プレビューの表示／非表示を切り替える |
| cmd + +	| 拡大する |
| cmd + =	| 拡大する |
| cmd + _	| 縮小する |
| cmd + -	| 縮小する |
| cmd + 0	| 縮尺をリセットする |
| cmd + 9 | 縮尺をプレビュー画面に合わせる |

## PNGファイルの解像度
SVG で出力したらキレイなのに PNG で出力したら汚く見える場合は、PNG ファイルの解像度が低い可能性があります。
PlantUML ファイルで `skinparam dpi 300` のように設定すると、解像度を大きくすることができます。

## サンプル
例えば、以下のような適当なコードの場合。[^3]

[^3]: PHP 公式マニュアルの [抽象クラス](https://www.php.net/manual/ja/language.oop5.abstract.php) に手を加えました。

```
@startuml

'解像度設定
skinparam dpi 300

abstract class AbstractClass {
  # {abstract}getValue()
  # {abstract}prefixValue()
  + printOut()
}

interface Writable {
  + {abstract}write()
}

class ConcreteClass1 {
  # getValue()
  # prefixValue($prefix)
  + setValue($value)
  - $value
}

class ConcreteClass2 {
  # getValue()
  # prefixValue($prefix)
  + write()
}

AbstractClass <|-- ConcreteClass1
AbstractClass <|-- ConcreteClass2
Writable      <|-- ConcreteClass2

@enduml
```

プレビューすると、以下のように表示されます。

<img width="1182" alt="スクリーンショット 2019-05-02 19.16.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141299/a72a6e57-f344-84e1-b540-ebf68a6cd35b.png">


# 参考
- [PlantUMLを使ったUMLの描き方](http://plantuml.com/ja/guide)
  - 公式リファレンス
- [PlantUML Cheat Sheet](https://qiita.com/ogomr/items/0b5c4de7f38fd1482a48)
  - PlantUML の書き方
- [Atomでplant-viewerが動かないから、代わりにplantuml-previewを使う(mac)](https://qiita.com/guitar_char/items/34fc60f02e72070ec8fb)
  - plantuml-preview について
- [真面目に PlantUML (1) : PlantUML のインストール](https://text.baldanders.info/remark/2018/12/plantuml-1/)
  - PlantUML で PNG ファイルの解像度を設定する方法について