R言語による電子カルテデータの二次利用

~R言語初心者がデータ処理を楽しめるように基本的内容中心のサイトです~

電子カルテのサンプルデータ①

ここ2年ぐらい電子カルテについての話をする機会が何度かありました。ブログのタイトルにもあるようにR言語SQLデータベースからデータを抽出し、可視化したり、簡単な統計処理をしたりしました。電子カルテデータの二次利用について興味を持ってくれる医師もいますが、当院のデータベースを用いた話なのでコードをそのまま流用することができず、実際に自分の施設でデータを抽出するところまではいたらないようです。

R言語SQLデータベースについては、過去のブログで簡単な環境構築ついて触れておりますし、ネットの情報も非常に豊富なのでSQLデータベースを触ったり、R言語で前処理したり、グラフを描いたり、統計処理するのは可能かと思います。ただ電子カルテデータを用いた処理の練習は、自分の施設の電子カルテサーバーへのアクセス権の問題や、練習用のサンプルデータが無いこともあり、非常に難しい状況です。

逆に、電子カルテで用いられるようなSQLデータベースにサンプルデータをいれて提供できれば、実際の運用をR言語でシュミレーションできるので、R言語SQL言語の習得にも力が入るのではないでしょうか?

これから少しずつ仮想の医療データを作成し、SQLサーバーに落とし込んでいきたいと思います。R言語の習得やデータの前処理、統計処理の勉強に役に立てば幸いです。

ggplot2で人口ピラミッドを描く

まずはサンプルデータを落としてきます。

library(dplyr)
library(RCurl)
# This is not actual patient data.
url <- getURL("https://raw.githubusercontent.com/Algo1970/EHR_data/master/pt_master_sample.csv")
df <- read.csv(text = url, header = TRUE)

よく見る患者マスターは、こんなデータ構成かと思います。(下記はコンピューターでランダムに作成されたデータです)

> df %>% tail()
     facility_code    id        name            kana gender
995        1234567 10995   金田 彩華   かねだ あやか     女
996        1234567 10996     藤森 兼   ふじもり けん     男
997        1234567 10997   木村 誠一 きむら せいいち     男
998        1234567 10998     足立 優     あだち ゆう     女
999        1234567 10999   小堀 一輝   こほり かずき     男
1000       1234567 11000 阿久津 一代   あくつ かずよ     女
         birth address
995  1948/6/19  茨城県
996  1956/1/24  岐阜県
997   1961/8/2  沖縄県
998  1984/7/13  愛知県
999  1978/4/30  岐阜県
1000  1968/9/5  岩手県
>

年齢が必要なので、誕生日から年齢を計算します。性別も文字列を変更しておきます(性別データも電子カルテメーカー毎にまちまちなので下記コードで…)。

# birthベクトルから年齢計算
make.age <- function(birth){
  df <- NULL
  for(i in 1:length(birth)){
    df[i] <- (length(seq(as.Date(birth[i]), Sys.Date(), "year"))-1)
  }
  df
}
df$age <- make.age(df$birth)

# genderを変更
df$gender <-as.character(df$gender) 
df$gender[df$gender %in% c("m","male","M","Male","MALE","男","男性")] <- c("male")
df$gender[df$gender %in% c("f","female","F","Female","FEMALE","女","女性")] <- c("female")

いちど確認。

> df %>% tail()
     facility_code    id        name            kana gender
995        1234567 10995   金田 彩華   かねだ あやか female
996        1234567 10996     藤森 兼   ふじもり けん   male
997        1234567 10997   木村 誠一 きむら せいいち   male
998        1234567 10998     足立 優     あだち ゆう female
999        1234567 10999   小堀 一輝   こほり かずき   male
1000       1234567 11000 阿久津 一代   あくつ かずよ female
         birth address age
995  1948/6/19  茨城県  68
996  1956/1/24  岐阜県  60
997   1961/8/2  沖縄県  55
998  1984/7/13  愛知県  32
999  1978/4/30  岐阜県  38
1000  1968/9/5  岩手県  48
>

