#InterSystems IRIS for Health

0 フォロワー · 887 投稿

InterSystems IRIS for Health™は、世界で最も重要なデータを管理する医療アプリケーションの迅速な開発を目的に特別に設計された世界初、かつ唯一のデータプラットフォームです。 トランザクションの処理と分析、拡張可能な医療データモデル、FHIRベースのソリューション開発、医療情報の相互運用性に関わる標準規格への対応など、すぐに使える強力な機能を搭載しています。 これらすべての機能により、開発者は価値を実現し、画期的なアプリケーションをすばやく構築することができます。 詳細はこちらをご覧ください

InterSystems公式 Seisuke Nakahashi · 8月 1, 2024

インターシステムズは、InterSystems IRIS、InterSystems IRIS for Health、HealthShare Health Connect のメンテナンスバージョン 2024.1.1 をリリースしました。2024.1.1 は 2024.1.0 に対するバグフィックスを提供しています。詳細な情報は、以下のページをご参照ください(すべて英語版です)

InterSystems IRIS
InterSystems IRIS for Health
HealthShare Health Connect
 

【キットのご案内】
本製品は、従来からのインストーラパッケージ形式と、コンテナイメージ形式をご用意しています。その一覧は、サポートプラットフォームページをご覧ください。

インストーラパッケージは WRC Direct から入手できます。InterSystems IRIS、IRIS for Health は IRIS ダウンロードページから、HealthShare Health Connect は HealthShare ダウンロードページから、それぞれ入手してください。

コンテナイメージは InterSystems Container Registry から入手できます。コンテナイメージには 2024.1 のタグが付けられています。

0
0 62
記事 Megumi Kakechi · 7月 28, 2024 2m read

これは InterSystems FAQ サイトの記事です。
通常SQLCODE -114(一致する行が既に別のユーザにロックされています)のエラーはロックが競合した場合に発生します。

こちらはレコードロック競合があったり、ロック閾値を超える更新を行いテーブルロックに昇格した際に、そのテーブルレコードに対して別のプロセスよりSelectを行い共有ロックを取ろうとして失敗した(ロック待ちがタイムアウトとなった)場合に発生します。

Selectで共有ロックを取る場合というのは、IRIS の ISOLATION LEVEL がREAD COMMITTED(デフォルトはREAD UNCOMMITTED)で、Selectを行った場合です。

例:Sample.Personテーブルにテーブルロックがかかった状態で以下を実行する場合

0
0 157
記事 Megumi Kakechi · 7月 23, 2024 4m read

これは InterSystems FAQ サイトの記事です。
 

JDBC および ODBC 経由でInterSystemsIRISから外部データベースにアクセスしたい場合、SQLゲートウェイを使用しリンクテーブルを作成して接続できます。

2023.1以降のバージョンでは、リンクテーブルに加えて、外部テーブル/FOREIGN TABLE を使用することが可能となりました(2024.1時点で実験的機能)。

外部テーブルというのは、物理的に別の場所に保存されているデータを IRIS SQL に投影する非常に便利な機能です。
外部テーブルを使用する場合は、Java(2023.1の場合は1.8~)を事前にインストールし、JAVA_HOME環境変数を設定するだけで、簡単に接続することが可能です。

※JAVA_HOME環境変数設定例:
 


外部テーブルの使用方法については、以下の記事で紹介しております。
レシピデータセットを外部テーブルで読み込み、組み込みPythonでLLMを使って分析する (Langchain + OpenAI)
 

こちらの記事では、外部テーブルで作成できる2種類のテーブル(「CSVファイル直接接続」と「外部DBへのJDBCゲートウェイ経由での接続」)の簡単なサンプル作成例と、外部テーブルの特徴を紹介しています。
 

0
0 223
記事 Mihoko Iijima · 7月 16, 2024 9m read

これは InterSystems FAQ サイトの記事です。

管理ポータル > [システム管理] > [セキュリティ] 以下の設定は、%SYSネームスペースにあるSecurityパッケージ以下クラスが提供するメソッドを利用することでプログラムから作成することができます。

以下シナリオに合わせたセキュリティ設定例をご紹介します。

シナリオ:RESTアプリケーション用設定を作成する

事前準備

シナリオの中で使用するソースを2種類インポートします。

アプリケーション用RESTディスパッチクラスをインポートします。

0
0 142
記事 Megumi Kakechi · 7月 16, 2024 2m read

これは InterSystems FAQ サイトの記事です。
 

SQLゲートウェイの接続設定は管理ポータルで作成できますが、プログラムでも作成が可能です。

管理ポータル:
[システム管理] > [構成] > [接続性] > [SQLゲートウェイ接続]

こちらのトピックでは、ODBC/JDBCそれぞれの設定をプログラムで行う方法をご紹介します。


--- SQL Gateway for ODBC ----

set gc = ##class(%SQLConnection).%New()
 set gc.Name = "test"set gc.DSN = "IRIS User"set gc.Usr = "_system"set gc.pwd = "SYS"set gc.bUnicodeStream = 1set gc.useCOALESCE = 1write gc.%Save()
 


--- SQL Gateway for JDBC ----

0
0 153
記事 Mihoko Iijima · 7月 11, 2024 4m read

これは InterSystems FAQ サイトの記事です。

管理ポータル > [システム管理] > [セキュリティ] 以下の設定は、%SYSネームスペースにあるSecurityパッケージ以下クラスが提供するメソッドを利用することでプログラムから作成することができます。

ユーザ設定については、Security.UsersクラスCreate()メソッドを使えば作成できますが、ユーザを作成するだけでは適切な権限が付与されずに目的のデータにアクセスできない状況もあります。

例)testAユーザ作成

%SYS>set st=##class(Security.Users).Create("testA",,"testA","これはテストユーザです","USER")

%SYS>write st
1

上記メソッドで作成した結果は以下の通りです。(ロール付与無し、テーブルに対する権限の割り当てもなしの状態)

 

以降の解説では、以下のシナリオをもとにした設定を行っていきます。

シナリオ:アプリケーション開発者用ロールとユーザを作成する

1) アプリケーション開発者のtestAは、USERネームスペースにログインするアプリケーション開発者です(=%DevelopmentリソースのUse許可を与えます)。

0
0 96
InterSystems公式 Seisuke Nakahashi · 7月 10, 2024

InterSystems Reports 24.1 がリリースされ、WRC の Components エリアから入手いただけるようになりました。本製品は InterSystems Reports Designer と InterSystems Reports Server と表記されており、Mac OSX、Windows、Linux 版を入手いただけます。  

この新バージョンには、弊社パートナーの insightsoftware 社によるすばらしい拡張機能が含まれています。InterSystems Reports 24.1 は Logi Report 24.1 SP2 をベースにしており、以下の機能が含まれます。

0
0 80
記事 Megumi Kakechi · 7月 10, 2024 5m read

これは InterSystems FAQ サイトの記事です。
 

こちらの記事では、「IRISでシャドウイングの代わりにミラーリングを構成する方法」を紹介しました。

