uc.png

UMLその他モデルの作図にJudeを愛用している。
・・・というかastah*か。

astah*で書いた図を、emfで(拡大縮小しても綺麗だから)ワードに張り付けるなどしているが、redmineのwikiに埋め込めるといいのにな~と思っていた。
もちろん画像で出力してからアップロードすることはできるが面倒。
せっかくリポジトリにastahのファイルを保管しているのだから、最新の図をwikiに自動反映できたら便利そう。

最近知ったのだけど、PlantUMLというのがあって、一定の記法で書いたUMLを画像にしてくれるOSSがあるそうだ。じゃあ、astah APIでモデルの情報を抜き出してPlantUML記法で吐きだしたらどうか?と一瞬考えたものの、レンダリング結果がastah上の図とはかなり変わってしまうし、APIで取得できない情報が多数あるのでそもそも再現度が低い。

やはり図の出力はastah*に任せたい。

jude時代から、コマンドラインで図出力を実行することができるので、これを呼び出したらいいだろう。
※細かいことは、インストール先のCommandRunner.htmlに書いてある。

自分ところで使っているredmineはどれもlinux上で動いているので、できればlinuxサーバで完結させたい。ということでまずは「linux上でコマンドラインで図出力」する手順を検討した。

ポイントは以下のとおり。
  • コマンドライン図出力を実行するには、DISPLAY(Xサーバ)が必要。
    • APIの場合はXサーバなしでも動くけど、図出力はdisplayが初期化できないと先に進まない。
    • 図出力用のディスプレイという位置づけで、vncserverを使うことにした。
  • astahライセンスをセットアップする必要がある

1. ディスプレイを用意

  • 図出力を実行するユーザ向けにvncserverのディスプレイを作る。
  • CentOSの場合、yumリポジトリにvnc-serverがあるのでこれをインストール。
  • 実行ユーザで一回vncserverを起動しておく。
    • 各種ファイルのひな型が作成されるのと、vncserverのパスワード設定を一度に出来るから。
      % vncserver

      You will require a password to access your desktops.

      Password:
      Verify:

      New 'somehost:1 (someuser)' desktop is host:1

      Creating default startup script /home/someuser/.vnc/xstartup
      Starting applications specified in /home/someuser/.vnc/xstartup
      Log file is /home/someuser/.vnc/somehost:1.log
  • 上で起動したvncserverはkillしちゃう。
    で、ひな型をちょこっと編集。CentOSの場合、xstartupは以下の内容になっていた。
    twmが動いていると、Xクライアントがウィンドウを作成するときに出現位置をユーザ操作で指定する流れになるので、図出力の自動化においては邪魔になってしまう。ので、twmの行を削除した。xtermも特に必要ないので削除。
    #!/bin/sh

    # Uncomment the following two lines for normal desktop:
    # unset SESSION_MANAGER
    # exec /etc/X11/xinit/xinitrc

    [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
    [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
    xsetroot -solid grey
    vncconfig -iconic &
    #xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
    #twm &
  • システム起動時の自動起動を考慮して/etc/sysconfig/vncserverに設定
    図出力を実行するユーザに合わせて編集。とりあえずディスプレイ番号は2のままにした。ジオメトリはもっと小さくてもいいはず。
    VNCSERVERS="2:someuser"
    VNCSERVERARGS[2]="-geometry 800x600 -nohttpd -localhost"
  • rootでrcスクリプトから起動
    # /etc/init.d/vncserver start
2. astah*を用意

  • astah*のダウンロードサイトからzipを入手。「JREなし、インストーラなしのアーカイブ」と書かれているもの。
  • 適当な場所にunzipする。
  • 同梱されているastah-command.shは後半がちょいおかしい(pro 6.1.1)ので、ちびっと修正して、とりあえず同じディレクトリに「run.sh」という名前で保存した。実行権限を忘れない。
    #!/bin/sh

    ASTAH_HOME=`cd \`dirname $0\` && pwd`

    INITIAL_HEAP_SIZE=64m
    MAXIMUM_HEAP_SIZE=1024m
    STACK_SIZE=3m

    JAVA_OPTS="-Xms$INITIAL_HEAP_SIZE -Xmx$MAXIMUM_HEAP_SIZE -Xss$STACK_SIZE"

    java $JAVA_OPTS -cp "$ASTAH_HOME/astah-pro.jar" com.change_vision.jude.cmdline.JudeCommandRunner $*

  • ライセンスを配置。
    自分ところはJUDEのユーザライセンスがサポート時効前なのでJUDEのライセンスで。
    $HOME/.astah/professional/JUDE_License_User_Professional.xml
3. 実行

  • path上にjavaコマンドがあることを確認。なければ適宜pathを通す。
  • 環境変数DISPLAYにvncserverを指定。
    自分はtcshスキーなので以下の通りだが、他のシェルの場合は適宜
    % setenv DISPLAY 127.0.0.1:2
  • 実行
    % /path/to/astah/run.sh -image all -f /path/to/some.asta -o /path/to/dir 

おわり

  • で、出力されたのが冒頭のpng画像。
  • Windowsで出力したときとフォントが異なるので、見た目の違いはあるけど、元の図がキープされていることに意義はありそう。
  • 元の図が大きくなりがちなので、wikiに張り付けるのに向かないケースも多そう。
  • 図出力にはかなり時間がかかる&出力したい図を指定できない(種類は指定出来る)ので、運用上はcronで出力しておいてどーこーみたいな仕組みも必要っぽい。
  • wikiマクロ的には、.astaファイルと図のpath(名前空間+名前)を指定する感じか。


環境:
  Windows 7 Ultimate x64
    JRE6 x86
      astah* professional 6.1.1
  CentOS 5.4 x64
    vnc-server-4.1.2-14.el5_3.1
    JRE6 x64
      astah* professional 6.1.1