ORCA APIを利用する(Post)


仕事が少し落ち着いたので前回に引き継き日医オープンソースORCAの話題である。
前回はGetの場合であるが、殆どのAPIがPostでのリクエストに対応しているのでその場合のサンプルです。
例によって厳密なエラー処理などしていないので流用する場合は注意してください。

以下は特定の患者の診療歴を取得する場合の例です。
bodyを変更する事ですべてのAPIが利用できます。

Dim body As String
body = “<data>” & vbCrLf & _
“<medicalgetreq type=””record””>” & vbCrLf & _
“<InOut type=””string””>O</InOut>” & vbCrLf & _
“<Patient_ID type=””string””>000001</Patient_ID>” & vbCrLf & _
“<Perform_Date type=””string””></Perform_Date>” & vbCrLf & _
“<For_Months type=””string””>99</For_Months>” & vbCrLf & _
“</medicalgetreq>” & vbCrLf & _
“</data>”

Dim oruser As String = “ormaster”
Dim orpasswd As String = “ormaster”
Dim URL As String = “http://192.168.0.2:8000/api01rv2/medicalgetv2?class=01”

Dim CONTENT_TYPE As String = “application/xml”
Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding(“UTF-8”)
Dim Result As String

Dim record_in_byte As Byte() = Encoding.UTF8.GetBytes(body)
Dim req As HttpWebRequest = CType(HttpWebRequest.Create(URL), HttpWebRequest)
req.ServicePoint.Expect100Continue = False

req.Method = “POST”
req.ContentType = CONTENT_TYPE
req.ContentLength = record_in_byte.Length
req.Credentials = New NetworkCredential(oruser, orpasswd)
req.PreAuthenticate = True
req.KeepAlive = False


Try
Dim reqstream As System.IO.Stream = req.GetRequestStream()
reqstream.Write(record_in_byte, 0, record_in_byte.Length)
reqstream.Close()

Dim res As WebResponse = req.GetResponse()
Dim str As System.IO.Stream = res.GetResponseStream()

Dim strread As New System.IO.StreamReader(str, enc)

Dim FOO As String = strread.ReadToEnd()
Result = FOO

strread.Close()
str.Close()
res.Close()

Catch exc As WebException
Result = “ERROR”
If exc.Status = WebExceptionStatus.ProtocolError Then
Dim err As HttpWebResponse = DirectCast(exc.Response, HttpWebResponse)

Dim errcode As Integer = CInt(err.StatusCode)

‘Console.WriteLine(err.ResponseUri)
‘Console.WriteLine(“{0}:{1}”, errcode, err.StatusDescription)

err.Close()
Else
‘Console.WriteLine(exc.Message)
End If
End Try

‘以降Resultをparseする()

 

ORCA APIを利用する(Get)


ニッチな話題ですがお仕事で扱っている日医がオープンソースとして主に診療所等など用に公開しているORCAについて外部アプリケーションから患者の氏名などのデータを利用する案件があったのでメモ。

ORCAからデータを取得するにはAPIを使用するかPostgresqlのDBから直接読み込む方法があるがスマートな方法であるAPIを使用する事にした。