今回は、「プログラムでシャドウイングの代わりにミラーリングを構成する方法(Windows版)」を紹介します。
【今回のサンプル・ミラー構成について】

  正サーバ(ミラー・プライマリ) 副サーバ(ミラー・非同期)
ミラー名 MIRRORSET MIRRORSET
ミラーメンバ名 MACHINEA MACHINEC
IPアドレス 35.77.84.159 54.248.39.237


では、ミラーの構成手順をご紹介します。手順は以下になります。
 

<ミラーリングのプライマリ設定>     // MACHINEA(正サーバ)

1. ISCAgentの自動起動設定および起動         ※Windowsコマンドプロンプトで実行

C:\Users\Administrator>sc config ISCAgent start=auto
C:\Users\Administrator>sc start ISCAgent

 

2. [システム管理] > [構成] > [ミラーサービスの有効化]     ※IRISターミナルで実行

0
0 220
記事 Mihoko Iijima · 7月 9, 2024 2m read

これは InterSystems FAQ サイトの記事です。

メッセージログ(messages.log)/コンソールログ(cconsole.log) に以下のようなメッセージが表示される場合があります。

03/22/18-14:27:34:624 (1851) 2 [SYSTEM MONITOR] WriteDaemon Alert: Write Daemon still on pass 320186

このメッセージ出力は、ライトデーモンのデータベースファイルへの書き込み処理の遅延を示しています。
その原因としては、ディスクI/O負荷が高く、そのI/O要求量に対してディスク処理性能が不足していることが考えられます。

ディスクI/O負荷の原因としては以下が考えられます。

  • アプリケーションによるデータへの更新や参照処理が集中した
  • アンチウイルスソフトのスキャンやデータベースバックアップソフト等によるディスクへのI/O負荷

もしアンチウイルスソフトがインストールされている場合は、「アンチウイルスソフト(セキュリティソフト)のスキャンから除外してほしいリスト」に記述している情報を参考に、InterSystems製品の対象ファイルをスキャンの対象外に設定変更してください。

0
0 106
お知らせ Mihoko Iijima · 7月 8, 2024

開発者の皆さん、こんにちは!

次のInterSystems プログラミングコンテストの内容についてご案内します📣

🏆 InterSystems Python コンテスト 🏆

期間:2024年7月15日~2024年8月4日

賞金総額:$14,000


0
0 179
記事 Mihoko Iijima · 7月 7, 2024 4m read

これは InterSystems FAQ サイトの記事です。

監査ログはシステムDB内テーブル(%SYS.Audit)に記録されていますので、そのテーブルに対するクエリを実行して抽出したり、%SYS.Auditテーブルに用意されていストアドプロシージャを利用して情報を取得しファイル出力するようにプログラムを用意することもできます。

以下にご紹介する内容は「監査ログをプログラムで出力(ユーザやイベント指定など)する方法」に関連した内容で、監査ログのファイル出力を管理ポータルの機能を利用した例とプログラムを利用した例でご紹介します。

 

1. 管理ポータルの印刷機能を使う

管理ポータル > [システムエクスプローラ] > [SQL]を開き、%SYSネームスペースに接続します。

システムのチェックを入れ、スキーマに%SYSを指定した後、プロシージャの階層を展開するとプロシージャリストが参照できます。

%SYS.Audit_ で始まるプロシージャが監査ログに対して実行できるプロシージャです。

SQL文例)InterSystems製品内ユーザのSuperUserに対する監査ログをストアドプロシージャ:%SYS,Audit_ListByUser を利用して出力しています。

call %SYS.Audit_ListByUser(,,,,,'SuperUser')
0
0 144
記事 Mihoko Iijima · 7月 4, 2024 9m read

これは InterSystems FAQ サイトの記事です。

PythonスクリプトファイルやPythonで記述されたIRIS内メソッドを呼び出す際、エラーが発生した場合の対応方法をご紹介します。

説明使用するコードや資料PDFは公開しています👉 test1.pyFS.Utilsクラスコードのコピー元ビデオで解説している資料PDF

Embedded Python 自習用ビデオをご用意しています(項目別にYouTubeプレイリストをご用意しています)。

各プレイリストについて詳しくはこちらをご参照ください👉【はじめてのInterSystems IRIS】Embedded Python セルフラーニングビデオシリーズ公開!

0
0 385
記事 Mihoko Iijima · 7月 4, 2024 2m read

これは InterSystems FAQ サイトの記事です。

InterSystems製品のサーバサイドでファイル入出力を行うと、文字列はシステムで設定されたファイル入出力用文字コードに自動変換され、文字単位でREADします。

ファイルから入力する文字をバイト単位で操作するためには、自動変換を行わない無変換の状態でファイル入力を行い指定バイトずつ読みながら読んだ分だけUnicodeに手動で変換していく必要があります。

変換には$ZCONVERT()関数を使用します。($ZCONVERT()には省略形があり$ZCVT()でも同様の操作が行えます。)

なお、READした指定バイトを変換する際、文字の全バイトが含まれない場合もあるため、途中までの読み取りになった文字列を第4引数に指定する変数に設定できるようになっています。
次回読み取り時に途中だった文字を自動的に先頭に追加し、$ZCONVERT()の処理を実行します。

《メモ》ファイル入出力の文字コードについては、以下管理ポータルの画面で確認できます。
管理ポータル > 構成 > 国際言語設定 > 構成したデフォルト値
 入力/出力テーブルの表の「ファイル」

以下の文章がファイルにUTF8で保存されているとします。

2024/4/19:強風でしたが良い天気でした
0
0 143
記事 Megumi Kakechi · 7月 1, 2024 6m read

これは InterSystems FAQ サイトの記事です。
 

IRIS2024.1以降のバージョンをインストールしようとした際に、以下のようなエラーになることがあります。

This CPU is not supported by this version of IRISHealth, which requires “AVX” and “BMI” CPU instructions.


これは、2024.1以降のバージョンより最小CPUの条件として、AVX および BMI 拡張命令が含まれることが条件となっているのですが、ご使用の環境に含まれない(仮想環境やFTサーバ等の特殊なシステムでは無効化されている場合も)ときに出力されるエラーです。

最小CPUサポートバージョンについては、以下のドキュメントをご覧ください。
Minimum Supported CPU

現在使用中のCPUの拡張命令セットの情報の確認方法については、以下のDC記事をご覧ください。
CPU のマイクロアーキテクチャファミリと命令セットの判定方法


Linuxの場合は、lscpuコマンド、または lshw -class processor コマンドで確認できます。

実行例:

0
0 331
記事 Mihoko Iijima · 3月 11, 2024 2m read

これは InterSystems FAQ サイトの記事です。

現時点(2024年3月)では、コミュニティに掲載されているPythonライブラリ「iris-dollar-list」を利用することでIRISの$LIST()形式のデータをPythonのリストとして利用することができます。

※標準ツールではありませんがご利用いただけます。詳細はコミュニティの記事「もう1つの $ListBuild() の実装:Pythonライブラリ「iris-dollar-list」」をご参照ください。

WindowsにインストールしたIRISで使用する場合は、以下の方法で「iris-dollar-list」をインストールしてください。

