« 2011年12月 | トップページ | 2012年2月 »

2012年1月

2012年1月30日 (月)

リファクタリングと環境整備(4)

OpenDolphin 実行

取り込んだ OpenDolphin-1.3.0.7 を実行してみる。
  1. OpenDolphin-EA-1.3.0.7 を右クリック → 「配備」すると,JBoss Application Server が立ち上がり,出力画面にコンソールが出力されていく。この時,OpenDolphin-EA-1.3.0.7 と jboss-ds.xml が自動的に jboss-5.1.0.GA/server/default/deploy フォルダにコピーされてデプロイされる。
  2. ちなみに,間違って OpenDolphin-EJB の方を配備してしまうと,deploy フォルダに jar ファイルが配置されてしまい,Exception が出まくる。これをしてしまった場合は,deploy フォルダから OpenDolphin-EJB-1.3.0.7.jar を手動で削除する必要がある。
  3. JBoss AS が立ち上がったら,OpenDolphin-1.3.0.7 の open.dolphin.master パッケージに入っている profiel.txt を開いて編集する。サーバは localhost のままで。
  4. 同じパッケージの InitDatabase を選択して右クリック,「ファイルを実行する」で実行する。以下の様なメッセージが出て,データベースが初期化される。
    key=host.address  value=localhost
    key=facility.name  value=シルククリニック
    key=facility.zipcode  value=231-0023
    key=facility.address  value=横浜市中区山下町1番地
    key=facility.telephone  value=045-681-5251
    key=facility.url  value=http://www.hospital.jp
    key=admin.login.id  value=admin
    key=admin.login.password  value=admin
    key=admin.sir.name  value=オープン
    key=admin.given.name  value=ドルフィン
    key=admin.email  value=admin@hospital.jp
    0 [main] INFO open.dolphin.master.InitDatabase  - 管理者情報ファイルを読み込みました。
    62 [main] DEBUG org.jnp.interfaces.TimedSocketFactory  - createSocket, hostAddr: localhost/127.0.0.1, port: 1099, localAddr: null, localPort: 0, timeout: 0
    282 [main] DEBUG org.jboss.ejb3.proxy.impl.objectfactory.ProxyObjectFactory  - org.jboss.ejb3.proxy.impl.objectfactory.ProxyObjectFactory servicing request for openDolphin/RemoteSystemService
    352 [main] DEBUG org.jboss.remoting.transport.socket.MicroSocketClientInvoker  - SocketClientInvoker[353c375, socket://127.0.0.1:3873] constructed
    352 [main] DEBUG org.jboss.remoting.MicroRemoteClientInvoker  - SocketClientInvoker[353c375, socket://127.0.0.1:3873] connecting
    352 [main] DEBUG org.jboss.remoting.transport.socket.MicroSocketClientInvoker  - Creating semaphore with size 50
    353 [main] DEBUG org.jboss.remoting.MicroRemoteClientInvoker  - SocketClientInvoker[353c375, socket://127.0.0.1:3873] connected
    505 [main] DEBUG org.jboss.remoting.InvokerRegistry  - removed SocketClientInvoker[353c375, socket://127.0.0.1:3873] from registry
    505 [main] DEBUG org.jboss.remoting.transport.socket.MicroSocketClientInvoker  - SocketClientInvoker[353c375, socket://127.0.0.1:3873] disconnecting ...
    506 [main] DEBUG org.jboss.ejb3.proxy.impl.objectfactory.session.SessionProxyObjectFactory  - Created Proxy of type $Proxy1 for EJB3 Business Interface: open.dolphin.ejb.RemoteSystemService
    508 [main] INFO open.dolphin.master.InitDatabase  - Host Service を取得しました。
    514 [main] DEBUG org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase  - Couldn't handle invocation directly within org.jboss.ejb3.proxy.impl.handler.session.SessionRemoteProxyInvocationHandler@5eb7ec5d: Current invocation "public abstract void open.dolphin.ejb.RemoteSystemService.addFacilityAdmin(open.dolphin.infomodel.UserModel)" is not eligible for direct handling by org.jboss.ejb3.proxy.impl.handler.session.SessionRemoteProxyInvocationHandler@5eb7ec5d
    518 [main] DEBUG org.jboss.ejb3.proxy.impl.invocation.InvokableContextStatefulRemoteProxyInvocationHack  - Received invocation request to method open.dolphin.ejb.RemoteSystemService: open.dolphin.ejb.RemoteSystemService.addFacilityAdmin(open.dolphin.infomodel.UserModel); using hash: -5161330131342058877
    525 [main] DEBUG org.jboss.security.SecurityAssociation  - Using ThreadLocal: false
    539 [main] DEBUG org.jboss.remoting.transport.socket.MicroSocketClientInvoker  - SocketClientInvoker[dcb52ae, socket://127.0.0.1:3873] constructed
    539 [main] DEBUG org.jboss.remoting.MicroRemoteClientInvoker  - SocketClientInvoker[dcb52ae, socket://127.0.0.1:3873] connecting
    539 [main] DEBUG org.jboss.remoting.transport.socket.MicroSocketClientInvoker  - Creating semaphore with size 50
    539 [main] DEBUG org.jboss.remoting.MicroRemoteClientInvoker  - SocketClientInvoker[dcb52ae, socket://127.0.0.1:3873] connected
    1056 [main] DEBUG org.jboss.remoting.InvokerRegistry  - removed SocketClientInvoker[dcb52ae, socket://127.0.0.1:3873] from registry
    1056 [main] DEBUG org.jboss.remoting.transport.socket.MicroSocketClientInvoker  - SocketClientInvoker[dcb52ae, socket://127.0.0.1:3873] disconnecting ...
    1056 [main] INFO open.dolphin.master.InitDatabase  - 管理者を登録しました。
    1062 [main] DEBUG org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase  - Couldn't handle invocation directly within org.jboss.ejb3.proxy.impl.handler.session.SessionRemoteProxyInvocationHandler@5eb7ec5d: Current invocation "public abstract void open.dolphin.ejb.RemoteSystemService.putRadMethodMaster(java.util.Collection)" is not eligible for direct handling by org.jboss.ejb3.proxy.impl.handler.session.SessionRemoteProxyInvocationHandler@5eb7ec5d
    1062 [main] DEBUG org.jboss.ejb3.proxy.impl.invocation.InvokableContextStatefulRemoteProxyInvocationHack  - Received invocation request to method open.dolphin.ejb.RemoteSystemService: open.dolphin.ejb.RemoteSystemService.putRadMethodMaster(java.util.Collection); using hash: 7358299985991160638
    1063 [main] DEBUG org.jboss.remoting.transport.socket.MicroSocketClientInvoker  - SocketClientInvoker[3ad3c6a3, socket://127.0.0.1:3873] constructed
    1063 [main] DEBUG org.jboss.remoting.MicroRemoteClientInvoker  - SocketClientInvoker[3ad3c6a3, socket://127.0.0.1:3873] connecting
    1063 [main] DEBUG org.jboss.remoting.transport.socket.MicroSocketClientInvoker  - Creating semaphore with size 50
    1063 [main] DEBUG org.jboss.remoting.MicroRemoteClientInvoker  - SocketClientInvoker[3ad3c6a3, socket://127.0.0.1:3873] connected
    1290 [main] DEBUG org.jboss.remoting.InvokerRegistry  - removed SocketClientInvoker[3ad3c6a3, socket://127.0.0.1:3873] from registry
    1290 [main] DEBUG org.jboss.remoting.transport.socket.MicroSocketClientInvoker  - SocketClientInvoker[3ad3c6a3, socket://127.0.0.1:3873] disconnecting ...
    1290 [main] INFO open.dolphin.master.InitDatabase  - 放射線メソッドマスタを登録しました。
    1290 [main] INFO open.dolphin.master.InitDatabase  - データベースを初期化しました。
    
  5. OpenDolphin-1.3.0.7 を右クリック→「実行」でクライアントを立ち上げる。
  6. 「設定」をクリック,IPアドレス:localhost,ユーザID:admin
  7. パスワード:admin でログイン
    これで,OpenDolphin が Mac の中だけで立ち上がる。NetBeans ってすごい。(別途 ORCA サーバは必要だけど)
  8. ちなみに,初期化直後のダンプファイル
    ダウンロード dolphin_initialized.dump.zip (9.7K)
    取り込み方法
    $ sudo -u _postgres dropdb dolphin
    $ sudo -u _postgres createdb -O dolphin dolphin
    $ sudo -u _postgres psql -U dolphin dolphin < dolphin_initialized.dump
    

2012年1月28日 (土)

リファクタリングと環境整備(3)

OpenDolphin-1.3.0.7 を NetBeans に取り込んでみる

リファクタリングした OpenDolphin-1.3.0.7 を,Bitbucket から NetBeans に組み込んでみる方法。
  1. NetBeans 7.1 Java EE バージョンをダウンロードして立ち上げる。
  2. メニューから,「チーム」→「Mercurial」→「他をクローン」と選択。
  3. リポジトリ URL を入力して次へ。匿名アクセスなので,ユーザ/パスワードは不要。

    02

  4. Mercurial パスの入力

    03

  5. 出力先ディレクトリを指定。

    04

  6. クローンが開始される。クローン完了ダイアログが出るまで,15〜20分くらいかかる。
  7. クローン完了ダイアログが出たら「プロジェクトを開く」を選択
  8. 「選択したプロジェクトを開きます」ダイアログでは,全てのプロジェクトを選択する
  9. これで,OpenDolphin-1.3.0.7 のダウンロードと NetBeans への取り込みが完了する。

2012年1月27日 (金)

リファクタリングと環境整備(2)

Plugin フォルダの廃止

本家デジタルグローブ社の OpenDolphin-2.1.2M を見てみると,1.3 時代にあった plugin フォルダが廃止されて,plugin になっていた部分は open.dolphin.impl に配置転換されている。それに合わせて自分の環境もリファクタリングしてみた。

  1. plugin のパッケージを右クリック,「リファクタリング」から「名前の変更」を選択し,パッケージの名前を open.dolphin.impl.xxxx に変更する。
  2. 名前の変更ができたら,ドラッグ&ドロップで主プロジェクトに移動する。
  3. 全てのプラグインでこれを繰り返す。
  4. getResource(String) 等,ファイルの位置が文字列でコーディングされている部分はリファクタリングされないので,必要部分を手動で変更する。直し忘れがあると,実行時に変な場所で ExceptionInInitializerError が発生する。
  5. META-INF.plugin に入っているプラグイン情報が入ったファイルを,適宜追加・変更する。
    open.dolphin.client.AbstractSettingPanel
    open.dolphin.client.MainWindow
    open.dolphin.client.Chart
    open.dolphin.client.MmlMessageListener
    open.dolphin.client.ChartDocument
    open.dolphin.client.NChartDocument
    open.dolphin.client.ClaimMessageListener
    open.dolphin.client.SchemaEditor
    open.dolphin.client.Letter
    open.dolphin.server.PVTServer
    open.dolphin.client.MainComponent
    

Java EE EJB モジュール化

本家デジタルグローブ社の OpenDolphin-2.1.2M を見てみると,クライアントが OpenDolphin-2.1M,EJB が OpenDolphin-EA-2.0,OpenDolphin-EJB-2.0 と分離されている。これに合わせるようにリファクタリングしてみた。

  1. 「新規プロジェクト」→「JavaEE」→「エンタープライズアプリケーション」を選択
    • プロジェクト名 "OpenDolphin-EA-1.3.0.7"
    • サーバーと設定
      サーバー:JBoss Application Server,Java EE バージョン:Java EE 5
      「EJB モジュールを作成」と「Web アプリケーションモジュールを作成」は,ここでは両方ともチェックを外しておく
  2. 「新規プロジェクト」→「JavaEE」→「EJBモジュール」を選択
    • プロジェクト名:OpenDolphin-EJB-1.3.0.7
    • エンタープライズアプリケーションに追加:OpenDolphin-EA-1.3.0.7,サーバー:JBoss Application Server,Java EE バージョン:Java EE 5
  3. できあがった OpenDolphin-EJB-1.3.0.7 を右クリック→「プロファイル選択」
    ソース/バイナリ形式:JDK_6,エンコーディング:UTF-8 に設定
  4. OpenDolphin-EJB-1.3.0.7 を選択し,「新規ファイル」→「持続性」→「持続性ユニット」を選択
    持続性ユニット名:openDolphin,持続性プロバイダ:Hibernate (JPA 1.0)
  5. データソースから,「新しいデータソース」 を選択。JNDI 名:PostgresDS,データベース接続:jdbc:postgresql:... を選択。これで,EJB サーバリソースの jboss-ds.xml が作成される。既にサーバリソースに jboss-ds.xml がある場合は作成されないので,うまくできないときは jboss-ds.xml を削除して再度データソースを入力する。
  6. できあがった jboss-ds.xml を OpenDolphin-EA のサーバリソースに移動する。EA の方に入っていないとうまくデプロイされない。
  7. 持続性ユニットにプロパティーを設定する。デザインモードよりソースモードにして入力した方が楽。以下の property を追加する。hiberneate search の index directory は,書き込み可能なディレクトリに設定する。
    <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>            
    <!-- hibernate search -->
    <property name="hibernate.search.default.directory_provider" value="org.hibernate.search.store.FSDirectoryProvider"/>
    <property name="hibernate.search.default.indexBase" value="/Applications/jboss-5.1.0.GA/lucene/indexes"/>
    
  8. EJB 側からクライアント側を参照している部分を直す。ClaimConst.java と KarteState.java が EJB 側から参照されていて修正した。何で今まで動いていたのか分からない。恐ろしい・・・
    • KarteState.java を infomodel パッケージに「リファクタリング」→「移動」。
    • BundleMed から ClaimConst を参照している部分を,IInfoModel に値をコピーして,そちらを参照させる。
  9. ライブラリフォルダの位置を common/lib に移動する。NetBeans がライブラリを見失うので,OpenDolphin-1.3.0.7 のプロパティーから,ライブラリを設定しなおす。
  10. OpenDolphin-EJB-1.3.0.7 のライブラリを右クリックし,「JAR/フォルダを追加」を選択し,common/lib から以下のライブラリを追加する。
    • hibernate-search-3.1.1.GA.jar
    • jboss-ejb3-ext-api.jar
    • lucene-analyzers-2.4.1.jar
    • lucene-core-2.4.1.jar
    • velocity-1.7.jar
    • velocity-1.7-dep.jar
  11. 同じく,「ライブラリを追加」を選択して,「Hibernate JPA」を追加する
  12. 作った OpenDolphin-EJB-1.3.0.7 のソースパッケージに,OpenDolphin-1.3.0.7 から open.dolphin.dto,open.dolphin.ejb,open.dolphin.exception,open.dolphin.infomodel をドラッグ&ドロップで移動する。
  13. OpenDolphin-EA-1.3.0.7 を右クリック → 構築
  14. OpenDolphin-1.3.0.7 のライブラリを右クリック →「プロジェクトを追加」で OpenDolphin-EJB-1.3.0.7 を選択。
  15. これで,リファクタリングは終了。

リファクタリングと環境整備(1)

思い立って,環境整備とコードのリファクタリングを試みた。環境整備として,PostgreSQL,JBoss Application Server (JBoss AS) を Mac で動かして NetBeans (Java EE バージョン)からコントロールし,Mac 内だけでコーディング・デバッグできるような環境を作ってみた。リファクタリングは,プラグインフォルダを廃止し,さらに,クライアントと EJB を分離した。

 

Mac OS X に PostgreSQL をインストール

Mac OS X Lion には PostgreSQL 9.0.4 のクライアントが標準で入っているが,サーバーは入っていない。サーバーまで使いたい場合は,Server.app を App Store で購入する必要がある。

  1. Server.app をインストール後,ターミナルで確認すると,以下のようになっており,postgres がインストールされているのが確認できる。
    $ sudo serveradmin list
    accounts
    addressbook
    afp
     :
    postgres
     :
    
  2. サーバーを起動するためのコマンド。起動したままにしておくと,次回からコンピューターの起動時に自動的に postgres も起動するようになる。
    $ sudo serveradmin start postgres
    postgres:state = "RUNNING"
    $
    
  3. ちなみに,停止するためのコマンド。
    $ sudo serveradmin stop postgres
    postgres:state = "STOPPED"
    $
    
  4. 外部からのアクセスを許可するためには listen_addresses を設定する。
    $sudo serveradmin settings postgres:listen_addresses = "*"
    postgres:listen_addresses = "*"
    $ 
    
    ここで,タイプミスで間違ったキー(listen_address)を作ってしまい postgres が立ち上がらなくなって困った。マニュアルによると postgres:xxxx = delete とすれば消えると書いてあるが,実際やってみると値は消去されず,代わりに "delete" という値がセットされてしまった。
    /System/Library/LaunchDaemons/org.posgtresql.postgres.plist を直接編集してキーを削除する必要がある。
  5. dolphin ユーザーの作成。mac では,postgres ユーザー名は _postgres となっている。
    $ sudo -u _postgres createuser dolphin
    Shall the new role be a superuser? (y/n) y
    $ 
    
  6. dolphin データベースの作成。
    $ sudo -u _postgres createdb -O dolphin dolphin 
    $
    
  7. psql でデータベースに入ってみる。
    $ sudo -u _postgres psql -U dolphin dolphin 
    psql (9.0.4)
    Type "help" for help.
    
    dolphin=# 
    
  8. Mountain Lion Server にアップグレードしたら,データベースにつながらなくなった。/Library/Server/PostgreSQL/Data/pg_hba.conf を設定する必要がある。なお,org.postgresql.postgres.plist の場所も /Library/Server/PostgreSQL/Config/ に変更になっている。

NetBeans に PostgreSQL を登録

NetBeans から PostgreSQL がコントロールできるとは知らなかった。
  1. NetBeans のサービスタブを選択する(⌘-5)
  2. データベースを右クリックし「新規接続」→「PostgreSQL」と選択して,接続ウイザードを出す
  3. ドライバ名:PostgreSQL,ホスト:localhost,ポート:5432,データベース:dolphin,ユーザー名: dolphin,パスワード:空欄,「接続をテスト」をクリックして,接続されることを確認して次へ。
  4. データベーススキーマを選択:information_schema(選択はどれでもよい)。

NetBeans に JBoss AS 5.1.0.GA を登録

NetBeans から JBoss AS をコントロールできるとは知らなかった。
  1. JBoss AS 5.1.0.GA (jboss-5.1.0.GA-jdk6.zip)をダウンロードして展開し,アプリケーションフォルダに展開する(/Applications/jboss-5.1.0.GA となる)。
  2. OpenDolphin 用に,以下の2つの設定をする。jboss-5.1.0.GA に加える変更はこの2つだけでよい。
  3. NetBeans で「サーバー」を右クリック,「サーバーを追加」を選択
  4. JBoss AS を選択し,展開した /Applications/jboss-5.1.0.GA を選択
  5. ドメイン:default,ホスト:localhost,ポート:8080 と入力して完了。
  6. できた JBoss AS を右クリック,プロファイルを選択,プロファイルの「VM オプション」を削除して空欄にする。ここに何か書いてあると run.conf が無視されてしまい,OutOfMemorry エラーになる。
  7. JBoss AS の起動は,「サーバー」タグに加わった JBoss AS を右クリック →「起動」
  8. 停止は,起動と同じ方法で「停止」を選択するか,「出力」画面を右クリックして「停止」を選択してもいい。

2012年1月11日 (水)

DiagnosisInspector の機能強化

DiagnosisDocument との連携を強くすることにより,DiagnosisInspector  の機能を強化した。

  • スタンプ箱の病名スタンプをドロップできるようにした。
  • 右クリックでポップアップメニューを表示し,修飾語の入力ができるようにした。
  • さらに,command-Z / shift-command-Z で undo / redo もできるようにした。
    スタンプ箱から病名をドロップ

     

    右クリックでポップアップメニュー表示

    Diaginspector1

     

    Diaginspector2

    これにより,病名入力する場合に,いちいち傷病名タブに切り替えなくても,KarteViewer でカルテを見ながら新しい病名をインスペクタにドロップして加えていくことができるようになった。もちろん,転帰の入力や,複雑な操作をする場合は,傷病名タブに切り替えて作業することになる。


    Diagnosisinspector3

     

    インスペクタの右端の方を右クリックすると,転帰ポップアップが出るようにした。これで,ほとんどの病名入力はインスペクタだけでできるようになった。(2012/02/11)
  • 2012年1月 9日 (月)

    部位入力パネルをグラフィカルに

    スタンプのポップアップメニュー拡張で,「 部位入力パネル」を作っていたが,これをグラフィカルに改造してみた。

    Regionview

    2012年1月 1日 (日)

    半透明の DnD フィードバック

    スタンプのドラッグを開始した時,オリジナルの状態では,ドラッグ中のスタンプは長方形の線で表示されるのみである。これが,ドラッグ中もスタンプが半透明で表示されると,何をドラッグしているのかがわかりやすい。そのために使えそうな TransferHandler#getVisualRepresentation(Transferable t) というメソッドがあるが,実際やってみると,このメソッドをオーバーライドしても呼ばれることはなく無視されてしまう。このことはオラクルのサイトにバグとして報告されており,同サイトに work around (PatchedTransferHandler.java)が出ていた。これを組み込んで改造して,下のように半透明のフィードバックが出るようにした。ただし,Mac でしか動かないようだ。

     

    スタンプのドラッグ:改造前

     

    改造後

    Dnd1before_2

     

    Dnd1after_2

    スタンプ箱からのドラッグ:改造前

     

    改造後

    Dnd2before

     

    Dnd2after

    シェーマのドラッグ:改造前

     

    改造後

    Dnd3before

     

    Dnd3after

    « 2011年12月 | トップページ | 2012年2月 »