judeの最近のブログ記事

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



失敗のないファンクションポイント法
受託開発の見積りをすることがある。

このフェーズにおいてもJUDEを利用しています。
以前はモデリングはともかく数字の部分が「KKD(経験・勘・度胸)」だったのだけど、ここ二年ぐらいはファンクションポイントによる見積りにチャレンジしているのです。
※機能規模と関連の薄い部分(導入とか利用者トレーニングとかバッファ)は相変わらずKKDだけど。

  • ヒアリングしたメモをマインドマップにざらーっと書き出しつつ、思いついたことをちょいちょい書き足す
  • マインドマップを見返しながらアクターとユースケースを並べる
  • ざーっとエンティティを見出す
  • CRUDを埋める
  • FP計数
という感じで。

かなり詳細にシステム像をイメージしないと数字が出せないのが難点といえば難点だけど、どんなものを作るかわからないのに見積り数字が出るってのも変といえば変。
それに計数を重ね記録することで、(組織/チームとしての)生産性が見えることがわかったのは収穫だったと思う。

で、

せっかくJUDEでモデリングしているのだから、これを活かしてFP計数が出来ればなお効率もいいだろう、という話し。
すでにやっておられる方がいるので今更感はあったのだけど、これも理解を深めるため&自分都合の使い易さのためということで。

judeユーティリティ

■実行環境
 OS: CentOS 5.2 i386
   libxml2: 2.6.26-2.1.2.6
   ruby: 1.8.5-5.el5_2.3
     rubygems: 1.2.0
     libxml-ruby: 0.8.3 (gem)
   JRE: Sun Java 1.6.0_07
     jruby: 1.1.4
     JUDE-Pro: 5.4

※注意:プログラムの実行結果について作者はなんら責任を持ちませんので悪しからず。

このFP計数ユーティリティにおける前提条件は以下のとおり。
  • データファンクション(以下DF):
    • JUDEモデルでいうと以下のいずれかで、属性が1つ以上あるものをDFとみなす。
       <<entity>>なclass
       ERエンティティ
  • DFのファイルタイプ(ILF/EIF):
    • CRUD図で当該エンティティに対する操作の有無で判断、または手動付与
       Rのみのエンティティ→EIF扱い
       CUDのいずれかが設定されているエンティティ→ILF扱い
  • DFのDET:
    • 非PKな属性の数をDETとみなす
    • JUDE APIを jrubyから使う その1 」で書いたようにIdentifierを使ったモデリングをするようにしているので、主キーにはユーザ識別可能なデータは出てこない、とみなしています
  • DFのRET:
    • 考えられるグループを@retアノテーションで列挙する。列挙された@retアノテーションの数をRETとする。
    • ここでのアノテーションとはjavaのアレではなく、JUDEにタグ付き値がなかったころに独自データを付与するため作ったオレオレ表記。
      モデルの定義中の「@アノテーション名(空白)値」という記述部分を抜き出してデータとします。
    • とあるエンティティが「xxx種別」の値で意味合いを制御するようなモデリングの場合に、
       @ret xxx種別が講師の場合
       @ret xxx種別が講師以外の場合
      のようにエンティティの定義に記述することでRET=2と計数します
  • トランザクショナルファンクション(以下TF)は、JUDEモデルでいうとユースケース1つに対応するものとします。
  • TFのファイルタイプ(EI/EO/EQ):
    • TFのCRUD操作から判断させるか手動で付与します
      • RのみのTF→EO
        CUDあり→EI
      • ユースケースに対して@tfアノテーションで明示指定
         @tf eo
         @tf ei
         @tf eq
    • 結果的にCRUDからはEQが出てこないのだけども、全く加工のない操作って少ないのではないかと考えたから
  • TFのFTR:
    • 当該ユースケースのCRUDで操作対象となっているエンティティの個数をFTRとします
  • TFのDET:
    • ここはまだ方式を確立しかねている
    • 現状は、当該TF(ユースケース)の直下に「FP-」で始まる名前のシーケンス図を書き、アクターが発するメッセージから計数することにしています
      例:「FP-社員情報を登録する」みたいな感じで。
    • DET=メッセージ(=トリガ)+操作の引数の個数+返り値の個数
      • 「操作」に対して返り値は1つしか指定できないので、返り値にclassを指定した場合はその属性の数を返り値の個数とします
      • あるいは、返り値ではなく「操作」の「out」パラメータとして記述します