※Windows以外にインストールしたIRISでは、pipコマンドを利用した通常の方法でインストールできます。

コマンドプロンプトを開き、以下実行します。(IRISをデフォルトインストールしたときのディレクトリで掲載しています)

>cd C:\InterSystems\IRIS\bin> irispip install --target C:\InterSystems\IRIS\mgr\python iris-dollar-list

実行例は以下の通りです。

1
1 180
記事 Toshihiko Minamoto · 6月 12, 2024 4m read

はじめに

先日、@Patrick Jamieson が開催した素晴らしいハンズオンに参加してきました。そこでは、SMART On FHIR が定義したプロトコルに従って Angular アプリケーションを IRIS FHIR サーバーとともに構成したセッションでした。非常に深い興味を得たため、独自に Andular アプリケーションを開発し、そこから学んだことを活用してコミュニティに共有することにしました。

SMART On FHIR

SMART On FHIR について Google ではどのように説明しているのか見てみましょう。

SMART On FHIR は電子健康記録(EHR)システムの情報にアプリケーションがアクセスできるようにするためのデータ規格です。 アプリケーション開発者は、その規格を採用した EHR システムに接続する単一のアプリケーションを作成できます。

SMART On FHIR では、以下の主な概念を処理します。

  • OAuth2 または OpenID による代理認証と承認。
  • 定義されたコンテキストにおける FHIR リソースの操作。
  • HTTPS 通信。

プロジェクトのアーキテクチャ

この演習では、Docker と Auth0 サービスの両方で以下の要素を構成しました。

  • フロントエンドとして機能する Angular で開発されたアプリケーション。このアプリケーションは SMART On FHIR の原則に従って開発されています。
  • Angular で開発されたアプリケーションを公開する NGINX Web サーバーおよびリバースプロキシ。
  • Auth0 が提供する OAuth2 による認証および承認サービス。
  • FHIR サーバーをデプロイし、Docker イメージですでに提供されている Apache サーバーを含む Web ゲートウェイを通じて接続する InterSystems IRIS。

Auth0

ユーザーの認証と承認をこの目的でデプロイされた別の IRIS サーバーに委任することもできますが、ここでは、Auth0 が提供するサービスを使用することにします。

Auth0 とは?

Auth0 は、プラットフォームの認証と承認を処理するメカニズム全体を提供するサービスです。

Auth0 には、あらゆるプロジェクトに簡単に統合できる多様な言語に特化したライブラリもあるため、SMART On FHIR に基づく開発において必ず考慮できるオプションです。

アプリケーションでの Auth0 の使用

OAuth2 の使用は SMART On FHIR を使用するための必要要件であるため、認証、承認、およびアプリケーションアクセスの通常のプロセスに OAuth2 サーバーを含める必要があります。 以下の図は、Auth0 サービスを使ってシステムに送信される情報が辿るパスを示しています。

では、プロセスを分析しましょう。

  • ログインリクエスト:
    1. ログインリクエスト: ユーザーがインターネットブラウザを使用してアプリケーションにアクセスし、ログインをリクエストします。
    2. ログインリクエスト: Angular アプリケーションがそのリクエストを Auth0 サービスに転送します。
    3. ログインページ: Auth0 がユーザーのインターネットブラウザを開発者が作成したページにリダイレクトします。
  • Auth0 での認証:
    1. ユーザー認証情報: ユーザーが、Auth0 に登録されたメールアドレスとパスワードを入力します。
    2. 認証と承認: Auth0 がデータを検証し、ユーザーに割り当てられたコンテキストを含む Access_token を生成します。
    3. Access_token のレスポンスとリダイレクト: Auth0 が生成されたトークンを含むレスポンスをプロジェクト構成に指定された URL にリダイレクトします。
    4. 患者の画面: Angulaar アプリケーションが、個人情報を登録するページをユーザーに表示します。
  • FHIR リソースレコード:
    1. 患者の保存: ユーザーが個人情報をフォームに入力し、Angular アプリケーションがフォームを FHIR Patient リソースのフォーマットで JSON オブジェクトに変換します。
    2. POST リクエスト: Angular アプリケーションが IRIS にデプロイされている FHIR サーバーに、認証トークンとしての access_token をリクエストヘッダーに含めて HTTP POST 呼び出しを送信します。
    3. POST レスポンス: Web ゲートウェイを通じて POST リクエストを受け取ると、IRIS はトークンの有効性とリクエストのコンテキストをチェックします。 すべてが正しければ、受信したリソースを検証して FHIR サーバーに登録し、新しいリソースの作成を示す HTTP 201 を返します。 また、ヘッダーに、新しいリソースに割り当てられた識別子が含められます。
    4. 処理成功: Angular アプリケーションが、主な機能を示す画面にユーザーをリダイレクトします。

ログインが完了すると、プロジェクトに含まれる Auth0 ライブラリが、FHIR サーバーに対して発行するすべてのリクエストを傍受し、Auth0 から受け取るアクセストークンを含めます。

今後の予定

次の記事では、関りのある各システムを構成し、最終的に Angular アプリケーションに接続する方法を説明します。 記事の公開を待ちきれない方は、この記事にリンクされた OpenExchange プロジェクトに関連付する GitHub で README.md をお読みください。Auth0 と InterSystems IRIS の両方を構成する方法が詳しく説明されています。

Awfully Good: Stay Tuned (1992) with John Ritter

0
0 127
記事 Megumi Kakechi · 6月 11, 2024 6m read

SSL/TLS を使用するように InterSystems IRIS スーパーサーバを構成した際に、「管理ポータルに接続できなくなった」というお問い合わせを時々いただきます。
こちらの記事では、その際の対処法をご案内します。


スーパーサーバを SSL/TLS 化するために、以下のドキュメントにある方法を設定されると思います。
TLS を使用するための InterSystems IRIS スーパーサーバの構成

その際に、SSL/TLSサポートレベル  を 「必須」にしてしまうと、管理ポータルに接続できなくなる場合があります。

    
※管理ポータル:
     IRIS2024.1 ~ [システム管理] > [セキュリティ] > [スーパーサーバ]
     ~IRIS2023.1  [システム管理] > [セキュリティ] > [システム・セキュリティ] > [システムワイドセキュリティパラメータ]


「必須」に設定する場合、すべてのクライアントからの接続を SSL/TLS 化する必要があります。
これは、WebゲートウェイからIRISへの接続にもあてはまるため、「Webゲートウェイ <==> IRIS」間を SSL/TLS 設定していない場合は、管理ポータル(REST/CSPを含む)に接続ができなくなってしまいます。

0
0 215
記事 Tomoko Furuzono · 6月 6, 2024 2m read

これは、InterSystems FAQサイトの記事です。

IRIS/IRIS for Health2024.1以降のバージョンのSQLで、JSON_TABLE関数がサポートされています。
【ドキュメント】JSON_TABLE(SQL)

これを使用することにより、JSON形式データを表形式で取得することが出来ます。
【例】郵便番号情報を外部から取得し、表形式にマッピングする。
(取得データ(JSON))

