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
http://localhsot:8080/plantuml/png/SoWkIImgAStDuNBAJrBGjLDmpCbCJbMmKiX8pSd9vt98pKi1IW80
png/svg/txt を指定可能。URLの最後はPlantUMLの記述を独自のエンコーディングでエンコードしたもの(base64ではない)
この結果を得るには次の処理を行います: #. テキストを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に送信することで、
を得ます。(SVGなので、PNGに比べ文字などが拡大してもクッキリしています)