FP計数周辺に絞った手順

1. モデリング
  • ユースケースをモデリング
    • TFのDET計数用シーケンス図作成
  • ERモデリング(クラス図でもよい)
  • CRUD表作成してユースケースとエンティティの操作を結びつける
2. 計数元ネタファイル作成
  • judeファイルからAPIを使ってFP計数に必要な情報を抽出→中間XMLファイル
    ※linuxの操作例
    % env CLASSPATH=./jude-pro.jar jruby ./jude_export.rb -o 出力中間.xml 入力.jude
    

  • 中間XMLファイルからFP計数→TSVファイルに出力
    ※linuxの操作例
    % ./calc_fp.rb -e cp932 -o 出力.txt 入力中間.xml
    

  • TSVファイルを雛形xlsに貼り付けて集計
    • TSVファイルをテキストエディタで開いてコピー&ペースト
    • アーカイブにFP-hinagata.xlsというxlsブックが入っています。TSV全体をコピペで[ファンクション]シートに貼り付けます
    • もし既存の表をはみ出たら適宜書式をコピーしておきます
3. FP計数
  • 一般システム特性記入
    • [一般システム特性]シートに数字を入れます
    • この辺が参考になります
  • 雛形xlsのピボットテーブル更新
    • [業務単位FP集計]シート
    • [FP概算法]シート
    • [FP試算法]シート
    • FP概算法、FP試算法についてはこの辺を参考にしました。
    • 個人的な感覚では試算法だと数字が離れるなーという印象。rapidに見積もる必要がある、あるいは画面項目を想定するほど情報が揃っていないときは概算法のほうがいいなという感触。


ファンクションポイント法自体については「失敗のないファンクションポイント法 」という本を参考にしています。
この本は項目説明が網羅されているだけでなく例示が勉強になります。300ページちょいの本ですが、約200ページを「計測実習」に割いており非常に具体的で参考になります。




JUDE 5.3には編集APIのサンプルとしてDBリバースのプログラムが付属しています。
サンプルといっても十分便利。DB接続可能なときはこれを利用している。


何かしらのシステムやアプリを引き継ぐと、DDLすら提示されず、「テーブル定義書」「テーブル設計書」といった名称のxlsブックだけ出てくる場合がある。困ったことによくある。
目視でぽちぽちjudeにエントリしてもいいのだけど、編集APIのプラクティスを兼ねてインポートツールを書いた。

要するにCSVで記述したERエンティティをjudeモデルとして一括登録、というもの。
※注意:judeファイルになんらか問題が発生しても責任を負いかねます。自己責任で。そしてバックアップ or リビジョン管理重要。