{
	"message": null,
	"results": [
		{
			"address1": "東京都",
			"address2": "新宿区",
			"address3": "西新宿",
			"kana1": "トウキョウト",
			"kana2": "シンジュクク",
			"kana3": "ニシシンジュク",
			"prefcode": "13",
			"zipcode": "1600023"
		}
	],
	"status": 200
}

(SQL例)
 ※下記の実行には、SSL構成が必要になります。事前に構成を作成して、その構成名を使用してください。

0
0 122
InterSystems公式 Ayumu Tanaka · 6月 2, 2024 2m read

InterSystems IRIS® データ・プラットフォーム 2022.3 からライセンス消費メカニズムにRESTとSOAPを追加しました。この変更により、コア・ベースライセンス以外でRESTまたはSOAPを使用している場合、アップグレード後にライセンス消費量が多くなる可能性があります。この勧告がお使いのシステムに該当するかどうかは、以下にあるFAQ(英語)のリンクをご参照ください。.

ライセンス使用について、こちらの表にまとめています。

製品

REST と SOAP のリクエストがライセンスを消費するかどうか

InterSystems Caché®

する

InterSystems Ensemble®

しない

InterSystems IRIS, InterSystems IRIS® for Health, Health Connect  2022.3 より前

しない

InterSystems IRIS, InterSystems IRIS for Health, Health Connect 2022.3 以降

する

 

0
0 295
お知らせ Mihoko Iijima · 3月 26, 2024

開発者の皆さん、こんにちは。

(2024/5/30:6月の日時、ウェビナー内容を更新しました)

InterSystems IRIS、InterSystems IRIS for Healthの新バージョン2024.1がリリースされました。

様々な機能の追加や実験的機能としての追加が行われましたが、その中から以下3種類の内容についてウェビナーを開催します!📣

✅4月23日(火)13時半~14時:IRIS 2024.1の管理用Webサーバ(PWS)廃止に備えて

YouTube公開しました👉https://youtu.be/bVwWZt1oNws?list=PLzSN_5VbNaxCeC_ibw2l-xneMCwCVf-Or

✅5月30日(木)13時半~14時:ベクトル検索機能のご紹介

YouTube公開しました👉https://youtu.be/v0G7K2et_Yk?list=PLzSN_5VbNaxB39_H2QMMEG_EsNEFc0ASz

✅6月25日(火)13時半~14時:FHIR新機能のご紹介~2024.1~

オンデマンド配信はこちら👉https://event.on24.com/wcc/r/4597704/ADA161B6446E6BA01623C875CF596FD0
(資料PDFもオンデマンド配信画面よりダウンロードいただけます)
 

2
0 208
記事 Toshihiko Minamoto · 5月 28, 2024 6m read

前回の記事では特定の HIS のデータベースに格納されたリソースを取得する方法を確認したので、今回は、HIS に、システムで受け取る FHIR リソースを起点とする新しいレコードを追加する方法を説明します。

FHIR の CRUD 操作

FHIR の主な機能の 1 つに、Rest API による CRUD 操作のサポートがあります。つまり、FHIR と連携するすべてのシステムには、GET、POST、PUT、および DELETE タイプの HTTP 呼び出しがサポートされていなければなりません。 この記事では、FHIR アダプターをインストールした際に自動的に構成されたエンドポイントへの POST 呼び出しを処理する方法を見てみましょう。

FHIR のリソースストレージ呼び出しに関する仕様を確認すると、呼び出しに使用する URL は、以下のフォーマットを使用している必要があります。

http(s)://server_url/{endpoint}/{Resource}

この記事の例では、セキュリティで保護された呼び出しは行わないため、以下のような URL になります。

http://localhost:52774/Adapter/r4/Patient

ここで行いたいのは新しい患者を記録することであるため、呼び出しの本文に患者のデータを含めた POST 呼び出しを行う必要があります。 application/fhir+xml として問題なく XML 形式を使用することもできますが、この場合の呼び出しのフォーマットは application/fhir+json とします。

患者のリソースの保存

前回の記事ですでに Patient リソースの定義を確認したのでここでは繰り返しません。ここでは、整形済みのテスト患者がどのように見えるかを確認しましょう。 ここで見るのは以下の患者です。

{
    "resourceType": "Patient",
    "address": [
        {
            "city": "SALAMANCA",
            "line": [
                "CALLE LAMENTOS 2 1ºA"
            ],
            "postalCode": "45021"
        }
    ],
    "birthDate": "1988-01-23",
    "gender": "F",
    "identifier": [
        {
            "type": {
                "text": "NHC"
            },
            "value": "803987"
        },
        {
            "type": {
                "text": "DNI"
            },
            "value": "87654321F"
        }
    ],
    "name": [
        {
            "family": "SANZ LÓPEZ",
            "given": [
                "REBECA"
            ]
        }
    ],
    "telecom": [
        {
            "system": "phone",
            "value": "699850017"
        },
        {
            "system": "email",
            "value": "rebek1988@hotmail.com"
        }
    ]
}

ご覧のように、Postman からサーバーのエンドポイントに送信する Patient タイプの Resource です。

200 を受け取り、患者が HIS に登録されたので、Patient テーブルを確認しましょう。

ここに、POST リクエストに対するレスポンスで受け取った識別子で HIS に正しく記録された Rebecca があります。 では、本番環境にアクセスし、FHIR メッセージが IRIS 内で通過したパスを確認しましょう。

IRIS での Patient リソースの操作

ここまでで、FHIR リソースをサーバーのエンドポイントに送信する方法を見てきました。では、受け取った FHIR リソースをどのように解釈し、特定の HIS に挿入するために変換できるかを確認しましょう。

まず、本番環境の構成をもう一度確認しましょう。

メッセージは InteropService から届き、ProcessFHIRBP に転送されます。そこで、FromAdapterToHIS が呼び出され、対応する操作が実行されます。 では、受信したメッセージのトレースを確認しましょう。

ここでは、受信したメッセージの詳細を確認できます。ご覧のように、Patient エンドポイントに HTTP POST リクエストが届いており、QuickStreamId に値があることがわかります。メッセージは Stream に格納されていることが示されています。

BO はこのメッセージをどのように処理するのでしょうか?

elseif (requestData.Request.RequestPath [ "Patient")
  {
    if (requestData.Request.RequestMethod = "POST")
    {
      If requestData.QuickStreamId '= "" {
        Set quickStreamIn = ##class(HS.SDA3.QuickStream).%OpenId(requestData.QuickStreamId,, .tSC)
    <span class="hljs-keyword">set</span> dynamicPatient = <span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%DynamicAbstractObject</span>).<span class="hljs-built_in">%FromJSON</span>(quickStreamIn)

    <span class="hljs-keyword">set</span> sc = <span class="hljs-built_in">..InsertPatient</span>(dynamicPatient, .response)
  }      
}
<span class="hljs-keyword">elseif</span> (requestData.Request.RequestMethod = <span class="hljs-string">"GET"</span>)
{
  <span class="hljs-keyword">set</span> patientId = <span class="hljs-built_in">$Piece</span>(requestData.Request.RequestPath,<span class="hljs-string">"/"</span>,<span class="hljs-number">2</span>)
  <span class="hljs-keyword">set</span> sc = <span class="hljs-built_in">..GetPatient</span>(patientId, .response)
}

}

