クリアフィルター
記事
Toshihiko Minamoto · 2021年11月11日
しばらく前、GitHubは[GitHub Codespaces](https://github.com/features/codespaces)という新しい機能を発表しました。 ブラウザでVSCodeを実行する機能があります。マシンでローカルに実行するのとほぼ同じ性能がありますが、クラウドの能力も備わっているため、最大32CPU、64 GB RAMのマシンタイプを選択することが可能です。
.png)
素晴らしいことですね。 でも、このことは、InterSystems IRISで駆動するプロジェクトで作業する上で、どのように役立つのでしょうか。 それをどのように構成するのか見てみましょう。
### あらゆるリポジトリに対応できる基本の出発点
この機能を使用すると、[Code]ボタンを押せば、クラウド内のあらゆるリポジトリを編集できるようになります。 この機能はまだベータ段階にあるため、すべての人が利用できるわけではないことに注意してください。ベータ期間が終了すれば、有料アカウントでのみ利用できるようになります。
.png)
このリポジトリは、VSCodeのみに準備されているだけであり、Codespaces用として特別に用意されたものではありません。 [New codespace]ボタンを押すと、自分だけの環境を作成できます。
.png)
私の場合、以前のCodespacesの使用においてObjectScript拡張機能をインストールし、Codespacesからプロンプトでグローバルに有効にしています。 毎回インストールされるため、ObjectScriptコードはすでにハイライト表示されています。 しかし、IRISはまだ利用できないため、 まずはdocker-composeから始めましょう。
.png)
それが済むと、IRIS Terminalに接続し、コードをコンパイルできるようになります。
.png).png)
docker-composeのポートは自動的に認識され、ブラウザで開くことができるため、システム管理ポータルを開くことも可能です。
.png)
### 準備済みのリポジトリでの使用
VSCodeとIRISをクラウドで実行することはできましたが、準備段階で手動での作業がいくつかありました。 しかし、開始直後にリポジトリを開発できるようにすることもできます。
[devcontainer.json](https://docs.github.com/jp/codespaces/customizing-your-codespace/configuring-codespaces-for-your-project)を使うと可能です。 私の最近のプロジェクトの1つである[Realworld](https://github.com/daimor/realworld-intersystems-iris)に基づく例を紹介します。 このプロジェクトは非常に複雑で、バックエンドとフロントエンドがあり、docker-composeを使用してすべてをまとめて起動します。
devcontainerはdocker-composeも使用する可能性があるため、私の構成は次のようになりました。
{
"name": "IRIS RealWorld example",
"dockerComposeFile": "docker-compose.yml",
"service": "server",
"extensions": [
"intersystems-community.vscode-objectscript"
],
"forwardPorts": [
80,
52773
],
"workspaceFolder": "/home/irisowner/conduit",
"remoteUser": "irisowner",
"postCreateCommand": "iris start iris",
"settings": {
"terminal.integrated.defaultProfile.linux": "bash",
"terminal.integrated.profiles.linux": {
"bash": {
"path": "bash",
"icon": "terminal-bash"
},
"iris": {
"path": "iris",
"args": ["session", "iris"]
}
},
"intersystems.servers": {
"/ignore": true
},
"objectscript.ignoreInstallServerManager": true,
"objectscript.ignoreInstallLanguageServer": true,
"objectscript.conn": {
"active": true,
"host": "localhost",
"port": 52773,
"ns": "CONDUIT",
"username": "demo",
"password": "demo",
"links": {
"Conduit APP": "http://localhost:80/",
"Conduit API": "http://${host}:${port}/conduit/"
}
}
}
}
ここでは多くの事項が構成されています。
* 主としてCodespacesのためのカスタムdocker-compose.ymlへのパス
* 開発が行われるメインサービスの名前
* VSCodeにデフォルトでインストールされる拡張機能のリスト
* 公開する必要のあるポート。この場合はIRIS用とフロントエンド用のWebサーバーポート
* 作業ディレクトリへのパス
* コンテナ内のユーザー。IRISコンテナに入るときに、irisownerユーザーが必要です。
* デフォルトのエントリポイントであるiris-mainを使用せずに、単に無限にスリープし、環境が起動した後に自分でIRISを起動するように構成されたdocker-compose内のIRISコンテナ
* 最後に、VSCodeの設定もここで構成可能です。これはマシンレベルの設定です。 必ず.vscode/settings.jsonでオーバーライドまたはアペンドできます。
このようなリポジトリ向けのCodespacesを起動するには、すべての必要なコンテナをビルドして開始する必要があるため、もう少し時間がかかります。 GitHubは、このようなイメージをリポジトリにプッシュした後にプリベイクして、起動を高速化することが可能だと述べています。
.png)
そして、それが開始すると、何の操作も必要なく、開発の準備が完了しています。
.png)
このプロジェクトには、用意されたPostmanテストを使用してREST APIをテストするオプションがあるため、IRISでバックエンドコンテナ内にnpmとnewmanをインストールしました。 そこでテストを実行することができます。 すべて合格です。よくできました。
.png)
そしてフロントエンド部分を使用できます。
.png)
GitHubでは、ローカルのVSCodeからでもCodespacesに接続できるようになっています。 隅にある緑色のCodespacesを押すと、VC Codeで開くことを選択できます(GitHub Codespaces 拡張機能がインストールされている必要があります)。
.png)
これは、ローカルのVSCodeで開いたプロジェクトですが、ifconfigの結果からわかるように、クラウドで実行されています。私は今、絶対にシンガポールにはいません。
.png)
### GitHub Codespacesなしでブラウザーで実行
Codespaces機能にアクセスできない場合、またはこの方法では使用したくないが、ブラウザーでVSCodeを試してみたい場合は、どうすればよいでしょうか。
もう1つのプロジェクトである[code-server](https://github.com/cdr/code-server)を使えば可能です。
このVSCodeを次のコマンドで実行するだけです。
`docker run -it -p 8080:8080 codercom/code-server --auth=none`
デフォルトバージョンのVSCodeが実行されます。フォルダがマッピングされていないため、任意のフォルダをマウントし、それをworkdirに設定すると、内部を見れるようになります。
``docker run -it -p 8080:8080 -v `pwd`:/opt/realworld -w /opt/realworld codercom/code-server --auth=none``
.png)
これはデフォルトのVSCodeで、ObjectScript拡張機能はインストールされていません。 拡張機能の制限があり、元のVSCodeマーケットプレイスへのアクセスがありませんが、代わりにopen-vsx.orgという別のプレイスを使用しています。また、メインのObjectScript拡張機能もそこに[提供されています](https://open-vsx.org/extension/intersystems-community/vscode-objectscript)。
このようなDockerfileを使用すると、そこに何でもインストールされ、一部の拡張機能もすでにインストールされた独自のCode Serverをベイクすることができます。
FROM codercom/code-server
USER root
RUN curl -fsSL https://deb.nodesource.com/setup_15.x | bash - && \
apt-get install -y jq nodejs python3-pip python3-dev unixodbc-dev && \
rm -rf /var/lib/apt/lists/* && \
pip3 install pyodbc && \
npm install -g yarn && \
sudo chown -R 1000:1000 /home/coder
COPY extensions extensions
COPY settings.json /root/.local/share/code-server/User/settings.json
ENV SERVICE_URL=https://open-vsx.org/vscode/gallery
ENV ITEM_URL=https://open-vsx.org/vscode/item
RUN \
code-server --install-extension ms-python.python && \
code-server --install-extension intersystems-community.vscode-objectscript && \
find extensions -type f -exec code-server --install-extension {} \;
WORKDIR /opt/intersystems
CMD [ "--auth=none", "--disable-telemetry" ]
一部のユーザーレベルのデフォルトのsettings.jsonを定義し、必要な拡張機能がopen-vsxにない場合は、手動でダウンロードして、Dockerfileの隣にあるextensionsフォルダに配置すれば、インストールできます。
これで、必要なすべての拡張機能がインストールされた新しいcode-serverを実行できるようになりました。
docker run -it -p 8080:8080 -v `pwd`:/opt/realworld -w /opt/realworld <strong>caretdev/code-server</strong> --auth=none
また、構文ハイライトもすでに存在しています。後はIRIS自体を実行するだけですが、拡張docker-composeを使って行えます。code-serverはIRISに並ぶ単なるもう1つのサービスとして扱われます。
.png)
記事
Hiroshi Sato · 2021年3月3日
これは InterSystems FAQ サイトの記事です。
通常SQLCODE -110(Locking conflict in filing)のエラーはロックが競合した場合に発生します。
大量レコードが一度に更新された場合、その件数がロック閾値を超えてロックエスカレーションを起こしてテーブルロックとなる可能性があり、そのためにロックの競合が起きやすくなっていることが考えられます。
このロック閾値を上げることにより、この競合を回避できる可能性もあります。
しかしこの閾値を上げることにより、システムが必要とするロック管理用のメモリが増えるという副作用がありますので、慎重な検討が必要です。
あるいはテーブルロックになる可能性を排除できずに、更新タイミング等アプリケーションの仕様を見直す必要があるかもしれません。
またSQLCODE -110はロックテーブルの空き容量が不足した場合にも発生する可能性があります。
コンソールログファイル(※)をご確認いただき、「LOCK TABLE FULL!!!」のエラーが記録されているようであれば、ロックテーブルの容量不足が原因です。
※ InterSystems IRIS のコンソールログファイル名は messages.log、Caché/Ensemble/HealthShare コンソールログファイル名は cconsole.log
この場合は、
ロックテーブルのサイズを増やす
ロック閾値を小さくして、より少ない件数でテーブルロックに移行するように設定する
などの対応が考えられます。
各種設定は管理ポータルの以下メニューで行うことができます。
ロックテーブルサイズの設定:
【バージョン2011.1~】 [ホーム] > [システム管理] > [構成] > [追加の設定] > [メモリ詳細設定] gmheap(KB 単位) と locksiz(バイト単位)
【バージョン2009.1~2010.2】 [ホーム] > [構成] > [メモリ詳細設定] gmheap(KB 単位) と locksiz(バイト単位)【バージョン5.1~2008.2】 [ホーム] > [構成] > [詳細設定] カテゴリ:Memory GenericHeapSize と LockTableSize
ロック閾値の設定:【バージョン2011.1~】 [ホーム] > [システム管理] > [構成] > [SQL設定] > [一般SQL設定] : ロック閾値
【バージョン2009.1~2010.2】 [ホーム] > [構成] > [SQL設定] > [一般SQL設定] : ロック閾値
【バージョン5.2~2008.2】 [ホーム] > [構成] > [SQL設定] : ロック閾値 【バージョン5.1】
バージョン5.1では、ロック閾値は以下メソッドを使用して変更します。
// 第1引数に指定したい閾値、第2引数は参照渡しで現在の閾値が設定されます。// 処理が成功すると、1が返ります。set st=$system.SQL.SetLockThreshold(1001,.oldval)
質問
Mitsuru Amano · 2021年3月3日
こんにちは、皆さま
IRISとVSCODE環境を日頃から愛用しています。
普段は使用しませんが、実験的にCSPファイル(*.CSP)をVSCODEで編集してみようと思い試みましたが上手く行きませんでした。
VSCODEの拡張は、「InterSystems ObjectScript Extension Pack」を使用しています。
具体的は2つの方法を試しました。
1.DBからworkspaceにExportして編集+Import&Compile
ObjectScriptのソースTree-コンテキストメニューにExportが無いため動作を確認できず。
clsのExprot
cspのExportが…ない
2.DBの*.CSPを直接編集。
ObjectScriptのソースTree-からcspファイルを開き編集したが、読み取り専用と表示。
VSCODEでCSPファイルを編集する方法をご存じの方は、教えて頂けないでしょうか? Amanoさん、こんにちは。
settings.json に以下1行追記すると、サーバ側コードを直接VSCodeから編集できます(ローカルにExportせずサーバ側コードを操作できます)。
"objectscript.serverSideEditing": true,
全体だとこんな感じです。
{
"objectscript.serverSideEditing": true,
"objectscript.conn": {
"server": "test",
"active": true,
"ns": "USER",
},
"intersystems.servers": {
"test": {
"webServer": {
"scheme": "http",
"host": "localhost",
"port": 52773
},
"username": "_SYSTEM",
},
}
}
CSPのExportのボタンですが、うまく動かないそうで(6つ目の箇条書き) 非表示になってるようでした。
その他、クラスやルーチンのように、ワークスペースで書いたCSPファイルをファイル保存の動作でサーバ側にインポート+コンパイルできるようにしてほしい!のリクエストは上がっていたのですが、まだできてないようでした。
進捗あったらお知らせします! Iijimaさん
出来ました!!
エンコードは、サーバ側のOSに依存している感じですね。
Shift-JISは、問題なく編集できましたが、UTF-8(BOM付き)は文字化けしました。
※サーバのCSPファイル(UTF8BOM付き)をテキストエディタで作成して、VSCODEで編集すると保存後の再表示で文字化け。(仕組み上しょうがないですね。)
CSPファイル自体での開発頻度は、少なくなると思うので問題なしって感じです。
返信ありがとうございました。 Amanoさん、さっそくお試しいただきありがとうございます! Amano さん、
最近アップデートされた、InterSystems Server Manager エクステンションでは、簡単に「サーバ上のCSPファイル」を編集できるようになりました。以下に手順を投稿しましたので、もしご参考になれば幸いです。
VSCode を使ってみよう (2021年4月20日版)
記事
Mihoko Iijima · 2021年5月23日
これは InterSystems FAQ サイトの記事です。
仮想ドキュメント(以降VDOC)とは複雑な構造のドキュメント(メッセージ)を効率良く高速に処理するために考えられたメッセージ処理の仕組みです。
HL7に代表される EDI 標準は電子データ交換のための汎用的なかなり複雑なメッセージ形式を含んでいます。
また、メッセージの種類を増やすと運用が複雑になってしまうため、1 つのメッセージに様々なデータを詰め込む傾向があります。
その結果 1 つのメッセージは複雑かつデータ量が多いものになりがちです。
一方、実際のメッセージ交換では、メッセージの全てのデータを処理することはまれで一部のデータのみが必要となるケースがほとんどです。
複雑なメッセージ構造から必要な項目を抽出して処理する際、メッセージを InterSystems IRIS data platform のオプジェクト指向フレームワークに基づき一度オブジェクトとしてインスタンス化することで処理を簡潔に記述できます。
しかし、データ量の多いメッセージを解析しオブジェクトにインスタンス化する処理は非常に負荷のかかる処理で、しかも大量のメッセージを処理しなければならない場合は求められるスループットを満たせない状況になりがちです。
しかも必要なデータは「全体の中のほんの少し」という状況の場合、無駄の多い処理となります。
この課題を解決するために考えられたのが VDOC (Virtual Document) です。
VDOC のメッセージは、オブジェクトとしてインスタンス化せずそのままの形式で読み込みますが、メッセージを処理するコードの中ではオブジェクトの操作と同様の表記で記述が行えます。
記述したコードがコンパイルされるとき、予め用意されたメッセージ形式に関するスキーマ情報と突き合わせることで実際のメッセージ上の位置や文字数などの情報を特定し、その情報に基づいてメッセージ項目にアクセスするコードを自動生成します。
こうすることでプログラム実行時、オブジェクトをインスタンス化せず直接メッセージ上の特定の位置からデータを取得することができます。
記事
Tomoko Furuzono · 2021年6月29日
これは、InterSystems FAQサイトの記事です。
IRISのターミナルスクリプトを使用することで、コマンドラインからの入力作業なしで IRIS のユーティリティを実行することが可能になります。
また、IRISのルーチンやクラスを、Windows のバッチファイルで実行する場合(irisコマンドで実行)は、「認証なし」もしくは「オペレーティングシステム認証」を指定していただく必要がありますが、パスワード認証のみしか使用できないような場合に、ターミナルスクリプトを使用する方法が使えます。 ターミナルスクリプトを使用する場合、Telnetサービス(%Service_Telnet)を有効にしていただく必要があります。 簡単に手順を説明すると、以下のようになります。
--------------------------------------------------------------------------------------------iristerm.exeを使用します。これはプロンプトが返ってきてユーザが入力を必要とするもの(例えば^%GSIZEなど)にも有効です。詳細は以下をご覧ください。import.scrの中身を変更することであらゆるIRISのユーティリティの実行に使用できます。
1. トピック下部にあるサンプル import.scr を、適当なディレクトリに配置して下さい。(ここではC:\import.scr とします)
2. 以下のように実行します。
cd C:\intersystems\cache\biniristerm.exe /console=cn_iptcp:localhost[23] C:\import.scr
※ [23]:Telnetポートを指定してください--------------------------------------------------------------------------------------------
以下ドキュメントをご参照ください。ターミナルスクリプトの使用法について★import.scr(ターミナルスクリプトのサンプル)
#ログインUsername/Password入力wait:Username:send:_Systemwait:Password:send:SYSwait:%SYSsend: zn "USER"#クラスインポート&コンパイル実行send:d ##class(%SYSTEM.OBJ).Load("c:\temp\test.xml","ck")send:send:H
尚、Telnetサービスを使用してターミナルスクリプトを実行する場合、スクリプト内で日本語を直接使用することはできません。
これは、ターミナルでスクリプトを読み込む際に文字コードは無変換で読み込む仕様となっているためです。日本語をUnicodeに変換する形でコードを記述することで、日本語を使用することが可能になります。例:.scrファイルを SJISで作成した場合(ファイル保存文字コード=SJISの時)
wait for: USER>send:s ^x=$ZCVT("あいうえお","I","SJIS")
または、日本語を直接記述せずに、$char()を使用して文字コードで指定する方法でも可能です。
USER>w $a("あ")_","_$a("い")_","_$a("う")_","_$a("え")_","_$a("お")12354,12356,12358,12360,12362---wait for: USER>send:s ^x=$c(12354,12356,12358,12360,12362)
記事
Mihoko Iijima · 2021年8月31日
これは InterSystems FAQ サイトの記事です。
24時間停止しないシステムの場合、「ジャーナルファイルの削除設定」に合わせて 0時30分 に古いジャーナルファイルを削除します。
「ジャーナルファイルの削除設定」より古いジャーナルファイルが残っている原因として、オープンされたままのトランザクションが存在していることが考えられます。
その場合、トランザクション実行中プロセスを探し、トランザクションを確定させることでジャーナルファイルを削除できるようになります。
以下のサンプルは、オープンされたままのトランザクションの存在確認と、存在する場合は対象ファイル名とジャーナルレコード情報が出力されます。
(サンプルは、https://github.com/Intersystems-jp/CheckOpenTransaction からダウンロードできます)
※注意※確認対象のジャーナルファイルサイズが大きい場合、ジャーナルファイルが多数ある場合は、実行に時間がかかるため、弊社サポートセンターまでご連絡ください。
Class ISJ.JournalUtility
{
ClassMethod GetOpenTransaction() As %Status
{
set status=$$$OK
#dim ex As %Exception.AbstractException
#dim rset As %ResultSet
try {
//現在のジャーナルファイル
write !,"現在のジャーナルファイル名:",
##class(%SYS.Journal.System).GetCurrentFileName(),!! // Open中トランザクション調査
// WIJに記録されているジャーナルの情報を取得
$$$ThrowOnError(##class(%SYS.Journal.System).GetImageJournalInfo(.filename,.jrnoffset,.jrnfilecount,.opentranoffset,.opentranfilecount))
if $get(opentranoffset)="" {
write !,"オープン中トランザクションはありません",!
return status
} //ファイルカウントに差(jrnfilecount-opentranfilecount>0 )がある場合
// 古いジャーナルファイルにオープン中トランザクションがあるため、対象ファイル名を探す
if jrnfilecount-opentranfilecount>0 {
set loopcnt=jrnfilecount-opentranfilecount
for i=1:1:loopcnt {
set currentfile=filename
$$$ThrowOnError(##class(%SYS.Journal.File).GetPrev(currentfile,.filename))
}
} write "〇〇 オープン中の対象ジャーナルレコード一覧 〇〇",!
set rset=##class(%ResultSet).%New("%SYS.Journal.Record:List")
do rset.%Execute(filename,,,,$LB("Address","=",opentranoffset))
write !,"=== File Name : ",filename," ===",!
write "Address : TimeStamp : ProcessID : RemoteSystemID : TypeName : Transaction",!
while rset.%Next() {
write rset.%Get("Address")," : ",
rset.%Get("TimeStamp")," : ",
rset.%Get("ProcessID")," : ",
rset.%Get("RemoteSystemID")," : ",
rset.%Get("TypeName")," : ",
rset.%Get("InTransaction"),!
}
}
catch ex {
set status=ex.AsStatus()
}
return status
}
}
実行例は以下の通りです。
USER>do ##class(ISJ.JournalUtility).GetOpenTransaction()
現在のジャーナルファイル名:/usr/irissys/mgr/journal/20210330.002
〇〇 オープン中の対象ジャーナルレコード一覧 〇〇
=== File Name : /usr/irissys/mgr/journal/20210330.001 ===
Address : TimeStamp : ProcessID : RemoteSystemID : TypeName : Transaction
1834156 : 2021-03-30 13:19:00 : 5194 : 1073741824 : BeginTrans : 1
関連する記事もご参照ください。
ジャーナルファイルを削除する方法
記事
Seisuke Nakahashi · 2022年7月11日
IRIS 2022.1では Embedded Python が導入されました。Embedde Python によって、IRISの独自言語である ObjectScript と Python の親和性の良さをぜひ実感いただけると嬉しいです。今回の記事では、日本語PDFをPythonライブラリを利用して作成し、さらに ObjectScript と融合するところまで見ていただこうと思います。
【事前準備】
Pythonの ReportLab ライブラリ を Embedde Python にインストールしておきます。コマンドプロンプトで <IRISdir>\bin に移動し、以下を実行します。
C:\InterSystems\IRIS\bin>irispip install --target ..\mgr\python ReportLab
【PDF作成 by Python】
クラスに以下のクラスメソッドを作成し、実行します。そのまま Python のロジック、ですね。[Language=Python] と宣言するだけで、特に接続を定義する必要もなく、Pythonコードを IRISサーバ上で直接動かすことが出来ます。
ClassMethod createPDF() [ Language = python ]
{
from reportlab.pdfgen import canvas
from reportlab.lib import pagesizes
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase import ttfonts
# A4 PDF
FILENAME = 'C:/temp/HelloWorld.pdf'
pdfsize = pagesizes.portrait(pagesizes.A4)
c = canvas.Canvas(FILENAME, pdfsize)
# Font
FONTNAME = 'Meiryo UI'
FONTFILE = 'C:/Windows/fonts/Meiryo.ttc'
FONTSIZE = 24
pdfmetrics.registerFont(ttfonts.TTFont(FONTNAME, FONTFILE))
c.setFont(FONTNAME, FONTSIZE)
# put letters
xpos = 100
ypos = 500
c.drawString(xpos, ypos, 'IRISから簡単にPythonを呼び出そう')
c.save()
}
【PDF作成 by ObjectScript】
このロジックを、ObjectScriptのロジックに完全に移行することも簡単です。次のクラスメソッドをご覧ください。ReportLabライブラリの Import 、変数のセット、メソッドの実行の構文が少しだけ違いますが、先ほどのクラスメソッドと、1行ずつの実行内容がまったく同じになっていますね。PythonとObjectScriptの親和性の良さを感じていただけると思います。
ClassMethod createPDF2()
{
set canvas=##class(%SYS.Python).Import("reportlab.pdfgen.canvas")
set pagesizes=##class(%SYS.Python).Import("reportlab.lib.pagesizes")
set pdfmetrics=##class(%SYS.Python).Import("reportlab.pdfbase.pdfmetrics")
set ttfonts=##class(%SYS.Python).Import("reportlab.pdfbase.ttfonts")
; A4 PDF
set FILENAME="C:/temp/HelloWorld.pdf"
set pdfsize=pagesizes.portrait(pagesizes.A4)
set c = canvas.Canvas(FILENAME, pdfsize)
; Font
set FONTNAME = "Meiryo UI"
set FONTFILE = "C:/Windows/fonts/Meiryo.ttc"
set FONTSIZE = 24
do pdfmetrics.registerFont(ttfonts.TTFont(FONTNAME, FONTFILE))
do c.setFont(FONTNAME, FONTSIZE)
; Put letters
set xpos = 100
set ypos = 500
do c.drawString(xpos, ypos, "IRISから簡単にPythonを呼び出そう")
do c.save()
}
このように、Embedded Pythonによって、世の中に星の数ほどある Pythonライブラリ や 既存のPythonコードを、そのままIRISで実行するだけでなく、ObjectScriptに移行してIRISの既存データや既存ロジックと連携することも簡単にできます。
ぜひ Embedded Python を活用いただき、これまで以上に IRIS と世界をつなげてみてください!
★お知らせ
Embedded Pythonのセルフラーニングビデオを順次公開しています。Embedded Python概要や利用前準備、対象者別の使い方も含めて、ぜひ、以下の開発者コミュニティ記事をあわせてご参照ください。
【はじめてのInterSystems IRIS】Embedded Python セルフラーニングビデオシリーズ公開!
記事
Tomoko Furuzono · 2023年5月14日
これは InterSystems FAQ サイトの記事です。
オペレーティング・システム・ベースの認証(OS認証)では、OSのユーザ ID を使用して、IRISを使用するユーザを識別します。
インストール時に選択する初期セキュリティ設定=最小の場合は、予め、OSログインユーザと同一名のユーザをInterSystems IRIS に作成する必要があります。(パスワードは異なっていても構いません。)初期セキュリティ設定=通常以上の場合は、インストールユーザ名(OSログインユーザ名)で、ユーザが作成されていますので、このユーザを使用することができます。別のログインユーザで実行したい場合は、同様にIRISユーザを同名で作成してください。
[インストール時の初期セキュリティ設定画面]
OS認証は、以下の3つのサービスに使用できます。
・コールイン (%Service_Callin)・コンソール (%Service_Console) ※Windowsのローカル接続・ターミナル (%Service_Terminal) ※Linux/Unixのローカル接続
※iris run(runw)/ccontrol run(runw) ではパスワード認証は使用できませんが、OS認証を使用してシステムにログインすることが可能となります。
OS認証を行うための設定手順は以下の通りです。
1.[認証/Web セッション・オプション] ページ ([システム管理] > [セキュリティ] > [システム・セキュリティ] > [認証/ウェブセッションオプション]) ページで、[OS認証を許可] を選択します。※ご使用のバージョンにより、"OS認証"、"オペレーティングシステム認証"など、表記が違う場合があります。
2.[サービス] ページ ([システム管理] > [セキュリティ] > [サービス]) で、[名前] 列からサービスを選択します。選択したサービスの [サービス編集] ページが表示されます。
3.[サービス編集] ページで、[オペレーティングシステム] チェック・ボックスにチェックを付けてオペレーティング・システム・ベースの認証を選択します。(例では、%Service_Consoleの設定を編集しています。) ※初期セキュリティ設定=通常以上の場合は、デフォルトで[パスワード]がチェックされていますが、 OS認証のみを実行したい場合は、[パスワード]のチェックは外しておく必要があります。
[保存] をクリックすると、選択した設定内容が使用されます。
以上の設定で、指定したサービスで、OS認証が可能となります。
ドキュメントは以下のページとなります。併せてご確認ください。オペレーティング・システム・ベースの認証構成について
記事
Mihoko Iijima · 2020年12月3日
これまでさまざまなストレージ技術とそのパフォーマンス特性の例を紹介してきましたが、今回は新しい HPE Cloudline 3150 Gen10(AMD プロセッサベースのシングルソケットサーバーで 3.2TB の [Samsung PM1725a](https://www.samsung.com/semiconductor/global.semi.static/Samsung_PM1725a_NVMe_SSD-0.pdf) NVMe ドライブを 2 台搭載)など、内部コモディティベースのサーバーストレージの活用が増加傾向にあることを確認しました。
### ハードウェア構成と LinuxLVM のセットアップ
テストは次の構成で行われました。
* 2 x Samsung 3.2TB PM1725a NVMe ドライブ(サーバー内蔵)
* 1 x HPE Cloudline 3150 Gen10 サーバー
* Red Hat Enterprise Linux 7.5 64 ビット版
このテストでは、その他のストレージデバイスや HBA は使用していません。 両方の NVMe ディスク装置の IO 能力を最大化するため、16MB の PE サイズを使用して単一の LVM PE ストライプを作成しました。 LVM PE ストライピングのセットアップの詳細は、コミュニティ内の別の記事にあります。
### InterSystems IRIS のインストールとセットアップ
InterSystems IRIS は、単一のボリュームグループと単一の論理ボリュームにインストールされます。 今回は複数のボリュームグループと論理ボリュームを使わず、非常に単純なセットアップを行いたいと思いました。
この例では、単一の論理ボリュームとファイルシステムを作成しました(この例では、/data がファイルシステムのマウントポイントになっています)。 データベースインスタンスからのランダム読み取りのワークロードを使用し、徐々にジョブ数が増加する IO ワークロードを生成しています。 1 TBのデータベースが IO ワークロードのターゲットです。 このテストで使用された RANREAD ツールの詳細は、こちらを参照してください。
### テスト結果
わずか 10 個のジョブから開始した最初の時点では、ストレージのスループットは 100 マイクロ秒(µs)と非常に低い遅延で 1 秒間に 10 万個の 8 KB データベースブロックを読み取ることができました。
ジョブの数が増えても、サーバーが実際に CPU の能力を使い果たしてストレージをさらに激しく駆動させるまでは遅延はずっと低いままでした。 観察された中で最も大きな遅延は 300µs に過ぎず、1秒間に 850 K 以上の 8KB データベースブロックの読み取りを維持していました。
図 1 は 2 台の Samsung NVMe ディスク装置のみを使用してテストした構成で、パフォーマンスが予測可能でスループットが維持されたことを示しています。 最大値でも遅延は非常に低く、実際には NVMe ディスク装置のスループットが最大化する前にテストサーバーが実際に CPU を使い果たしたことが分かります。
図 1: 予測可能で非常に低い遅延と非常に高いスループットを維持

## まとめ
Samsung PM1725a NVMe ディスク装置は非常に低い遅延と高スループット能力を示し、非常に高性能なトランザクションシステムをサポートしています。 そのため、ストレージの待機時間とスループットが必要なインジェッション・ワークロードに最適です。
これらの Samsung NVMe ディスク装置はこのような素晴らしいパフォーマンス特性を備えながら非常に魅力的な価格で提供されており、InterSystems のデータベースミラーリングと組み合わせると同じレベルのアプリケーションの可用性を実現できます。
記事
Mihoko Iijima · 2020年11月6日
これはInterSystems FAQ サイトの記事です。
テーブルチューニングを行った際に、フィールドに値がほとんど登録されていない(Null)場合や、特定の値がほとんどを占める場合、その値を [外れ値] として除外して選択性計算を行います。 また、外れ値が全レコードの何 % を占めているかの値は [外れ値の選択性] として記録されます。
InterSystems 製品のクエリオプティマイザは、選択性数値とエクステントサイズを使用してクエリの経路を決定しますが、クラスクエリ、埋め込み SQL に使用しているクエリに外れ値が含まれる場合は、外れ値の選択性が自動的に考慮され、インデックスの使用有無を決定しています。
ダイナミック SQL 、ODBC/JDBC 経由でのクエリについては、外れ値が Null である場合、自動的に外れ値の選択性が考慮されますが、Null 以外の特定の値が外れ値に検出される場合は、明示的に指示を与えるまで考慮しません。
詳細は、ドキュメント(異常値に対する述語条件【IRIS】/異常値に対する述語条件【Caché/Ensemble】)をご参照ください。
SAMPLES ネームスペースの Sample.Person テーブルの FavoriteColors には、好きな色が複数格納されていますが未登録(NULL)の値も多く含まれています(インストール直後の状態で 200 件中 71 件がNULL)。選択性の計算で FavoriteColors を外れ値と認識した場合、[外れ値] に NULL、[外れ値の選択性] に 35.5% (71/200×100=35.5)が表示されます。
※ IRIS/IRIS for Health でお試しいただく場合の Sample.Person 作成方法 ※
IRIS/IRIS for Health にはSAMPLESネームスペースはありませんので、任意のネームスペースに Sample.Person のサンプルをインポートします。
サンプルインポート方法詳細は、ドキュメント(InterSystems IRIS で使用するサンプルのダウンロード)、または関連記事【サンプル(Sample.Person)のクラス定義ダウンロードとサンプルデータの作成について】をご参照ください。
IRIS/IRIS for Health でお試しいただく場合、以降の説明に登場する SAMPLES ネームスペースは、Sample.Person クラスをインポートしたネームスペースに読み替えてお試しください。
管理ポータルで確認できます。1、[システムエクスプローラ] > [SQL] を開きます。
2、画面中央上部にある[変更]を押下し、ネームスペースをSAMPLESに切り替えます。
[スキーマ] のプルダウンから Sample を選択し、[テーブル] の > をクリックして階層を展開し、[Sample.Person] を選択します。
画面右側で [カタログ詳細]タブの [フィールド] のラジオボタンをクリックすると詳細表示が開きます。
外れ値を考慮したプランを確認するため、Sample.Person クラスの FavoriteColors に対するインデックスを追加し、インデックスを再構築します。
インデックス追加例は以下の通りです。
/// インデックス例 ※FavoriteColorsはリストコレクションで定義されています
Index FavoriteColorsIdx On (FavoriteColors(ELEMENTS), FavoriteColors(KEYS));
作成したインデックス再構築します。メソッドを利用する方法は以下の通りです。
do ##class(Sample.Person).%BuildIndices($LB("FavoriteColorsIdx"))
管理ポータルで再構築する方法は、以下の通りです。
管理ポータル、またはターミナルで以下のSQLを実行し、クエリプランを確認します。
select ID,Name from Sample.Person where FavoriteColors is null
プラン表示より レコード全体(Read master map)を参照したことを示しています。
where FavoriteColors is null を指定した場合、ダイナミック SQL でも外れ値:Null を考慮したプランを選択するため、インデックス:FavoriteColorsIdx が使用されていないことがわかります。
次に、条件式をNull以外に変え実行します。
select ID,Name from Sample.Person where for some %element(FavoriteColors) (%value='red')
Module:B を参照すると、FavoriteColorsIdx を使用していることがわかります。
外れ値について詳細は、ドキュメント(Selectivity と Outlier Selectivityについて【IRIS】/Selectivity と Outlier Selectivityについて【Caché/Ensemble】)もご参照ください。
※上記ドキュメント中の [異常値] や [Outlier] は [外れ値] と同義語です。
記事
Toshihiko Minamoto · 2022年12月20日
Global Summit 2022 で発表しました通り、Apache ベースの Web サーバ (プライベート Web サーバまたは PWS と呼ばれることが多い) の出荷、インストールを中止します。現在のところ、InterSystems IRIS 2023.1 から中止する予定です。
この新しいアプローチにより、目的に最も適した Web サーバを選択し、その設定や保守、更新を自由に実施することが可能となります。この変更による主な利点は、特にセキュリティ脆弱性において重要な修正について、インターシステムズ からのキットのアップデートを待つことなく、最新バージョンを入手できるようになることです。インターシステムズは、Apache または IIS の構成に役立つツールを提供します。(InterSystems IRIS Community Edition では、PWS を引き続きインストールすることに注意してください)。
Web サーバのインストールは一般的なプロセスであり、通常は簡単です。また、さまざまな Web サーバ・ベンダによって文書化されています。
以下は、Ubuntu、Windows、および macOS の例です。これらの例は、インターシステムズ社製品に Web サーバが含まれていない場合やインストールされていない場合に、新しい動作を確認できるよう、簡単なインストール手順を示すものです。(このコードは既存のまま提供されており、サポートされていません。また、ミッションクリティカルなアプリケーションやデータ機密性の高いアプリケーションをホストするには不十分であることに注意してください)。
また、この新しいプロセスを試すためのキットへのアクセスも可能です。FAQについては、この記事の最後にあるPDFをご覧ください。また、議論したい方は、https://jp.community.intersystems.com/node/532491 をご覧ください。
ウェブサーバーをインストールする方法には複数あることが多いため、慣れており一番うまくいく方法を選択ください。
PWSを含まない新しいインストーラを試したい方のために、新しい早期アクセスプログラム(EAP)を作りました。 このEAPに参加いただき、キットにアクセスしたい方は、nopws@InterSystems.com までメールにてご連絡ください。
ご意見、ご感想は、nopws@InterSystems.com までお願いします。
マイクロソフトWindowsの例
マイクロソフトWindowsを使用してIISをインストールします。
一度IISをインストールしますと、IRISをインストールするときにIISを設定するかどうかを聞いてきます。
Ubuntuの例
前提条件として、インストールするユーザはsudoが使え、PWSがインストールされていないこと。
apt-get コマンドを使用してUbuntuのApache公式リポジトリを利用できます。
リポジトリの更新
$ sudo apt-get update
Apacheのインストール
$ sudo apt-get install apache2
インストールの検証
$ apache2 -v
インストール後に以下の調整を行います。
$ sudo nano /etc/apache2/apache2.conf
from:
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
To:
User <マシンのユーザのユーザ名>
Group <マシンのユーザのグループ名>
Webサーバのリスタート
$ sudo apachectl -k restart
InterSystems IRISのインストール
SMPのテスト (http://localhost/iris/csp/sys/UtilHome.csp)
インストールが単にテスト目的の場合、以下のコマンドで apache2 を削除できます。
$ sudo apt-get remove apache2
macOSの例
以下のコマンドでインストールします
$ brew install apache-httpd
インストールや更新後にhttpdをリスタートします
$ brew services restart httpd
以下のコマンドで起動します
$ sudo apachectl -k start
または以下のコマンドで再起動します
$ sudo apachectl -k restart
ブラウザより以下のコマンドでテストします
http://localhost
成功すると It works と表示されます。
IRISのインストール (please observe the new installation dialog as it is new)
Web サーバのリスタート
$ sudo apachectl -k restart
SMPのテスト (http://localhost/iris/csp/sys/UtilHome.csp)
インストールが単にテスト目的の場合、以下のコマンドで apache-httpd を削除できます。
$ brew remove apache-httpd
記事
Mihoko Iijima · 2025年3月28日
開発者の皆さん、こんにちは。
先日、EM リリース新バージョン 2025.1 がリリースされました。
コンテナ版以外ですが、新規インストール時に指定する初期セキュリティオプションのデフォルトが「ロックダウン(Locked Down)」に変更となりましたので、今までとの違いについて以下ご説明します。
ドキュメント(Windows):[Windows Development Installation] > [Step 3: Choose Initial Security]
ドキュメント(UNIX、Linux、Mac):[UNIX®, Linux, and macOS Development Installation] > [Step 1: Choose Security Settings]
以前のバージョンのデフォルトは、IRIS:「最小(Minimal)」、IRIS for Health:「通常(Normal)」です。
ロックダウンオプションは、初期セキュリティの中で一番厳しいセキュリティ設定を行うオプションで、例えば、オブジェクト/SQL のアクセスが行えない、VSCode から IRIS にアクセスできない状況からスタートします。
そのため、使用したいアクセスに対してアクセス許可追加していく必要のあるセキュリティオプションです。
今までご利用いただいていたバージョンのデフォルト値と異なりますので、新規インストール時は設定値に気を付けてインストールを進めてみてください。
Windows の場合は、以下の表示となります。
※設定値の並びも以前のバージョンと変わっていますのでご注意ください。
※ 2025/3/28 現在、Windows 版 IRIS for Health のインストールキットのみ、以前と同様の「通常(Normal)」がデフォルト設定されています(将来のリリースで修正される予定です)。
Linuxでは、IRIS、IRIS for Health 共通で以下のように表示されます(最下部とご覧ください)。
Your system type is 'Ubuntu 22.04 LTS (x64)'.
Enter instance name <IRIS>: IRIS
Enter a destination directory for the new instance.
Directory: /usr/irissys
Directory '/usr/irissys' does not exist.
Do you want to create it <Yes>?
Select installation type.
1) Development - Install InterSystems IRIS server and all language bindings
2) Server only - Install InterSystems IRIS server
3) Custom
Setup type <1>? 1
How restrictive do you want the initial Security settings to be?
"Locked Down" is the most secure, "Minimal" is the least restrictive.
1) Locked Down
2) Normal
3) Minimal
Initial Security settings <1>?
もし、ロックダウンの設定でインストールしてしまった場合ですが、
1、オブジェクト/SQL を使いたい(ODBC / JDBC経由のアクセス、スタジオの利用も含まれます)
2、VSCode から IRIS に接続したい
上記アクセスを行いたい場合は、管理ポータルにログインし、セキュリティ設定を変更する必要があります。
1、オブジェクト/SQLを使いたい
サービス:%Service_Bindings を有効に変更します。
※ サービスとは、InterSystems 製品への接続経路を管理するセキュリティ設定で、対象サービスを有効とするか(接続を使うか)、無効とするか(接続を使わないか)、有効とする場合の認証はどれを使うか、などを設定します。
管理ポータルの以下メニューにアクセスします(SuperUser でログインをしてください。パスワードはインストール時に指定したパスワードを指定します)。
[システム管理] > [セキュリティ] > [サービス]
グレーの行は無効化されていることを示しています。
%Service_Bindings をクリックし、有効にチェックを入れ、[保存] ボタンをクリックします。
設定は以上です。
その他サービスの初期セキュリティオプション別、有効・無効については、ドキュメント「初期のサービス・プロパティ」をご参照ください。
2、VSCode から IRIS に接続したい
VSCode から REST 経由で IRIS に接続しています。内部的に使用しているエンドポイントのパスの設定がロックダウンでは無効化されていますので接続できません。有効化に変更するため管理ポータルで設定を変更します。
[システム管理] > [セキュリティ] > [アプリケーション] > [ウェブ・アプリケーション] > /api/atelier を選択
/api/atelier の設定画面を開いたら、[アプリケーション有効] にチェックを入れて[保存]ボタンをクリックします。
設定は以上です。
記事
Mihoko Iijima · 2020年12月1日
これは、InterSystems FAQサイトの記事です。
プログラムでロック情報を取得するには以下2種類の方法があります。
%SYS.LockQuery クラス を使用する方法
SSVN(構造化システム変数)を使用する方法
1. %SYS.LockQuery クラス を使用する方法
#dim rset As %SQL.StatementResult
set stmt=##class(%SQL.Statement).%New()
set st=stmt.%PrepareClassQuery("%SYS.LockQuery","List")
set rset=stmt.%Execute()
while rset.%Next() {
write !,rset.%Get("FullReference")
write !,rset.%Get("Owner")
write !,rset.%Get("DelKey"),!
}
より詳細なロック情報を取得する場合には List クエリではなく Detail クエリを使用します。
set st=stmt.%PrepareClassQuery("%SYS.LockQuery","List") を
set st=stmt.%PrepareClassQuery("%SYS.LockQuery","Detail") に変更します。
その他 条件を指定してロック情報を取得する事が出来ます。詳細についてはクラスリファレンス(%SYS.LockQuery)【IRIS】をご参照ください。(クラスリファレンス(%SYS.LockQuery))
2. SSVN(構造化システム変数)を使用する方法
以下サンプルは、現在のネームスペースにあるロックを検索し表示します。またローカル変数 LOCKET の配列に検索で見つかったロック名を設定しています。
SET lname=""
FOR I=1:1 {
SET lname=$ORDER(^$LOCK(lname))
IF lname="" { QUIT }
SET LOCKET(I)=lname
WRITE !,"the lock name is: ",lname
}
WRITE !,"All lock names listed"
QUIT
詳細は、^$LOCKについて【IRIS】のドキュメントをご参照ください。
(^$LOCKについて )
記事
Mihoko Iijima · 2020年12月1日
これは、InterSystems FAQサイトの記事です。
以下の例では Test.Class2 クラスの Images プロパティに画像ファイルが保存できるように定義しています。input() メソッドを利用して画像ファイルを Images プロパティに登録し、データベースに保存したとします。
Class Test.Class2 Extends %Persistent
{
Property Images As %Stream.GlobalBinary;
///引数には画像ファイルのフルパスを指定
ClassMethod input(in As %String) As %Status
{
//画像ファイル格納用ストリームのインスタンスを用意
set filestream=##class(%Stream.FileBinary).%New()
//画像ファイルをストリームのインスタンスにリンクさせる
do filestream.LinkToFile(in)
//Test.Class2クラスのインスタンス生成
set o=..%New()
//画像のストリームをTest.Class2のインスタンスにコピー
do o.Images.CopyFrom(filestream)
//インスタンスをデータベースに保存
quit o.%Save()
}
/// 以下Storage定義は省略
}
データベース登録されたストリームデータを画像ファイルに出力するコード例は以下の通りです(ID=1で格納されたデータをオープンしています)。
set file="/ISC/test.JPG"
set filestream=##class(%Stream.FileBinary).%New()
do filestream.LinkToFile(file)
set obj=##class(Test.Class2).%OpenId(1) //保存済オブジェクトのオープン
do filestream.CopyFrom(obj.Images)
set st=filestream.%Save()
記事
Megumi Kakechi · 2021年1月6日
これは InterSystems FAQ サイトの記事です
Web サービス(SOAP)またはREST で IIS を経由してクライアントにエラー応答する際、既定では IISが生成するデフォルトのエラーページ( HTTP 500 エラー )が返されます。
SoapFaultなど、サーバ側で出力したエラーの詳細情報は返されません。
IIS7 以降、WebクライアントがWeb サービスの障害の詳細情報を取得するための設定オプションが追加されました。
HTTP ステータスコードがエラーの場合に、既存の応答をどうするかを existingResponse 属性で指定することができます。
こちらの値を、既定の Auto から PassThrough に変更することで、エラーの詳細情報が返されるように変更できます。※設定変更後、IISの再起動が必要です。
詳細や設定手順については、以下ドキュメントをご参照ください。Microsoft IIS 7 以降の設定手順について【IRIS】
Microsoft IIS 7 以降の設定手順について
※web.config ファイルの手動編集よりも、IIS マネージャに組み込まれている構成エディタ を使用する方法がエラーが少なく安全です。
※HTTP エラー について