クリアフィルター
記事
Tomoko Furuzono · 2023年4月11日
これは、InterSystems FAQサイトの記事です。管理ポータルの監査メニューを使用する場合、ユーザに監査データベースの閲覧のみを許可するということはできません。管理ポータルから監査データベースを閲覧する場合は、そのユーザに、・%Admin_Secure:U(監査以外にもセキュリティ関連の操作が可能となる)・%DB_IRISAUDIT:RW(監査データベースへの読み込み/書き込み権限)等のリソースへの権限が必要になりますが、これを与えることにより、監査データベースの閲覧以外の操作も可能となってしまいます。
監査データベースの閲覧のみを許可したい場合には、管理ポータルの監査メニューは使用せず、外部ツール等からSQLで監査テーブルを参照するようにします。このとき、ユーザに必要な権限は以下の通りです。※他の権限は与えないようにします。・IRISAUDITデータベースへのRW権限 ⇒ %DB_IRISAUDITロールの付与・%SYS.AuditテーブルへのSelect権限
1.新規ロールの作成必要な2つの権限のみを含むロールを作成します。
(1)新規作成システム管理>セキュリティ>[新規ロール作成]>名前入力>[保存]↓(2)作成したロールに%DB_IRISAUDITロールを割り当てるロールの定義編集>Assigned Toタブ>%DB_IRISAUDITを選択して[割り当てる]
(3)作成したロールに%SYS.AuditテーブルへのSelect権限を付与するロールの定義編集>SQL Tablesタブ>「システムアイテムを含む」にチェック>[テーブル追加]
↓%SYS.Auditを選択して適用
2.ユーザに作成したロール(AuditCheck)を付与]
ユーザ定義編集-RolesタブでAuditCheckを選択して[割り当てる]
ユーザ設定が完了したら、このユーザで外部ツール等からログインし、SQLで必要な情報を取得します。(SQL実行例)
SELECT UTCTimeStamp, Event, Username, TO_CHAR(%EXTERNAL Authentication) Authentication, Description, EventData, Namespace, CSPSessionIDFROM %SYS.AuditORDER BY UTCTimeStamp DESC
※Authenticationカラムは、特殊なデータタイプであるため、外部ツールからはそのまま参照できません。 上記のように変換して取得してください。(この制限は、以降のバージョンで改善される予定です。)
記事
Megumi Kakechi · 2020年9月30日
これはInterSystems FAQ サイトの記事です。
DBLatency の Warning メッセージは、ヘルス・モニタプロセスが定期的にデータベースからのランダム読み取りが完了するまでに要した時間(ミリ秒)を計測していて、設定されている閾値(1000 msec)を超えた場合に出力されます。
mm/dd/yy-18:31:15:060 (2932) 1 [SYSTEM MONITOR] DBLatency(c:\xxx\) Warning: DBLatency = 1510 ( Warnvalue is 1000).
上記例では、C:\xxx\IRIS.DAT(または C:\xxx\CACHE.DAT)へのディスク読み取り I/O に 1510 msec かかったことを示していて、メッセージ出力時のディスク I/O 応答速度が遅いことが考えられます。
ディスク I/O 応答速度が遅い原因としては、ディスク I/O 負荷が高いことが考えられます。
大量のデータ登録や変更を行う処理が実施されていた。
弊社製品以外のソフト(アンチウイルスソフト、バックアップソフト)が動作していた。
弊社製品以外のアプリケーションによるディスク負荷など。
その他、RAID構成のメンバディスクで障害が発生している なども考えられます。
原因調査のためには、現象発生中の情報収集が必要となります。情報収集方法については、【FAQ】トラブル発生時、管理者が最初に行うべきことを教えてください をご覧ください。
なお、コンソールログのメッセージの深刻度ですが、0 は Information、1 は Warning、2 は Alert を示します。
ヘルスモニタでは、深刻度の数値を以下のように分けて出力しています。
【Alert の場合】ある期間のセンサの読み取り値が 3 回連続してセンサの最大値を上回った場合にアラート(深刻度 2 の通知)を生成
【Warning の場合】ある期間のセンサの読み取り値が 5 回連続してセンサの警告値を上回った場合にワーニング (深刻度 1 の通知)を生成
ヘルスモニタについて詳細は以下ドキュメントをご参照ください。ヘルスモニタについて【IRIS】Cachéヘルスモニタについて
記事
Mihoko Iijima · 2023年6月1日
開発者の皆さん、こんにちは!
この記事では、システム連携の自動的な流れの中にユーザからの指示を介入できる「ワークフローコンポーネント」のサンプル でご紹介した内容を、お手元のIRIS、IRIS for Healthを利用して体験いただくための手順を解説します。
なお、ワークフローコンポーネントでどんなことができるのか?の概要説明については、ウェビナー(オンデマンド再生)をご参照ください。
A.事前準備
1) InterSystems IRIS または、IRIS for Healthのインストール環境をご用意ください。
まだインストール環境がない場合は、コミュニティエディション(コンテナ版かキット版)をご利用ください。
コンテナをご利用いただく場合は、InterSystemsコンテナレジストリにあるIRISご利用ください。(ページ使用方法は、InterSystemsコンテナレジストリ Webユーザインターフェースのお知らせ をご参照ください。)
インストールキットをご利用いただく場合は、InterSystems IRIS/InterSystems IRIS for Health コミュニティエディションのダウンロード方法 をご参照ください。
インストール方法については、【はじめての InterSystems IRIS】セルフラーニングビデオ:基本その1:InterSystems IRIS Community Edition をインストールしてみよう! をご参照ください。
2) サンプルのダウンロード
サンプル(https://github.com/Intersystems-jp/WorkFlow-DC)を git clone またはZipでダウンロードします。
ISJFoodsディレクトリ以下を使用します。
3) ネームスペース、データベースの用意(コミュニティエディションの場合は不要)
コミュニティエディションをご利用の場合は、インストール時用意されるUSERネームスペースをご利用いただけますので準備不要です。
製品版をインストールされている場合は、任意のネームスペース、データベースの作成をお願いします。
ネームスペース、データベースの作成について詳しくは、【はじめての InterSystems IRIS】セルフラーニングビデオ:基本その2:InterSystems IRIS で開発をはじめよう! をご参照ください。
4) サンプルのインポート
2)でダウンロードしたサンプルの中から、ISJFoodsディレクトリ以下のクラス定義を 3)で確認したネームスペースにインポートします。
(コミュニティエディションの場合はUSERをご利用ください)
インポート方法は、IDE(VSCode/スタジオ)または管理ポータルから行えます。4-1)~4-3) の中からお好みの方法を選択してインポートを行ってください。
IRIS接続時に使用するログインユーザは、SuperUserや_systemをご利用ください。
パスワードはインストール時に指定された文字列をご利用ください。インストール時にパスワードを指定されていない場合は、SYS(すべて大文字)をご利用ください。
4-1) VSCodeの場合
VSCodeでWorkFlow-DCディレクトリを開きます。IRISに接続後、ISJFoodsフォルダを右クリックし「Import and Compile」をクリックします。
VSCodeでIRISに接続する方法は、VSCode を使ってみよう! をご参照ください。
4-2) スタジオの場合
スタジオを起動し、接続先ネームスペースに切り替え、ISJFoods以下のサブディレクトリも含め、すべての *.clsをドラッグ&ドロップしてインポートします。
4-3) 管理ポータルの場合
管理ポータルを開きます。👉 http://localhost:52773/csp/sys/UtilHome.csp
※ポート番号はお使いの環境に合わせてご変更ください。
管理ポータル > [システムエクスプローラ] > [クラス] を開き、画面左側で使用するネームスペースを選択します(下図はUSERを選択しています)
インポートボタンをクリックし、「ディレクトリ」を指定してインポートを選択し、ダウンロードしたサンプルのISJFoodsディレクトリを指定します。
インポートボタンをクリックすると、以下の画面が表示されます。
「バックグラウンドタスクを参照するには・・・」のリンクをクリックすると、コンパイルが正常終了しているかどうか確認できます。
5) ワークフロータスク用データ作成(POPメッセージ候補の作成)
ワークフローユーザポータルで審査ができるように、POPメッセージ候補を登録するテーブルに予め4件データを登録します。
ISJFoods.Utilsクラスの CreateData() メソッドを実行します。
WindowsにIRISをインストールされている場合は、タスクバー上のIRISランチャー をクリックし、ターミナルを選択します。
Windows以外でお試しいただいてる場合は、iris session iris コマンドでIRISにログインしてください。
※ iris session インスタンス名 (インスタンス名=インストール時に指定した名称)
iris session iris
ログイン後、対象ネームスペースに移動します。
※コミュニティエディションを利用されている場合はUSERネームスペースを使用します。ログイン時のデフォルトネームスペースがUSERネームスペースのため、移動は不要です。
set $namespace="TEST" //TESTネームスペースに移動する例
メソッドを実行します。
do ##class(ISJFoods.Utils).CreateData()
データの確認には、管理ポータルのSQLメニューを利用します。
管理ポータルを開きます。👉 http://localhost:52773/csp/sys/UtilHome.csp
[システムエクスプローラ] > [SQL] > ネームスペース選択 (例:USER)に移動し、「クエリ実行」タブに以下SELECT文を入力し「実行」ボタンをクリックします。
商品情報用テーブル
select * from ISJFoods_Tbl.Product
POPメッセージ候補テーブル
select * from ISJFoods_Tbl.POP
ビジネス・サービスで一定間隔にレコードを抽出するときに使用しているSELECT文は以下の通りです。
SELECT
Product->PID,Product->ProductName,POPID,Status,Message,TO_CHAR(StartDate,'YYYY-MM-DD') As StartDate, Period,RejectedReason, Done
FROM ISJFoods_Tbl.POP
暗黙結合(矢印構文)を使用しています。詳細はドキュメントをご参照ください。
6) テーブルへの接続に使用するDSNの設定
サンプルの中では、5)で用意したテーブルに対して、ODBC/JDBC接続を利用して定期的にSELECT文を実行します。
サンプルコードの設定では、DSN名「Test」で登録していますので、ODBC/JDBC接続用DSN名を環境にご用意ください。
ODBC接続の場合(Windowsの例)
ODBCデータソースアドミニストレーター(64bit)で「システムDSN」として作成します。
ドライバ名は「InterSystems IRIS ODBC35」を選択して、DSN名「Test」で作成します。
IPアドレス、ポート、ネームスペース、ユーザ名、パスワード を接続対象IRISに合わせて記入します。
「テスト接続」ボタンをクリックし、接続が成功することを確認してから、OKボタンをクリックして画面を閉じてください。
JDBC接続の場合
※サポートしているバージョンについて最新はこちらのドキュメントをご参照ください。
管理ポータルを開きます。👉 http://localhost:52773/csp/sys/UtilHome.csp
[システム管理] > [構成] > [接続性] > [SQLゲートウェイ接続] > 新規接続作成 をクリックし、接続名に「Test」と設定します。
ドライバ名は com.intersystems.jdbc.IRISDriver
URLは、jdbc:IRIS://localhost:1972/USER (ポート番号、ネームスペース名は環境に合わせて変更してください)
クラスパスは、.:usr/irissys/dev/java/lib/1.8/intersystems-jdbc-3.7.1.jar (JARファイルは、IRISインストールディレクトリ/dev/java/lib/ 以下にあります)
※インストール環境のポート番号(上記設定では「スーパーサーバポート」)を確認する場合は管理ポータルの「概要」ページをご参照ください。
設定が完了したら「テスト接続」ボタンをクリックして接続を確認します。
成功したら「保存」ボタンをクリックして設定を保存します。
以上で事前準備は完了です!
B.ワークフローコンポーネントを使用するための設定
次はいよいよ、ワークフローコンポーネントを使用するための設定を行っていきます。以下の手順で進めていきます。
ワークフロータスクを処理するユーザを作成する
ワークフローロールを作成する
ビジネス・オペレーションを追加する
ビジネス・プロセスからワークフローオペレーションを呼び出す
3、4については、サンプルクラスのインポートで準備済ですが、コードを参照しながら流れをご確認いただきます。
1. ワークフロータスクを処理するユーザを作成する
ワークフロータスクを処理するユーザは、IRISのユーザポータルにログインする必要があるため、IRIS内ユーザとして登録が必要です。
この記事の中では、ワークフロータスクの処理だけが行えるユーザとして登録していきます。(管理ポータルにログインできないけれども、ワークフロータスクを処理するため、ユーザポータルにはアクセスできるユーザを作成していきます。)
IRIS内ユーザは、ロールを付与することで管理ポータル内メニューやデータベース、ターミナルへのアクセス許可を得ます。
ロールにはリソース(保護対象:データベース、接続経路であるサービス、ターミナル、スタジオ、管理ポータルメニューなど)に対する許可の組み合わせを登録できます。
ロールは自分で作成することも、インストール時用意される事前定義のロールを使用することもできます。
手順は以下の通りです。
1-1) ユーザポータルだけにアクセスできるロールを作成する
1-2) ユーザを作成し、1-1)で作成したロールのメンバーに設定する。
1-3) 作成したユーザを「ワークフローユーザ」として設定する
1-1) ユーザポータルだけにアクセスできるロールを作成する
ロール名は任意に決定できますが、この手順では、WorkFlowSystemRole の名称で作成し、ユーザポータルのUSE許可を持つロールとして作成します。
管理ポータルを開きます。👉 http://localhost:52773/csp/sys/UtilHome.csp
[システム管理] > [セキュリティ] > [ロール] > [新規ロール作成]ボタンをクリックします。
「名前」に WorkFlowSystemRole を設定し、「保存」ボタンをクリックします。(一度名前を付けて保存した後、リソースに対する許可を設定します)
保存ボタンクリック後、リソースの追加が行えます。
追加ボタンをクリックし、表示される子画面の中から「%DeepSee_Portal」を選択し、OKボタンをクリックします。
デフォルトでUSE許可の「U」が設定されます。
これでロールの作成は完了です。
1-2) ユーザを作成し、1-1)で作成したロールのメンバーに設定する。
管理ポータル > [システム管理] > [セキュリティ] > [ユーザ] > [新規ユーザ作成] ボタンをクリックします。
サンプルコードでは、ユーザ:ManagerA に対してワークフロータスクを依頼するため、ManagerAは必須で作成してください。
「名前」に ManagerA を設定します。
「パスワード」と「パスワード(再入力)」に、お好みのパスワードを指定してください。
名前、パスワード、パスワード(再入力)の設定が完了したら「保存」ボタンをクリックします。
保存後、「ロール」タブが表示されます。
ロールタブに移動し、「利用可能」から作成したロール:WorkFlowSystemRole を選択し、「選択済み」に移します。
「付与する」ボタンをクリックすることで、ManagerAに WorkFlowSystemRole ロールが付与されます。
同様の手順で、ユーザ:ManagerBを作成します。
WorkFlowSystemRoleのメンバにManagerAとManagerBが所属していれば、設定完了です。
1-3) 作成したユーザを「ワークフローユーザ」として設定する
作成したManagerA、ManagerBをワークフローユーザとして設定します。
管理ポータル > [Interoperability] > 使用するネームスペース選択 > [管理] > [ワークフロー] > [ユーザ]
※コミュニティエディションを利用している場合は、USERネームスペースを指定します。製品版を使用している場合は、用意したネームスペースを選択します。
画面右の「名前」のプルダウンから、ManagerAを選択します。「アクティブ?」のチェックボックスにチェックを入れ、保存ボタンをクリックします。
同様に、ManagerBも設定します。
2. ワークフローロールを作成する
1で作成したワークフローユーザをメンバに持つワークフローロールを作成します。
この名称は、ワークフロービジネス・オペレーションのコンポーネント登録名として利用する名前になります。サンプルコードでは「POP審査ワークフロー」としているので、この名称でワークフローロールを作成します。
管理ポータル > [Interoperability] > ネームスペース選択 > 管理 > ワークフロー > ワークフロー・ロール
※コミュニティエディションを利用している場合は、ネームスペースはUSERを選択してください。それ以外の環境はサンプルコードをインポートされたネームスペースを指定してください。
まずは、「名前」に「POP審査ワークフロー」を設定し「保存」ボタンをクリックします。
保存ボタンクリック後、ロール名が画面中央に表示されます。
画面中央のロール名をクリックし、画面右の「追加」ボタンから、ワークフローユーザを追加します。
ManagerAとManagerBをメンバとして設定します。
設定後の確認で、「ユーザ」ボタンをクリックすると、ワークフローロールのメンバが表示されます。
3. ビジネス・オペレーションを追加する
サンプルコードのインポートでプロダクションにオペレーションが追加されています。
どのように追加したか、プロダクション構成画面を参照しながら確認します。
管理ポータル > [Interoperability] > [構成する] > [プロダクション] に移動します。「開く」のボタンをクリックし、ISJFoods > Production を選択します。
開いた画面の「開始する」ボタンをクリックします。
開始中の画面が表示され、「完了しました」が表示されたことを確認しOKボタンをクリックすると、以下の表示に変わります。(〇の色が濃い緑色に変わります)
※もし、〇 の色が赤くなっている場合は、データベースへの接続に失敗していることなどが考えられます。お困りのことがありましたら、返信欄でお知らせください。
今回使用しているワークフロービジネス・オペレーションは、1つ前の手順で作成したワークフローロール名「POP審査ワークフロー」と一致させる規則があります。
「POP審査ワークフロー」の字の部分をクリックすると右画面に設定画面が表示されます。
ワークフロービジネス・オペレーションは予め用意されたクラス:EnsLib.WorkFlow.Operation を使用して登録されています。
(画面右の「設定」タブにある「情報を提供する設定」を展開すると「クラス名」に使用しているクラス名が表示されます)
これで、ワークフローロールのメンバにタスクを渡す準備が整いました。
後は、ビジネス・プロセスからワークフロービジネス・オペレーションを呼び出すだけとなりました。
4.ビジネス・プロセスからワークフローオペレーションを呼び出す
ワークフロービジネス・オペレーションを呼び出すビジネス・プロセスの定義を確認します。
開いているプロダクション構成画面にある「POP審査」がサンプルで使用しているビジネス・プロセスです。コードを開くには、「POP審査」の字の部分をクリックし、「設定」タブの「情報を提供する設定」を展開し、「クラス名」に欄の右横にある🔍のアイコンをクリックします。
ビジネス・プロセスエディタが開き、定義を確認できます。
「判断ワークフロー呼び出し」の箱(アクティビティ)がワークフロービジネス・オペレーションの呼び出しを設定しているアクティビティです。
アクティビティをクリックすると、画面右側に設定内容が表示されます。
画面右の設定欄で「ターゲット」に設定されているのは、呼び出し先となるワークフロービジネス・オペレーションの名称「POP審査ワークフロー」です。
「要求メッセージ・クラス」に設定されているのは、ワークフロービジネス・オペレーションに渡すメッセージクラスでEnsLib.Workflow.TaskRequestが設定されています。
その下の「要求アクション」には、ユーザが審査する際使用するユーザポータルに表示させるボタン表示名(callrequest.%Actionsの設定)や、件名(callrequest.%Subject)、依頼するユーザ名(callrequest.%UserName)が設定されていることが確認できます。
この後、ユーザからの指示が来るまで、「ワークフローの応答待機」のところでフローは待機します。
ユーザからの指示が来た場合、「応答アクション」にある応答メッセージでユーザが押したボタンの情報など、取得できます。
ユーザからの回答は、応答メッセージ:EnsLib.Workflow.TaskResponse に設定され、押したボタンの情報は callresponse.%Actionsで確認できます。
以上で、設定は完了です。
C.ワークフローユーザによるタスクの審査
次は、いよいよ、ワークフローユーザによるタスクの審査を行ってみます。以下の手順で確認していきましょう。
処理対象POPメッセージのトレースを開く
ユーザポータルにログインし、ワークフロータスクを処理する
タスク処理後のメッセージのトレースを確認する
1. 処理対象POPメッセージのトレースを開く
管理ポータル > [Interoperability] > [構成する] > [プロダクション] に移動します。
ビジネス・サービス「POPメッセージSQL抽出」は、定期的にPOPメッセージ候補が格納されたテーブルに対してSELECT文を実施しています。
画面左下の「POPメッセージ抽出」の字の部分をクリックし、「設定」タブを参照します。
「Data」を展開し「クエリ」欄を確認します。POPメッセージ候補が格納されているテーブルの未処理(Done=0)のレコードを抽出するためのSELECT文が登録されています。
select StartDate,Period,Message,Product,POPID,Product,Product->PID As PID from ISJFoods_Tbl.POP
WHERE Done=0
また、「削除クエリ」欄では、以下UPDATE文が登録されています。
UPDATE ISJFoods_Tbl.POP
SET Done=1
WHERE POPID=?
「削除クエリ」は、「処理したレコードを処理対象から削除する」と考えていただくとわかりやすいと思います。
サンプルの設定では、SELECT対象テーブルのDoneカラムが0のレコードを処理対象とし、処理済レコードはDoneを1に変更することで、何度も同じレコードを処理対象としないように設定しています。
また、UPDATE文の条件となる値は、「キー・フィールド名」の指定したPOPIDの値を利用するように設定しています。
なお、このビジネス・サービスは EnsLib.SQL.Service.GenericService クラスを使用しています(IRISインストール時に用意されるクラスを利用しています)。このクラスを利用して登録したビジネス・サービスは、取得できたレコードをJSON文字としてメッセージに設定し、次のコンポーネントに送信します。(詳細はメッセージのトレースを参照すると確認できます)
ということで、メッセージを確認してみましょう。
画面左下の「POPメッセージ抽出」の字の部分をクリックします。画面向かって右側で「メッセージ」タブをクリックすると、4件のメッセージが送信されていることが確認できます。
ヘッダ列にある番号をクリックするとトレース画面が開きます。以下の画面は一番上にある(8)のメッセージを選択した状態です。
[1] の箱を選択し、右画面の「コンテンツ」タブを選択すると送信されているメッセージの情報を確認できます。
取得できたレコードがJSON文字として送信されていることが確認できます。
[2] の箱をクリックします。[2]は、ワークフロービジネス・オペレーションに送付している情報を確認できます。ワークフローを処理するユーザが使用するユーザポータルに表示させるボタン名などが指定されています。
図の設定ですと、ボタン名は 承認/却下/保留、サブジェクトに「商品ID:P001 新着POPメッセージ」、メッセージとして「運動会のおかずにどうでしょう」という情報がユーザポータルに表示される予定です。
また、ManagerAに審査を依頼していることも確認できます。
この後、ユーザポータルを利用してManagerAがボタンを選択しタスクを処理します。ユーザが押したボタンの情報は、このトレースの続きの情報として確認できる予定です。
(この画面は、ワークフロータスクを処理した後にも参照しますので、消さずに残しておいてください。)
2.ユーザポータルにログインし、ワークフロータスクを処理する
ManagerAでユーザポータルにログインします。
※管理ポータルの表示に利用しているブラウザではない別の種類のブラウザで開くことをお勧めします。(ManagerAはユーザポータルしかアクセスできないユーザであるため、管理ポータルを表示するために毎回ログインが必要となります。別の種類のブラウザを利用することで、セッションが別管理となるためいちいちログインしなおす必要がありません)
USERネームスペースを利用している場合は、以下URLでアクセスできます(ポート番号はアクセスされる環境に合わせてご変更ください)。
http://localhost:52773/csp/user/_DeepSee.UserPortal.Home.zen
TESTネームスペース利用されている場合は、
http://localhost:52773/csp/test/_DeepSee.UserPortal.Home.zen
IRIS for Healthで任意のネームスペースを作成された場合は(例:TEST)
http://localhost:52773/csp/healthshare/test/_DeepSee.UserPortal.Home.zen
アクセスできない場合は、管理ポータルを開き http://localhost:52773/csp/sys/UtilHome.csp、一旦SuperUserか_SYSTEMでログインします。
管理ポータル > [Analytics] > ネームスペース選択 > [ユーザポータル] に移動後、ログアウトします。
ManagerAでログイン後、「ワークフロー受信箱」を選択します。
メッセージのトレースで確認した情報を探し、一覧の中から選択します。
画面下にタスク詳細が表示されます。メッセージに設定していたボタン名が表示されていることを確認できます(右3つのボタン)。また、サブジェクトとメッセージにもトレースで確認した情報が表示されていることが確認できます。
では、承認ボタンを押してみましょう。(ボタンクリック後、一覧から情報が消えます)
3. タスク処理後のメッセージのトレースを確認する
1で確認していたメッセージのトレース画面をリロードしてみましょう。
ユーザが押したボタンの情報が [3]の箱をクリックすると確認できます。
また、次の処理に進んでいることも確認できます。
ここまでの流れを通して、ワークフローコンポーネントを利用することで自動的に流れる処理の途中にユーザからの指示待ちの動作を入れたり、ユーザからの回答内容に合わせて処理を変えていくなど、自動的な流れとユーザの動作を統合させることができることを確認できました。
サンプルコードの流れでは、ユーザの押したボタンに合わせ、POPメッセージが承認されたか、却下されたか、ステータスを更新する処理だけで終了していますが、この後、POP登録者用Teamsチャネルに通知を出すおまけの動作も含めています。
お試しいただく場合は、システム連携の自動的な流れの中にユーザからの指示を介入できる「ワークフローコンポーネント」のサンプルの「POPメッセージ審査完了通知(Teams)をご利用いただく場合」をご参照ください。
続いて、未処理のタスクを他のユーザにアサインする方法をご紹介します。
別ユーザへのアサインは、管理ポータルを利用しますので、スーパーバイザーとしてのユーザを用意する必要がありますが、この記事の中ではSuperUserまたは_SYSTEMユーザを利用して試してみます。
SuperUserまたは_Systemでログインした管理ポータルを利用して、以下メニューにアクセスします。
管理ポータル > [Interoperability] > [管理] > [ワークフロー] > [ワークフロー・タスク]
ManagerAにアサインされているタスクを、ManagerBに変更してみます。
タスクの一覧が表示されるので、ステータスが「Assigned」の行を選択し、「タスクの割り当て」ボタンをクリックします。
表示される子画面の「ユーザ名」のプルダウンから、ManagerBを選択し、OKボタンをクリックします。
ユーザポータルをManagerBでログインしなおし、1件だけタスクが表示されることを確認してください。
ユーザポータルは、管理ポータル > [Analytics] > [ユーザポータル] で遷移できます。一旦ログアウトし、ManagerBでログインしなおしてください。
ManagerBの画面にタスクが1件表示されることが確認できます。
これで、担当者が急なお休みに入ってしまっても担当者の切り替えができるので安心です。
最後に、ユーザポータルの表示についてですが、標準のポータルはこれ以上の加工ができません。
ユーザが処理する際、補足的な情報をもっと表示させたりお好みのデザインのWebアプリに埋め込みたい!などのご要望もあるかと思います。
そんな時には、開発者コミュニティのサンプル公開サイトであるOpen Echange に公開されている「ワークフローREST API」が最適です!
次の記事では、ワークフローREST API の使い方をご紹介する予定です。
サンプルWebアプリは、1つ前の記事システム連携の自動的な流れの中にユーザからの指示を介入できる「ワークフローコンポーネント」のサンプル でご紹介しています。
記事
Megumi Kakechi · 2020年10月25日
これはInterSystems FAQ サイトの記事です。
ネットワーク共有フォルダ/ネットワークプリンタにアクセスしたい場合、以下の2つの方法があります。
A. net use コマンドを使用する方法B. IRISの起動ユーザを変更する方法
詳細は以下をご覧ください。
------------------------------------------------------------------------------------------【方法A】net use コマンドを使用する方法------------------------------------------------------------------------------------------
1) IRIS からネットワーク共有フォルダへのアクセスを許可する場合、以下のコマンドを実行するように SYSTEM^%ZSTART に記述します。
net use \\<サーバ>\<共有フォルダ> /user:<ユーザ名> <パスワード>
※^%ZSTART または従来の ^ZSTU は、ユーザのスタートルーチンです。
詳細は以下のページをご参照下さい。^%ZSTART ルーチンと ^%ZSTOP ルーチンによる開始動作と停止動作のカスタマイズについて
※%ZSTART での記述ミスは IRISの起動不可になりますので、%ZSTARTの単体実行を確認するようにしてください。
また、%ZSTART ルーチンは、ネームスペース %SYS に新規に作成する必要があります。フォーマットは以下になります。
SYSTEM Set st = $ZF(-100, "/shell", "net", "use", "\\share\public", "/user:username", "password") Quit
2) %ZSTART ルーチンを保存+コンパイルしたら、 IRISを再起動します。
<< 注意 >>ターミナルで実行する場合と、TelnetやJobコマンドで実行する場合では、ユーザ権限が異なります。==========================================================ターミナル:WindowsログインユーザTelnet/Job:IRISサービスの起動ユーザ(既定:LocalSystem)==========================================================
ターミナルはWindowsログインユーザとセッションを共有しているため、事前にWindowsでネットワーク共有フォルダにアクセス済みであれば、IRISで何も設定しなくてもターミナルからのアクセスは可能です。
しかし、Telnet/Job(バックグラウンドジョブ全般※) はIRISサービスのログインユーザとセッションを共有するため、IRISサービスの起動ユーザで net use コマンドを実行する必要があります。
上で紹介しているように、^%ZSTART ルーチンで net use コマンドを実行することで、Telnet/Job でのアクセスも可能になります。※ODBC/JDBC接続や、Webアプリケーションで動作するものも含む
----------------------------------------------------------------【方法B】IRIS の起動ユーザを変更する方法----------------------------------------------------------------
1) ユーザアカウントを決めますIRIS のサーバとネットワーク共有をサービスしているサーバに、同じユーザ名/パスワードのアカウントを作成します。※ユーザアカウントは、Windows Administrators グループのメンバである必要はありません。
2) irisinstall コマンドを使用して IRIS サービスのユーザアカウントを変更します。IRIS サービスのユーザアカウントを変更するときは、従来のように「Windowsコントロールパネル>管理ツール>サービス>IRIS Controller for XX」からIRISサービスの起動ユーザを変更するのではなく、irisinstall コマンドを使用して 変更します。
コマンドは次の通りです。
irisinstall setserviceusername <構成名> <起動ユーザ名> <パスワード>
具体的には、Windows のコマンドプロンプトを「管理者権限で」起動して以下のように実行します。(ユーザ:username、パスワード:password を使う場合。構成名 IRIS とします)
cd C:\InterSystems\IRIS\bin <-- install dir\bin に移動irisinstall setserviceusername IRIS username password
<<注意1>>【方法B】の場合も A と同様に、ターミナルでネットワーク共有フォルダにアクセスする場合は、事前にWindowsでネットワーク共有フォルダにアクセスしていることが条件になります。(Windowsログインユーザとセッションを共有しているため)
<<注意2>>サービス起動ユーザをLOCAL_SYSTEMから変えると、権限が不足するためLarge Pageの使用(※)ができなくなります。※Windows上でのCaché共有メモリの割り当てについて
Large Pageを使用するためには、変更したアカウントに対して"メモリ内のページのロック" 特権を付与する必要があります。“メモリ内のページのロック” 特権の付与は、ローカルセキュリティポリシー(secpol.msc)より実施します。
Windows での Large Page の構成と権限については、以下のドキュメントもあわせてご覧ください。Windows でのラージページの構成について 記事を更新しました。「irisinstall setserviceusername」コマンドでサービス起動ユーザをLOCAL_SYSTEMから変える場合、ユーザ権限が不足するため、共有メモリの割り当て時にLarge Page(ラージページ)の使用ができなくなるので注意が必要です。記事の最後に <<注意2>> で追記しておりますのでご確認ください。
記事
Minoru Horita · 2022年2月2日
開発者の皆さん、こんにちは!
最近リリースされた InterSystems IRIS 2021.2 の目玉機能のひとつが Embedded Pythonです。Embedded Pythonは、PythonのランタイムをIRISに組み込むことによって、IRISのメソッドをPythonで記述したり、PythonのコードからIRISのクラスにアクセスしたりなどなど、IRISのObjectScriptとPythonとで相互に呼び出しを行なえる機能です。
しかも、Pythonのランタイムを埋め込んでいるため、ネットワークのオーバーヘッドがなく、パフォーマンスへの影響は最小限です。
IRISのプログラマの方には、Pythonの豊富なライブラリをストレスなく利用して頂けます。
Pythonのプログラマの方には、ObjectScriptを学ぶことなく、IRISの高速なデータベースやインターオペラビリティ機能などをストレスなく活用して頂けます。
今回の記事では、Embedded Pythonの機能をほんの一部だけ紹介します。
メソッドをPythonで書く
次のコードは、日付を表す文字列を2つ渡して、2つの日付の間の日数を返すメソッドです。
ClassMethod DateDiff(fromdate As %String, todate As %String, format As %String) As %Integer [ Language = python ]
{
import datetime
if format == '' :
format = '%Y-%m-%d'
f = datetime.datetime.strptime(fromdate, format)
t = datetime.datetime.strptime(todate, format)
return (t - f).days
}
重要なポイントは、メソッドの宣言部に [ Language = Python ] と指定することです。これだけで、IRISクラスのメソッドをPythonで記述できるようになります。以下は、実行例です。
USER>w ##class(SimpleDemo).DateDiff("2022-2-2", "2022-12-31", "")332
簡単ですね。(執筆時点で、今年はあと332日です。)
もう一つ例を挙げてみます。
ClassMethod SplitString(str As %String) [ Language = python ]
{
return str.split(',')
}
USER>set list=##class(SimpleDemo).SplitString("one,two,three")USER>zwrite listlist=5@%SYS.Python ; ['one', 'two', 'three'] ; <OREF>USER>w list."__getitem__"(1)two
Pythonが得意な文字列<->リスト変換を使って、カンマ区切りの文字列をリストにして返す関数です。IRISのObjectScriptで、Pythonのリスト型を扱えるようになっていることに注意してください。(ただし、_ はObjectScriptでは文字列連結演算子ですので、""でくくる必要があります。)
データベースにアクセスして簡単にデータ分析
ObjectScriptプログラマの方は、これくらいはObjectScriptでもできると思われたのではないでしょうか。(その通りです!)ですので、少しPythonらしい例を挙げて今回は終わりにしたいと思います。
IRISデータベースに、Kaggleのワイン品質データセットをテーブルとして保存しておき、そのテーブルにselect文を発行します。
ClassMethod SimpleAnalyze() [ Language = python ]
{
import iris
df = iris.sql.exec('select * from kaggle.wineqt').dataframe()
# データフレームを表示
print(df)
# アルコール度数(alcoholフィールド)の統計的数値を表示
print(df['alcohol'].describe())
}
import irisで、IRISデータベースにアクセスするPythonモジュールをインポートし、iris.sql.exec()で、SQLを発行しています。結果に対しdataframe()を実行することで、Python (pandas)のデータフレームとして変数に格納します。SQLを発行する際、接続を行なっていません。最初に書いたように、PythonのコードはIRISのランタイムでそのまま実行されますので、簡単かつ高速にSQLアクセスが可能です。
df['alcohol'].describe()
で、アルコール度数に関する基本的な統計的数値が計算できます。
実行結果は、以下の通りです。
USER>d ##class(SimpleDemo).SimpleAnalyze() fixedacidity volatileacidity citricacid residualsugar chlorides ... ph sulphates alcohol quality id0 7.4 0.700 0.00 1.9 0.076 ... 3.51 0.56 9.4 5.0 01 7.8 0.880 0.00 2.6 0.098 ... 3.20 0.68 9.8 5.0 12 7.8 0.760 0.04 2.3 0.092 ... 3.26 0.65 9.8 5.0 23 11.2 0.280 0.56 1.9 0.075 ... 3.16 0.58 9.8 6.0 34 7.4 0.700 0.00 1.9 0.076 ... 3.51 0.56 9.4 5.0 4... ... ... ... ... ... ... ... ... ... ... ...1138 6.3 0.510 0.13 2.3 0.076 ... 3.42 0.75 11.0 6.0 15921139 6.8 0.620 0.08 1.9 0.068 ... 3.42 0.82 9.5 6.0 15931140 6.2 0.600 0.08 2.0 0.090 ... 3.45 0.58 10.5 5.0 15941141 5.9 0.550 0.10 2.2 0.062 ... 3.52 0.76 11.2 6.0 15951142 5.9 0.645 0.12 2.0 0.075 ... 3.57 0.71 10.2 5.0 1597[1143 rows x 13 columns]count 1143.000000mean 10.442111std 1.082196min 8.40000025% 9.50000050% 10.20000075% 11.100000max 14.900000Name: alcohol, dtype: float64
大変簡単な例ですが、IRISに格納されたデータをPythonでデータ分析する入り口に立つことができました。
今回は、Embedded Pythonを簡単にご紹介しましたが、まだまだ紹介しきれない機能がたくさんあります。これから、開発者コミュニティに続きを投稿する予定ですので、どうか楽しみにしていてください。
また、3月に開催される InterSystems Japan Virtual Summit 2022で、Embedded Pythonについてのセッションをご提供します。是非ご登録をお願いします!(お申し込みはコチラ)
最後までお読み頂きありがとうございました。質問などがありましたら、コメント頂けたら嬉しいです。
記事
Toshihiko Minamoto · 2022年6月28日
皆さん、こんにちは!
職場で持ち上がった単純なリクエストで始めた個人プロジェクトを紹介したいと思います。
> 使用している Caché ライセンス数を調べることはできますか?
コミュニティに掲載されている他の記事を読んでみたところ、[David Loveluck](https://community.intersystems.com/user/david-loveluck) が投稿したぴったりの記事が見つかりました。
**APM - Using the Caché History Monitor**(APM - Caché 履歴モニターを使用する)
そこで、David の記事を参考に、Caché 履歴モニターを使って、リクエストされた情報を表示して見ました。
「どのテクノロジーを使用するのか」という疑問に対し
私は CSP に決定しました。単純で強力なテクノロジーであるため、私が担当するお客様は Caché が単なる MUMPS/ターミナルではないことに気づくでしょう。
ライセンス、データベース増加状況、CSP セッションの履歴を表示するページを作成した後、「システムダッシュボードとプロセス」ページのデザインを新装することにしました。
私の Caché インスタンスではすべてうまく機能します。
でも、IRIS はどうでしょうか?
[Evgeny Shvarov](https://community.intersystems.com/user/evgeny-shvarov) が投稿した以下の記事に従って、
**Using Docker with your InterSystems IRIS development repository**(InterSystems IRIS 開発リポジトリで Docker を使用する)
コードを Docker 化して GitHub に配置しました。いくつかの手順を踏めば、どなたでも利用できます。
* * *
## 実行方法
このリポジトリでコーディングを始めるには、以下を実行します。
1. 任意のローカルディレクトリに[リポジトリ](https://github.com/diashenrique/iris-history-monitor)を Clone/git pull します。
`$ git clone https://github.com/diashenrique/iris-history-monitor.git`
2. このディレクトリでターミナルを開き、以下を実行します。
`$ docker-compose build`
3. プロジェクトで IRIS コンテナを実行します。
`$ docker-compose up -d`
## テスト方法
ブラウザを開いて、以下のアドレスに移動します。
例:
ユーザー名 _SYSTEM を使用して、ダッシュボードとその他の機能を実行できます。
## システムダッシュボード

システムダッシュボードには、以下の項目が表示されます。
* ライセンス
* システム時間
* アプリケーションエラー
* Cache プロセス
* CSP セッション
* ロックテーブル
* ジャーナル空間
* ジャーナルのステータス
* ECP AppServer
* ECP DataServer
* Write デーモン
* Cache の効率
* 重大なアラート
線グラフウィジェットには、5 秒ごとにポイントがプロットされます。

## システムメニュー

## システムプロセス

## プロセスフィルター

さまざまなフィルターを使用して、必要な結果を得ることができます。 また、列のヘッダーを Shift + クリックすると、複数の項目で並べ替えることもできます。データグリッドを **_Excel_** にエクスポートすることも可能です!

## 履歴モニター
CSP セッションとライセンスの履歴モニターでは、情報が以下の 3 つのセクションに分かれて表示されます。
* 5 分毎
* 毎日
* 毎時間
データベースの増加が表示できるのは、毎日の情報のみです。
履歴ページでは以下の機能を共通して使用できます。
### 日付範囲の選択ツール

_デフォルト_値は、「過去 7 日間」です。
### グラフ/データテーブル
各セクションの右上に、2 つのボタン(チャート/データテーブル)があります。

データテーブルには、グラフを作成する情報が表示されます。Excel 形式でダウンロード可能です。


Excel には、CSP で定義されたのと同じフォーマット、コンテンツ、およびグループが表示浚えます。
### ズーム機能
すべてのグラフにはズームオプションがあるため、情報をより詳細に可視化することができます。

### 平均と最大
毎時間と毎日のセクションのグラフには、平均値と最大値が表示されます。
#### 平均

#### 最大

どうぞお楽しみください!
記事
Megumi Kakechi · 2023年5月8日
これは InterSystems FAQ サイトの記事です。
InterSystems IRIS では、柔軟でユーザ拡張可能な監視ツールである「システムモニタ」をお使いいただくことが可能です。
システムモニタには、以下の3つのインスタンス監視ツールがあります。
システムモニタ:システムの状態およびリソースを監視・固定パラメータに基づいて通知 (アラートおよび警告) を生成
ヘルスモニタ:主要なシステムメトリックおよびユーザ定義メトリックをサンプリング&ユーザ変更可能パラメータおよび規定の通常値と比較し、該当しきい値を超えた場合に通知を生成
アプリケーションモニタ:重要なシステムメトリックをサンプリング&ユーザが作成したアラート定義を使用して評価
messages.logに、以下のようなログが記録される場合があります。
[SYSTEM MONITOR] DBLatency(c:\xxx\) Warning: DBLatency = 1510 ( Warnvalue is 1000).※このメッセージの意味については こちらの記事 をご覧ください。
このメッセージはシステムモニタのインスタンス監視ツールであるヘルスモニタにより出力されています。システムモニタは色々なリソースの使用状況を監視する機能です。メッセージ中のDBLatency は、データベースの読み取り I/O 速度(ディスク I/O 応答速度)を監視し出力しているものです。
ご参考ドキュメントIRIS ヘルス・モニタ
このシステムモニタよりコンソールログへメッセージが出力されますが、メッセージの重要度が 0 のものは、インフォメーションのメッセージになります。
センサオブジェクトで設定された最大値や警告値を超えた場合は、メッセージの重要度が 1 Warning , 2 Alert のものを出力します。
Alertの場合:ある期間のセンサの読み取り値が 3 回連続してセンサの最大値を上回った場合にアラート (深刻度 2 の通知) を生成Warningの場合:ある期間のセンサの読み取り値が 5 回連続してセンサの警告値を上回った場合にワーニング (深刻度 1 の通知) を生成
ヘルスモニタのセンサーオブジェクトの設定(最大値等の変更)は、^%SYSMONMGR ユーティリティを使用して行えます。※システムモニタのセンサオブジェクト設定は固定パラメータであるため変更はできません。
変更例)
DBLatencyのログ出力のしきい値を、 Alert (深刻度 2 の通知):3000 から 4000 へ Warning (深刻度 1 の通知):1000 から 2000 へに変更します。
センサオブジェクトの設定を行う前に システムモニタを停止する必要があります。
%SYS>do ^%SYSMONMGR
1) Start/Stop System Monitor
2) Set System Monitor Options
3) Configure System Monitor Classes
4) View System Monitor State
5) Manage Application Monitor
6) Manage Health Monitor
7) View System Data
8) Exit
Option? 1
1) Start System Monitor
2) Stop System Monitor
3) Exit
Option? 2
Stopping System Monitor... System Monitor stopped
1) Start System Monitor
2) Stop System Monitor
3) Exit
Option?
センサオブジェクトのしきい値の変更を行います。
%SYS>do ^%SYSMONMGR
1) Start/Stop System Monitor
2) Set System Monitor Options
3) Configure System Monitor Classes
4) View System Monitor State
5) Manage Application Monitor
6) Manage Health Monitor
7) View System Data
8) Exit
Option? 6
1) Enable/Disable Health Monitor
2) View Alerts Records
3) Configure Health Monitor Classes
4) Set Health Monitor Options
5) Exit
Option? 3
1) Activate/Deactivate Rules
2) Configure Periods
3) Configure Charts
4) Edit Sensor Objects
5) Reset Defaults
6) Exit
Option? 4
1) List Sensor Objects
2) Edit Sensor Object
3) Exit
Option? 2
Sensor? ?
Num Sensor Threshold
:
9) DBLatency
10) DBReads
11) DBWrites
12) DiskPercentFull
:
Sensor? 9 DBLatency
Base? 1000 =>
Alert Value? 3000 => 4000 <-- Alert(2) メッセージ出力レベルを 4000 に変更
Setting Max Multiplier and Warn Multiplier to 0. Enter a Warn Value
Warn Value? 1000 => 2000 <-- Warming(1) メッセージ出力レベルを 2000 に変更
Sensor object DBLatency updated.
Base 750
MaxMult 0
AlertValue 4000
WarnMult 0
WarnValue 2000
1) List Sensor Objects
2) Edit Sensor Object
3) Exit
Option? <-- このあと全て <Enter> で抜ける
システムモニタを再開することで、設定したセンサオブジェクトの値が有効になります。
%SYS>do ^%SYSMONMGR
1) Start/Stop System Monitor
:
Option? 1
1) Start System Monitor
2) Stop System Monitor
3) Exit
Option? 1
Starting System Monitor... System Monitor started
1) Start System Monitor
2) Stop System Monitor
3) Exit
Option? <-- このあと全て <Enter> で抜ける
※変更可能なセンサオブジェクトの一覧は こちら をご覧ください。
Caché 用に作成された資料になりますが、以下で^%SYSMONMGRユーティリティについて詳しく説明をしています(IRISでも根本機能は同じです)。ぜひ参考になさってください。モニタリングツールによるシステム監視(P.8~)
記事
Toshihiko Minamoto · 2021年8月3日