年齢も、性別文字列変更もできてますね。
必要なデータのみtempにいれて、まず集計。

df[,c("gender","age")]->temp
result <- tapply(temp$age,temp$gender, hist, breaks=seq(0,100,5))

結果はこんな感じで返します。

> result
$female
$breaks
 [1]   0   5  10  15  20  25  30  35  40  45  50  55  60  65
[15]  70  75  80  85  90  95 100

$counts
 [1]  0  0  0  7 56 43 50 45 43 45 33 41 38 34 33 47  0  0  0
[20]  0

$density
 [1] 0.000000000 0.000000000 0.000000000 0.002718447
 [5] 0.021747573 0.016699029 0.019417476 0.017475728
 [9] 0.016699029 0.017475728 0.012815534 0.015922330
[13] 0.014757282 0.013203883 0.012815534 0.018252427
[17] 0.000000000 0.000000000 0.000000000 0.000000000

$mids
 [1]  2.5  7.5 12.5 17.5 22.5 27.5 32.5 37.5 42.5 47.5 52.5
[12] 57.5 62.5 67.5 72.5 77.5 82.5 87.5 92.5 97.5

$xname
[1] "X[[i]]"

$equidist
[1] TRUE

attr(,"class")
[1] "histogram"

$male
$breaks
 [1]   0   5  10  15  20  25  30  35  40  45  50  55  60  65
[15]  70  75  80  85  90  95 100

$counts
 [1]  0  0  0  8 42 43 35 43 32 38 40 44 47 39 35 39  0  0  0
[20]  0

$density
 [1] 0.000000000 0.000000000 0.000000000 0.003298969
 [5] 0.017319588 0.017731959 0.014432990 0.017731959
 [9] 0.013195876 0.015670103 0.016494845 0.018144330
[13] 0.019381443 0.016082474 0.014432990 0.016082474
[17] 0.000000000 0.000000000 0.000000000 0.000000000

$mids
 [1]  2.5  7.5 12.5 17.5 22.5 27.5 32.5 37.5 42.5 47.5 52.5
[12] 57.5 62.5 67.5 72.5 77.5 82.5 87.5 92.5 97.5

$xname
[1] "X[[i]]"

$equidist
[1] TRUE

attr(,"class")
[1] "histogram"

> 

必要なのは、result$(性別)$breaksとresult$(性別)$countsなので、取り出してデータフレームを作成します。
breaksは最後のデータが不要なので削除。カテゴリーの順序はlevelsで指定しておかないと後で順番がおかしくなるかも…
男女別に作ってrbindで結合。

paste(result$male$breaks,"-")->category
category[1:(length(category)-1)]->category
category <- factor(category,levels = category)

temp_male <- data.frame(category=category,
                        counts=result$male$counts,
                        gender=rep("male",length(result$male$counts)))
temp_female <- data.frame(category=category,
                        counts=result$female$counts*(-1),
                        gender=rep("female",length(result$female$counts)))
temp_all <- rbind(temp_male,temp_female)

できたデータはこんな感じ。

> temp_all
   category counts gender
1       0 -      0   male
2       5 -      0   male
3      10 -      0   male
4      15 -      8   male
5      20 -     42   male
6      25 -     43   male
7      30 -     35   male
8      35 -     43   male
9      40 -     32   male
10     45 -     38   male
11     50 -     40   male
12     55 -     44   male
13     60 -     47   male
14     65 -     39   male
15     70 -     35   male
16     75 -     39   male
17     80 -      0   male
18     85 -      0   male
19     90 -      0   male
20     95 -      0   male
21      0 -      0 female
22      5 -      0 female
23     10 -      0 female
24     15 -     -7 female
25     20 -    -56 female
26     25 -    -43 female
27     30 -    -50 female
28     35 -    -45 female
29     40 -    -43 female
30     45 -    -45 female
31     50 -    -33 female
32     55 -    -41 female
33     60 -    -38 female
34     65 -    -34 female
35     70 -    -33 female
36     75 -    -47 female
37     80 -      0 female
38     85 -      0 female
39     90 -      0 female
40     95 -      0 female
> 

