2.12. PlantUML online serverの利用#

PlantUMLのwebサイトのドキュメントwebページには、PlantUMLを入力して、 その結果を確認するための編集画面が用意されています。 画面左サイドのバーで「Online Server」 をクリックすることで、編集画面が開きます。

編集エリアの入力を編集すると、処理された画像が表示されます。入力にエラーがある場合も エラーの内容を表示する画像が表示されます。「PNG」,「SVG」, 「ASCII Art」のボタンをおすことで、 それぞれのファイル形式の画像が作成されます。

編集エリアの下に、//www.plantuml.com/plantuml/png/SoWkIImgAStDuNBAJrBGjLDmpCbCJbMmKiX8pSd9vt98pKi1IW80 という謎の文字列が表示されますが、これは編集画面の入力をPlantUMLの独自の方法でエンコードした文字列になっています。 このURLに https: を追加してリクエストを送信すれば、画像データが送り返されるという仕組みになっています。

この文字列は生成された画像にもメタデータとして含まれているようです。(ということは、作成した画像から容易に テキストデータが復元できるということなので、機密の情報がふくまれている場合にはご注意ください)

2.12.1. python plantuml モジュール#

さて、エンコードされたPlantUMLのコードがあれば、直接PlantUML online serverから望む図版の画像が入手できることがわかりました。 pythonの plantuml モジュールはそのための機能(deflate_and_encode())を提供しています。

print(uml)

@startuml
scale 4.0
Bob -> Alice : hello
@enduml

print(plantuml.deflate_and_encode(uml))
ut8eBaaiAYdDpU4gJaxCILKmqJFWSifFKj2rKt3CoKnELR1Io4ZDoSddSaZDIm4f0m0=

お手元のwebブラウザで https://www.plantuml.com/plantuml/png/ut8eBaaiAYdDpU4gJaxCILKmqJFWSifFKj2rKt3CoKnELR1Io4ZDoSddSaZDIm4f0m0= を開いてみましょう。このURLの "png"を"svg"に変更すれば、svg形式の画像ファイルが送られてきます。

2.12.2. PlantUML Pico サーバー#

PlantUMLは便利ですが、機密にしておきたい情報があるようなダイアグラムは外部のサーバーに頼ることはできません。

幸い、javaのPlantUMLブログラムには、Pico サーバーと呼ぶエンコードされたPlantUMLのソースコードから画像データを 返すwebサーバーが内臓されています。 Picoサーバを立ち上げるは "-picoweb"オプションで使用するポートとネットワークインタフェースを 指定して、PlantUML Java プログラムを起動します。

java -jar /opt/src/plantUML/plantuml-1.2024.5.jar -picoweb:8080:127.0.0.1

scale 4.0
Bob -> Alice : hello

図 2.60 sphinxcontrib-plantumlを使って作成した図 (scale 2.0)#

http://localhsot:8080/plantuml/png/SoWkIImgAStDuNBAJrBGjLDmpCbCJbMmKiX8pSd9vt98pKi1IW80

png/svg/txt を指定可能。URLの最後はPlantUMLの記述を独自のエンコーディングでエンコードしたもの(base64ではない)

PlantUML テキスト エンコード

この結果を得るには次の処理を行います: #. テキストをUTF-8でエンコードします。 #. DeflateまたはBrotliアルゴリズムで圧縮します。 #. Base64に類似したアルゴリズムを使って、ASCIIに再エンコーディングします。

Base64ではない理由

大きな理由は歴史的なものです。このフォーマットは最初、公開を目的としていませんでした。これを変更するのは今となっては遅すぎます。しかし、その差異は、使用する文字の順番のみです。 Base64は0~63の値を、次の配列に対応させます:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

PlantUMLでは、0~63の値を、次の配列に対応させます:

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_

とあります。

plantuml を使って、

server=plantuml.PlantUML("http://localhost:8080/plantuml/svg/")
uml='@startuml\nBob -> Alice : hello\n@enduml'
server.get_url(uml)

を実行することでUMLをエンコードしたURLの文字列

を得ます(plantuml.deflate_and_encode(uml) でエンコードされたPUMLコードを取得することも可能)。 これを PlantUML picoServeに送信することで、

http://localhost:8080/plantuml/svg/SoWkIImgAStDuNBAJrBGjLDmpCbCJbMmKiX8pSd9vt98pKi1IW80

図 2.61 plantUML picoserveとpython planumlモジュールを使って作成。#

を得ます。(SVGなので、PNGに比べ文字などが拡大してもクッキリしています)

http://localhost:8080/plantuml/png/SoWkIImgAStDuNBAJrBGjLDmpCbCJbMmKiX8pSd9vt98pKi1IW80

図 2.62 plantUML picoserveとpython planumlモジュールを使って作成。(PNG)#