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アドレスを入力します。
conquest serverのrestartがわからず。コンテナのrestart。
$ sudo docker restart conquest
今度はホストPC上のクライアントソフト(KPACS:DICOMviewer)の設定です。
右上のDICOMsettingボタンを押して、DICOMconfigurationsで、仮想マシンのIPアドレスを入力し設定保存します。
KPACSのQuery→Networkタブを選択→Conquestにチェック→Search filterのSearchボタンを押してみましょう。テストデータが見えました。
接続成功です。
本当は、データベースをSQLiteからMySQLに変更したかったのですが、dicom.iniファイルを変更してから、もろもろの処理ができず、お手上げ状態でした。Windowsの場合はConquestのソフトでMySQLにデータベース変更したり、データベースの初期化ができるのですが、Linuxコマンドでは上手く行きませんでした。わかる人がいたら教えて欲しい…
参考:
- Conquest:Conquest DICOM software
- Docker conquest:https://hub.docker.com/r/wavedrift/docker-conquest/
- Ubuntu 12.04 LTS上へのConquestのインストール及び運用の記録:Ubuntu 12.04 LTS上へのConquestのインストール及び運用の記録
PostgreSQLとRstudio環境構築
正直PostgreSQLは、ほぼ触ったことがありません。
ただ医師会のレセコン(ORCA)や、オープンソース電子カルテのOpenDolphinはPostgreSQLを利用しており、これからレセコン・電子カルテデータをいじるのに避けては通れません。
はじめて操作した電子カルテはMySQLだったのですが、使い始めはSQLの文法より何より、データベースサーバー・クライアントのインストール等の環境構築で手間取った記憶があります。もちろん細かいこともあとから勉強必要ですが、データベースにアクセスして操作する楽しみを少しでも早く感じれるように、環境構築の時間を可能な限り短くしたいものです。
今回PostgreSQLでSQLの練習前に、簡単に早く環境構築(PostgreSQL+Rstudio)することを目標に書いてみました。
準備するもの
時代はUbuntuです。Dockerのオーバーヘッドを減らすためメインPCのWindowsをUbuntuに上書きするか(無茶?)、仮想マシン(VMware等)にUbuntuOSをインストールしておいてください。僕はUbuntu64bit16.04LTSをインストールした仮想マシンを用意しました。
インストールからの流れ
- Dockerいれる
- PostgreSQLコンテナ走らせる
- 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
2つのコンテナともstatusはupで大丈夫のようです。
ホストマシン(僕はWindows)のブラウザにDockerをインストールした[IPアドレス]とポート[8787]と入力します。
例)192.168.0.5:8787
UsernameとPasswordは共にrstudioです。接続できたら新規ファイルを作成。
新規ファイルに下記のスクリプトをコピペしてください。
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
r_testというデータベースが確認できました。
つながらないときは、プロパティを確認してみましょう。
一応、別の方法でも。
仮想マシンの端末からpostgresコンテナ内に入り、コマンドで確認します。
$ sudo docker exec -it postgres bash # psql -U postgres r_test r_test=# \det+
空っぽのデータベースが見えました。大丈夫そうです。
あとは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)。
シェルスクリプトを書き込むdorca.shファイルを作ります。
$ gedit dorca.sh
エディターが立ち上がりましたね。ここに下記のスクリプトをコピーペーストして、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)のアドレスを追加します。
保存して終了します。次に別の設定ファイルが起動します。
最終行に'host all all 0.0.0.0/0 trust'を追加して、保存して終了します。
CLAIMサーバーの設定は、No、No、の次が下の画面になるのでYes、
Portはそのまま
最後にORCAのパスワードを確認されますので8桁以上のパスワードを入力しましょう。
これでサーバーの準備は完了です。
OpenDolphinクライアントのインストール
次のURLからクライアントソフトをダウンロードします。Javaバージョン8の実行環境が必要なので予めインストールしておいてください。
https://i18n.opendolphin.com/dolphin/client/OpenDolphin.zip
ORCA(日医標準レセプトソフト)の導入
当院では使用しておりませんが、ORCAというレセプトソフトがあります。ちょっと触ってみたいと思っても、Ubuntuにインストールするのでやや敷居が高い感じです。
今回は仮想マシンで環境構築してみます。
まずVMwareにUbuntu14.04LTSを準備します。
OSの準備
そのままだと日本語入力ができないようなので、
下記サイトを参考にmozc使えるようにしておきましょう。
OS右上のキーボードマークを押してください。
configureを選択。
➕ボタンを押して、
Only Show Current Languageのチェックを外し、Search Input Methodにmozcと入力、Mozcを選択しOK。
上矢印ボタンでMozcを一番上に移動し終了です。
ORCAのインストール
ここからORCAのインストールです。
このサイトに書いてあるとおり勧めます。
www.orca.med.or.jp
UbuntuにはWindowsのバッチのような、シェルスクリプトがあるので使ってみましょう。
まず端末を立ち上げて。(Ctrl+Alt+T)
orca.shファイルを作ります。
$ gedit orca.sh
エディターが起動します。
このエディターに下のスクリプトをコピペして、記録してください。
#!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を立ち上げます。
先ほど決めたパスワードを入力
つぎにネットワーク上の他のPCからレセコンを立ち上げます。
Windows機の場合は、下記からJava Web start版をインストールしてください。
ORCA Project: monsiaj(日医標準レセプトソフトクライアント)
立ち上げたあとは、仮想マシンのコンソールからifconfigでIPaddress確認し、
アプリの接続画面にアドレス入力
接続すると
上手く起動しました。
ORCAデータの定期的バックアップと、復元方法をマスターしてしまえば、業者に委託せずとも管理できそうです。あとは医療事務さんの同意が得られれば、現在のシステムから移行できるかな…。
参考:
- Ubuntu Desktop 日本語 Remixのダウンロード
https://www.ubuntulinux.jp/download/ja-remix
- Ubuntu server 14.04で日本語入力できない
DockerでRとMySQLの環境構築(Ubuntu16.04LTS仮想マシン編)
RとMySQLをDockerで動かす練習です。
今回はUbuntu 16.04 LTSで環境作ります。
まずVMwareでUbuntu64bit16.04LTSの仮想マシンを作っておきます。
端末から、
$ 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
パッケージでDockerインストールするときは
$ sudo apt-get install docker.io
では、次に以前も紹介したHadley packageの入ったrocker/hadleyverse(Docker image)を入れます。
$ sudo docker run -d -p 8787:8787 -v ~:/home/rstudio rocker/hadleyverse
データベースはMySQLにします。
$ sudo docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql
ちゃんとうごいているか確認
$ sudo docker ps
大丈夫みたいです。STATUSはUPになってます。
Dockerコンテナのip addressを確認して。
$ ifconfig
さてRstudioをブラウザから動かして見ましょう。
ブラウザのアドレスバーに[ip address]:8787と入力します。
Rstudio serverが立ち上がりましたね。
Username,Passwordはどちらも"rstudio"で。
Consoleからでも、PackagesタブのInstallボタンでも良いので
install.packages("RMySQL")
まずはMySQLに接続するためのパッケージをインストール。
実際データベースを操作してみましょう。
Rstudioに新規ファイルを作り、下記コードをコピペしてください。
library(RMySQL) con <- dbConnect(MySQL(), host="[ip address]", port=3306, dbname="mysql", user="root", password="mysql") dbGetQuery(con,"SHOW DATABASES;") dbGetQuery(con,"CREATE DATABASE rbeginner;") dbGetQuery(con,"SHOW DATABASES;") dbDisconnect(con) # 終わったらconnectionは切りましょう
順番にRUNボタンで実行すると。最初の"SHOW DATABASES;"ではなかったものが、2回めにできていますね。
本当にMySQLにrbegginerのデータベースができているでしょうか?
もういちどUbuntu端末に戻ります。
$ sudo docker exec -it mysql bash
mysqlコンテナに入ります。
# mysql -u root -pmysql
mysql> show databases;
できていますね。Dockerは環境構築が簡単なので良いですね。
Rで画像処理~magick package
最近、ホームページもRmarkdownで書くようになりました。凝ったものは必要ないし、修正するのも楽だし、Rstudioで全て済ませられるので満足してます。ただホームページに貼り付ける画像を編集するのに、他の画像ソフトを立ち上げるのはやや面倒だなとは感じていました。でも、もうほかのソフトは必要ないかもしれません、magick packageがあれば…
画像の入出力
パッケージを読み込んでから、画像を取り込みます。
先日頂いた、えび味噌ラーメン画像です。
library(magick) ramen <- image_read('img/ebi_miso.jpg')
Rstudioのviewerに出力するには、ramenとそのまま打ち込むだけです。
コンソールには画像の情報も一緒に出力されます。
画像の情報だけ欲しい場合は、image_infoを使います。
image_info(ramen)
ちなみに画像の出力は、image_writeを使います。
image_write(ramen,path='img/ebi_miso.png',format='png')
画像の処理
画像のサイズ変更は、image_scaleで。
library(dplyr) image_scale(ramen, "200") %>% image_browse() # width: 300px image_scale(ramen, "x200") %>% image_browse() # height: 300px
画像の回転、鏡像はimage_rotate,image_flip,image_flopで。
image_rotate(ramen, 45) image_flip(ramen) image_flop(ramen)
画像のフィルター、効果は、image_blur,image_noiseで。
image_blur(ramen, 10, 5) image_noise(ramen)
画像のテキスト注釈
上の写真のようなテキストを付けるのは、image_annotateを使います。
ramen %>% image_annotate(.,'text!!',size=70,gravity='northeast',color='green')
画像の結合
ラーメン画像を3枚用意します(ramen1,ramen2,ramen3)。
3つの画像をcombineしてから、image_appendするのですが、画像の大きさが、まちまちかもしれないので、image_scaleで高さをそろえてからappendしてください。
img <- c(ramen1,ramen2,ramen3) image_append(image_scale(img, "x200"))
レイヤー
Photoshopみたいにレイヤーを重ねたりできます。
logo <- image_read("https://www.r-project.org/logo/Rlogo.png") image_scale(ramen, "500") ->ramen500 image_scale(logo, "300") ->logo300 img <- c(ramen500 ,logo300) image_mosaic(img)
アニメーション
先ほどのラーメン画像3枚でパラパラアニメです。image_animateを使用します。
img <- c(ramen1,ramen2,ramen3) image_animate(image_scale(img, "200x200"), fps = 1, dispose = "previous")
試してない機能もまだまだあります。
ラスター画像に変換し、ggplotに貼り付けたりもできるようです。
まとめ
簡単な画像処理は、Rでできそうです。
たくさんの画像に同じ処理するような場合には、効率よいですね。
繰り返し作業は画像ソフトより、可能な限りRで済ませたいものです。
ggmapで位置情報を可視化
電子カルテ用のPCはインターネットに接続されていないものが多いです。セキュリティーの問題もありやむを得ないのですが…。ただ折角の患者位置情報を可視化できないのはもったいないことです。Rでは、leaflet packageでインタラクティブな地図にプロットもできますがインターネット接続が必要となりますので、今回は静的な地図へのプロットをggmap packageで練習します。
練習用のデータ(コンビニ位置情報)は、下記から入手しました。
http://www.sinfonica.or.jp/kanko/estrela/refer/s29/index.html
あらかじめtokyo3.csvというファイル名で保存しておきます。
df<- read.csv("tokyo3.csv",header = F) colnames(df) <- c("name","address","lon","lat")
こんなデータフレームになります。
address | name | lon | lat |
---|---|---|---|
ファミリーマート練馬駅西口店 | 東京都練馬区練馬1丁目15-1 | 139.6525 | 35.73847 |
セブンイレブン練馬3丁目店 | 東京都練馬区練馬3-1-10 | 139.6504 | 35.73736 |
ローソンストア100練馬3丁目店 | 東京都練馬区練馬3-1-7 | 139.6504 | 35.73736 |
まずは背景となる地図をget_map関数でゲットします。地図の中心は東京駅(lat=35.6813023,lon=139.7640529)とします。
library(ggmap) lon_tokyo <- 139.7640529 lat_tokyo <- 35.6813023 map <- get_map(location=c(lon_tokyo,lat_tokyo), zoom=10,maptype = "terrain",source = c("google"))
地図の表示はggmap関数です。
ggmap(map)
get_mapの引数maptypeはいろいろ選択できます。
詳しくは、ここを参照。
https://github.com/dkahle/ggmap/blob/master/R/get_map.R
先ほどのコンビニ位置データ(df)をプロットします。geom_pointで点を載せてみましょう。
ggmap(map) + geom_point(aes(x=lon, y=lat), data=df, size=1, colour='red')
ここから一工夫。東京駅から10キロ圏内のコンビニをプロットしてみましょう。
二点間の距離が分かればいいのですが、どうすれば良いのでしょう。
ちゃんと緯度経度から距離を計算するヒュベニの公式がというものがあるのですね…
関数を作るのが面倒であれば下記サイトを参考にしてください。ちゃんとRの関数が載っています(MIT Licenseとのことです)
二地点の緯度・経度からその距離を計算する(日本は山だらけ〜)
東京駅からの距離カラム(dist)を追加します。
address | name | lon | lat | dist |
---|---|---|---|---|
ファミリーマート練馬駅西口店 | 東京都練馬区練馬1丁目15-1 | 139.6525 | 35.73847 | 11923.65 |
セブンイレブン練馬3丁目店 | 東京都練馬区練馬3-1-10 | 139.6504 | 35.73736 | 12020.09 |
ローソンストア100練馬3丁目店 | 東京都練馬区練馬3-1-7 | 139.6504 | 35.73736 | 12020.09 |
10キロ以内のデータを抽出すると
ggmap(map) + geom_point(aes(x=lon, y=lat), data=df[df$dist <=10000,], size=1, colour='red')
ここまでできれば、診療圏調査も簡単です。
クリニックからの距離毎に来院患者数を出したり、患者年齢層で色分けしたり、新患がどこから来ているか調べたり…
看板も効果的に設置できますね。