女性のカウント数に-1をかけているのは、あとでggplotで作図するためです。

brks <- seq(-60, 60, 20)
lbls = paste0(as.character(c(seq(60, 0, -20), seq(20, 60, 20))))

ggplot(temp_all, aes(x = category, y = counts, fill = gender)) +   
  geom_bar(stat = "identity", width = .8) +   
  scale_y_continuous(breaks = brks,labels = lbls) + 
  coord_flip() +  
  labs(title="Population pyramid") +
  theme_tufte() +  
  theme(text=element_text(size=12, family="Comic Sans MS"), 
        plot.title = element_text(hjust = .5), 
        axis.ticks = element_blank()) +   
  scale_fill_manual(values=c("#9999CC","#CC6666"))

f:id:r_beginner:20170115152512j:plain

サンプルデータは適当に作った生年月日データなので、実際の分布とは大きく異なりますが、作図のイメージはできたかと思います。
時間があったら、ちゃんとしたサンプルデータに変更します。

〈追記〉
総務省統計局に年齢各性別人口(平成26年)のデータがありましたので、それからサンプリングして、20000人分の性別、年齢データを作ってみます。
ホームページのエクセルファイルから年齢別の人口を取り出し、CSVファイルにしてありますので、読み込んでみてください。

url <- getURL("https://raw.githubusercontent.com/Algo1970/EHR_data/master/Population_in_Japan.csv")
df <- read.csv(text = url, header = TRUE)

データの途中を確認してみます。

> df[40:50,]
   age  male female
40  39   954    928
41  40 1,006    979
42  41 1,022    998
43  42 1,004    977
44  43   976    955
45  44   948    928
46  45   931    917
47  46   910    898
48  47   907    894
49  48   707    702
50  49   874    867
> 

先程作ったデータと似ていますが、数字にカンマが入っています。これはマズイです。

df$male <- df$male %>% as.character() %>% gsub(",","",.) %>% as.numeric()
df$female <- df$female %>% as.character() %>% gsub(",","",.) %>% as.numeric()

gsub関数でカンマを外してから数値に変換します。
つぎに年齢ごと、性別ごとの確率を求めて、新しいカラムを作成します。

df$male.ratio <- round(df$male/sum(df$male),6)
df$female.ratio <- round(df$female/sum(df$female),6)

新しい確率カラムを確認してみます。

> df %>% head()
  age male female male.ratio female.ratio
1   0  524    496   0.008480     0.007604
2   1  533    508   0.008626     0.007788
3   2  534    508   0.008642     0.007788
4   3  548    519   0.008868     0.007956
5   4  534    509   0.008642     0.007803
6   5  534    510   0.008642     0.007818
> 

ちゃんとできていますね。
きれいなピラミッドが見たいので、10000人ずつサンプルと取ってみます。

sample(df$age,size=10000,replace = T,df$male.ratio) -> male.age
sample(df$age,size=10000,replace = T,df$female.ratio) -> female.age
male.df <- data.frame(gender=rep("male",length(male.age)),age=male.age)
female.df <- data.frame(gender=rep("female",length(female.age)),age=female.age)
temp <- rbind(male.df,female.df)

先ほどと同じ形のデータフレームができているか確認しましょう。

> temp %>% tail()
      gender age
19995 female  41
19996 female   0
19997 female   4
19998 female  38
19999 female  45
20000 female   5
>

大丈夫です。あとは先程と同じながれで、データを整形してプロットします。

result <- tapply(temp$age,temp$gender, hist, breaks=seq(0,100,5))
paste(result$male$breaks,"-")->category
category[1:(length(category)-1)]->category
category <- factor(category,levels = category)
temp_male <- data.frame(category=category,
                        counts=result$male$counts,
                        gender=rep("male",length(result$male$counts)))
temp_female <- data.frame(category=category,
                          counts=result$female$counts*(-1),
                          gender=rep("female",length(result$female$counts)))