非常に単純です。受信したリクエストから得られる情報をもって、メッセージを適切なメソッドにリダイレクトできます。Patient リソースからの特定のリクエストであることとメソッドが POST であることを確認できるため、メッセージを格納している Stream を取得してそれを %DynamicObject に変換します。以下では、InsertPatient メソッドからこれを処理します。そのメソッドのコードを見てみましょう。

Method InsertPatient(dynamicPatient As%DynamicAbstractObject, Output patient As Adapter.Message.FHIRResponse) As%Status
{
  Set tSC = $$$OKkill pResp
  set pResp=$$$NULLOREFset sqlInsert="INSERT INTO his.patient (name, lastname, phone, address, city, email, nhc, postal_code, birth_date, dni, gender) values (?,?,?,?,?,?,?,?,?,?,?)"//perform the Insertset tSC = ..Adapter.ExecuteUpdate(.nrows, sqlInsert, dynamicPatient.%Get("name").%Get(0).%Get("given").%Get(0), dynamicPatient.%Get("name").%Get(0).%Get("family"), dynamicPatient.%Get("telecom").%Get(0).value, 
    dynamicPatient.%Get("address").%Get(0).%Get("line").%Get(0), dynamicPatient.%Get("address").%Get(0).%Get("city"), dynamicPatient.%Get("telecom").%Get(1).value, dynamicPatient.%Get("identifier").%Get(1).value, 
    dynamicPatient.%Get("address").%Get(0).%Get("postalCode"), dynamicPatient.%Get("birthDate"), dynamicPatient.%Get("identifier").%Get(2).value, dynamicPatient.%Get("gender"))

set sql="SELECT id, name, lastname, phone, address, city, email, nhc, postal_code, birth_date, dni, gender FROM his.patient WHERE nhc = ?"//perform the Selectset tSC = ..Adapter.ExecuteQuery(.resultSet, sql, dynamicPatient.%Get("identifier").%Get(1).value)

If resultSet.Next() { set personResult = {"id":(resultSet.GetData(1)), "name": (resultSet.GetData(2)), "lastname": (resultSet.GetData(3)), "phone": (resultSet.GetData(4)), "address": (resultSet.GetData(5)), "city": (resultSet.GetData(6)), "email": (resultSet.GetData(7)), "nhc": (resultSet.GetData(8)), "postalCode": (resultSet.GetData(9)), "birthDate": (resultSet.GetData(10)), "dni": (resultSet.GetData(11)), "gender": (resultSet.GetData(12)), "type": ("Patient")} } else { set personResult = {} }

//create the response messagedo patient.Resource.Insert(personResult.%ToJSON())

<span class="hljs-keyword">Return</span> tSC

}

ご覧のように、最初に行うのは、HIS の Patient テーブルへの挿入です(誰かがその患者が存在しないことを確認済みであると仮定しましょう)。挿入が完了したら、この患者に対して生成された識別子を取得してリクエストを送信したクライアントアプリケーションにそれを返すために、同じテーブルで SELECT を実行します。 レスポンスメッセージを完成させるために、最も関連性があると思われるフィールドを取得できます。

取得した患者データとともに、クライアントに返すことのできる Patient タイプリソースを生成するために必要な変換を実行する BP に戻ります。

変換については、前の記事をご覧ください。

リソースが生成されたら、レスポンスに含めてクライアントアプリケーションに戻す Stream に変換します。

ご覧のように、非常に簡単です。患者リソースからデータを取得し、対応するテーブルに挿入するだけです。 最後に、登録されたオブジェクトを、GET リクエストで行ったのと同じ方法で返します。

次の記事では、Bundle またはリソースセットを処理する方法を説明します。 お読みいただきありがとうございました!

0
0 122
記事 Megumi Kakechi · 5月 27, 2024 4m read

こちら の記事では、LinuxでODBC接続を行う方法  をご紹介しました。

今回は、SSL/TLS を使用するように InterSystems IRIS スーパーサーバを構成 した IRIS に対して、ODBCで SSL/TLS 接続をする方法をご紹介します。

LinuxでODBC接続を行う方法 の記事で紹介している手順で、SSL/TLS なしでODBC接続できる環境を用意していることを前提にご説明します。

手順は以下のようになります。手順の詳細は、この後で説明します。

1.CA証明書を用意します

2.TLS 構成ファイルの設定を行います

3.TLS 構成ファイル odbcssl.ini を作成します

4.環境変数 ISC_SSLconfigurations で <path>/odbcssl.ini を指定します

5.IRISへのODBC接続確認をします


1.CA証明書を用意します

CA証明書に問題がないか証明書情報を確認します。
※ ***.***.***.*** :接続先IRISサーバのIPアドレス

0
0 0
記事 Megumi Kakechi · 5月 24, 2024 4m read

こちら の記事では、LinuxでJDBC接続を行う方法  をご紹介しました。

今回は、SSL/TLS を使用するように InterSystems IRIS スーパーサーバを構成 した IRIS に対して、JDBCで SSL/TLS 接続をする方法をご紹介します。

LinuxでJDBC接続を行う方法 の記事で紹介している手順で、SSL/TLS なしでJDBC接続できる環境を用意していることを前提にご説明します。

手順は以下のようになります。手順の詳細は、この後で説明します。

1.CA証明書を用意します

2.Java キーストアに証明書をインポートします

3.Java ファイルを含むディレクトリに、SSLConfig.properties という名前の構成ファイルを作成ます

4.Java のコードに SSL/TLS の使用を指定する設定を追加します


1.CA証明書を用意します

最初に、CA証明書を用意します。証明書に問題がないか証明書情報を確認します。
※ ***.***.***.*** :接続先IRISサーバのIPアドレス

0
0 437
記事 Toshihiko Minamoto · 5月 23, 2024 11m read

HealthShare、HealthConnect、および InterSystems IRIS ユーザーが使用できる FHIR アダプターツールに関する連載記事を再開しましょう。

前回の記事では、ワークショップをセットアップした小さなアプリケーションを紹介し、FHIR アダプターをインストールした後に IRIS インスタンスにデプロイされたアーキテクチャを説明しました。 この記事では、最も一般的な CRUD(作成、読み取り、更新、削除)操作の 1 つである読み取り操作を実行する方法の例を確認します。ここではリソースの取得によって行います。

リソースとは?

FHIR のリソースはある種の臨床情報です。この情報は、患者(Patient)、臨床検査へのリクエスト(ServiceRequest)、または診断(Condition)などです。 各リソースはそれを構成するデータのタイプのほか、データの制約や他のリソースタイプとの関係を定義します。 リソースごとに、それが格納する情報の拡張が可能であるため、FHIR ポリシーの範囲外のニーズに 80% 対応できます(ユーザーの 80% が使用する要件に対応)。

この記事の例では、最も一般的なリソースである Patient を使用します。 その定義を確認しましょう。

