トップ «前の日記(2008-06-20) 最新 次の日記(2008-06-28)» 編集

ORCA愉快日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|10|11|12|
2012|01|02|09|
2013|04|

2008-06-23 DBSを利用してORCAと連携させる方法

_ [orca] DBSを利用してORCAと連携させる方法

日レセの外部接続に用いられるDBSを利用して連携させるスクリプトを書いてみたので、そのメモ。

追記 :2009年4月時点で、DBSライブラリの仕様が変わっているみたいなので、下記の方法そのままでは接続できないかと思います。内容は追って修正する予定です。

□ DBS接続について調べた理由
日レセには、外部インタフェースとしてDBSならびにCLAIM方式がありますが
実際使いこなすのは、やり方が分かりにくくて難儀します。
データベースを直接触る手もありますが、参照系ならともかく更新系では
複雑なロジックを実装するのは容易ではありません。
  
また、DBSなどのサンプルがWeb上にあまり見つからないところを見ると
社外に公開してないか、データベースへの直接接続でやっている
ベンダ等が多いのかもしれませんね。
  
やってみたらたいしたことなくても、"とっかかり"に苦労する人が
いるともったいないので、サンプルスクリプトを書いて公開してみることにしました。
この文章が参考になると思った人は、別の参考になる情報をWebで公開して
知識の共有を行ってもらえればと思います。
  
  
□ DBS接続の概要
基本的には、下記のリンク参照。
http://www.orca.med.or.jp/receipt/tec/dev/dbs.rhtml
  
DBS接続をするには、jma-receipt-dbsパッケージをインストールする。
外部アプリケーションは、日レセマシンのポート8013とTCP通信を行うことで
日レセの情報を外部から参照/更新できるようになる。
  
# aptitude update
# aptitude install jma-receipt-dbs
  
DBS接続はORCAプロジェクトにおいて、医見書/給管鳥といったアプリで
患者情報を参照するのに役立っている。特定健診ソフトはPostgreSQLとの
直接接続なので、PostgreSQLの設定が必要。
  
通信そのものは、TCP上でのメッセージのやりとりなので単純。
下記のように、telnetで接続してメッセージを送ることもできる。
ただし、DB検索を行う場合にどんなメッセージを送る必要があるのか
と言うことに関しては、慣れないと少々分かりづらい。

  
  
□ DBS接続の詳細
独自に情報を取得するのであれば、上記サイトの「(4) 定義体について」で
解説されているように、db/dbs定義体を作成する必要があり、多少手間がかかる。
しかしながら、jma-receipt-dbsで標準的に用意されている/usr/lib/jma-receipt/lddef/dbs.dbd
を利用することで、定義体を作成しなくても標準的なデータを楽に取得することができる。
  