temp_all <- rbind(temp_male,temp_female)
brks <- seq(-600, 600, 200)
lbls = paste0(as.character(c(seq(600, 0, -200), seq(200, 600, 200))))
ggplot(temp_all, aes(x = category, y = counts, fill = gender)) +   
  geom_bar(stat = "identity", width = .8) +   
  scale_y_continuous(breaks = brks,labels = lbls) + 
  coord_flip() +  
  labs(title="Population pyramid") +
  theme_tufte() +  
  theme(text=element_text(size=12, family="Comic Sans MS"), 
        plot.title = element_text(hjust = .5), 
        axis.ticks = element_blank()) +   
  scale_fill_manual(values=c("#9999CC","#CC6666"))

f:id:r_beginner:20170115180915j:plain
こんどは美しい人口ピラミッドが作成されました。


参考

vimを使ってみよう。

dockerコンテナ使っていると、vi使わざるを得ない時があります。
最初はとっつきにくい感じがしますが、少し慣れてくるとマウスも矢印キーも打たずに、指もホームポジションにおけるので楽に入力できるようになるそうです。僕はまだまだですが…
またキーバインド、外観等、設定の自由度の高さも魅力の一つです。長く使われているエディターの魅力を感じてみてください。
(Ubuntu64bit 16.04のVMware仮想マシンで試しています。)

まずはvimのインストール

$ sudo apt-get install vim

vimの設定ファイルは、~/.vimrcに作成します。
設定ファイルはコピペしたいので、geditで。

$ gedit .vimrc

設定ファイルの例

if has("syntax")
      syntax on
endif

set ambiwidth=double
set backspace=indent,eol,start
set cursorcolumn
set cursorline
set expandtab
set hidden
set history=50
set ignorecase     " Do case insensitive matching
set incsearch      " Incremental search
set list
set listchars=tab:»-,trail:-,eol:↲,extends:»,precedes:«,nbsp:%
set mouse=a        " Enable mouse usage (all modes)
set nrformats-=octal
set number
set shiftwidth=4
set showcmd        " Show (partial) command in status line.
set showmatch      " Show matching brackets.
set smartcase      " Do smart case matching
set smartindent
set tabstop=4
set title
set virtualedit=block
set whichwrap=b,s,[,],<,>
set wildmenu
set wildmode=list:longest
set wrapscan

noremap <C-j> <esc>
noremap! <C-j> <esc>

ESCキーが遠いのでCtrl+Jに変換してます。
行番号いれたり、カーソルライン入れたり、インクリメンタルサーチにしたり、自分色に変わると愛着が湧いてきます。

なおwindowsレジストリは変更してCapsLockはCtrlキーに変更済みです。
ちなみにwindows10でCapsLockをCtrlに変更するregファイルは下記です。<適当なファイル名>.regファイルで保存してダブルクリックで実行です。

REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00

DockerでDICOMserver構築①~Conquest、SQLite

フリーのDICOM画像serverでConquestというのがあります。
最近はDockerImageもあるようなので、使ってみました。

まずは、Ubuntu64ビット16.04を準備。

$ gedit conquest.sh

エディターを立ち上げたら、下のスクリプトをコピペします。

#!bin/sh
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
sudo apt-get install docker.io 

# まずはdocker-conquest
sudo docker run --name conquest -d -p 5678:5678 -p 80:80 wavedrift/docker-conquest

実行します。

$ sh conquest.sh

これでサーバーは動いているはずです。

ブラウザのアドレスバーに”http://localhost/cgi-bin/dgate”と入力。
上手くつながってはいるのを確認してください。
次にクライアントソフトから接続するための設定をします。

クライアントは定番のKPACS。参考サイトからダウンロードしてください。アカウントの作成とログインが必要です。
ホストPC(ウチの環境はWindows)のDICOMviewerからも見えるように、acrnema.mapの設定を変更します。

まずはacrnema.mapがどこにあるのか?当たり前だけどDockerコンテナ内なので
Ubuntu端末から、conquestコンテナ内に入ります

$ sudo docker exec -it conquest bash

ファイル検索は、findで検索。

# find / -name 'acrnema.map'

conquestフォルダにありました。