judeユーティリティ


  1. xlsからCSVを作成する
    • 記述例はアーカイブ同梱のsamp1.xlsを参照
    • 「テーブル定義書」のレイアウトは様々。それに合わせて以下のようなCSVファイルを出力するようマクロを調整のこと
      • 1CSVファイル=1エンティティ
      • 1行=1属性
    • CSVファイル内の最初の列が「#」で始まる行はメタ情報行
      • #@entity行
        • 1列目:エンティティの論理名
        • 2列目:エンティティの物理名
      • 次に#で始まる行は各列の値の意味を指定するヘッダ。認識するヘッダは以下の通り
        logicalname属性の論理名
        physicalname属性の物理名
        domain属性のドメイン(の論理名)
        更新対象judeファイル内に同名の論理名を持つドメインがない場合は作成される
        type属性のデータ型
        更新対象judeファイル内に同名のデータ型がない場合は作成される
        length属性の長さ
        nnNOT NULLかどうか
        非空文字ならNOT NULL指定
        default属性のデフォルト値
        pkPRIMARY KEY制約をつけるかどうか
        非空文字ならPRIMARY KEY指定
    • excelがインストールされたwindows上で同梱のmake_csv.jsマクロ実行し、全シートをCSV出力します
      • 出力ファイル名は"シート名.csv"になります。
        シートごとに別ファイルに出力されます

        > cscript.exe make_csv.js samp1.xls
    • 編集APIの仕様で以下の点に注意
      • 論理名のないエンティティは登録できない
      • 論理名のない属性は登録できない
      • 同じ論理名を持つエンティティが既に存在すると登録できない
      • データ型に英小文字を指定しても英大文字になる
        • GUIでは英小文字名称のデータ型を登録できるけど、編集APIでcreateすると大文字になる。
  2. 出来たCSVをjudeファイルにインポートする
    • 実行例

      $ env CLASSPATH=./jude-pro.jar jruby ./import_ermodel.rb --fs=, -o new.jude samp2.csv
      ※インポートのデフォルトのフィールド区切りは「HT」です。--fsでカンマを指定しています。
      ※jude-pro.jarがカレントにある前提
    • 存在しないjudeファイルを指定してもよいし、既存のjudeファイルを指定してもよいです。
      存在しないjudeファイルを指定するとjudeファイルが作成されます。
      新規judeファイルに出力しインポート後の内容を確認して問題なさそうならマージするという手順がいいと思う。
    • 本スクリプトは日本語環境で作成されたjudeファイルを前提としています。
      編集APIサンプルのように createERModel(project, "ER Model");でIERModelを作成すると、日本語環境GUIでマージできなかった。日本語環境GUIで作ったjudeファイルの場合、IERModelの名称が"ERモデル"(これはエクスポートするとわかる)となっていることに関係するのではないかと想像している。

■実行環境
 OS: CentOS 5.2 i386
   JRE: Sun Java 1.6.0_07
     jruby: 1.1.4
     JUDE-Pro: 5.3.0

モデル編集APIは、「図要素」を編集できるようになるとうれしい。図中のモデルの位置だとか大きさ。GUIの自動レイアウトがもうひとつだなぁと感じている。何かしらのレイアウトエンジンを使って独自の整列ができるようになったらかなり素敵だと思うんだけどな。


JUDEには無償のCommunity版と有償のProfessional版がある。
両者の違いは製品公式ページの機能比較表のとおり。
結構Community版使ってますみたいなエントリを見かけるんだけども、自分がPro版購入を決めたポイントを並べてみる。
※僕はチェンジビジョンの関係者ではありません。

  1. EMF出力できる
    • 特にコピー&ペーストでWord等office文書に貼り付けられるところがいい。
    • ビットマップでなくベクターグラフィックだから、拡大縮小しても印刷しても綺麗。貼り付け先文書内で好きな大きさにできる。
  2. ステレオタイプのアイコンを指定できる
    • 機能比較表ではさらっと書いてあるけど、これはかなりうれしい。
    • boundary(メロンが横になった記号)やactor(棒人間)に帳票や人を示すビットマップを指定すると「普通の人」も見る気になってくれる
      icon.png
    • オブジェクトごとにUML表記/アイコン表記を切り替えられるので、読み手に合わせた作図をしつつ、情報量はキープみたいな使い方。
  3. モデルから関連する図へジャンプできる
    • これ
    • このモデルが使われているあの図はどこだっけ・・、とモデル基点で図を逆引きできるのは地味に便利。
  4. CRUDマトリクスを書ける
    • ファンクションポイント法による見積りのソースに使えてうれしい
    • Com版とPro版の違い、とは関係ないが、CRUDの軸に指定したユースケース図にユースケースを足したとき、ER図にモデルを足したときに、CRUD表の当該モデルに対する行/列が自動で追加されるのは本当にうれしい機能だ。
  5. 別名をつけられる
    • クラスの名前や属性の名前など、日本語表記と英語表記を付けることが出来る。
    • モデリングは日本語で行い、SQL出力など英語表記にしたい部分だけ英語、という使い分けができて助かる
  6. APIの違い
    • ER図(系のモデル)、CRUDの情報を取れるのはかなりのアドバンテージ
  7. プロジェクトをマージできる
    • judeを2つ起動して、片方のjudeからもう片方にコピー&ペースト、ということが「出来ない」ので、その代わりとして使えるから。