{
  "resourceType" : "Patient",
  // from Resource: id, meta, implicitRules, and language
  // from DomainResource: text, contained, extension, and modifierExtension
  "identifier" : [{ Identifier }], // An identifier for this patient
  "active" : <boolean>, // Whether this patient's record is in active use
  "name" : [{ HumanName }], // A name associated with the patient
  "telecom" : [{ ContactPoint }], // A contact detail for the individual
  "gender" : "<code>", // male | female | other | unknown
  "birthDate" : "<date>", // The date of birth for the individual
  // deceased[x]: Indicates if the individual is deceased or not. One of these 2:
  "deceasedBoolean" : <boolean>,
  "deceasedDateTime" : "<dateTime>",
  "address" : [{ Address }], // An address for the individual
  "maritalStatus" : { CodeableConcept }, // Marital (civil) status of a patient
  // multipleBirth[x]: Whether patient is part of a multiple birth. One of these 2:
  "multipleBirthBoolean" : <boolean>,
  "multipleBirthInteger" : <integer>,
  "photo" : [{ Attachment }], // Image of the patient
  "contact" : [{ // A contact party (e.g. guardian, partner, friend) for the patient
    "relationship" : [{ CodeableConcept }], // The kind of relationship
    "name" : { HumanName }, // I A name associated with the contact person
    "telecom" : [{ ContactPoint }], // I A contact detail for the person
    "address" : { Address }, // I Address for the contact person
    "gender" : "<code>", // male | female | other | unknown
    "organization" : { Reference(Organization) }, // I Organization that is associated with the contact
    "period" : { Period } // The period during which this contact person or organization is valid to be contacted relating to this patient
  }],
  "communication" : [{ // A language which may be used to communicate with the patient about his or her health
    "language" : { CodeableConcept }, // R!  The language which can be used to communicate with the patient about his or her health
    "preferred" : <boolean> // Language preference indicator
  }],
  "generalPractitioner" : [{ Reference(Organization|Practitioner|
   PractitionerRole) }], // Patient's nominated primary care provider
  "managingOrganization" : { Reference(Organization) }, // Organization that is the custodian of the patient record
  "link" : [{ // Link to a Patient or RelatedPerson resource that concerns the same actual individual
    "other" : { Reference(Patient|RelatedPerson) }, // R!  The other patient or related person resource that the link refers to
    "type" : "<code>" // R!  replaced-by | replaces | refer | seealso
  }]
}

ご覧のように、実質的に患者のすべての管理情報のニーズに対応しています。

HIS から患者の取得

前回の記事を覚えていれば、HIS システムのデータベースをシミュレーションする PostgreSQL データベースをデプロイしました。特定の HIS にあるサンプルテーブルを確認してみましょう。

多くはありませんが、ここでの例には十分です。 patient テーブルをもう少し詳しく見てみましょう。

ここに、3 つの患者の例があります。ご覧のように、それぞれに一意の識別子(ID)のほか、医療組織に関連性のある一連の管理データがあります。 最初の目標は、1 人の患者の FHIR リソースを取得することです。

患者のクエリ

サーバーから患者データをリクエストするにはどうすればよいでしょうか? FHIR が作成した実装仕様によると、サーバーのアドレス、リソース名、および識別子を使って REST 経由で URL に GET を実行する必要があり、 以下のように呼び出す必要があります。

http://SERVER_PATH/Patient/{id}

この例では、Juan López Hurtado という患者を検索します。この患者の ID は 1 であるため、呼び出す URL は以下のようになります。

http://localhost:52774/Adapter/r4/Patient/1

テストするには、クライアントとして Postman を使用します。 サーバーのレスポンスを確認しましょう。

{
    "resourceType": "Patient",
    "address": [
        {
            "city": "TERUEL",
            "line": [
                "CALLE SUSPIROS 39 2ºA"
            ],
            "postalCode": "98345"
        }
    ],
    "birthDate": "1966-11-23",
    "gender": "M",
    "id": "1",
    "identifier": [
        {
            "type": {
                "text": "ID"
            },
            "value": "1"
        },
        {
            "type": {
                "text": "NHC"
            },
            "value": "588392"
        },
        {
            "type": {
                "text": "DNI"
            },
            "value": "12345678X"
        }
    ],
    "name": [
        {
            "family": "LÓPEZ HURTADO",
            "given": [
                "JUAN"
            ]
        }
    ],
    "telecom": [
        {
            "system": "phone",
            "value": "844324239"
        },
        {
            "system": "email",
            "value": "juanitomaravilla@terra.es"
        }
    ]
}

次に、本番環境内でリクエストが通過した経路を詳しく見てみましょう。

ルートは以下のようになっています。

  1. BS InteropService にリクエストが到着。
  2. BS の宛先として構成し、受信した呼び出しの患者識別子がクエリされる BP に転送。
  3. BO FromAdapterToHIS から HIS データベースにクエリ。
  4. 患者データを BP に転送し、それを FHIR Patient リソースに変換。
  5. レスポンスを BS に転送。

BP ProcessFHIRBP で受信するメッセージのタイプを見てみましょう。

クライアントからどの種類のオペレーションをリクエストされたかを特定するための鍵となる 3 つの属性を見てみましょう。

  • Request.RequestMethod: どの種のオペレーションを実行するかを示します。 この例では、患者の検索は GET になります。
  • Request.RequestPath: この属性には、サーバーに届いたリクエストのパスが含まれ、操作するリソースを示します。この場合、取得するための具体的な識別子が含まれます。
  • Quick.StreamId: FHIR Adapter は Stream に届いたすべての FHIR メッセージを変換し、この属性に保存される識別子が割り当てられます。 この例では、GET を実行しており、FHIR オブジェクトを送信していないため、これは必要ありません。

処理を行う GLP を詳しく分析して、メッセージの流れをさらに見ていきましょう。

ProcessFHIRBP:

本番環境に、ビジネスサービスから受け取る FHIR メッセージングを管理する BPL を実装しました。 どのように実装されているか見てみましょう。

ステップごとに実行する操作を見てみましょう。

FHIR オブジェクトの管理:

HIS データベースへの接続とデータベースクエリを処理する BO FromAdapterToHIS を呼び出します。

Method ManageFHIR(requestData As HS.FHIRServer.Interop.Request, response As Adapter.Message.FHIRResponse) As%Status
{
  set sc = $$$OKset response = ##class(Adapter.Message.FHIRResponse).%New()

if (requestData.Request.RequestPath = "Bundle") { If requestData.QuickStreamId '= "" { Set quickStreamIn = ##class(HS.SDA3.QuickStream).%OpenId(requestData.QuickStreamId,, .tSC)

    <span class="hljs-keyword">set</span> dynamicBundle = <span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%DynamicAbstractObject</span>).<span class="hljs-built_in">%FromJSON</span>(quickStreamIn)

    <span class="hljs-keyword">set</span> sc = <span class="hljs-built_in">..GetBundle</span>(dynamicBundle, .response)
  }

} elseif (requestData.Request.RequestPath [ "Patient") { if (requestData.Request.RequestMethod = "POST") { If requestData.QuickStreamId '= "" { Set quickStreamIn = ##class(HS.SDA3.QuickStream).%OpenId(requestData.QuickStreamId,, .tSC)

    <span class="hljs-keyword">set</span> dynamicPatient = <span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%DynamicAbstractObject</span>).<span class="hljs-built_in">%FromJSON</span>(quickStreamIn)

    <span class="hljs-keyword">set</span> sc = <span class="hljs-built_in">..InsertPatient</span>(dynamicPatient, .response)
  }      
}
<span class="hljs-keyword">elseif</span> (requestData.Request.RequestMethod = <span class="hljs-string">"GET"</span>)
{
  <span class="hljs-keyword">set</span> patientId = <span class="hljs-built_in">$Piece</span>(requestData.Request.RequestPath,<span class="hljs-string">"/"</span>,<span class="hljs-number">2</span>)
  <span class="hljs-keyword">set</span> sc = <span class="hljs-built_in">..GetPatient</span>(patientId, .response)
}

} Return sc }