# cd conquest
# ls

dicom.iniもacrnema.mapもありますね、さあ編集です。でもgeditが動かない。
うーん、辛いけどviで開く。今後のためにも参考サイト見ながら操作の勉強。

# vi acrnema.map

クライアント何個かある場合はAEタイトルが重ならないように注意です。
ホストPCのIPアドレスを入力します。

f:id:r_beginner:20161211142413j:plain

conquest serverのrestartがわからず。コンテナのrestart。

$ sudo docker restart conquest

今度はホストPC上のクライアントソフト(KPACS:DICOMviewer)の設定です。
右上のDICOMsettingボタンを押して、DICOMconfigurationsで、仮想マシンIPアドレスを入力し設定保存します。

f:id:r_beginner:20161211142952j:plain

KPACSのQuery→Networkタブを選択→Conquestにチェック→Search filterのSearchボタンを押してみましょう。テストデータが見えました。

f:id:r_beginner:20161211143321p:plain

接続成功です。

本当は、データベースをSQLiteからMySQLに変更したかったのですが、dicom.iniファイルを変更してから、もろもろの処理ができず、お手上げ状態でした。Windowsの場合はConquestのソフトでMySQLにデータベース変更したり、データベースの初期化ができるのですが、Linuxコマンドでは上手く行きませんでした。わかる人がいたら教えて欲しい…


参考:

PostgreSQLとRstudio環境構築

正直PostgreSQLは、ほぼ触ったことがありません。

ただ医師会のレセコン(ORCA)や、オープンソース電子カルテのOpenDolphinはPostgreSQLを利用しており、これからレセコン・電子カルテデータをいじるのに避けては通れません。
はじめて操作した電子カルテMySQLだったのですが、使い始めはSQLの文法より何より、データベースサーバー・クライアントのインストール等の環境構築で手間取った記憶があります。もちろん細かいこともあとから勉強必要ですが、データベースにアクセスして操作する楽しみを少しでも早く感じれるように、環境構築の時間を可能な限り短くしたいものです。

今回PostgreSQLSQLの練習前に、簡単に早く環境構築(PostgreSQL+Rstudio)することを目標に書いてみました。

準備するもの

時代はUbuntuです。Dockerのオーバーヘッドを減らすためメインPCのWindowsUbuntuに上書きするか(無茶?)、仮想マシンVMware等)にUbuntuOSをインストールしておいてください。僕はUbuntu64bit16.04LTSをインストールした仮想マシンを用意しました。
f:id:r_beginner:20161129205319p:plain

インストールからの流れ

  • Dockerいれる
  • Rstudioコンテナ走らせる
  • ホストPCからつないでみる

では始めます。Ctrl+Alt+Tと押して、端末を立ち上げてください。
シェルスクリプトを書き込むrpostgres.shファイルを作ります。

$ gedit rpostgres.sh

入力するとエディターが立ち上がります。下記のスクリプトをコピペして、記録してエディターを終了してください。

#!bin/sh
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
sudo apt-get install docker.io 
# まずPostgres環境  
sudo docker run -d --name=postgres -p 5432:5432 -e POSTGRES_PASSWORD=mypwd postgres
# rstudioの環境
sudo docker run -d --name=rstudio -p 8787:8787  rocker/hadleyverse 

それではシェルスクリプトを実行します。

$ sh rpostgres.sh

10分とかからずインストールは終了したかと思います。念のためコンテナが動いているか確認します。

$ sudo docker ps -a

f:id:r_beginner:20161210180552j:plain
2つのコンテナともstatusはupで大丈夫のようです。

ホストマシン(僕はWindows)のブラウザにDockerをインストールした[IPアドレス]とポート[8787]と入力します。
例)192.168.0.5:8787
f:id:r_beginner:20161210180000p:plain

UsernameとPasswordは共にrstudioです。接続できたら新規ファイルを作成。

f:id:r_beginner:20161210175824p:plain

新規ファイルに下記のスクリプトをコピペしてください。

