Javaなしで安全に使える
PlantUMLビューア「pumlv」

Go Connect #15

Rinrin — @rin2yh

#goconnect

自己紹介

名前 Rinrin
職種 フルスタックエンジニア
趣味 アニメ、ゲーム、キーボード
Go歴 2年くらい。趣味で使うことが多い(OSS, TinyGo)
ひとこと 生産者はchiroさん。Java嫌いではありません(大事!)
#goconnect

目次

  1. 前提
  2. プロダクト紹介
  3. 仕組み〜Goの用途〜
  4. まとめ
#goconnect

SECTION 01

前提

#goconnect

PlantUMLとMermaidの違い

項目 PlantUML Mermaid
実行環境 Java JavaScript
サポートする図の種類 豊富 そこそこ
レイアウトの自由度 低(ほぼ自動)
Markdown連携の容易さ
#goconnect

PlantUMLとMermaid、実際の図


PlantUML


Mermaid

同じクラス図でも、PlantUMLは配置や線種を指定して整理できる(Mermaidは自動レイアウト任せ)

#goconnect

業務での課題感

  • PJTではPlantUMLからデータモデルのコード生成をしていた
    • データモデルを変更するコードを書く必要が発生した
  • プラグイン各種でJavaのインストールを要求される(!?)
    • PJTはTSのみで、Javaは使わない
  • PlantUMLのオンラインエディタもあったが...
    • 外部のサーバに情報を送信し、その結果で描画する仕組み
    • クライアントワークなので、そんなリスク踏めない...

→Javaがいらないビューアを作ろう!!

#goconnect

SECTION 02

プロダクト紹介

#goconnect

Java不要で安全なPlantUMLビューア「pumlv」

特徴

  1. Java不要: PlantUML公式のJavaScript版をブラウザで動かすため、Javaランタイム不要
  2. 安全:レンダリングはすべてブラウザ側で行い、外部送信0
  3. 単一バイナリで完結: GitHub Releasesまたはmiseから取得した1ファイルだけで起動できる
#goconnect

構成

  • Go側: ファイルの監視、ローカルHTTPサーバ、SSE配信、フロントエンド資産の同梱
  • ブラウザ側: SPAが変更通知を受け取り、plantuml.js(TeaVM)がその場でSVGを生成
  • 描画がブラウザ内で完結するので、Javaランタイムも外部サーバも不要

k1LoW/mo (マークダウンビューア)のフロントエンドをGoに埋め込む発想に感動し、大いに影響を受けた

#goconnect

使い方

# カレントディレクトリ以下のpumlファイルを監視し、ビューアをWebブラウザで開く
pumlv .

# 1ファイルの場合
pumlv ./design/seq.puml

# 引数を複数与えることも可
pumlv ./docs ./design/seq.puml
#goconnect

既存のツールとの比較

ツール Java 外部送信 エディタ依存
PlantUML(VSCode拡張) 必要 なし VSCode
nvim-plantuml 必要 なし Neovim
PlantUML Web Server 不要 あり なし
pumlv 不要 なし なし
#goconnect

SECTION 03

仕組み〜Goをどこで使っているか〜

#goconnect

構成(再掲)

赤枠がGoを使用している箇所(=バイナリ)

#goconnect

シーケンス①:起動時

#goconnect

シーケンス②:ファイルを保存したとき

#goconnect

ライブラリ

ライブラリ 役割
spf13/cobra CLI
fsnotify/fsnotify ファイル監視。OSごとの通知APIの差を吸収
k1LoW/donegroup graceful shutdown
pkg/browser 起動時にデフォルトブラウザを開く
muesli/termenv ログの色付け
標準ライブラリ net/http(サーバ+SSE)、embed(フロントエンドの同梱)
#goconnect

開発・リリースを支えるGo製のツール

ツール 用途
k1LoW/octocov カバレッジ計測とPRコメント
Songmu/gocredits 依存ライブラリのライセンスをCREDITSにまとめる
Songmu/tagpr mainにマージするとリリース用のドラフトPRを作成or更新する
goreleaser 3OS × 2CPUアーキテクチャのバイナリをビルドしてGitHub Releasesへ
#goconnect

SECTION 04

まとめ

#goconnect

まとめ

Javaいらずで安心安全なPlantUMLビューアの開発でGoが大活躍!!

  • Javaいらず: JS版のPlantUMLをgo:embedで同梱し、単一バイナリに
  • 安心安全: Goのサーバでローカル完結
  • CI/CD:Go製OSSでカバレッジやリリースまで実施
#goconnect

ご清聴いただき、
ありがとうございました

Rinrin — @rin2yh

pumlv — https://github.com/rin2yh/pumlv
zenn - リリース記事

#goconnect

参考文献

#goconnect

補足: なぜGitHubでPlantUMLが選ばれなかったのか(推測)

plantuml.jsリリースされておらず、Webブラウザとの相性が微妙だったから

  • PlantUMLの方が表現力は優れていて、長く使われてきた歴史もあった
  • しかし、JS版のリリースはGitHubが選定する時には存在しなかった
  • Mermaidの人気が出始めていたのも影響しているかも
#goconnect