ちょっとした違いかもしれないけど、普段の業務でしみじみ便利だなーと思う瞬間。
こういう違いを知らずにCommunity版を使ってる人がいたらちょっともったいないな、と思ったので書いてみた。


楽々ERDレッスン (CodeZine BOOKS)
モデリングツールにJUDEを利用している。

このツールを選んだポイントの1つはjavaを使ったAPIがあること。
5.3になって、モデル編集のAPIも追加された。

で、テーブル設計。

過去に「楽々ERDレッスン (CodeZine BOOKS) 」を読み、「Identifier」の有用さに心打たれて以来、いつもID列を設けるようにしている。

要求・要望・要件の断片からざっとエンティティを見出し、ID属性を付与、リレーションを付けて多重度を設定して・・・という手順でやっているのだけど、エンティティの数が多いと、ID属性を追加するのも結構手間。。。。

ということで、モデル編集APIを扱うプラクティスも兼ねて、JUDEプロジェクト内のERエンティティにID属性を追加するスクリプトを書いてみた。

judeユーティリティ

ちょこちょことスクリプトを書くときは、screen+viな環境でやると調子がいい(僕は)。なので、linux上でしか確認してない。

■実行環境
 OS: CentOS 5.2 i386
   JRE: Sun Java 1.6.0_05
     jruby: 1.1.3
     JUDE-Pro: 5.3.0

■実行例

アーカイブを展開し、jude-pro.jarを展開先ディレクトリに置いてある前提。

○ERエンティティ、「ID」という論理名でSMALLINT型の属性を追加する

% env CLASSPATH=./jude-pro.jar jruby add_identifier.rb --attr-name=ID --datatype=SMALLINT judeファイルのパス

○ERエンティティに、「ID」という名前・INT型のERドメインで、「ID」という論理名の属性を追加する

% env CLASSPATH=./jude-pro.jar jruby add_identifier.rb --attr-name=ID --domain=ID judeファイルのパス

○ERエンティティに、「ID」という名前・SMALLINT型のERドメインで、「エンティティ論理名_ID」という論理名の属性を追加する

% env CLASSPATH=./jude-pro.jar jruby add_identifier.rb --attr-name=%e_ID --domain=ID --domain-datatype=SMALLINT judeファイルのパス
指定したデータ型、ドメインが存在しない場合は作成します。
作成された属性にはPK指定が付きます

■注意
  • READMEにも書いてありますが無保証です
  • judeファイルを書き換えますので、バックアップ必須です。ファイルが壊れても責任持てません。
  • (JUDEの機能による)ロックがかかりますので、更新対象JUDEファイルをGUIで編集していない状態で実行します
  • 既に主キーがついているエンティティには属性追加しません。
  • 唯一の主キーが作成しようとしてる属性論理名が同じ場合はデータ型/ドメインを更新します
  • 既にERモデルが作成されているJUDEファイル前提です。日本語環境以外で作成されたものがどうなるかは不明です。



まだベータだけど。いつリリースかなー。

CRUDの改善
    • モデル軸にクラス図を選択可能にしました。
https://jude.change-vision.com/jude-web/notes/ReleaseNote-JUDE-Professional-flame.html から

自作の見積もりツールで、ユースケースとクラス図中のentityの利用関係を取得したくて、手作業でUMLモデル→ERモデル変換するという使用方法だったのだけど、これで素直にUMLモデルが使える。

JudeのERモデルにはちょっと後付け感を感じる。構造ツリー上も「別居」しているから、ユースケースとの結びつきをイメージしにくくてヤだなあと思っていたのだ。

>>サイトトップへ

address

このアーカイブについて

このページには、過去に書かれたブログ記事のうちjudeカテゴリに属しているものが含まれています。

前のカテゴリはjscriptです。

次のカテゴリはlinuxです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.261