install.packages("RPostgreSQL")
library("RPostgreSQL")
con <- dbConnect(PostgreSQL(), 
                 host="192.168.0.5",  # 自分の環境のIPアドレスを入力
                 user= "postgres", 
                 password="mypwd")
dbSendQuery(con, "CREATE DATABASE r_test;")

一番上の行からrstudioのRunボタンで実行してみてください。

  • まずRPostgreSQLパッケージをインストール
  • パッケージを読み込み
  • Connectionオブジェクトを作成
  • オブジェクトにクエリを投げて実行します。(r_testというデータベースを作成)

これでつながりました。
確認も兼ねて、GUIのクライアントツールもインストールしてみましょう。

pgAdmin4 : https://www.pgadmin.org/download/windows.php

f:id:r_beginner:20161210173610p:plain

r_testというデータベースが確認できました。
つながらないときは、プロパティを確認してみましょう。

f:id:r_beginner:20161210173752p:plain

一応、別の方法でも。
仮想マシンの端末からpostgresコンテナ内に入り、コマンドで確認します。

$ sudo docker exec -it postgres bash
# psql -U postgres r_test
r_test=# \det+

f:id:r_beginner:20161210175304j:plain

空っぽのデータベースが見えました。大丈夫そうです。
あとはPostgreSQLの勉強をして、大好きなrstudioからガンガンSQLを流し込みましょう。

参考:

OpenDolphinとORCAの簡単な環境構築

OpenDolphinは日医レセコンORCAに接続できる、オープンソース電子カルテです。

PC初心者でも導入できるように分かりやすく書かれていますので、これを参考に動かしてみたいと思います。
gihyo.jp

はじめに

極力インストールの手間を省略するためと、ホストOSの環境をよごさないために、VMware仮想マシンにUbuntu64,14.04LTSをインストールし、そこにORCAをインストールします。またOpenDolphinはUbuntuのDockerを利用してインストールします。
Ubuntuが苦手、Dockerがわからなくても環境構築できるように、シェルスクリプトを使ってコード入力を少なくすることにします。

ORCA、OpenDolphinサーバーとglclient2のインストール

まずUbuntu14.04LTSの仮想マシンは準備しておいてください。僕はVMwareで準備しました。そのままのUbuntu14.04は使いにくいので日本語入力はできるように設定変更してください。
わからない方は、ここを参考にしてください。
ORCA(日医標準レセプトソフト)の導入 - R言語による電子カルテデータの二次利用

Ubuntuの端末を起動してください(Ctrl+Alt+T)。
f:id:r_beginner:20161207174556p:plain

シェルスクリプトを書き込むdorca.shファイルを作ります。

$ gedit dorca.sh

f:id:r_beginner:20161207175536p:plain
エディターが立ち上がりましたね。ここに下記のスクリプトをコピーペーストして、saveボタンで記録してください。

#!bin/sh
printf "password: "
read password

TIME_A=`date +%s`  

# install ORCA
echo "$password" | sudo -S wget -q https://ftp.orca.med.or.jp/pub/ubuntu/archive.key
sudo apt-key add archive.key
sudo wget -q -O \
/etc/apt/sources.list.d/jma-receipt-trusty48.list \
https://ftp.orca.med.or.jp/pub/ubuntu/jma-receipt-trusty48.list
sudo apt-get update
sudo apt-get -y dist-upgrade
echo "$password" | sudo -S apt-get install -y jma-receipt
wget https://ftp.orca.med.or.jp/pub/data/receipt/outline/update/claim_update.tar.gz
tar xvzf claim_update.tar.gz
sudo bash claim_update.sh
sudo jma-setup
sudo service jma-receipt start
sudo apt-get install -y panda-client2

# install OpenDolphin
sudo apt-get update
sudo apt-get install curl
sudo curl -sSL https://get.docker.com/|sh
sudo service docker start
sudo docker pull dolphindev/postgres
sudo docker pull dolphindev/wildfly
sudo docker run --name dolphin-db -P -d dolphindev/postgres
sudo docker run --name dolphin-server --link dolphin-db:ds -p 8080:8080 -d dolphindev/wildfly

