クリアフィルター
記事
Megumi Kakechi · 2025年2月4日
これは InterSystems FAQ サイトの記事です。
整合性チェックを行う場合、管理ポータルやタスクマネージャーから行う方法と、ターミナルから ^Integrity ユーティリティを使用して行う方法があります。
こちらのトピックでは、それぞれの違いをご説明します。
管理ポータル、整合性チェックタスク、および SYS.Database の IntegrityCheck メソッドから行う方法
こちらの方法は、選択した複数のデータベースや、1 つのデータベースに格納された選択可能な複数のグローバルを対象に整合性をチェックを行います。
管理ポータル:[システムオペレーション] > [データベース] 整合性チェック・ボタン※チェックを行いたいネームスペース、必要に応じてグローバルを選択し、実行・ボタンをクリック
整合性チェックタスク:[システムオペレーション] > [タスクマネージャー] > [タスクスケジュール] 整合性チェック・タスク
SYS.Database クラスの IntegrityCheck メソッド:
%SYS>do ##class(SYS.Database).IntegrityCheck($LB("c:\intersystems\iris\mgr\user\")) // DB指定
%SYS>do ##class(SYS.Database).IntegrityCheck() // 全データベース
これらの方法では、エラーが検出されたすべてのグローバルを自動的に再テストします。誤検出対策のための再チェックを行うため、余分に時間がかかる場合があります。
2回目のパス以降でもエラーが検出された場合、エラーメッセージが出力されます。
詳細は以下のドキュメントをご覧ください。整合性チェックの誤検出
メリット:誤検出対策のための自動再チェックを行える、グローバル単位でチェックを行える(※管理ポータル)デメリット:エラー検出の際には再チェックを行うため、余分な時間がかかる場合がある
^Integrity ユーティリティを使用して行う方法
こちらの方法は、ターミナルより手動でチェックを行えます。複数データベースを指定することも可能です。
管理ポータル等で行う上記方法と異なり、誤検出対策のための再チェックは行いません。
つまり、1 回目のパスでエラーが検出されたグローバルの再チェックは行わないため、エラーが報告されたグローバルをご自身で再チェックして誤検出を排除することが重要になります。
実行手順は、ターミナルを開き、%SYS ネームスペースに切り替えて、do ^Integrity と入力します。
また、^Integrity エントリポイントを用いることで、プログラムによる使用も可能です。こちらの方法は、使用する並列処理の最大数を指定することが可能なため、整合性チェックのパフォーマンスを調整することが可能です(プロセス数の既定は8)。以下の ^Integrity エントリポイント(CheckList^Integrity)を使用して行います。
Do CheckList^Integrity(outputglobal,dirlist,stopafteranyerror,listofglolist,maxproc,partialcheck)
outputglobal:結果を格納するグローバルdirlist:チェックするすべてのディレクトリの $LIST stopafteranyerror:エラー発生時の整合性チェックの動作 (1:エラー検出でディレクトリのチェック停止、0:既定値。エラー発生時にチェック続行)listofglolist:グローバル名を指定した $LIST を複数含む $LISTmaxproc:使用する並列処理の最大数(既定値は8)partialcheck:既定値 0 (この値は予期しない問題が発生した場合のフォールバックとしてのみ提供)
// 以下は、5 つのプロセスを使って 3 つのデータベースをチェックしている例
set dblist=$listbuild(“/data/db1/”,”/data/db2/”,”/data/db3/”)
set sc=$$CheckList^Integrity(,dblist,,,5)
do Display^Integrity()
kill ^IRIS.TempIntegrityOutput(+$job)
メリット:エントリポイントを用いる場合、maxprocを指定することでパフォーマンスの調整が可能、 再チェックを行わないので余分なチェックは行わない(時間短縮)、結果をファイルやターミナルに即座に出力デメリット:自動再チェックは行わないためエラーの場合は独自に再チェックを行う必要がある、グローバルの選択はできない
【ご参考】整合性チェック: 高速化と低速化整合性チェックのパフォーマンスの調整整合性チェックの目安の時間や動作状況の確認、途中で停止する方法について
記事
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 から実行する方法などご紹介する予定です。お楽しみに~
なお、ドキュメントにいろんなパタンのサンプルコードが掲載されています。
記事より前に試された方!ぜひ感想やこんなコード動かせたよ!の情報をお寄せください!お待ちしてます!
記事
Mihoko Iijima · 2024年5月16日
開発者の皆さん、こんにちは。
この記事では、InterSystems製品のバックアップ方法(4種類)のご紹介と、バックアップを行う前に確認しておきたい内容について解説します。
また、この記事に続くシリーズ記事では、それぞれのバックアップの仕組みと操作例を交えたバックアップとリストア手順を解説していきます。
外部バックアップの仕組みとバックアップとリストア方法について
オンラインバックアップの仕組みとバックアップとリストア方法について
並行外部バックアップの仕組みとバックアップとリストア方法について
コールドバックアップとリストア方法について
シリーズ記事の中で行っているバックアップ練習、リストア練習の内容については、インターシステムズの講師付きトレーニングコースの中でも取り入れている内容で、一人1環境の演習環境内で実際にお試しいただいています。
参加者の皆さんと一緒に演習を進めて行きますと、データベースリストアの後に行うジャーナルリストアについては、ユーティリティから出力される確認項目が多いため、皆さん慎重に確認されながらリストアの指示を入力されています。そのため、リストア開始前の手続きや準備に意外と時間がかかっています。(実行例)
普段なかなかバックアップやリストアを行う機会がないかと思いますが、万が一の場合に備え練習いただくことで実際のリストア作業が発生した際も落ち着いて対処できるようになるかと思います。
また、試さなくてもどんな感じになるのかをお読みいただくことで手続きの大枠がつかめ、心の準備ができるかと思います。まだ体験されたことない方はぜひご興味あるバックアップ手法に対するバックアップ・リストア方法をご確認下さい!
最初は、バックアップの種類について簡単にご紹介します。
InterSystems製品のバックアップ方法(4種類)
以下の4種類の方法を選択できます。
外部バックアップ
(推奨方法) 外部バックアップは主に、論理ディスク・ボリュームの有効な ”スナップショット” を迅速に作成するテクノロジと共に使用します。 ここでは、バックアップ時、データベースへの書き込みをフリーズさせてからスナップショットを実行します。
この ”スナップショット” のようなテクノロジは、ストレージアレイからオペレーティング・システム、ディスクの単純なミラーリングに至るまで、さまざまなレベルで存在します。
オンライン・バックアップ
InterSystems製品が用意するバックアップ機能を利用する方法で、バックアップ対象に設定した全データベースの使用済ブロックをバックアップする方法です。
管理ポータルメニューやタスクスケジュールにも含まれるメニューでお手軽ですが、データベースの使用済ブロック数が多くなればなるほどバックアップ時間も長くなりバックアップファイルサイズも大きくなってしまう方法です。
バージョン2024.1以降では、実験的機能としてオンラインバックアップの高速化機能を提供しています。
並行外部バックアップ
データベースファイル(DATファイル)の退避(ファイルコピーのような対退避方法も含)とオンライン・バックアップを組み合わせて利用する方法で、外部バックアップで使用するスナップショットのようなテクノロジが利用できない環境に対して素早くバックアップを取得できる方法です。(オンラインバックアップより高速にバックアップを実行できますが、手順は複雑です。)
コールド・バックアップ
InterSystems製品を停止できる場合に利用できる方法で手順がシンプルです。
シリーズ記事では、それぞれのバックアップ方法とリストア方法を解説していきますがその前に、 バックアップを取得する前に必ず確認しておきたい事 があります。
さて、それは何でしょうか・・・・・
👇
👇
それは、バックアップを取るデータベースの物理的な整合性が保たれているかどうかをバックアップ前に確認すること です。
万が一に備えてバックアップをとっていたとしても、バックアップ対象データベースの物理的な整合性が崩れている状態のバックアップはリストア対象として利用できません。
物理的な整合性=ディスク上のデータベース・ブロックの整合性
整合性が崩れた状態で取得したバックアップでは、正常な状態のデータベースに復旧させることができないためデータ喪失につながり、バックアップの目的が果たせず、非常に危険です。
バックアップが正常に成功していることを確認することも重要ですが、最も重要なことは データベースの整合性が保たれているデータベースをバックアップしているか ということです。
種類別のバックアップ方法、リストア方法紹介の前に、まずはデータベースの整合性チェックについて確認していきましょう。
データベースの物理的な整合性チェックツール
整合性チェックは、管理ポータルメニュー([システムオペレーション] > [データベース] > [整合性チェック]ボタン)や ^Integrity 、タスクスケジュールを使用して実行することができます。
管理ポータルメニューは以下の通りです。
システムルーチン:^Integrity を使用する場合は、IRISにログインし%SYSネームスペースに移動します。
チェックしたいデータベースを指定した実行もできますが、まずはシステム全体のチェックを実行してみます。
カレントデバイスに出力することもできますが、整合性チェックのログは長くなるので、例ではファイル出力先をフルパスで指定しています。
USER>set $namespace="%SYS"
%SYS>do ^Integrity
This utility is used to check the integrity of a database
and the pointer structure of one or more globals.
Output results on
Device: /usr/irissys/mgr/integ0424.log
Parameters? "WNS" =>
Stop after any error? No=>
Do you want to check all databases? No=> yes
ログ例は以下の通りです。
整合性チェックは全てのデータベースブロックについての検査結果を出力する長いログのため、一部省略+コメントを追記しています。
Intersystems IRIS Database Integrity Check on 04/08/2024 at 15:23:20
System: 733fea287670 Configuration: IRIS
IRIS for UNIX (Ubuntu Server LTS for x86-64 Containers) 2024.1 (Build 263U) Wed Mar 13 2024 15:21:28 EDT
《コメント》データベースディレクトリ毎に中身に含まれるデータベースブロックのつながりを検査します。
---Directory /usr/irissys/mgr/---
Global: %
トップ/ボトムポインタレベル: ブロック数=1 8kb (充填率 0%)
データレベル: ブロック数=2 16kb (充填率 79%)
合計: ブロック数=3 24kb (充填率 53%)
経過時間 = 0.2 秒 04/08/2024 15:23:26
Global: %IRIS.SASchema
トップ/ボトムポインタレベル: ブロック数=1 8kb (充填率 0%)
データレベル: ブロック数=1 8kb (充填率 11%)
合計: ブロック数=2 16kb (充填率 5%)
経過時間 = 0.2 秒 04/08/2024 15:23:26
<省略>
Global: rOBJ
トップ/ボトムポインタレベル: ブロック数=1 8kb (充填率 37%)
データレベル: ブロック数=205 1,640kb (充填率 73%)
ビッグストリング: ブロック数=1,374 10MB (充填率 81%) カウント = 539
合計: ブロック数=1,580 12MB (充填率 80%)
経過時間 = 0.2 秒 04/08/2024 15:23:40
---Total for directory /usr/irissys/mgr/---
95 Pointer Level blocks 760kb (16% full)
6,634 Data Level blocks 51MB (83% full)
1,574 Big String blocks 12MB (79% full) # = 696
8,318 Total blocks 64MB (81% full)
1,279 Free blocks 10232kb
Elapsed time = 14.3 seconds 04/08/2024 15:23:40
《コメント》データベースディレクトリに対してチェックが終わると上記サマリを出力し、エラーがない場合は以下出力します。
No Errors were found in this directory.
《コメント》次のデータベースに対する整合性チェックを開始します。
---Directory /usr/irissys/mgr/HSCUSTOM/---
Global: EnsDICOM.Dictionary
トップ/ボトムポインタレベル: ブロック数=1 8kb (充填率 0%)
データレベル: ブロック数=1 8kb (充填率 0%)
合計: ブロック数=2 16kb (充填率 0%)
経過時間 = 0.2 秒 04/08/2024 15:23:40
<省略>
Global: rOBJ
トップ/ボトムポインタレベル: ブロック数=1 8kb (充填率 2%)
データレベル: ブロック数=19 152kb (充填率 76%)
ビッグストリング: ブロック数=259 2,072kb (充填率 60%) カウント = 259
合計: ブロック数=279 2,232kb (充填率 61%)
経過時間 = 0.1 秒 04/08/2024 15:23:47
---Total for directory /usr/irissys/mgr/HSCUSTOM/---
48 Pointer Level blocks 384kb (11% full)
2,150 Data Level blocks 16MB (70% full)
272 Big String blocks 2176kb (60% full) # = 272
2,485 Total blocks 19MB (67% full)
203 Free blocks 1624kb
Elapsed time = 7.6 seconds 04/08/2024 15:23:47
No Errors were found in this directory.
《コメント》以降同様にデータベース毎にチェックを行い、エラーがある場合はその対象ブロックに対してエラー情報を出力します。エラーがない場合は各データベースのチェックの終わりに「No Errors were found in this directory.」と出力します。
すべてのデータベースの検査を終え、エラーがない事を確認すると以下1行出力し、整合性チェックが終了します。
No Errors were found.
タスクスケジュールについては、インストール時に毎週月曜日深夜2時に実行するタスクとして登録されていますが、一時停止状態で登録されています。
管理ポータル > [システムオペレーション] > [タスクマネージャ] > [タスクスケジュール] > Integrity Check
整合性チェックは指定したデータベースの全データベースブロックを検査するため、チェック時間は、データ量、チェックするデータベース数、HWスペックに依存します。
目安となるような計測時間は特になく、実際稼働中の環境で実測した値を参考に予測していただく必要があります。
万が一の場合に備え、データベース整合性チェック時間のおおよその検討が付けられるように、実環境でテスト実行を行っていただくことを推奨します。
また、整合性チェック時間は環境により異なりますので、実稼働環境の状況に合わせ実行のタイミングをご検討ください。
もし、整合性チェックでエラーが出た場合は、すぐにサポートセンターまでご連絡ください。
以上、整合性チェックツールの使い方でした。
次は、いよいよバックアップ種類別のバックアップとリストア方法について解説します。
外部バックアップの仕組みとバックアップとリストア方法について
オンラインバックアップの仕組みとバックアップとリストア方法につい
並行外部バックアップの仕組みとバックアップとリストア方法について
コールドバックアップとリストア方法について
記事
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
記事
Shintaro Kaminaka · 2021年4月15日
開発者の皆さん、こんにちは。
以前の[記事](https://jp.community.intersystems.com/node/481321)でIRIS for Health上でFHIRリポジトリを構築し、OAuth2認証を構成する方法をご紹介しました。
この代行認証編では、IRIS for HealthのFHIRリポジトリに組み込まれた認証機能ではなく、IRISの代行認証機能+ZAUTHENTICATEルーチンを使用して認証を行う方法をご紹介します。
前回記事でご紹介したように、標準のFHIRリポジトリの認証機構では、アクセストークンの発行先を追加するためのAudienceの指定(aud=https://~) や、アクセストークンだけではなくベーシック認証の情報を送付するなどの対応が必要でした。
スクラッチでFHIRクライアントを開発するのではなく、既成の製品やアプリケーションからアクセスする場合、上記のような処理の実装ができないことがあるかもしれません。
そのような場合には、この代行認証+ZAUTHENTICATEルーチンを使用して、カスタマイズした認証の仕組みを構築することができます。
## この記事に含まれる情報のドキュメントについて
この記事で記載されている情報はIRIS for Healthのドキュメントにも含まれている内容をわかりやすく再構成したものです。
[RESTサービスの保護:RESTアプリケーションおよびOAuth2.0](https://docs.intersystems.com/irisforhealth20201/csp/docbookj/Doc.View.cls?KEY=GREST_securing#GREST_oauth2)
[OAuth 2.0 クライアントとしての InterSystems IRIS Web アプリケーションの使用法](https://docs.intersystems.com/irisforhealth20201/csp/docbookj/DocBook.UI.Page.cls?KEY=GOAUTH_client)
## 代行認証を有効にする
まず使用しているIRIS環境で「代行認証」機能を有効にし、アクセスするFHIRリポジトリの「Webアプリケーション設定」で「代行認証」機能を使える用に構成します。
### 認証/ウェブセッションオプション画面
まずシステムとして「代行認証」が使用できるように構成します。
管理ポータルの システム管理→セキュリティ→システム・セキュリティ→認証/ウェブセッションオプション と進み、「代行認証を許可」をチェックします。
「代行認証によるOS認証を許可」ではありませんのでご注意ください。

### %Service_WebGatewayサービス 画面
次に、CSPゲートウェイを経由したWebのアクセスに対して、「代行認証」が有効になるよう構成します。
管理ポータルの システム管理→セキュリティ→サービス と進み、「%Service_WebGateway」をクリックして、許可された認証方法の「代行」にチェックがついていることを確認します。もしチェックされていなければ、チェックして保存を実行してください。

### FHIRリポジトリの ウェブアプリケーションの編集 画面
最後に、アクセスするFHIRリポジトリの ウェブ・アプリケーションの編集画面で「代行認証」を有効にします。
管理ポータルの システム管理→セキュリティ→アプリケーション→ウェブ・アプリケーション と進み、該当のFHIRリポジトリアプリケーションを選択します。
特に変更をしていなければ、/csp/healthshare/\/fhir/r4 となっています。
この画面で、セキュリティの設定:許可された認証方法の「代行」をチェックして保存します。

これで、「代行認証」を利用する準備はOKです。次は、実際に代行認証のためのロジックが記載されたZAUTHENTICATEルーチンを用意します。
## ZAUTHETICATEルーチンの入手とインポート
ZAUTHENTICATEルーチンのサンプルはInterSystemsのGitHubで公開されています。
[GitHub:Samples-Security](https://github.com/intersystems/Samples-Security/)
この記事ではここで紹介されているREST.ZAUTHENTICATE.macルーチンを利用します。
GitHubのREADMEに記載されているこのルーチンの説明をここにも転載します。
* `REST.ZAUTHENTICATE.mac` is another sample routine that demonstrates how to authenticate a REST application using OAuth 2.0. To use this sample:
1. Configure the resource server containing the REST application as an OAuth 2.0 resource server.
2. Copy this routine to the %SYS namespace as ZAUTHENTICATE.mac.
3. Modify value of applicationName in ZAUTHENTICATE.mac.
4. Allow delegated authentication for %Service.CSP.
5. Make sure that the web application for the REST application is using delegated authentication.
この記事では、先に手順の4.,5.を済ませているので、ルーチンのインポートを実施しましょう。
(上記READMEでは、%Service.CSPと記載されていますが、現在は%Service_WebGatewayになっています。)
GitHubからルーチンをダウンロードしてインポートするか、あるいは、この[リンク](https://github.com/intersystems/Samples-Security/blob/master/rtn/REST.ZAUTHENTICATE.mac)から直接ルーチンを表示し、中身をStudioやVS Codeのエディタを使ってコピーしてZAUTHENTICATEルーチンをつくることもできます。**%SYS**ネームスペースに作成します。
(**注意**:2021/4/16時点ではこのルーチンをスタジオからインポートするとエラーが発生してしまいます。お手数ですが、ファイルの中身をコピーしてZAUTHENTICATEルーチンを作成する方法で回避してください。)
ZAUTHENTICATEルーチンを作成したら、applicationNameを変更します。これは前回の記事で記載したOAuth2クライアントアプリケーションの **クライアント構成** 画面で作成した「アプリケーション名」を指定します。

ここでは前回の記事にならい「FHIRResource」としています。コードの一部を紹介します。
```
// Usually you will need to modify at least the roles to be assigned.
set roles="%DB_DEFAULT,%Operator"
$$$SysLog(3,"OAuth2","[ZAUTHENTICATE]","ServiceName="_ServiceName_", Username="_Username_", roles="_roles)
// MUST BE MODIFIED FOR EACH INSTANCE WHICH USES OAuth 2.0 for REST.
// The application name used to define the authorization server to this resource server.
set applicationName="FHIRResource"
set loginSuccessful=0
set errorText=""
```
コードを変更したらコンパイルを実行します。
このZAUTHENTICATEルーチンで重要なのは以下のコード部分です。
GetAccessTokenFromRequestメソッドを使用してHTTPリクエストからアクセストークンを取り出し、ValidateJWTメソッドを使用してValidationを実施し正しいアクセストークンであることを確認しています。
```
// This ZAUTHENTICATE routine will support OAuth 2.0 based
// delegated authentication for subclasses of %CSP.REST.
set accessToken=##class(%SYS.OAuth2.AccessToken).GetAccessTokenFromRequest(.sc)
// Check if authorized.
// if the access token is not a JWT, we would need to validate the access token
// using another means such as the introspection or userinfo endpoint.
if $$$ISOK(sc) {
set valid=##class(%SYS.OAuth2.Validation).ValidateJWT(applicationName,accessToken,,,.jsonObject,,.sc)
}
```
## POSTMANからのテスト
それでは前回同様、RESTクライアントツールのPOSTMANからテストしてみましょう。
前回同様、まずはアクセストークンを取得します。
前回とは異なり、Auth URLにaudパラメータを追加する必要はありません。トークンを取得できたら、「Use Token」ボタンをクリックし、そのトークンを使用できるようにします。
次は、FHIRリポジトリへのアクセスです。今回は前回と異なり、ベーシック認証と組み合わせる必要はありませんので、そのままFHIRリポジトリにアクセスするRESTのURLのみを入力し、実行します。
FHIRリソースが取得できたら成功です。
### 2020.4以降の対応
IRIS for Health 2020.4ではこちらの[記事](https://jp.community.intersystems.com/node/493246)に掲載したように、FHIRリポジトリ上でアクセストークンのスコープ情報がチェックされるようになりました。
このため、セキュリティ用件にも依存しますが、ZAUTHENTICATEルーチンで必ずしもアクセストークンのValidationチェックを行う必要はありません。
これまでこのシリーズで紹介してきましたように、IRIS for HealthがOAuth2認可サーバの役割も兼ねている場合、2020.4上で動かす最も単純な方法は、ZAUTHENTICATEルーチンのGetCredentialsラベルで、アクセストークンを取得する際にも指定したIRISパスワードユーザを返すようにすることです。
例:アクセストークンを取得した際のユーザと

同じユーザを返すようにする。(このdaikoユーザには%All権限を与えています)
```
GetCredentials(ServiceName,Namespace,Username,Password,Credentials) Public {
if ServiceName="%Service_WebGateway" {
// Supply user name and password for authentication via a subclass of %CSP.REST
set Username="daiko"
set Password="xxxxx"
}
quit $$$OK
}
```
こちらの[代行認証に関するドキュメント](https://docs.intersystems.com/irisforhealth20201/csp/docbookj/Doc.View.cls?KEY=GCAS_delegated#GCAS_delegated_zauthgetcreds)に記載があるように、GetCredentialsラベルで実在するIRISパスワードユーザが返された場合はそのユーザに認証が行われるため、ZAUTHENTICATEルーチンで実行されていたアクセストークンのValidationチェックのロジックは実施されなくなります。
ただし、アクセストークンの検証はその後FHIRリポジトリ上で実施されるため不正なアクセストークンでアクセスしたりすることはできません。
なお、2020.4では、スコープのチェックやAudience情報のチェックも行われるため、このバージョンの代行認証では aud=https://~ の情報の追加や適切なスコープ指定も必要になります。
テストとしてはこの方法で動作を確認することができると思いますが、もちろん実際のアプリケーションで実装する場合は、より複雑な状況を考慮に入れる必要があるでしょう。例えば、アクセスするユーザごとに異なるIRISパスワードユーザをもつケースもあれば、そもそもアクセストークンの発行元であOAuth2認可サーバが、IRISではなく他のサービスである可能性もあります。後者のようなケースでは、このZAUTHENTICATEルーチン上で代行ユーザを作成する必要があり、さらにそのユーザ名はアクセストークン内のユーザ情報(sub)と一致する必要があります。
残念ながらこの記事でそれらの状況をすべてカバーすることはできませんが、この記事に記載されている情報がIRIS for HealthのFHIRリポジトリを活用したセキュアなアプリケーション構築の一助となれば幸いです。
記事
Megumi Kakechi · 2021年3月2日
これは InterSystems FAQ サイトの記事です。※記事後半に、「2>&1」で 標準エラー出力(2) を 標準出力(1) にリダイレクトする方法を追記しました。
$ZF(-100) では実行したコマンドの出力を取得することはできませんが、代わりにコマンド・パイプ デバイスを使用する方法があります。
詳細は、以下ドキュメントをご参照ください。
コマンド・パイプ デバイスを使用する方法について
こちらを %File クラスで使用した例が以下になります。
USER>killUSER>set cmd=##class(%File).%New("netstat -anp tcp")USER>write cmd.Open("rq")1USER>while 'cmd.AtEnd { write !,cmd.ReadLine() }アクティブな接続 プロトコル ローカル アドレス 外部アドレス 状態 TCP 0.0.0.0:23 0.0.0.0:0 LISTENING TCP 0.0.0.0:80 0.0.0.0:0 LISTENING(中略) TCP 192.168.172.1:139 0.0.0.0:0 LISTENINGUSER>
※注意※$ZF(-1)および$ZF(-2)には、セキュリティ上の脆弱性があり、その使用が推奨されておりません。代替の機能として$ZF(-100)が用意されておりますので、そちらをご使用ください。$ZF(-100)の詳細は、以下の関連トピックをご参照下さい。
$ZF(-100)の戻り値に -1 が返って実行できません。なぜですか?
$ZF(-100)の使用方法を教えてください
※2023/7/20追記
以下の方法で、標準エラー出力(2) を 標準出力(1) へリダイレクトし、さらにコマンドの 標準出力 を ファイル(result.log) へ出力する方法が使用できます。
USER>Set st = $ZF(-100, "/shell", "net", "use", "\\server1\Public", "/user:name", "password", ">result.log", "2>&1")
USER>write st // 戻り値が0(成功)以外の時、ログを見て原因を調査してみる
2
上記コマンドの場合、実行したネームスペースのデフォルトデータベースのフォルダに result.log が出力されます。例えば、内容は以下のような標準出力が記録されます。
/* result.log */
システム エラー 1219 が発生しました。
同じユーザーによる、サーバーまたは共有リソースへの複数のユーザー名での複数の接続は許可されません。サーバーまたは共有リソースへの以前の接続をすべて切断してから、再試行してください。
記事後半に、「2>&1」で 標準エラー出力(2) を 標準出力(1) にリダイレクトする方法を追記しました。
記事
Megumi Kakechi · 2021年4月23日
これは InterSystems FAQ サイトの記事です。
アプリケーションに求められる要件は日々複雑化しています。
しかし、複雑化するからといって開発のスピードおよび実行時のスピードが遅くなることは許されません。
複雑な要件を満たすために現在主流の手法ではソフトウェアスタック上の様々な部品(ミドルウェア、ライブラリ、フレームワークなど)を組み合わせる方法を取ります。
この方法は、様々なものを学習するための時間、それらを連携する方法、経年で様々なものが進化していくことに伴って各部品間の関係性が変化するためにそれらを維持管理していくための手間など様々な付帯的な作業が必要です。
結果として本来行いたいことに集中して取り組む前に付随する作業に忙殺されることになり開発生産性があがりません。しかも実行時にも様々な部分が連携するためのオーバーヘッドを避けることができず期待する性能を確保することも困難になります。
一方インターシステムズのプラットフォームには上記要件を満たすのに必要十分な機能がひとつの首尾一貫した形で提供されており上記の様な手間がほとんど必要ありません。
さらにこのプラットフォームにはインターシステムズ独自の高性能、スケーラビリティの高いデータベースエンジンが内蔵されており様々なデータ処理を効率良く高速に処理します。
結果として本来行いたい作業に集中でき、アプリケーションを素早く開発でき、完成したアプリケーションは期待通りの性能を発揮します。
以下の記事もあわせてご覧ください。
【FAQ】ブレークスルーアプリケーションとはどのようなものですか?
【FAQ】インターシステムズという会社を簡単に説明してください。
記事
Hiroshi Sato · 2021年10月5日
これは InterSystems FAQ サイトの記事です。Web/CSPゲートウェイ管理ページは、通常クライアントマシンからアクセスできないように構成されています。
クライアントからその管理ページにアクセスすると、以下の様なメッセージが返ってきます。
システム管理 このシステムを使用する権限がありません。
Not authorized to use this facility.
You are not authorized to use this facility.
任意のクライアントからアクセスするためには以下の操作を行います。
Web/CSPゲートウェイ管理ページにアクセス可能なシステムからブラウザを起動し、管理ポータルにアクセスします。
管理ポータル>システム管理>構成>の所でCSPゲートウェイ管理をクリックします。
表示されるページの左ペインに表示されるデフォルトパラメータをクリックします。
システム管理マシンの所に*.*.*.*と入力し、設定を保存ボタンを押下げます。
しかしながら任意のクライアントから管理ページにアクセスできるようにするのはセキュリティの観点からはあまりお勧めできません。
アクセスできるクライアントはなるべく限定することをお勧めします。
クライアントアドレスの指定方法としては、以下のような指定形式があります。
[SYSTEM]System_Manager=190.8.7.4-6
上記の例は、以下の記述をより簡単にしたものです。
[SYSTEM]System_Manager=190.8.7.6, 190.8.7.5, 190.8.7.4
以下の例のように、ワイルドカードも使用できます。
[SYSTEM]System_Manager=190.8.7.*
またはCSP.iniを直接編集することで上記と同じ設定を行うことが可能です。
Windowsシステムの場合、<システムドライブ>:¥intepub¥CSPGatewayにCSP.iniファイルがあります。
UNIX系システムの場合、CSPnsdと同じディレクトリに、CSP.iniファイルがあります。
[SYSTEM]セクションに、以下の行を追加します。
[SYSTEM]
System_Manager=190.8.7.6, 190.8.7.5, 190.8.7.4
ファイル修正後、この設定を反映するためには、CSPnsdの再起動が必要です。
詳細は、下記ドキュメントページをご参照ください。
Webゲートウェイ管理ページでのセキュリティの考慮事項【IRIS】CSP ウェブゲートウェイ管理ページでのセキュリティの考慮事項
記事
Hiroshi Sato · 2021年9月17日
これは InterSystems FAQ サイトの記事です。※ IRIS Data Platformのサーバーライセンス(プロセッサーコア単位の課金)では以下の内容は適用されませんので、ご注意お願いします。
2012.1以降のバージョンより、ライセンス管理が厳格化されたために、管理ポータルでもライセンスを消費するようになりました。
デフォルトでは、管理ポータルは独立したID(CSPセッション)単位でライセンスを消費するために同一ユーザが複数ライセンスを消費するようになります。
スタジオ、ターミナル、管理ポータル全ての消費ライセンスをに同一ユーザにまとめる方法は以下になります。
(1) スタジオ、ターミナル、管理ポータルに共通ユーザでログイン
管理ポータル: [システム管理] > [セキュリティ] > [サービス]
以下3つを「パスワード」認証のみに変更
%Service_Bindings%Service_Telnet%Service_Console
管理ポータル: [システム管理] > [セキュリティ] > [アプリケーション] > [ウェブ・アプリケーション]
以下7つを「パスワード」認証のみに変更
/csp/sys/csp/sys/bi/csp/sys/exp/csp/sys/mgr/csp/sys/op/csp/sys/sec/api/atelier
(2) %ZSTARTルーチンのSYSTEMラベルを作成し以下を実行
SYSTEM
set dummy=$SYSTEM.License.UserNameLicensing(1)
quit
VSCodeでの作成例
ターミナルから
set dummy=$SYSTEM.License.UserNameLicensing(1)
を実行すると、ライセンスは <ユーザ名@IP> でまとまります。
(1)のあとに、上記コマンドを実行することで、次のログインより消費ライセンスを同一ユーザにまとめることが可能になります。
ただし、こちらの設定はインスタンスを停止するまで有効ですが、再起動するとクリアされてしまいます。
再起動ごとにコマンドを実行する手間を省くためには、(2)の SYSTEM^%ZSTART にて実行する方法を使用します。
※この設定は管理ポータルで行うことはできません。 詳細については、以下ドキュメントをご参照ください。
ライセンスの消費を<ユーザ名@IP>に変更する方法について【IRIS】
ライセンスの消費を<ユーザ名@IP>に変更する方法について
記事
Toshihiko Minamoto · 2020年11月18日
FTP ファイルを Intersystems Caché からダウンロードする**メソッド**を以下に示します。ご質問がある場合はメッセージをお寄せください。
ClassMethod FTPDownload(myFTP = "", myUserName = "", myPassword = "", sFileLocation = "", dLocation = "", noOfdownloadFile = 1, sourceFileDel = ){ /*--------------------------------------------------------------------------------------------------------------------------- 要件に従ってファイルをダウンロードします : FTP
メソッド : 再利用可能
作成者 : Sanjib Raj Pandey、30/03/2018 に作成
downLoadFile = ファイル数またはすべてのファイル ...... ダウンロードしたいファイルを指定します、デフォルト値は 1 です。 = 1,3,7,100 ファイルなどの値を指定します。 = すべてのファイルをダウンロードするには "*" を指定します。 SourceFileDel = ダウンロード後にソースフォルダーのファイルを削除したい場合は..... この値を 1 に設定します -- ; デフォルト値 : 0 1= True (ダウンロード後にソースフォルダーを削除する)、 0 = False(コピーのみ) sFileLocation = ソースファイルの場所(フォルダー) dLocation = 宛先フォルダー例 : 以下の内容は ..... すべてのファイルをソースから宛先フォルダーに移動します。 w ##class(CW.COMMON).FTPDownload("IP アドレス","ユーザー名","パスワード","ソースフォルダー","宛先フォルダー,"*",1) 以下の内容は...... 200 ファイルをソースから宛先フォルダーにコピーします。w ##class(CW.COMMON).FTPDownload("IP アドレス","ユーザー名","パスワード","ソースフォルダー","宛先フォルダー,200,0)
------------------------------------------------------------------------------------------------------------------------- */ // Try .. Catch のようなエラー制御をセットアップできます。 Set (count,fileNo,key,messge,fileStream,myFileName,myFile,fSave,eMessage,eSubject)="" Set fIp= myFTP Set fUserName= myUserName set fPassword=myPassword set sFileLocaion=sFileLocation set dLocation=dLocation Set downloadFile=noOfdownloadFile Set sourceFileDel=sourceFileDel If $Length(fIp)=0||($L(fUserName)=0)||($L(fPassword)=0) || ($L(downloadFile)=0) Q "資格情報が無効であるか、ダウンロードファイルが 0 です!IP、ユーザー名、パスワード、FTP または宛先の場所を確認してください!" Set myFtp=##class(%Net.FtpSession).%New() Set eMessage="FTP 接続に失敗しました。"_fIp_" またはユーザー名、パスワードをチェックしてください!" Set eSubject ="FTP 警告メッセージ。" Set myFtp.Timeout = 60 If 'myFtp.Connect(fIp,fUserName,fPassword) Quit w $$EVEMAIL^CW.COMMON(eSubject,eMessage) Do myFtp.SetDirectory(sFileLocaion) If 'myFtp.NameList(" ",.x) Quit "ファイルが見つかりません " Set fileStream = ##class(%Stream.FileBinary).%New() Set message ="コピー" Set myFileName="" Set fileNo=0 Set Key="" If (downloadFile = "*") { While (x.GetNext(.Key))'="" { Do StartCopy }Do myFtp.Logout()Quit fileNo_" ファイルが正常に"_message_"されました!" } If (downloadFile >0) { Set count=1 While ((count <= downloadFile) && (count<=x.Count())) { do StartCopy Set count=count +1 } Do myFtp.Logout() Quit fileNo_" ファイルが正常に"_message_"されました!" } StartCopy Set myFileName= x.GetNext(.fileNo) Do myFtp.Binary() Do myFtp.Retrieve(myFileName,.fileStream) Set myFile= ##class(%Library.FileBinaryStream).%New() Set myFile.Filename=dLocation_myFileName Do myFile.CopyFrom(fileStream) Set fSave=myFile.%Save() IF ((sourceFileDel=1) && (fSave = 1)) { Do myFtp.Delete(myFileName) Set message="移動"}
記事
Henrique Dias · 2020年10月8日
npm-iris とは何ですか?
N.P.Mは "No Project Mess "の略です。
N.P.M.は、InterSystems IRISとBootstrap 4を使用したプロジェクト&タスク管理アプリです。
No Project Messは、シンプルで直感的なプロジェクトとタスクの管理ソフトウェアで、開発者や中小企業が日々の複雑な問題を軽減できるように作成されています。 スプレッドシート、カンバン、カレンダー、ガントチャートなど、タスクのためのさまざまなビューを提供しています。
なぜでしょうか?
異なるチームで仕事をしていると、あなたは異なるツールを好む人々の存在に気づくでしょう。
だから、多くの場合、あなたはプロジェクトのためのガントチャート、別のためのカンバン、他の紙の上のリストを使用しているでしょう...
N.P.M.を使うとこういった煩わしさから解放されます。 あなたやあなたのチームがどのような表示を好むかは関係ありません。 表示はクリックだけで変更することが出来ます。
特徴
初期設定
プロジェクト
利用者
タスク : タスクの作成と管理
スケジューラ : タスクのカレンダー表示
カンバン : カンバンスタイルでタスクを管理する
ガント : ガントチャートを使用して、締め切り、マイルストーン、進捗状況を確認できます。
新機能・改善のためのロードマップ
OAuth2認証
プロジェクト/チーム/ユーザー別のセキュリティ
タイムトラッキング
カスタムカレンダー(祝日)
添付ファイルのサポート
AppS.RESTフレームワークを活用
Vue.js版
ホームダッシュボードでtodoリストの進捗を確認することができます。
ここでソフトウェアを試すことができます!!!http://npm-iris.eastus.cloudapp.azure.com:52773/npm/home.csp
あなたがソフトウェアを気に入って、私があなたの投票に値すると思うなら、npm-irisに投票してください! https://openexchange.intersystems.com/contest/current
Henriqueさん、ありがとうございます。
シンプルで見やすいですね!また、ユーザがそれぞれ見やすい画面を選択できるというのも良いと思いました
Toshihikoさん、どうもありがとうございました。
記事
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 · 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つの原因として、ライトデーモンのデータベースファイルへのアクセスが、セキュリティソフトによってブロックされたことが挙げられます。その場合は、インストールフォルダ以下のすべてのファイル(サブフォルダ―も含む)、およびすべてのデータベースファイル、ジャーナルファイルをスキャン対象から外してください。
また、データベースの破損の可能性もありますので、その場合は整合性チェックを行うことを推奨します。
記事
Toshihiko Minamoto · 2024年1月31日
コミュニティの皆さん、こんにちは!!
Open Exchange に最新の「IRIS Api Tester」アプリケーションをアップロードしました。
InterSystems IRIS と Newman を使用した Docker プロジェクトで、素早く簡単に Postman コレクションをテストできます。
リポジトリをクローンするだけで、初期状態で使用できるようになっています: https://github.com/daniel-aguilar-garcia/irisapitester
docker-compose ファイルを実行します。
この URL をブラウザで開きます。
http://localhost:52773/csp/user/index.html
テストを Postman コレクションに追加します。
この例では、テストをコレクションの Test セクションに追加することでコレクションのすべてのエントリにグローバルテストを追加していますが、個別のテストを項目ごとに追加することもできます。
ここでは、リクエストのステータスコードが 200 になることをテストしています。ステータスコードが 200 でない場合には、レポートにエラーとして表示されます。
テストを追加したら、コレクションを JSON 形式でエクスポートします。
次に、JSON ファイルを IRIS Api Tester のホームページにドラッグし、「Run Test」ボタンを押します。
数秒後、レポートページにリダイレクトされます。
ここで、レポート内を移動して、すべてのテストを詳しく調べることができます。
ユーザーインターフェースを使わずにテストを起動したい場合は、このリクエストを使用できます。
テストを実行するための POST リクエスト:
localhost:52773/run_tests
Body の例:
{
"collection" : {
"info": {
"_postman_id": "79cfb5de-a2ab-4548-aa54-4a1712bf67a4",
"name": "TestNewman",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
"_exporter_id": "838575"
},
"item": [
{
"name": "test_ok",
"event": [
{
"listen": "test",
"script": {
"exec": [
""
],
"type": "text/javascript"
}
}
],
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "localhost:52773/test_ok",
"host": [
"localhost"
],
"port": "52773",
"path": [
"test_ok"
]
}
},
"response": []
},
{
"name": "test_ko",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "localhost:52773/test_ko",
"host": [
"localhost"
],
"port": "52773",
"path": [
"test_ko"
]
}
},
"response": []
}
],
"event": [
{
"listen": "prerequest",
"script": {
"type": "text/javascript",
"exec": [
""
]
}
},
{
"listen": "test",
"script": {
"type": "text/javascript",
"exec": [
"pm.test(\"Verificar código de cabecera\", function () {",
" pm.response.to.not.have.status(500);",
"});"
]
}
}
]
}
}
次に、HTML レポートを取得します。
HTML レポートを取得するための GET リクエスト:
localhost:52773/show_report
必要であれば、エクスポートしたサンプルコレクションの JSON ファイルを残しているので、ぜひお試しください。
このアプリがお役に立てれば幸いです。
お読みいただきありがとうございました!!
以下は、デモ動画です ;-)