BO は受信した HS.FHIRServer.Interop.Request タイプのメッセージを確認します。この場合は、GET を設定して、Partient リソースに対応するパスに、以下の GetPatient メソッドが呼び出されることを示して確認します。

Method GetPatient(patientId As%String, Output patient As Adapter.Message.FHIRResponse) As%Status
{
  Set tSC = $$$OKset sql="SELECT id, name, lastname, phone, address, city, email, nhc, postal_code, birth_date, dni, gender FROM his.patient WHERE id = ?"//perform the Selectset tSC = ..Adapter.ExecuteQuery(.resultSet, sql, patientId)

If resultSet.Next() { set personResult = {"id":(resultSet.GetData(1)), "name": (resultSet.GetData(2)), "lastname": (resultSet.GetData(3)), "phone": (resultSet.GetData(4)), "address": (resultSet.GetData(5)), "city": (resultSet.GetData(6)), "email": (resultSet.GetData(7)), "nhc": (resultSet.GetData(8)), "postalCode": (resultSet.GetData(9)), "birthDate": (resultSet.GetData(10)), "dni": (resultSet.GetData(11)), "gender": (resultSet.GetData(12)), "type": ("Patient")}

} else { set personResult = {} }

//create the response messagedo patient.Resource.Insert(personResult.%ToJSON())

<span class="hljs-keyword">Return</span> tSC

}

ご覧のように、このメソッドは HIS のデータベースにクエリを発行し、すべての患者情報を取得してから後で String に変換されて Adapter.Message.FHIRResponse タイプの変数に格納される DynamicObject を生成します。 後でトレースでレスポンスを表示できるように、Resource プロパティを String リストとして定義しました。 直接 DynamicObjects として定義し、後続の変換を省略することもできます。

Bundle かどうかの確認:

BO からのレスポンスによって、Bundle タイプであるか(今後公開される記事で説明します)単なる Resource であるかをチェックします。

DynamicObject の作成:

BO レスポンスを DynamicObject に変換し、それを一時コンテキスト変数(context.temporalDO)に割り当てます。 変換に使用される関数は以下のとおりです。

##class(%DynamicAbstractObject).%FromJSON(context.FHIRObject.Resource.GetAt(1))

FHIR の変換:

DynamicObject タイプの一時変数を使用して、クラス HS.FHIR.DTL.vR4.Model.Resource.Patient のオブジェクトへの変換を行います。 他のタイプのリソースを探す場合は、タイプごとに特定の変換を定義する必要があります。 では、変換を確認しましょう。

この変換によって、BS InteropService が解釈するオブジェクトが得られます。 結果を context.PatientResponse 変数に格納します。

Stream へのリソースの割り当て:

FHIR の変換で取得した変数 context.PatientResponse を Stream に変換します。

QuickStream への変換:

response 変数に、クライアントに戻す必要のあるすべてのデータを割り当てます。

set qs=##class(HS.SDA3.QuickStream).%New()
 set response.QuickStreamId = qs.%Id()
 set copyStatus = qs.CopyFrom(context.JSONPayloadStream)
 set response.Response.ResponseFormatCode="JSON"set response.Response.Status=200set response.ContentType="application/fhir+json"set response.CharSet = "utf8"

この場合、200 レスポンスを常に返します。 本番環境では、検索されたリソースが正しく取得されたことを確認し、取得されていない場合は、レスポンスのステータスを 200 から「見つかりません」に対応する 404 に変更します。 このコード箇所で見られるように、オブジェクト HS.FHIR.DTL.vR4.Model.Resource.Patient
は Stream に変換されて、 HS.SDA3.QuickStream として格納されます。そのオブジェクトの識別子を QuickStreamID 属性に追加されるため、その後 InteropService サービスによって結果を JSON として正しく戻せるようになります。

まとめ:

この記事で行ったことをまとめましょう。

  1. GET タイプのリクエストを送信して、定義された ID を持つ Patient リソースを検索しいました。
  2. BS InteropService は構成済みの BP にリクエストを転送しました。
  3. BP は、HIS データベースを操作する BO を呼び出しました。
  4. 構成済みの BO は、HIS データベースから患者データを取得しました。
  5. BP は結果を、デフォルトの InteropService が作成された BS によって理解可能なオブジェクトに変換しました。
  6. BS はレスポンスを受け取り、クライアントに転送しました。

ご覧のように、操作は比較的単純で、より多くのタイプのリソースをサーバーに追加する場合、BO に取得される新しいリソースに対応するデータベースのテーブルにクエリを追加し、BO の結果を対応する HS.FHIR.DTL.vR4.Model.Resource.* タイプのオブジェクトに変換する処理を BP に含めます。

次の記事では、Patient タイプの新しい FHIR リソースを HIS データベースに追加する方法を説明します。

お読みいただきありがとうございました!

0
0 141
記事 Toshihiko Minamoto · 5月 21, 2024 4m read

さて、FHIR アダプターの使用例に戻り、この記事では、IRIS インスタンスでの構成方法とインストールの結果を確認したいと思います。

プロジェクトの構成手順は公式ドキュメントで指示されているものと同じなので、直接こちらで確認できます。 では作業に移りましょう!

インストール

この記事に関連するプロジェクトでわかるように、IRIS インスタンスを Docker でデプロイしています。そのため最初の構成の主な部分は Dockerfile で行います。 Docker 構成については詳しく確認しないため、気にする必要はありません。

FHIR アダプターをインストールする手順は、たったこれだけです。

  1. 相互運用性機能を備えた IRIS インスタンスに ADAPTER というネームスペースを作成します。
  2. IRIS ターミナルで、そのネームスペースにアクセスして以下のコマンドを実行します。
set status = ##class(HS.FHIRServer.Installer).InteropAdapterConfig("/Adapter/r4")

ここでは、REST リクエストを受信する IRIS エンドポイントの URL を /Adapter/r4 と定義しました。

インストール結果

FHIR アダプターのインストールが完了したら、IRIS インスタンスで何が起きたかを確認できます。 これを行うには、まず Web アプリケーションメニュー(システム管理 -> セキュリティ -> アプリケーション -> Web アプリケーション)を確認します。