sudo service jma-receipt stop
sudo gedit /etc/postgresql/9.3/main/postgresql.conf
sudo gedit /etc/postgresql/9.3/main/pg_hba.conf 
sudo service postgresql stop 
sudo service postgresql start
sudo dpkg-reconfigure jma-receipt 
sudo service jma-receipt start
sudo ufw disable

# ORCApasswordの設定
sudo -u orca /usr/lib/jma-receipt/bin/passwd_store.sh

TIME_B=`date +%s`   
PT=`expr ${TIME_B} - ${TIME_A}`
H=`expr ${PT} / 3600`
PT=`expr ${PT} % 3600`
M=`expr ${PT} / 60`
S=`expr ${PT} % 60`
echo "${H}:${M}:${S}"

エディターを終了し、ファイルが記録されているか確認します。

$ cat dorca.sh

確認できたら、あとで接続設定で必要となるIPアドレスを記録しておきます。
端末をもう一つ開いて、ifconfigで仮想マシンIPアドレスを確認。
次にVMware等仮想化ソフトを動かしているOS(僕はWindows10)のIPアドレスを確認しておきます。
メモしておきましょう。
それでは、シェルスクリプトを実行します。

$ sh dorca.sh

つぎつぎスクリプトが実行されていきます。前半はORCAのインストール、後半はDockerのインストールとOpenDolphinに必要なDockerImageのダウンロード、コンテナの実行です。とりあえずここではDockerとかコンテナとかわからなくて問題ありません。
途中で確認入力を要求されたらy[yes]と入れてください。
後半でORCAのデータベースPostgresの設定画面が開きます。

59行目、listen_addressesの前の'#'をはずし、仮想化ソフトを動かしているOS(僕はWindows10)のアドレスを追加します。
f:id:r_beginner:20161207181433j:plain
保存して終了します。次に別の設定ファイルが起動します。
f:id:r_beginner:20161207182323j:plain
最終行に'host all all 0.0.0.0/0 trust'を追加して、保存して終了します。

CLAIMサーバーの設定は、No、No、の次が下の画面になるのでYes、
f:id:r_beginner:20170226143834j:plain
Portはそのまま
f:id:r_beginner:20170226143841j:plain

最後にORCAのパスワードを確認されますので8桁以上のパスワードを入力しましょう。
これでサーバーの準備は完了です。

OpenDolphinクライアントのインストール

次のURLからクライアントソフトをダウンロードします。Javaバージョン8の実行環境が必要なので予めインストールしておいてください。
https://i18n.opendolphin.com/dolphin/client/OpenDolphin.zip

glclient2の設定

Ubuntuランチャーの一番上のボタンを押して、glclient2を検索
f:id:r_beginner:20161119154709j:plain
起動したら、先程入力したORCAのパスワードを入力してください。
f:id:r_beginner:20161119155003j:plain
01 医療事務ボタンを押すと、下記画面になります。
f:id:r_beginner:20161119155458p:plain
91マスタ登録から、101システム管理マスタを開き、管理コード9000CLAIM接続情報を選び、何度かEnterを押して確定。
f:id:r_beginner:20161207190702j:plain
CLAIM接続するを選び、送信アドレスに、OpenDolphinクライアントのIPアドレス(Win10)を入力、受付ポート5002を入力し登録します。
f:id:r_beginner:20161207190824j:plain

OpenDolphinクライアントの設定

ログイン画面から設定を選び
f:id:r_beginner:20161207191300p:plain
サーバー設定では、サーバーの欄に仮想マシンIPアドレスを入力
f:id:r_beginner:20161207191429p:plain
レセコン設定では、レセコンとの接続をクライアントにして、IPアドレス仮想マシンIPアドレス、ポート番号8210、リッスンアドレスをDolphinクライアントのIPアドレス(Win10)として保存。
f:id:r_beginner:20161207191727p:plain

以上で設定は終了です。使い方はORCAのサイトを参考に。
テスト患者をORCAから入力してみましょう。OpenDolphinのメインウインドウに患者が出力されました。これでORCAとOpneDolphinのCLAIM接続は成功です。
f:id:r_beginner:20161207192152j:plain