以下VB.Netでのサンプル。
このサンプルは唯一getメソッド?でアクセルするタイプのAPIです。
(https://www.orca.med.or.jp/receipt/tec/api/patientget.html)

サンプルはエラー処理などキチンとしていないのでもし再利用する方がいましたらその辺注意してください。
またC#のサンプルが本家にありますのでそちらも参考にしてください。

Dim USER As String = “ormaster”
Dim PASSWD As String = “ormasterpass”
Dim URL As String

URL = “http://192.168.0.5:8000/api01rv2/patientgetv2?id=<ptnum>”
URL = Replace(URL, “<ptnum>”, “1”) ‘患者番号

Dim ResultXML As String

Dim req As HttpWebRequest = CType(HttpWebRequest.Create(URL), HttpWebRequest)
req.Method = “GET”
req.Credentials = New NetworkCredential(USER, PASSWD)
req.PreAuthenticate = True
Dim res As HttpWebResponse = Nothing

Try
res = DirectCast(req.GetResponse(), HttpWebResponse)

Catch wex As WebException
If wex.Status = WebExceptionStatus.ProtocolError Then
Dim err As HttpWebResponse = DirectCast(wex.Response, HttpWebResponse)

        Dim errcode As Integer = CInt(err.StatusCode)

        Console.WriteLine(err.ResponseUri)
Console.WriteLine(“Response server => {0}”, err.Server)
Console.WriteLine(“{0}:{1}”, errcode, err.StatusDescription)

        err.Close()
Else
Console.WriteLine(wex.Message)
End If
End Try

If res IsNot Nothing Then
Dim str As Stream = res.GetResponseStream()
Dim strread As New StreamReader(str)

    ResultXML = strread.ReadToEnd()

    strread.Close()
str.Close()
res.Close()
End If

GC.Collect()
req.Abort()

‘正常に取れたらResultXMLをparseする

RFIDリーダーをテストする


しばらく前に秋葉原の秋月電子にて購入して放置していた「RFID Reader USB」を試してみた。
なんでかと言えばお仕事で関わっている会社さんで扱っている医療系システムに何か応用できないかと思ったからである。
DSC_0772

http://akizukidenshi.com/catalog/g/gM-06826/

4,800円だったので面白そうと思い何かの用で秋葉原に行った際に衝動買いしたものでリーダーとサンプルタグが何種類か同梱されている。
ちなみにこれとは別に125kHzようにRFIDタグカードを50枚別口で買って持っている。

秋月電子のページに詳しい事は書いてあるがざっと重要な部分を紹介する。

  • リーダーはバーチャルCOM I/FでPCと接続される
  • 125KHz EM4100のタグに対応。
  • 読み込みのみで書き込みはできない。

主流は13.56MHzと860~960MHzのものであるようだ。
しかしながらamazonなどでお手軽価格で手に入るのは125KHzのタグなので実験等には最も適していると思われる。

秋月電子のHPにも商品内容の写真はあるが

DSC_0773

同梱物はリーダー基板とサンプルタグ数種。
正方形と円形のものは厚さ1mmに満たないクレジットカードのような暑さ、大きさのものである。
青いのはキーホルダー的なもの。

ちょっと心配だったのがUSB COMのドライバーである。
製造元のParallax社のHPにて確認するも、ドキュメント類はあるがドライバーは無い。
ならばと、PCに接続してみたが難なくCOMポートとして認識した。
(Windows10環境)

DSC_0775

動作を確認するためのサンプル的なものはソースはあるがアプリは見つからなかったのでXojoでサクッと作成。
タグ情報を読み込む事ができた。
ちなみに読み込める距離はタグの位置によって異なるが基板に重ねる方向は感度が悪く10~20mm程度、横方向(上記写真の丸型タグ)だと最大で50mm位です。

データは0x0aに続いて5bytesの数値を10桁のアスキー文字列かしたもの、最後に0x0dが読み込む際にCOMポートから送られてくる事がわかった。
例:

0x0a|0x30|0x31|0x32|0x33|0x34|0x35|0x36|0x37|0x38|0x39|0x0d
の計12Bytes。

それとタグが読める範囲にあると繰り返し同じタグ情報を送ってくるので実際に使用する場合はその辺の対策がソフトウェア的に必要である。

RFIDReadertest

サンプルアプリで読み込んだ様子。別口で購入したRFIDタグカードも問題なく読み込めました。
50枚セットで購入したカード1400円/50枚で1枚あたり28円で比較的安価ですのでいろいろな用途に応用できるような気がします。

それとこのリーダーとは違いますがRF522というRFID用のモジュールがamazonなどで数百円で売られているけど、RaspberryPiに繋いで遊んでみたいですね。(13.56MHzです)

OracleからPostgresqlへ移行 ora2pg


年末年始をかけて訳あってOracleで運用しているシステムを使い慣れたPostgrsqlへ移行。
ネットで調べるとora2pgというツールでPostgresqlの形式で出力できるようなので試してみた。

ora2pg

現在のOracleのバージョンなどは
Orcacle11g、正確には11.2.0.4.0である。
Oracle Linux上で動作している。

幸いにもコールドスタート用に準備していたバックアップ用のOracle Linuxがあったので運用しているシステムと同様の環境下でora2pgを動作させる事ができた。
これが本番環境しかないと色々と面倒である。

ora2pgを動作させるためにはいくつかのperlモジュールが必要なのでネットの情報を参考に

DBI
DBD:Pg
DBD::Oracle
String::Random
Compress::Zlib

をcpanでインストール。
DBD::Oracleだけは

cpan –fi DBD::Oracle

としないとインストールがうまくできなかった。

次にネットよりora2pgをダウンロード。
現在最新のバージョンは17.6、これを使用した。

http://ora2pg.darold.net/

ダウンロードしたファイルを展開し

sudo perl Makefile.pl
sudo make && make install

これで環境は整ったと思われたが、いざ変換用のスクリプトを起動してもエラーが出て正常に動作しない。
shared libがどうたらとかCan’t load~とか言われたので

/etc/ld.so.conf

にOracleのlibディレクトリを追記し

sudo ldconfig

することで何とか解決。
postgresqlのダンプファイルと同様の形式のファイルを出力することができた。

今回はLinux版のOracleからLinux版のPostgresqlなので文字のエンコードとか改行コードのようなものは特に問題なくできたようだけどWindows版のOracleからとかだとそのあたりも注意が必要だと思われる。
まぁとりあえず一度限りの事だから良いけどこの手の作業はすぐ忘れてしまうので一応メモ。

小規模なシステムでOracleである必要はないし不慣れなsqlplusと使わずに済むと思うとうれしいが半面Oracleに触れる機会が減るのでスキルが少し下がってしまうかも。
とはいえOracleマスターなどの肩書もないし自慢にもならんのだが。
Linux版のOracleは初期導入がかなり面倒だったのでその時は凄く勉強になったが数年前の事で忘れてるので次回もしOracleを使う事になったらWindows版を使用しようかと思う。

orcaというlinuxで動作する業務用アプリケーション


知り合いに頼まれて表題のアプリケーションのセットアップを行った。医療機関で使用する事務処理用のアプリケーションらしいがlinux上で動作する。
10年以上歴史はあるようでそれなりに普及しているようだ。
日本医師会が開発元らしくオープンソースのフリーウェアである。

ORCAプロジェクト
https://www.orca.med.or.jp/receipt/

簡単に言うと病院等で使うお会計ソフト、処方せん発行、そして処方せん、診療報酬請求を行うアプリケーションのようだ。
そう言えば最近診療報酬詐欺とかありましたね。

ubuntu14.04上で動作するサバクラ方式のシステム。
インストール自体はマニュアルが用意されているので簡単。
ものの1時間で完了した。

クライアントアプリケーションはjavaでも提供されているいうでwinやmacでも利用できる。個人的にはサーバーアプリはvmwareかなにかで稼働させてwinクライアントが操作面で良いのでは無いかと思います。

さて、細かい設定は医療事務の知識が必要なので私にはチンプンカンプンですが、個人でも処方せんとかお会計のシミュレーションが出来るので面白い。

病院でもらった領収書?明細書?の内容を入力してみたら同じ金額の領収書がでて面白い。きちんと設定すればいろいろ試せそうですが、自分には意味無いのでとりあえずここまで。
あとは知り合いの事務責任者に引き渡し。

linuxが活用されているのは嬉しいですが時代的にはクラウドなんだろうと思いました。

医療業界ってのIT化はなかなか難しいのですかね。