* 標準で利用できるdb定義体
(/usr/lib/jma-receipt/lddef/dbs.dbdの内容)
それぞれの/usr/lib/jma-receipt/record/*****.dbを参照。
--------------------------------------------------------
        metadb;
        tbl_byomei;
        tbl_hkncombi;
        tbl_ptbyomei;
        tbl_pthkninf;
        tbl_ptinf;
        tbl_ptnum;
        tbl_syskanri;
        tbl_wksryact;
        tbl_sysuser;
--------------------------------------------------------
  
  
□ DBS接続プログラミング
DBS接続をするためには、Ruby版とJava版のライブラリが
あるとのことだが、現在のpanda-1.4.1ではJava版のライブラリは
見当たらなくなっている。(apt-get source panda-serverで取得)
TCPでソケット通信をしてメッセージをやりとりするだけなので
他の言語でライブラリを書くのも難しいことではない。
(その場合は、dbslib.rbのソースを参照すべし)
  
ここからは、Ruby版のライブラリ(dbslib.rb)を話のベースとする。
基本的なプログラミングは、上記サイトや下記のサンプルスクリプトを
参考にしてもらえばいいが、具体的に、DB検索を実行する箇所(recordopsメソッド)を
どのように書いたらいいか分かりにくいと思うので、dbファイルから一覧を抽出してみた。
下記参照。
  
* recordopsメソッド記述例リスト - ダウンロード
dbs.txt
* DBSサンプルスクリプト - ダウンロード
dbs_sample.tar.gz
--------------------------------------------------------
 dbs0.rb :患者氏名を1レコードだけ抽出するサンプル
 dbs1.rb :患者情報テーブルの構造を表示するサンプル
 dbs2.rb :患者情報を抽出して一覧表示するサンプル
 dbs3.rb(Etch向け) :特定の検索語句を含む病名を表示するサンプル。引数に検索単語を指定
--------------------------------------------------------
  
* DBS経由でデータを取得するサンプルスクリプト
-------------------------------------------------------------------
#!/usr/bin/ruby
  
require './dbslib.rb'  # 同じディレクトリ内にdbslib.rbファイルが必要。apt-get source panda-serverで取得。
  
records = {}
records['tbl_ptinf.HOSPNUM'] = '1'   #検索に必要なパラメータをハッシュに設定しておく。上記のメソッド例リストを参照。
  
server = DB_Server.new("localhost", 0, "ormaster", "ormaster123")  #環境に合わせてID/パスワードを変更すること。
server.dbops("DBOPEN")
server.dbops("DBSTART")
  
server.recordops("DBSELECT", "tbl_ptinf", "all", records)  #上記のメソッド例リストを参照
server.recordops("DBFETCH", "tbl_ptinf", "all", records)
puts records['tbl_ptinf.KANANAME']
  
server.dbops("DBCOMMIT")
server.dbops("DBDISCONNECT")
-------------------------------------------------------------------
  
実行する際には、もちろんjma-receiptならびにjma-receipt-dbsがインストール
されている必要がある。
また、デフォルトのID/パスワードはormaster/ormaster123なので、必要に合わせて
スクリプトの内容を変更すること。
  
Etch環境で実行する場合は
  $ ruby dbs0.rb | nkf -w
  $ ruby dbs3.rb ぶどう球菌
などのようにして実行。
  
  
□ その他の注意点
* スクリプトはEUC-JPベースで記述すること
  基本的に、スクリプトの文字コードはEUC-JPで記述すること。
  Debian EtchなどUTF-8な環境では、スクリプトからの出力を正しく表示させるには
  nkfなどで文字コードの変換を行う必要がある。
  
* 認証とセキュリティ
  DBS接続での認証には、日レセで登録したID/パスワード(ormaster等)を用いる。
  セキュリティ的な注意点としては、日レセで登録するパスワードを簡単な物に
  してはならない。特に、実運用で使う場合はormasterやormaster123などの
  デフォルトのパスワードにはしないこと。
  また、通信は暗号化されていないので、安全なネットワーク内での運用にとどめるべき。
  
* パラメータのキー名
  検索等に必要なパラメータはrecords['tbl_ptinf.HOSPNUM']などのように
  定義する必要があるが、ハッシュのキーはシングルクォート「'」等でくくり
  テーブル定義名.変数などのようにテーブル定義名も含めて記述すること。
  
* dbslib.rbの名前の衝突
下記の問題は、jma-receview 0.0.5以降では解消されています。

  Rubyスクリプト中で、requireでライブラリの読み込みを行う場合は
  panda-serverのソースから取得したdbslib.rbを、確実にロードする。
  (require './dbslib.rb'などの方法で)
  
  これは、jma-receviewパッケージをインストールすると、/usr/lib/ruby/1.8/以下に
  dbslib.rbというカスタマイズされた同名のライブラリがインストールされ
  require 'dbslib'とした場合は、jma-receview側のライブラリが呼び出されて
  引数エラーが発生するため。
  せめて、dbsblib.rbの名前を変えるか、/usr/lib/ruby/1.8/以外に
  インストールするか、どっちかだけでも対策してほしいものだ...。

_ [その他] ○○力というワード

最近、特に○○力というバズワード、多いなぁ。
  
ビジネス書の、「コミュニケーション力」「指導力」とかは序の口として
「フレームワーク力」「地頭力」「察知力」などの取って付けたような
ものとか、「幸せ力」「常識力」とかになってくると、「力」はいらんやろ!
と思ってしまう。
  
「幸せ」「常識」とかだけだと単語にインパクトがないから、
こういうあたかも能力がありますよーなんて表現を作ったのかもしれない。
また、自分の能力に自信がないけど、普通に生活している一般生活者に
とって、資格とか検定とかテストのような、何かを計るモノサシを
求める風潮によるような気がする。
  
「**は幸せですよー」、とか「**は常識ですよー」とかいうのは
本当に幸せなのか、どの範囲の世界での常識なのかをよく考えてみた方がいい。
  
ということで、「力」というワードを付けるのがばかばかしく思えてくる
ような単語はないかな、といくつか考えてみた。
  
□ 呼吸力
生命維持の目的のために、大変貴重な空気を吸い込むための力。
0歳から200歳までのレベルの呼吸力検定あり。
毎年5月9日に、全国1箇所で検定試験が開催される。
  
まだなんか説得力があるな...
□ ぐーたら力
毎日をいかに非生産的に活動できるかを競う力。
特に毎日何もしないが、結果がプラスでもマイナスでもないところに意義がある。
日本具鱈協会による指数、ぐーたら度がある。ぐーたら1弱-8強まで。
なお、日本具鱈協会へは、あまりにぐーたらなため連絡先がわかりません。
  
いまいちだな(笑

トップ «前の日記(2008-06-20) 最新 次の日記(2008-06-28)» 編集