日レセの外部接続に用いられる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強まで。 なお、日本具鱈協会へは、あまりにぐーたらなため連絡先がわかりません。 いまいちだな(笑