ご覧のように、新しい Web アプリケーションがリストに追加されており、ADAPTER ネームスペースに対応しているのがわかります。 では、これにアクセスしてその構成をさらに詳しく見てみましょう。

作成された Web アプリケーションでは REST 呼び出しの受信が有効になっており、これらの呼び出しを管理するクラスは HS.FHIRServer.HC.FHIRInteropAdapter となっています。 また、パスワード認証と認証なしの呼び出しの両方が有効になっているのもわかります。 この例では何も変更しいませんが、JWT 認証がすべての本番環境で有効になっていると興味深いでしょう。

本番のネームスペースで何か起きたか見てみましょう。

インストールによって、ビジネスサービス InteropService とビジネスオペレーション InteropOperation という 2 つの新しいコンポーネントが作成されてデプロイされました。 この例では、受信した FHIR メッセージを転送する InteropService のみを使用します。これはクラス HS.FHIRServer.Interop.Request であり、受信した情報の抽出で使用するものです。 InteropService が JSON レスポンスを返すために受信する必要のあるレスポンスのタイプは HS.FHIRServer.Interop.Response です。

「HIS」の構成

前回の記事で、理論上の HIS で相互運用性をシミュレーションすると述べました。このために、Docker には一連のテストテーブルを含む PostgreSQL インスタンスをデプロイしています。 この外部データベースにクエリを発行するために Java ゲートウェイを含めて構成したため、必要な JDBC 接続を確立できます。 また、PostgreSQL との接続に使用する JAVA ライブラリも含めました。

では、この接続を管理する本番コンポーネントを見てみましょう。

Docker にデプロイした Java 仮想マシンを指すように構成された Java ゲートウェイがあります。

ビジネスオペレーション FromAdapterToHIS によって、PostgreSQL へのクエリが処理されるため、その構成を確認しましょう。

ご覧のように、Adapter クラスとして EnsLib.SQL.OutboundAdapter を使用しているため、「HIS」のデータベースに直接接続することができます。 DSN 値は、Docker にデプロイされた PostgreSQL インスタンスへの接続文字列になります。

まとめると...

この記事で行ったことをもう一度確認しましょう。

  1. ネームスペースに FHIR アダプターをインストールし、FHIR メッセージの送信先となるエンドポイントがあることを確認しました。
  2. 本番ネームスペースにデフォルトで作成されたコンポーネント(InteropService と InteropOperation)を確認しました。
  3. 「HIS」データベースとやり取りするのに必要なコンポーネントを作成しました。

この手順により、JSON 形式で FHIR メッセージを受信し始める準備がすべて整いました。 次の記事では、受信したメッセージを処理するビジネスプロセスを作成し、PostgreSQL データベースの照会と書き込みに必要な様々な機能を実装します。

お読みいただきありがとうございました!

0
0 138
記事 Mihoko Iijima · 5月 20, 2024 2m read

InterSystems製品のバックアップ方法の中の4つの目方法は「コールドバックアップ」です。

InterSystems製品を停止できるときに利用できるバックアップ方法です。別サーバに環境を移植するときや、コミュニティエディションから製品版キットのインストール環境にデータベースを移植する場合などにもお使いいただけます。

 

バックアップ手順

1. InterSystems製品を停止する

2. バックアップしたいデータベースを退避する

3. InterSystems製品を開始する

 

既存環境から新環境へ移植する場合などの手順

1. 既存環境のInterSystems製品を停止する。

既存環境の設定など含めて全てを新環境に移植する場合は、以下記事の退避内容をご確認いただき、ご準備ください。

2. 新環境にInterSystems製品をインストールする。

1. の手順でコピーしていた情報をもとに、新環境の構成を設定します。

3. 新環境のInterSystems製品を停止する。

4. 既存環境のデータベースファイル(.DAT)を新環境の対象となるデータベースディレクトリに配置する(置換する)

対象:ユーザ用DB

5. 新環境のInterSystems製品を開始する。

0
0 106
記事 Mihoko Iijima · 5月 20, 2024 5m read

InterSystems製品のバックアップ方法の中の3つの目方法は、「並行外部バックアップ」についてです。

この方法は外部バックアップと異なり、スナップショットなどのストレージ機能がない環境に向いている方法でオンラインバックアップよりも高速にバックアップできます。(古いバージョンのInterSystems製品でも利用できるバックアップ方法です。)

ただし、バックアップやリストア手順が複雑になります。

並行外部バックアップの利用を検討される際は、事前にリストア手順についてもテスト環境などでご確認いただくことを推奨します。

 

並行外部バックアップ概要

データベースファイル(.DAT)を通常のコピーコマンドなどで退避します。

データベースファイルのサイズによってはコピー時間が長くなります。外部バックアップの方法を利用するとライトデーモン凍結時間のタイムアウトを迎えてしまうため、バックアップを正しく完了できません。

そのため並行外部バックアップでは、ライトデーモンの凍結を行わずデータベースのダーティコピーを行う方法を採用しています。

ダーティコピーのバックアップファイルだけでは不完全であるため、最後にオンラインバックアップの差分バックアップを行うことで完全なバックアップを取得します。

最後の手順に差分バックアップを行うため、オンラインバックアップと同様にデータベースリストを事前に作成する必要があります。

0
0 169
記事 Mihoko Iijima · 5月 16, 2024 27m read

この記事は、「インターシステムズ製品をバックアップする前に確認したいこと」に続く記事で、InterSystems製品のバックアップの手法の中の「オンラインバックアップ」の仕組みと、バックアップ・リストア手順について解説します。

オンラインバックアップは、InterSystems製品が用意するバックアップ機能を利用する方法で、バックアップ対象に設定した全データベースの使用済ブロックをバックアップする方法です。

InterSystems製品のデータベースには、サーバ側で記述したコード、テーブル定義/クラス定義、データ(レコード、永続オブジェクト、グローバル)が格納されていますので、これらすべてが1つのファイルにバックアップされます。

0
0 321
記事 Mihoko Iijima · 5月 16, 2024 26m read

開発者の皆さん、こんにちは。

この記事は、「インターシステムズ製品をバックアップする前に確認したいこと」に続く記事で、InterSystems製品のバックアップの手法の中の「外部バックアップ」の仕組みと、バックアップ・リストア手順について解説します。

まず、「外部バックアップ」とは、InterSystems製品の専用ルーチン使用せず、InterSystems製品以外のバックアップソリューションを使用してデータベースをバックアップする方法で、現時点の推奨されるバックアップ方法です。

詳細な説明、手順については、ドキュメント「外部バックアップ」をご参照ください。

外部バックアップでは、主に、論理ディスク・ボリュームの有効な "スナップショット" を迅速に作成するテクノロジと共に使用します。

例えば、

  • Windowsサーバの場合は、VSS(ボリューム・シャドウ・コピー・サービス)と組み合わせて利用する
  • AWSのEBS Snapshotと組み合わせて利用する

スナップショット・テクノロジが使用できないシステムであっても、後述する「特別な考慮」で対応できればご利用いただけます。

それでは早速、外部バックアップの前後で必要となるIRIS側の手続きと、バックアップとリストアについて確認していきましょう!

0
0 311