Enjoy!!

ORCA(日医標準レセプトソフト)の導入

当院では使用しておりませんが、ORCAというレセプトソフトがあります。ちょっと触ってみたいと思っても、Ubuntuにインストールするのでやや敷居が高い感じです。
今回は仮想マシンで環境構築してみます。
まずVMwareにUbuntu14.04LTSを準備します。

OSの準備

そのままだと日本語入力ができないようなので、
下記サイトを参考にmozc使えるようにしておきましょう。
OS右上のキーボードマークを押してください。

f:id:r_beginner:20161204112112j:plain
configureを選択。

f:id:r_beginner:20161204112139j:plain
➕ボタンを押して、

f:id:r_beginner:20161204112149j:plain
Only Show Current Languageのチェックを外し、Search Input Methodにmozcと入力、Mozcを選択しOK。

f:id:r_beginner:20161204112304j:plain
上矢印ボタンでMozcを一番上に移動し終了です。

ORCAのインストール

ここからORCAのインストールです。
このサイトに書いてあるとおり勧めます。
www.orca.med.or.jp

UbuntuにはWindowsのバッチのような、シェルスクリプトがあるので使ってみましょう。
まず端末を立ち上げて。(Ctrl+Alt+T)
orca.shファイルを作ります。

$ gedit orca.sh

エディターが起動します。
f:id:r_beginner:20161204113403j:plain
このエディターに下のスクリプトをコピペして、記録してください。

#!bin/sh

sudo wget -q https://ftp.orca.med.or.jp/pub/ubuntu/archive.key
sudo apt-key add archive.key
sudo wget -q -O \
/etc/apt/sources.list.d/jma-receipt-trusty48.list \
https://ftp.orca.med.or.jp/pub/ubuntu/jma-receipt-trusty48.list
sudo apt-get update
sudo apt-get -y dist-upgrade
sudo apt-get install -y jma-receipt
wget https://ftp.orca.med.or.jp/pub/data/receipt/outline/update/claim_update.tar.gz
tar xvzf claim_update.tar.gz
sudo bash claim_update.sh
sudo jma-setup
sudo service jma-receipt start
sudo apt-get install -y panda-client2

# passwordの設定
# sudo -u orca /usr/lib/jma-receipt/bin/passwd_store.sh

確認してみます。

$ cat orca.sh

実行はshコマンド

$ sh orca.sh

つぎつぎにコマンドが実行されて、ORCA環境が作成されます。
最後にスクリプトコメントアウトしておいた、パスワードの設定コマンドを入力

$ sudo -u orca /usr/lib/jma-receipt/bin/passwd_store.sh

これで準備は整いました。

クライアントソフト

glclient2を立ち上げます。
f:id:r_beginner:20161204145613j:plain

先ほど決めたパスワードを入力
f:id:r_beginner:20161204145630j:plain

レセプトソフトORCA仮想マシン上でたちあがりました。
f:id:r_beginner:20161204150028p:plain

つぎにネットワーク上の他のPCからレセコンを立ち上げます。
Windows機の場合は、下記からJava Web start版をインストールしてください。

ORCA Project: monsiaj(日医標準レセプトソフトクライアント)

立ち上げたあとは、仮想マシンのコンソールからifconfigでIPaddress確認し、
f:id:r_beginner:20161204150906j:plain

アプリの接続画面にアドレス入力
f:id:r_beginner:20161204151009p:plain

接続すると
f:id:r_beginner:20161204151120p:plain
上手く起動しました。

ORCAデータの定期的バックアップと、復元方法をマスターしてしまえば、業者に委託せずとも管理できそうです。あとは医療事務さんの同意が得られれば、現在のシステムから移行できるかな…。

参考:

  • Ubuntu Desktop 日本語 Remixのダウンロード

https://www.ubuntulinux.jp/download/ja-remix

  • Ubuntu server 14.04で日本語入力できない

Ubuntu server 14.04で日本語入力できない - pandazx's blog