# IRIS と Python でチャットボットを作成する
この記事では、InterSystems IRIS データベースを Python と統合して自然言語処理(NLP)の機械学習モデルを提供する方法を説明します。
### Python を使用する理由
世界的に広く採用され使用されている Python には素晴らしいコミュニティがあり、様々なアプリケーションをデプロイするためのアクセラレータ/ライブラリが豊富に提供されています。 関心のある方は https://www.python.org/about/apps/ をご覧ください。
### IRIS のグローバル
^globals について学び始めると、型にはまらないデータモデルに素早くデータを取り込む手法として使用することに慣れてきました。 そのため、最初は ^globals を使用してトレーニングデータと会話を保存し、チャットボットの動作をログに記録することにします。
### 自然言語処理
自然言語処理(NLP)は、人間の言語から意味を読み取って理解する能力を機械に与える AI のテーマです。 ご想像のとおりあまり単純ではありませんが、この広大で魅力的な分野で最初の一歩を踏み出す方法を説明します。
### デモ - 試してみましょう
チャットボットアプリケーションをデモとしてデプロイしています: [http://iris-python-suite.eastus.cloudapp.azure.com:8080](http://iris-python-suite.eastus.cloudapp.azure.com:8080)
### どのように動作しますか?
### 機械学習
まず、機械学習には、一般的なソフトウェア開発とは異なるパラダイムがあることを知っておきましょう。 分かりにくい要点は、機械学習モデルの開発サイクルです。
**完全な説明ではありません**
標準的なアプリケーション開発サイクルは次のようになっています。
コードの開発 -> テスト(開発データを使用)-> デプロイ(実際のデータを使用)
そして、機械学習では、コード自体に同じ価値がありません。 責任はデータと共有されています! つまり、データがなければ、実際のデータもないということです。 これは、実行される最終的なコードは、開発コンセプトと使用されるデータのマージによって生成されるためです。 したがって、機械学習アプリケーションのサイクルは次のようになっています。
モデルの開発(トレーニング)と実データ -> 検証 -> この結果(モデル)をデプロイ
### モデルをトレーニングするには
モデルをトレーニングするにはたくさんの手法があり、それぞれのケースと目的には大きな学習曲線が伴います。 ここでは、いくつかの手法をカプセル化して、トレーニング方法と事前処理済みのトレーニングデータを提供する [ChatterBot](https://github.com/gunthercox/ChatterBot) ライブラリを使用し、結果に焦点を当てやすくしています。
### 事前学習のモデル言語とカスタムモデル
基本的な会話型チャットボットを作成するにはこれを使用することができます。 チャットボットをトレーニングするためのすべてのデータがニーズを完全に満たすように作成することもできますが、短時間で作成するのは困難です。 このプロジェクトでは、会話のベースとして en_core_web_sm を使用し、[フォーム](http://iris-python-suite.eastus.cloudapp.azure.com/chatbot-training-data)を使って作成できるカスタムトレーニングデータとマージします。
### 基本アーキテクチャ

### Python で使用したもの
このアプリケーション環境では、Python 3.7 と以下のモジュールを使用します。
- PyYAML=1.0.0
- chatterbot>=1.0.0
- chatterbot-corpus>=1.2.0
- SQLAlchemy>=1.2
- ./nativeAPI_wheel/irisnative-1.0.0-cp34-abi3-linux_x86_64.whl
### プロジェクト構造
このプロジェクトは理解しやすい単純な構造になっています。 メインのフォルダには、最も重要な 3 つのサブフォルダがあります。
- ./app: すべての**アプリケーションコード**とインストール構成が含まれます。
- ./iris: アプリケーションをサービングする **InterSystems IRIS dockerfile** が含まれます。
- ./data: **ボリューム**によってホストをコンテナー環境にリンクします。
### アプリケーション構造
./app ディレクトリには、以下のファイルが含まれます。
- chatbot.py: Web アプリケーションの実装が含まれます。
- iris_python_suite.py: IRIS Native API によって IRIS データベースや Python と使用する、アクセラレータを持つクラスです。
### データベース構造
このアプリケーションでは、InterSystems IRIS をリポジトリとして使用します。使用されるグローバルは以下のとおりです。
- ^chatbot.training.data: 質疑応答の形式で、すべてのカスタムトレーニングデータを保存します。
- ^chatbot.conversation: すべての会話ペイロードを保存します。
- ^chatbot.training.isupdated: トレーニングパイプラインを制御します。
### ほかのソリューションの製品
全会話のレポートは作成しませんでしたが、私のグローバルグラフビューアを使用すれば、問題なく会話を追跡することができます。

## 自分でアプリケーションを実行する
### 前提条件
* git
* docker と docker-compose(docker のメモリ設定を 4 GB 以上に増加してください)
* 環境のターミナルへのアクセス
### 手順
docker-compose を使って、すべてのピースと構成を備えた 1 つの環境を簡単に起動できます。iris-python-covid19 フォルダに移動し、次のように入力します。
```
$ docker compose build
$ docker compose up
```
### コンテナの推定起動時間
初回実行時は、画像や依存関係をダウンロードするためのインターネット接続に依存します。 15 分以上かかる場合は、おそらく何らかの問題が発生しているので、こちらにご連絡ください。 2 回目以降はパフォーマンスが向上し、2 分もかかりません。
### すべてが万全である場合
しばらくしたら、ブラウザを開いて次のアドレスに移動します。
トレーニングデータのフォーム
```
http://localhost:8050/chatbot-training-data
```
チャットボット
```
http://localhost:8080
```
### IRIS 管理ポータルの確認
この時点では、USER ネームスペースを使用しています。
```
http://localhost:9092
user: _SYSTEM
pass: theansweris42
```
### この記事が役に立った場合、またはコンテンツを気に入った場合は、投票してください。
このアプリケーションは、Open Exchange コンテストに現在参加中です。こちら(https://openexchange.intersystems.com/contest/current)から私のアプリケーション「**iris-python-suite**」に投票してください。
記事
Mihoko Iijima · 2022年2月4日
開発者の皆さん、Python好きの皆さん、こんにちは!
ドキュメントをみながら IRIS 2021.2 に追加された Embedded Python を試してみました!
IRIS にログインしてるのに Pythonシェルに切り替えできて Python のコードが書けたり、Python で import iris するだけで SQL を実行できたりグローバルを操作できるので、おぉ!✨という感じです。
ぜひ、みなさんも体感してみてください!
では早速。
まず、IRISにログインします。Windows ならターミナルを開きます。Windows 以外は以下実行します。
IRIS のインストール方法を確認されたい方は、【はじめての InterSystems IRIS】セルフラーニングビデオ:基本その1:InterSystems IRIS Community Edition をインストールしてみよう!をチェックしてみてください!
iris session iris
iris session の引数はインストール時指定のインスタンス名(構成名)です。インスタンス名が不明な場合は iris list を打つと確認できます。以下の例の場合は IRIS がインスタンス名です。
irisowner@dc47786c4ca9:~$ iris list
Configuration 'IRIS' (default)
directory: /usr/irissys/
versionid: 2021.2.0.649.0
datadir: /data/config/
conf file: iris.cpf (SuperServer port = 1972, WebServer = 52773)
status: running, since Fri Feb 4 10:32:13 2022
state: warn
product: InterSystems IRISHealth
irisowner@dc47786c4ca9:~$
IRIS にログインした状態で Python シェルに切り替えてみましょう。
USER>do ##class(%SYS.Python).Shell()
Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type quit() or Ctrl-D to exit this shell.
>>> print("こんにちは!")
こんにちは!
>>>
Python 書けますね!
次、IRIS にSample.Person クラスがあるとします。後でSQLも実行したいので、永続クラスとして定義してあるとします。
Class Sample.Person Extends %Persistent
{
Property Name As %String;
Property Email As %String;
}
クラス定義を作成するのが面倒な場合は、以下 CREATE 文を実行でも大丈夫です。
CREATE TABLE Sample.Person (Name VARCHAR(50), Email VARCHAR(50))
メモ:CREATE文の場合、列を記述した順序で列番号が付与されますが、クラス定義はオブジェクト指向の考えに基づいて定義されるため、カラム番号の考えがありません。そのため、SELECT * FROM *** をしたときの表示順が異なる場合があります。
では、この Sample.Person に対して Python シェル上でインスタンスを作成して、保存してみたいと思います!
まず最初に、IRISの操作をしたいときは、 import iris をします。
>>> import iris
>>> p=iris.cls("Sample.Person")._New()
>>> p.Name="山田太郎"
>>> p.Email="taro@mail.com"
>>> status=p._Save()
>>> print(status)
1
インポートした iris モジュールの cls()メソッドにクラス名を指定し、_New() メソッドでインスタンスを生成します。インスタンスに値を入れて保存するときは _Save() メソッドを実行します。
IRIS内の構文に似てますね。 👉 set p=##class(Sample.Person).%New() 保存は set status=p.%Save()
では、ちゃんとデータが入っているかSQLで確認しましょう!
>>> rs=iris.sql.exec("SELECT Name,Email from Sample.Person")
>>> for idx,row in enumerate(rs):
... print(f"[{idx}]:{row}")
...
[0]:['山田太郎', 'taro@mail.com']
>>>
iris.sql.exec(”実行したいSQL文”) を指定して SQL を実行しています。実行結果(例では変数 rs)はリストで返るので、enumerate()関数を使ってFOR文で中身を取り出しています。
引数がある場合は、iris.sql.prepare() メソッドを利用します。引数の置き換え記号は ? を指定します。
>>> stmt=iris.sql.prepare("SELECT Name,Email from Sample.Person where ID<?")
>>> rs=stmt.execute(2)
>>> for idx,row in enumerate(rs):
... print(f"[{idx}]:{row}")
...
[0]:['山田太郎', 'taro@mail.com']
>>>
今度は、INSERT文を実行して一人増やしてみます。
>>> rs=iris.sql.exec("INSERT INTO Sample.Person (Name,Email) VALUES('鈴木花子','hana@mail.com')")
SQLで登録を確認します。
>>> rs=iris.sql.exec("SELECT Name,Email from Sample.Person")
>>> for idx,row in enumerate(rs):
... print(f"[{idx}]:{row}")
...
[0]:['山田太郎', 'taro@mail.com']
[1]:['鈴木花子', 'hana@mail.com']
>>>
2件目もちゃんと登録できました。
今度は、2件目の花子さんをオブジェクトの文法を使ってオープンして名前を変更して保存します。
>>> hanako=iris.cls("Sample.Person")._OpenId(2)
>>> hanako.Name
'鈴木花子'
>>> hanako.Name="HANAKO"
>>> hanako._Save()
1
また SQL で確認してみましょう。
>>> rs=iris.sql.exec("SELECT Name,Email from Sample.Person")
>>> for idx,row in enumerate(rs):
... print(f"[{idx}]:{row}")
...
[0]:['山田太郎', 'taro@mail.com']
[1]:['HANAKO', 'hana@mail.com']
>>>
ローマ字に変わりましたね!Pyhon で IRIS の ObjectScript と同じことができました!
では、次に、クラス定義にメソッドを追加します。最初は ObjectScript で書いたものを呼び出してみます。
ClassMethod CreateEmail(uid As %String) As %String
{
return uid_"@mail.com"
}
では Python から実行してみます。
>>> iris.cls("Sample.Person").CreateEmail("hanahana")
'hanahana@mail.com'
>>>
できましたー!
次、クラス定義にPythonでメソッドのコードを書いてみましょう!(そうなんです。書けちゃうんです。[ Language = python ] を付けたらできるんです!)
Method PythonPrint() [ Language = python ]
{
print("\nあなたの名前は:" + self.Name + " メールは:"+self.Email)
}
インスタンスメソッドなので、今オープンしている花子さんのデータを表示してみます。
>>> hanako.PythonPrint()
あなたの名前は:HANAKO メールは:hana@mail.com
>>>
動きましたねー!
では、次はグローバルに挑戦です。この記事で紹介した人物相関をグローバルで表現してみようの例を使います。
>>> glo=iris.gref("^Relation")
>>> glo["Eren"]="主人公エレン"
>>> glo["Eren","Armin"]=""
>>> glo["Eren","Mikasa"]=""
>>> glo["Eren","Zeke"]=""
>>> glo["Armin"]="エレンの幼馴染(エレン)"
>>> glo["Mikasa"]="エレンの幼馴染(ミカサ)"
>>> glo["Zeke"]="エレンの異母兄弟"
>>>
iris.gref() メソッドを使用してグローバルの参照を変数に設定しています。例では、前で設定したグローバル変数 ^Relation の参照を取得するため引数に "^Relation" を指定してます。
グローバルの参照を利用して、IRIS内の操作と同様に値を設定したり、サブスクリプトにデータを入れたり、好きなように操作できます。
値を参照したい場合は、こんな感じです。
>>> glo["Eren"]
'主人公エレン'
>>>
次は、登場人物 エレン のお友達を探してみましょう。
友達情報は、^Relation("Eren") の第2サブスクリプトを探せばよいのですが、Python でも $Order() 関数のイメージのまま記述できます。(import iris を実行した後の記述から書いています)
>>> glo=iris.gref("^Relation")
>>> sub=""
>>> while True:
... sub=glo.order(["Eren",sub])
... if (sub==None):
... break
... print(sub)
...
Armin
Mikasa
Zeke
>>>
無事、Python からもグローバル変数の第2サブスクリプトに設定したエレンのお友達が見つかりました。
いかがでしたでしょうか。
今回は、IRIS にログインした状態で Python を実行する方法を中心に試してみました。(IRIS にログインして Python シェルを起動して IRIS のテーブルやグローバルを操作しました。)
次は、Python のプログラムを IRIS から実行する方法などご紹介する予定です。お楽しみに~
なお、ドキュメントにいろんなパタンのサンプルコードが掲載されています。
記事より前に試された方!ぜひ感想やこんなコード動かせたよ!の情報をお寄せください!お待ちしてます!
記事
Toshihiko Minamoto · 2022年6月2日
コミュニティの皆さん、こんにちは。
今までにミラーリング環境をセットアップされたことはありますか? プライベートネットワーク、仮想 IP アドレス、および SSL 構成を設定したことはありますか? この作業を何度か繰り返すと、証明書の生成や各 IRIS インスタンスの構成にはたくさんの手動による作業が必要で、時間がかかる作業であることに気づきました。 頻繁にこの作業を行わなければならない方にとっては、面倒な作業です。
たとえば、品質管理チームでは、新しいバージョンのアプリケーションをテストするたびに、新しい環境を作成しなければならないでしょう。 サポートチームであれば、複雑な問題を再現する環境を作成しなくてはならないかもしれません。
となれば、こういった環境を素早く作成できるツールが絶対に必要です。
この記事では、以下を使用するミラー環境のセットアップ例を紹介します。
- アービター
- プライマリ
- バックアップフェイルオーバーメンバー
- 読み書きレポート非同期メンバー
- ノード間でジャーナルを転送するための SSL 構成
- ミラー用のプライベートネットワーク
- 仮想 IP アドレス
- ミラーリングされたデータベース

一見すると、ちょっと複雑であり、たくさんのコードが必要なように見えますが、ご心配いりません。 OpenExchange には、ほとんどの操作を簡単に実行できるライブラリがあります。
この記事では、プロセスをニーズに適合させる方法を例示することを目的としていますが、セキュリティ事項においてはベストプラクティスガイドではありません。 では、ここで使用するサンプルを作成しましょう。
### ツールとライブラリ
- [PKI-script](https://openexchange.intersystems.com/package/PKI-Script): 公開鍵基盤(PKI)は、自己署名された証明書を生成して権限サーバーを得られるようにする、IRIS に統合された機能です。 [Pete Greskoff の素晴らしい記事](https://community.intersystems.com/post/creating-ssl-enabled-mirror-intersystems-iris-using-public-key-infrastructure-pki)によると、PKI Script ライブラリは、すべての操作をプログラムで実行し、管理ポータルでのあらゆる手動操作を回避することを目標としています。 このライブラリには、ミラーリング用のユーティリティメソッドが含まれますが、 証明書がすでにある場合は、PKI-Script の代わりにその証明書を使用できます。
- [config-api](https://openexchange.intersystems.com/package/Config-API): このライブラリは、IRIS の構成に使用されます。 ミラーリング構成は、バージョン 1.1.0 以来サポートされています。 このライブラリの使用方法については詳しく説明しません。 これについてはいくつかの記事がすでに公開されていますので、 [そちら](https://community.intersystems.com/post/environment-setup-config-api)をご覧ください。 手短に言えば、config-api は IRIS テンプレート構成ファイル(JSON 形式)の作成と読み込みを簡単に行うために使用されます。
- [ZPM](https://openexchange.intersystems.com/package/ObjectScript-Package-Manager)
- Docker
### GitHub ページ
すべての必要なリソースは、[iris-mirroring-samples リポジトリ](https://github.com/lscalese/iris-mirroring-samples/)にあります。
### システムの準備
既存のリポジトリをクローンします。
```bash
git clone https://github.com/lscalese/iris-mirroring-samples
cd iris-mirroring-samples
```
リポジトリをクローンする代わりにサンプルを新規作成する場合は、新しいディレクトリと、`backup` と `config-files` というサブカテゴリを作成します。 [irissession.sh](https://raw.githubusercontent.com/lscalese/iris-mirroring-samples/master/session.sh) をダウンロードします。
```
mkdir -p iris-mirroring-samples/backup iris-mirroring-samples/config-files
cd iris-mirroring-samples
wget -O session.sh https://raw.githubusercontent.com/lscalese/iris-mirroring-samples/master/session.sh
```
後で「アクセス拒否」の問題が発生しないように、`irisowner` グループと `irisowner` ユーザーを作成し、バックアップディレクトリのグループを `irisowner` に変更する必要があります。
```bash
sudo useradd --uid 51773 --user-group irisowner
sudo groupmod --gid 51773 irisowner
sudo chgrp irisowner ./backup
```
このディレクトリは、最初のミラーメンバーをセットアップした後に、他のノードとデータベースバックアップを共有するためのボリュームとして使用されます。
### IRIS ライセンスを取得する
IRIS Community エディションでは、ミラーリングを使用できません。 有効な IRIS コンテナーライセンスをまだお持ちでない場合は、資格情報を使用して [Worldwide Response Center(WRC)](https://wrc.intersystems.com)にお問い合わせください。 「アクション」-->「オンライン配布」、次に「評価」ボタンをクリックし、「評価ライセンス」を選択してフォームに入力します。 ライセンスファイルの `iris.key` をこのディレクトリにコピーします。
### InterSystems Containers Registry にログインする
便宜上、InterSystems Containers Registry(ICR)を使用して、Docker イメージをプルします。 Docker ログイン\\パスワードが不明な場合は、WRC 資格情報を使用して [SSO.UI.User.ApplicationTokens.cls](https://login.intersystems.com/login/SSO.UI.User.ApplicationTokens.cls) にアクセスすると、ICR トークンを取得できます。
```bash
docker login -u="YourWRCLogin" -p="YourICRToken" containers.intersystems.com
```
### `myappdata` データベースとグローバルマッピングを作成する
ここでは実際には `myappdata` データベースの作成を行いませんが、Docker ビルド時にそれを作成するように構成を準備します。 そのためには、JSON 形式で単純なファイルを作成します。IRIS インスタンスに読み込むには config-api ライブラリが使用されます。
[config-files/simple-config.json](https://github.com/lscalese/iris-mirroring-samples/blob/master/config-files/simple-config.json) ファイルを作成します。
```json
{
"Defaults":{
"DBDATADIR" : "${MGRDIR}myappdata/",
"DBDATANAME" : "MYAPPDATA"
},
"SYS.Databases":{
"${DBDATADIR}" : {}
},
"Databases":{
"${DBDATANAME}" : {
"Directory" : "${DBDATADIR}"
}
},
"MapGlobals":{
"USER": [{
"Name" : "demo.*",
"Database" : "${DBDATANAME}"
}]
},
"Security.Services" : {
"%Service_Mirror" : { /* このインスタンスのミラーサービスを有効にします */
"Enabled" : true
}
}
}
```
この構成ファイルを使用すると、デフォルトの設定で新しいデータベースを作成し、USER ネームスペースに `demo.*` というグローバルマッピングを指定できます。
[config-api](https://openexchange.intersystems.com/package/config-api) 構成ファイルの機能に関する詳細については、関連する[記事](https://community.intersystems.com/post/environment-setup-config-api)または [GitHub ページ](https://community.intersystems.com/post/environment-setup-config-api)をご覧ください。
### Docker ファイル
Docker ファイルは既存の [Docker テンプレート](https://github.com/intersystems-community/objectscript-docker-template)を基盤としていますが、作業ディレクトリの作成、仮想 IP を使用するためのツールのインストール、ZPM のインストールなどを行うように変更する必要があります。
IRIS イメージは、すべてのミラーメンバーで同一です。 ミラーリングは、ロール(最初のメンバー、フェイルオーバーバックアップ、または読み書きレポート)に応じて正しい構成を使って開始するコンテナにセットアップされます。 以下の Dockerfile のコメントをご覧ください。
```Dockerfile
ARG IMAGE=containers.intersystems.com/intersystems/iris:2021.1.0.215.0
# WRC からイメージをダウンロードする必要はありません。 イメージはビルド時に ICR からプルされます。
FROM $IMAGE
USER root
#
COPY session.sh /
COPY iris.key /usr/irissys/mgr/iris.key
# /opt/demo を作業ディレクトリとし、構成ファイルやその他のインストールファイルをそこに保存します。
# arping コマンドを得るために、iputils-arping をインストールします。 仮想 IP の構成に必要です。
# 最新の ZPM バージョンをダウンロードします(ZPM は Communty エディションにのみ含まれます)。
RUN mkdir /opt/demo && \
chown ${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} /opt/demo && \
chmod 666 /usr/irissys/mgr/iris.key && \
apt-get update && apt-get install iputils-arping && \
wget -O /opt/demo/zpm.xml https://pm.community.intersystems.com/packages/zpm/latest/installer
USER ${ISC_PACKAGE_MGRUSER}
WORKDIR /opt/demo
# デフォルトミラーのロールを master に設定します。
# これはランタイム時に docker-compose ファイルでオーバーライドされます(最初のインスタンス、バックアップ、およびレポートのマスター)
ARG IRIS_MIRROR_ROLE=master
# config-files ディレクトリの内容を /opt/demo にコピーします。
# 現時点では、データベースとグローバルマッピングをセットアップする simple-config のみを作成しました。
# この記事の後の方で、ミラーのセットアップを行う他の構成ファイルを追加します。
ADD config-files .
SHELL [ "/session.sh" ]
# ZPM をインストールします。
# ZPM を使用して、config-api と pki-script をインストールします。
# 以下の操作を行うために、config-api を使って simple-config.json ファイルを読み込みます。
# - 「myappdata」データベースを作成する
# - 「myappdata」データベースのグローバル「demo.*」の「USER」ネームスペースにグローバルマッピングを追加する
# 基本的に、ここが、ObjectScript アプリケーションをインストールするエントリポイントです。
# このサンプルでは、simple-config.json を読み込んで、単純なデータベースとグローバルマッピングを作成します。
RUN \
Do $SYSTEM.OBJ.Load("/opt/demo/zpm.xml", "ck") \
zpm "install config-api" \
zpm "install pki-script" \
Set sc = ##class(Api.Config.Services.Loader).Load("/opt/demo/simple-config.json")
# ミラー初期化スクリプトをコピーします。
COPY init_mirror.sh /
# 起動後のスクリプト実行して、ミラーリングを構成します。
# init_mirror.sh の内容は、この記事の後の方で記述されます。
CMD ["-a", "/init_mirror.sh"]
```
### IRIS イメージをビルドする
Dockerfile の準備ができたので、イメージをビルドできます。
```
docker build --no-cache --tag mirror-demo:latest .
```
このイメージは、プライマリ、バックアップ、およびレポートノードの実行に使用されます。
### 最初のミラーメンバー構成ファイルを準備する
config-api ライブラリではミラーの構成が可能であるため、最初のミラーメンバー専用の構成ファイル `config-files/mirror-master.json` を作成する必要があります。
便宜上、コメントは直接 JSON に記述されています。 [コメントなしの mirror-master.json はこちら](https://raw.githubusercontent.com/lscalese/iris-mirroring-samples/master/config-files/mirror-master.json)からダウンロードできます。 すべての IP アドレスは、`Docker-compose` ファイルのあるノードにそれぞれ割り当てられます。
```json
{
"Defaults":{ /* すべての変数を含むセクション */
"MirrorName" : "Demo", /* ミラー名 */
"ArbiterNode" : "172.16.238.10|2188", /* アービターノードの IP アドレスとポート */
"VirtualAddress" : "172.16.238.100/24", /* 仮想 IP アドレス */
"VirtualAddressInterface" : "eth0", /* 仮想 IP アドレスに使用されるネットワークインターフェース */
"MirrorAddress" : "172.16.220.20", /* プライベートミラーネットワーク内のこのノードの IP アドレス */
"AgentAddress" : "172.16.238.20", /* このノードの IP アドレス(Agent は同じマシンにインストールされています) */
"SystemName" : "master", /* ミラー内のこのインスタンスの名前 */
"DBDir" : "${MGRDIR}myappdata/", /* Demo ミラーい追加するデータベースディレクトリ */
"DBName" : "MYAPPDATA" /* ミラー内のデータベース名 */
},
"SYS.MirrorMaster" : {
"${MirrorName}" : {
"Config" : {
"Name" : "${MirrorName}",
"SystemName" : "${SystemName}",
"UseSSL" : true,
"ArbiterNode" : "${ArbiterNode}",
"VirtualAddress" : "${VirtualAddress}",
"VirtualAddressInterface" : "${VirtualAddressInterface}",
"MirrorAddress": "${MirrorAddress}",
"AgentAddress": "${AgentAddress}"
},
"Databases" : [{ /* ミラーに追加するデータベースのリスト */
"Directory" : "${DBDir}",
"MirrorDBName" : "${DBName}"
}],
"SSLInfo" : { /* SSL 構成、証明書は PKI で生成されます */
"CAFile" : "/usr/irissys/mgr/CAServer/CA_Server.cer",
"CertificateFile" : "/usr/irissys/mgr/master_client.cer",
"PrivateKeyFile" : "/usr/irissys/mgr/master_client.key",
"PrivateKeyPassword" : "",
"PrivateKeyType" : "2"
}
}
}
}
```
### フェイルオーバーミラーメンバー構成ファイルを準備する
フェイルオーバーバックアップメンバーの `config-files/mirror-backup.json` 構成ファイルを作成します。
最初のメンバーに似ています。
```json
{
"Defaults":{ /* すべての変数を含むセクション */
"MirrorName" : "Demo", /* 参加するミラー */
"AgentAddress" : "172.16.238.20", /* 最初のミラーメンバーの Agent IP アドレス */
"SystemName" : "backup", /* ミラー内のこのインスタンス名 */
"PrimaryInstanceName" : "IRIS", /* 最初のミラーメンバーの IRIS インスタンス名 */
"VirtualAddressInterface" : "eth0", /* 仮想 IP アドレスに使用されるネットワークインターフェース */
"DBDir" : "${MGRDIR}myappdata/", /* ミラーの DB */
"MirrorAddress" : "172.16.220.30" /* プライベートネットワーク内のこのノードの IP アドレス */
},
"SYS.MirrorFailOver" : {
"${MirrorName}" : {
"Config": {
"Name" : "${MirrorName}",
"SystemName" : "${SystemName}",
"InstanceName" : "${PrimaryInstanceName}",
"AgentAddress" : "${AgentAddress}",
"AgentPort" : "2188",
"AsyncMember" : false,
"AsyncMemberType" : ""
},
"Databases" : [{
"Directory" : "${DBDir}"
}],
"LocalInfo" : {
"VirtualAddressInterface" : "${VirtualAddressInterface}",
"MirrorAddress": "${MirrorAddress}"
},
"SSLInfo" : {
"CAFile" : "/usr/irissys/mgr/CA_Server.cer",
"CertificateFile" : "/usr/irissys/mgr/backup_client.cer",
"PrivateKeyFile" : "/usr/irissys/mgr/backup_client.key",
"PrivateKeyPassword" : "",
"PrivateKeyType" : "2"
}
}
}
}
```
### 読み書き非同期メンバー構成ファイルを準備する
フェイルオーバー構成ファイルに非常に良く似ています。 違いは、`AsyncMember`、`AsyncMemberType`、および `MirrorAddress` の値です。 `./config-files/mirror-report.json` ファイルを作成します。
```json
{
"Defaults":{
"MirrorName" : "Demo",
"AgentAddress" : "172.16.238.20",
"SystemName" : "report",
"PrimaryInstanceName" : "IRIS",
"VirtualAddressInterface" : "eth0",
"DBDir" : "${MGRDIR}myappdata/",
"MirrorAddress" : "172.16.220.40"
},
"SYS.MirrorFailOver" : {
"${MirrorName}" : {
"Config": {
"Name" : "${MirrorName}",
"SystemName" : "${SystemName}",
"InstanceName" : "${PrimaryInstanceName}",
"AgentAddress" : "${AgentAddress}",
"AgentPort" : "2188",
"AsyncMember" : true,
"AsyncMemberType" : "rw"
},
"Databases" : [{
"Directory" : "${DBDir}"
}],
"LocalInfo" : {
"VirtualAddressInterface" : "${VirtualAddressInterface}",
"MirrorAddress": "${MirrorAddress}"
},
"SSLInfo" : {
"CAFile" : "/usr/irissys/mgr/CA_Server.cer",
"CertificateFile" : "/usr/irissys/mgr/report_client.cer",
"PrivateKeyFile" : "/usr/irissys/mgr/report_client.key",
"PrivateKeyPassword" : "",
"PrivateKeyType" : "2"
}
}
}
}
```
### IRIS ノードを構成して証明書を生成する
すべての構成ファイルの準備が整いました! [Dockerfile](https://github.com/lscalese/iris-mirroring-samples/blob/master/Dockerfile) の最後の行は、`CMD ["-a", "/init_mirror.sh"]` です。 次に、証明書を生成して、関連する構成ファイルで各 IRIS ノードをセットアップするこのスクリプトを記述する必要があります。
以下のこのスクリプトでわかるように、証明書を生成するためのコードはいたって単純です。
* マスターの場合は、`Do ##class(lscalese.pki.Utils).MirrorMaster(,"",,,,"backup,report")` とします。 PKI サーバー、PKI クライアント、証明書のリクエストの構成、検証を待機、証明書の取得、以降のノード別のリクエストを 5 分間自動的に検証、を行います。 自動的に受け入れられるリクエストは、ホストの `backup` と `report` に制限されます。
* バックアップとレポートノードの場合は、`Do ##class(lscalese.pki.Utils).MirrorBackup("${PKISERVER}","")` とします。 PKI クライアントを構成、証明書をリクエスト、検証を待機、証明書を取得、を行います。
```bash
#!/bin/bash
# ミラーをテストするために使用されるデータベース。
DATABASE=/usr/irissys/mgr/myappdata
# ディレクトリには、他のノードでリストアするための、マスターがバックアップした myappdata が含まれます。
BACKUP_FOLDER=/opt/backup
# マスターノード用の config-api JSON 形式のミラー構成ファイル。
MASTER_CONFIG=/opt/demo/mirror-master.json
# フェイルオーバーとバックアップノード用の config-api JSON 形式のミラー構成ファイル。
BACKUP_CONFIG=/opt/demo/mirror-backup.json
# レポートと非同期ノード用の config-api JSON 形式のミラー構成ファイル。
REPORT_CONFIG=/opt/demo/mirror-report.json
# ミラー名...
MIRROR_NAME=DEMO
# ミラーメンバーのリスト。
MIRROR_MEMBERS=BACKUP,REPORT
# PKI サーバーのホスト:ポート(PKI サーバーはマスターインスタンスにインストールされます)
PKISERVER=master:52773
# マスターで実行。
# このインスタンスの公開鍵基盤サーバーを構成し、SSL を使用してミラーを構成するための証明書を生成します。
# https://community.intersystems.com/post/creating-ssl-enabled-mirror-intersystems-iris-using-public-key-infrastructure-pki に記載された記事と
# https://openexchange.intersystems.com/package/PKI-Script の関連ツールをご覧ください。
# config-api と /opt/demo/simple-config.json ファイルを使用して、マイナー構成を読み込みます。
# 「backup」と「report」という他のメンバーのミラーへの参加を自動的に許可するジョブを開始します(最大 600 秒の遅延でポータル管理の手動検証を回避します)。
master() {
rm -rf $BACKUP_FOLDER/IRIS.DAT
iris session $ISC_PACKAGE_INSTANCENAME -U %SYS
記事
Mihoko Iijima · 2020年12月20日
これは InterSystems FAQ サイトの記事です
揮発性テーブル(多数のINSERT、DELETEが行われるテーブル)では、ビットマップ・インデックス用ストレージは徐々に効率が低下する可能性があります。
例えば、以下の定義からなるデータが数千件あり、一定期間保持した後 TRUNCATE TABLE で一括削除を行うオペレーションが繰り返し行われているとします。
Class MyWork.MonthData Extends (%Persistent, %Populate)
{
/// 満足度
Property Satisfaction As %String(VALUELIST = ",満足,やや満足,やや不満,不満,");
/// 年齢
Property Age As %Integer(MAXVAL = 70, MINVAL = 20);
Index AgeIdx On Age [ Type = bitmap ];
}
INSERT によってできたビットマップ・インデックスのストレージのイメージ(一部)は以下の通りです。
【INSERT時】
^MyWork.MonthDataI("AgeIdx",20,1) = $zwc(401,120,4,75,102,10,<省略> 958)/*$bit(5,76,103,107・・・
^MyWork.MonthDataI("AgeIdx",21,1) = $zwc(407,121,29,178,251,2<省略>,732,772,898,960)/*$bit(3・・・
^MyWork.MonthDataI("AgeIdx",22,1) = $zwc(402,96,5,57,74,164,<省略>,0,4)/*$bit(20,63,77,92,10・・・
^MyWork.MonthDataI("AgeIdx",23,1) = $zwc(133,116)_$c(0,0,8,0<省略>,64,0,4)/*$bit(20,63,77,92・・・
^MyWork.MonthDataI("AgeIdx",25,1) = $zwc(404,119,105,155,235<省略>,947)/*$bit(106,156,236,30・・・
^MyWork.MonthDataI("AgeIdx",26,1) = $zwc(128,119)_$c(0,0,0,2,<省略>,0,128)/*$bit(26,80,115,1・・・
<以下省略>
TRUNCATE TABLE でデータを一括削除した場合、レコードデータは消えますがビットマップ・インデックス用ストレージの一部が残ります(イメージ)。
【TRUNCATE後】
^MyWork.MonthDataI("AgeIdx",20,1) = $zwc(145,120)/*$bit()*/
^MyWork.MonthDataI("AgeIdx",21,1) = $zwc(151,121)/*$bit()*/
^MyWork.MonthDataI("AgeIdx",22,1) = $zwc(146,96)/*$bit()*/
^MyWork.MonthDataI("AgeIdx",23,1) = $zwc(133,116)_$c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,・・・
^MyWork.MonthDataI("AgeIdx",24,1) = $zwc(131,125)_$c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,・・・
^MyWork.MonthDataI("AgeIdx",25,1) = $zwc(148,119)/*$bit()*/
^MyWork.MonthDataI("AgeIdx",26,1) = $zwc(128,119)_$c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,・・・
<以下省略>
このように、繰り返し行われるデータの入れ直しによりビットマップ・インデックス用ストレージに不要な情報が残ったり、一括更新作業で効率が低下するようなストレージになった場合、%SYS.Maint.Bitmap クラスのOneClass()、Namespace() メソッドを使用してビットマップ・インデックスを圧縮(維持管理)し、最適な効率に復元することができます。
実行例は以下の通りです。
// 第1引数:クラス名
// 第2引数:ジャーナルに記録しない:1/記録する:0
// 第3引数:実行結果の画面表示あり:1/表示なし:0
>set st=##class(%SYS.Maint.Bitmap).OneClass("MyWork.MonthData",1.1)
Class: MyWork.MonthData Start Time: 2017-06-21 15:34:54
Global: ^MyWork.MonthDataI("$MonthData")was compressed: 96.15%
Old Size: 0.000(MB) New Size: 0.000(MB)
Global: ^MyWork.MonthDataI("AgeIdx")was compressed: 61.09%
Old Size: 0.004(MB) New Size: 0.002(MB)
Compression time in seconds: 0
Namespace() メソッドはネームスペース全体のビットマップ・インデックスの圧縮を行います。
詳細は下記クラスリファレンスをご参照ください。
クラスリファレンス(%SYS.Maint.Bitmap.Namespace())【IRIS】クラスリファレンス(%SYS.Maint.Bitmap.Namespace())
記事
Megumi Kakechi · 2021年4月23日
これは InterSystems FAQ サイトの記事です。
アプリケーションに求められる要件は日々複雑化しています。
しかし、複雑化するからといって開発のスピードおよび実行時のスピードが遅くなることは許されません。
複雑な要件を満たすために現在主流の手法ではソフトウェアスタック上の様々な部品(ミドルウェア、ライブラリ、フレームワークなど)を組み合わせる方法を取ります。
この方法は、様々なものを学習するための時間、それらを連携する方法、経年で様々なものが進化していくことに伴って各部品間の関係性が変化するためにそれらを維持管理していくための手間など様々な付帯的な作業が必要です。
結果として本来行いたいことに集中して取り組む前に付随する作業に忙殺されることになり開発生産性があがりません。しかも実行時にも様々な部分が連携するためのオーバーヘッドを避けることができず期待する性能を確保することも困難になります。
一方インターシステムズのプラットフォームには上記要件を満たすのに必要十分な機能がひとつの首尾一貫した形で提供されており上記の様な手間がほとんど必要ありません。
さらにこのプラットフォームにはインターシステムズ独自の高性能、スケーラビリティの高いデータベースエンジンが内蔵されており様々なデータ処理を効率良く高速に処理します。
結果として本来行いたい作業に集中でき、アプリケーションを素早く開発でき、完成したアプリケーションは期待通りの性能を発揮します。
以下の記事もあわせてご覧ください。
【FAQ】ブレークスルーアプリケーションとはどのようなものですか?
【FAQ】インターシステムズという会社を簡単に説明してください。
記事
Mihoko Iijima · 2021年6月28日
これは InterSystems FAQ サイトの記事です。
クラス定義の Property 定義文の名称を直接変更した場合、内部的には 元のプロパティを削除し、新しいプロパティを追加 したことになります。
このため、すでにデータを格納している永続クラスのプロパティ名をエディタで直接変更した場合、元のプロパティで設定されていた値にはアクセスができなくなります(新しいデータの格納位置が割り当てられます)。
また、変更したプロパティが必須(非ヌル)に指定されていた場合、データが存在しないために参照時にエラーが発生します。
以下の図は、左画面が変更前の状態、右画面がプロパティ名を変更してコンパイルを行った状態です。
基本的に、このような操作を行う場合は、あらかじめデータをエクスポートし、データの削除を行い、クラス定義の変更を行ってから、データを再インポートする方法が安全です。
または、スタジオのメニューの クラス > リファクタ > 名前変更 を利用してプロパティ名を変更します。(リファクタの名前変更メニューにより、クラス定義内のストレージやメソッド定義に対して、一括でプロパティ名を変更できます。)
変更対象のクラス定義を開き、修正したいプロパティ名を選択し、スタジオのメニューの クラス > リファクタ > 名前変更 を選択します。
変更対象の場所を目で確認しながら変更を許可することができます。変更を行った後は、クラス定義のコンパイルを行います。
VSCode または、リファクタメニューがない古いバージョンのスタジオでは、プロパティ名を修正した後、手動でストレージ定義を変更します。
方法:ストレージの定義で、新しいプロパティが元のプロパティと同じ格納位置をポイントするように手動で調整します。
詳細は、以下の通りです。
補足:<Value name="2"> の番号(例は2)は、システムにより任意の数が設定されます。
記事
Hiroshi Sato · 2022年10月14日
IRISでは.Net Binding機能が非推奨になったため、VisM.OCXの置き換えのために用意していたCaché版Cache Directエミュレータ(.Net Binding機能を使用していたため)の使用も非推奨となりました。そこでIRISのNative API機能を使用して書き換えたものを作成し、OpenExchange(以下のFAQトピックを参照してください)に登録しています。
FAQのトピック
Caché版Cache Directエミュレータを使っているアプリケーションをIRISに移行するためには、IRIS用のCache Directエミュレータに置き換えて、アプリケーションのコードをいくつか書き換える必要があります。
内容は、それぞれのプロジェクトに含まれるコンソールアプリケーションサンプル(consoleApp.cs)を比較することで大体理解できると思いますが、以下にその手順について説明します。
1. IRISの.Net Native API用のdllの参照設定を追加します。
Visual Studioのプロジェクト設定から参照の追加を選び、以下のファイルを追加してください。
c:\InterSystems\IRIS\dev\dotnet\bin\v4.6.2InterSystems.Data.IRISClient.dll
2. using句
Caché版の場合は、以下のusing句が使われていると思います。
using InterSystems.Data.CacheClient;using InterSystems.Data.CacheTypes;
IRISでは、以下の様に変更します。
using InterSystems.Data.IRISClient;using InterSystems.Data.IRISClient.ADO;
3. 接続処理およびインスタンスの生成
Caché版の場合は、以下のような記述で接続、インスタンス生成処理を行っていると思います。
cacheDirectWapper cdw = new cacheDirectWapper("Server = localhost; Log File=cprovider.log;Port=1972; Namespace=USER; Password = SYS; User ID = _system;");
IRIS版でも同じ処理で接続、インスタンス生成できます。
IRIS版では先にIRISへの接続を確立後、その接続オブジェクトを使用して接続する方法もサポートしています。
IRISConnection irisconn = new IRISConnection();irisconn.ConnectionString = "Server = localhost; Log File=cprovider.log;Port=1972; Namespace=USER; Password = SYS; User ID = _system;";irisconn.Open();cacheDirectWapper cdw = new cacheDirectWapper(irisconn);
4. プロパティの参照
Caché版の場合には、.Net Bindingの仕様の制約によって、プロパティやメソッドの参照は、以下の様に2段階(.を2つ使用)になっていました。
cdw.cd.P0 = "ABC;DEF;GHI";
IRIS版の場合は、そのような制約がないので、直接1つの.で参照できるようになりました。
cdw.P0 = "ABC;DEF;GHI";
記事
Megumi Kakechi · 2020年9月27日
これはInterSystems FAQ サイトの記事です。コンソールログ(message.log/cconsole.log)に、以下のようなログが出力される場合があります。
MM/DD/YY-hh:mm:ss:sss (pid) 2 CP: Pausing users because the Write Daemon has not shown signs of activity for xxx seconds. Users will resume if Write Daemon completes a pass or writes to disk (wdpass=yyyy).
このメッセージは、コントロールプロセスが出力しています。このプロセスは、ライトデーモン(WriteDaemon)等の主要なシステムプロセスを監視しています。
この監視にて、ディスクI/O 負荷が上がったことなどにより、ライトデーモンの書き込み処理が一定期間(xxx秒間)進んでいない場合、データベースキャッシュ上にダーティなバッファが増えるのを抑制する為に、ユーザプロセスのデータベースへの書き込みアクセスをサスペンドします。このメッセージ出力後、ライトデーモンの活動が復帰するまでユーザプロセスの書き込みアクセスは待ち状態になります(ハング状態になります)。その際、アプリケーションの応答時間への影響が発生します。
ただし、ディスクI/O 負荷が軽減し、ライトデーモンの処理が進行した場合は、以下のメッセージが記録されます。
MM/DD/YY-hh:mm:ss:sss (pid) 0 Write Daemon has show signs of activity, allowing users to proceed
この場合は、事象は一時的なものであり問題はありません。
上記の回復を示すメッセージが出力されていない場合は、ライトデーモンの書き込み処理は何らかの原因でハング状態にあったと考えられます。
1つの原因として、ライトデーモンのデータベースファイルへのアクセスが、セキュリティソフトによってブロックされたことが挙げられます。その場合は、インストールフォルダ以下のすべてのファイル(サブフォルダ―も含む)、およびすべてのデータベースファイル、ジャーナルファイルをスキャン対象から外してください。
また、データベースの破損の可能性もありますので、その場合は整合性チェックを行うことを推奨します。