検索

クリアフィルター
記事
Mihoko Iijima · 2021年3月19日

複数のSQL 文を実行する方法

これは InterSystems FAQ サイトの記事です。 複数の SQL 文を実行する GUI はありませんが、複数の SQL 文を含むファイルを作成しファイルをインポートしながら SQL を実行する方法で対応できます。 ご利用バージョンによって使用するユーティリティメソッドが異なります。 2020.3以降をご利用の場合は %SYSTEM.SQL.Schema クラスの ImportDDL() メソッドを使用します。 2020.2以前をご利用の場合は %SYSTEM.SQL クラスの DDLImport() メソッドを使用します。 1)バージョン 2020.3 以降での方法:%SYSTEM.SQL.Schema クラスの ImportDDL() メソッドの利用 インポート用ファイルに記述するSQL文が複数行ある場合は、記述する SQL の後ろに GO 文を記述する必要があります。 インポートファイル例は以下の通りです。 INSERT INTO Test2.Person (Name) values('test1') go INSERT INTO Test2.Person (Name) values('test2') go INSERT INTO Test2.Person (Name) values('test3') go %SYSTEM.SQL.Schema クラスの ImportDDL() メソッドの利用例は以下の通りです。 第1引数:インポート対象ファイルのフルパス 第2引数:インポート時のログ出力用ファイルのフルパス 第3引数:DDLモードを指定(指定文字詳細はクラスリファレンスをご参照ください) USER>do $system.SQL.Schema.ImportDDL(file,"/irisdev/src/ddlimport.log","IRIS") Importing SQL Statements from file: /irisdev/src/inserts.txt Recording any errors to principal device and log file: /irisdev/src/ddlimport.log SQL statement to process (number 1): INSERT INTO Test2.Person (Name) values('test1') Preparing SQL statement... Executing SQL statement... DONE SQL statement to process (number 2): INSERT INTO Test2.Person (Name) values('test2') Preparing SQL statement... Executing SQL statement... DONE SQL statement to process (number 3): INSERT INTO Test2.Person (Name) values('test3') Preparing SQL statement... Executing SQL statement... DONE Elapsed time: .010847 seconds USER> 詳細はドキュメントもご参照ください。 InterSystems SQL のインポート 2)バージョン 2020.2 以下での方法:%SYSTEM.SQL クラスの DDLImport() メソッドの利用 インポート用ファイルに記述するSQL文が複数行ある場合は、記述する SQL の後ろに GO 文を記述する必要があります。 GO 文の他に、SQLの文末に任意の区切り文字を指定することもできます。 以下実行例は、DDLImport() の7番目の引数に指定できる文末の区切り文字にセミコロン(;)を指定した方法の実行例です。 以下のような query.txt を用意しているとします。※文末区切り文字は ";" を指定しています。 C:\temp\query.txt insert into Sample.Person(Name,SSN) values('test1','999-99-9901'); insert into Sample.Person(Name,SSN) values('test2','999-99-9902'); insert into Sample.Person(Name,SSN) values('test3','999-99-9903'); insert into Sample.Person(Name,SSN) values('test4','999-99-9904'); DDLImport() の7番目の引数に文末区切り文字を指定しながら以下のように実行します。 DO $SYSTEM.SQL.DDLImport("CACHE",$Username,"c:\temp\query.txt",,,,";") ※ 第2引数は必須で、SQLを実行するユーザ名を指定します。例では、現在のユーザを $Username で取得し指定しています(テーブルにアクセスできるユーザを指定してください)。 詳細は、以下のドキュメントをご覧ください。 SQL のインポートについて【IRIS】 SQL のインポートについて
記事
Hiroshi Sato · 2021年10月13日

System routine buffer (# KB) shortage is detected.... のメッセージの意味と対処方法

これはInterSystems FAQ サイトの記事です。コンソールログファイル (※1) に、以下のメッセージが表示されることがあります。 05/14/19-09:32:14:056 (6888) 0 System routine buffer (64 KB) shortage is detected, 430 routine buffers configured, adjusted per process cached rtn to 71 (※1)コンソールログファイルは、[管理ポータル] > [システムオペレーション] > [システムログ] > [コンソール・ログ] から参照できます。または、以下ファイルを直接参照することもできます。  <インストールディレクトリ>\mgr\cconsole.log 上記メッセージでは、ルーチンバッファサイズのうちの 64KB バッファの不足が検出されています。 弊社製品インストール時点のルーチンキャッシュ用メモリのデフォルト値は 35MB に設定されていて、各バッファ(4KB/16KB/64KB)にそれぞれに 430 バッファを割り当てた合計値で設定されています(※補足)。 「adjusted per process cached rtn to 71」については、1プロセスあたりに参照できるルーチン個数が 71個に調整されています。 初期値の30%以下になると上記のメッセージがコンソールログに記録されるようになっています。 上記メッセージが出ているまま使用し続けた場合、ディスクアクセスが増えパフォーマンスが落ちる可能性もあります。 対策としては、ルーチンキャッシュ用メモリを増加させることで、ログが表示されなくなります。 【注意】 ルーチンキャッシュ用メモリの変更には、InterSystems製品の再起動が必要です。 IRISの Interoperabilityメニュー、または Ensembleメニュー では、コンポーネント作成時に上記メッセージが出力されるケースがあります。 インストール後、初期値の 35MB を 64MB 程度に増やして様子を見てください。 なお、ルーチンキャッシュ用メモリが実行環境で過不足ないかどうか、については実稼働環境で確認するツールがあります。 [管理ポータル] > [システムオペレーション] > [システム使用]  または  ^GLOSTATルーチン/^mgstatルーチン 上記ツールをアプリケーション稼働中 60 秒間計測します。 (1度の計測だけではなく、時間間隔をあけ数回計測します。) 「ルーチンバッファ読み込みと保存」 または 「Routine buffer loads and saves 」の値が 20以下であれば、設定値したメモリで十分と言えます。 (最適値は 0 で、実行用ルーチンが全てキャッシュ上にある状態を示します。) キャッシュの設定については、下記の技術資料もご確認ください。 Caché管理概要 (※補足)バージョン2010.1~2014.1では、初期サイズは24MBで、各バッファ(4KB/16KB/64KB)に 300 バッファを割り当てが合計値が設定されます。
記事
Megumi Kakechi · 2022年2月13日

IRISが使用するワーキングセット(メモリ)について

これは、InterSystems FAQサイトの記事です。各プロセスが消費しているメモリの内容は、Windowsリソースモニタの項目のワーキングセット、共有可能、プライベートで確認できます。 これらの内容は以下になります。 ワーキングセット プロセスが使用する物理メモリです。         ワーキングセット(プライベート)とワーキングセット(共有可能)との合計です。 共有可能   プロセスが使用する物理メモリ内で他のプロセスと共有可能なメモリです。 プライベート  プロセスが使用する物理メモリ内で他のプロセスと共有不可能なメモリです。 例えば、以下のようにメモリを使用しているプロセスがある場合、ほとんどは共有メモリになっているといえます。 ワーキングセット 5,341,472 = 共有可能 5,328,664 + プライベート12,808 (kb) プロセスがアクセスする共有メモリは、データベースキャッシュおよびルーチンキャッシュで使用されているメモリ領域になります。 プロセスが大量にグローバルへのアクセスを行うと、データベースキャッシュへのアクセス量も多くなり、メモリ使用量の共有可能の数値が大きくなります。(最大でデータベースキャッシュサイズまで大きくなります) 各プロセスのメモリ使用量のワーキングセットが多くても共有可能の数値が多い場合は特に問題はありません。 共有メモリ領域にマップしてる為にワーキングセットの数値が大きくなっているだけで、別途メモリを使用している状況ではありません。 WRTDMN や GARCOL などのシステムコアプロセスのワーキングセット(メモリ)が肥大化している場合、いずれのプロセスもデータベースキャッシュを大量にアクセスするため、データベースキャッシュのサイズが程度までの数値であれば妥当な値となります。 コアプロセスについては、以下のドキュメントをご覧ください。 コアプロセスについて あわせて、以下の関連記事も是非ご覧ください。 InterSystems製品のプロセスが使用するメモリ量について 管理ポータルのメモリ関連設定項目について System routine buffer (# KB) shortage is detected.... のメッセージの意味と対処方法 データベースキャッシュおよびルーチンキャッシュの最適値の設定方法 Windows上での共有メモリの割り当てについて
記事
Tomoko Furuzono · 2025年4月3日

二要素認証について

これは、InterSystems FAQ サイトの記事です。 InterSystems製品は、二要素認証をサポートしています。下記ドキュメントページに詳細について記載がありますので、ご参照ください。2要素認証 以下、例として、スマートフォン用認証アプリを用いて、IRIS上のCSPアプリケーションの2要素認証を行うための設定方法を解説します。 1.IRIS側の設定​1-1.インスタンスに対する 2 要素認証の有効化および構成を行います。管理ポータルで、[システム管理] > [セキュリティ] > [システム・セキュリティ] > [認証/Web セッション・オプション]と進み、[2 要素のタイムベース・ワンタイム・パスワード認証を許可] チェック・ボックスにチェックを付けます。チェックを付けると、[2 要素のタイムベース・ワンタイム・パスワードの発行者] フィールドが表示されますので、ここに発行者を示す文字列(任意)を入力します。 1-2.次に、このアプリケーションに接続するユーザの設定を行います。[システム管理] > [セキュリティ] > [ユーザ]で、該当のユーザの編集を行います。[二要素認証]の[タイムベースのワンタイム・パスコード有効]にチェックを付けて保存します。ここで、ワンタイム・パスワードキー(OTPキー)及びQRコードが表示されます。※OTPキーおよびQRコードの取り扱いには、十分注意してください。 詳細は、ドキュメントの注意書きをご確認ください。 1-3.ウェブアプリケーションの編集を行います。[システム管理] > [セキュリティ] > [アプリケーション] >[ウェブ・アプリケーション]で、該当のアプリケーションを開き(例では/csp/user)、[許可された認証方法]の[二要素パスワード]にチェックを付けて保存します。 2. スマートフォン認証アプリケーションの設定2-1. スマートフォンに任意の認証アプリケーションをインストールします。※例では、Microsoft Authenticatorを使用。 2-2. アカウントの追加アカウントの追加メニューで[他のアカウント]を選択し、1-2のQRコードをスキャンするか、OTPキーをマニュアル入力します。 以上で設定は完了です。 <テスト>CSPアプリケーションにアクセスすると、通常のユーザー名・パスワードの入力に続いて、ワンタイム・パスワードコードを入力する画面が出てきますので、そこに、スマートフォン認証アプリで表示されるコードを入力し、アクセスできることを確認します。
記事
Mihoko Iijima · 2022年7月26日

FlaskとEmbedded Pythonで簡単なWebアプリを作ってみよう!

開発者の皆さん、こんにちは! Flaskを使うと簡単にWebアプリが作成できるようでしたので、Embedded Pythonを利用してIRISに保存した月毎の歩数データ(テーブル/グローバル)を matplotlibを利用してグラフ表示する簡単なWebアプリを作成してみました。 使っているPythonスクリプトファイルやHTMLは以下の通りです(図例はテーブルからデータを取る例ですが、サンプルにはグローバルからデータを取得する例も含まれます)。 サンプルはこちらに置いています👉https://github.com/Intersystems-jp/WalkSteps IRISのインストール環境に合わせて、サンプルのディレクトリを分けています。 <Windows にIRISをインストールされている場合>https://github.com/Intersystems-jp/WalkSteps/tree/master/Windows をご覧ください。Windows上Pythonのバージョンは3.9で試しています。3.10では動作しませんでしたので、3.9でお試しください。 <Windows以外にIRISをインストールされている場合>https://github.com/Intersystems-jp/WalkSteps/tree/master/Linux をご覧ください。​​ できあがりのイメージは以下の通りです。 1) 事前準備について flaskとmatplitlib を pip でインストールします(Windows上にインストールしたIRISを使う場合もpipでインストールしてください​)。 WindowsにインストールしたIRISを利用する場合のみ、以下ご確認ください。 テーブルからデータを取得する例を試される場合は table_goiris.py の2行目、グローバルからデータを取得する例を試される場合は、global_goiris.py の2行目に記載のある sys.path のディレクトリを変更します。 以下2つのディレクトリを確認し、sys.pathに追加してください。 IRISインストールディレクトリ/mgr/python IRISインストールディレクトリ/lib/python ​​例: sys.path+=['c:\\intersystems\\irishealth\\mgr\\python','c:\\intersystems\\irishealth\\lib\\python'] 2)画面表示について 画面表示に使用しているHTMLは、index.html で、Flaskの render_template() 関数を利用し、HTTP応答としてHTML文書を返送しています。​​​(HTMLの継承ができたので、ベースとなるHTMLを base.htmlに作成し、index.htmlの中で {% extends 'base.html' %} と指定して base.html を継承しています) {% extends 'base.html' %} {% block body %} <div class="form"> <form action="/" method='POST'> <H2>{{selectmonth}}月の歩数</H2> <div class="alert alert-warning" role="alert"> <label for="title"> 確認したい月を指定してください。</label> <select name="selectmonth"> {% for month in monthlist %} <option value="{{ month }}">{{ month }}月</option> {% endfor %} </select> <input type="submit" value="歩数確認"> </div> </form> {% if rdate != "" %} <div class="card-body"> {{ image | safe }} </div> {% endif %} </div> {% endblock %} 3)画面表示に使うグラフとデータについて 以下、Linux用ディレクトリ以下にあるコード例で解説しますが、Windowsディレクトリ以下にある内容と大枠に違いはありません。 3-1) テーブルデータを利用する場合 IRISからデータを取得する処理は、table_goiris.py に記述しています。 getMonthTbl()関数では、保存されている歩数データの「月」情報をSELECTで取得し、Pythonリストに格納し戻しています。 def getMonthTbl(): rs=iris.sql.exec("select DATEPART('MM',RecordDate) As month from MyHealth.Steps group by DATEPART('MM',RecordDate)") monthlist=[] for row in enumerate(rs): monthlist.append(row[1][0]) return monthlist createChartFromTbl()関数では、指定月の日付と歩数をSELECTで取得し、Pythonリストに格納し戻しています。 def createChartFromTbl(monthnumber): sql="select tochar(RecordDate,'DD'),Steps from MyHealth.Steps WHERE DATEPART('MM',recorddate) = ?" stmt=iris.sql.prepare(sql) rs=stmt.execute(monthnumber) rdate=[] steps=[] for row in enumerate(rs): rdate.append(row[1][0]) steps.append(row[1][1]) return rdate,steps table_goiris.py で作成したリストを利用して、table_app.pyの中でグラフを生成しています。 matplotlibで作成したグラフを、HTMLに埋め込む方法については、こちらのページ(https://shiren-blog.com/flask-matplotlib-graph-demo/)を参考にさせていただきました。 (imgタグのsrcにBase64でエンコードしたグラフのデータをセットし、index.htmlに当てはめる方法をとっています)​​​ import base64 from io import BytesIO import matplotlib.pyplot as plt from flask import Flask, render_template, request import table_goiris as goiris app = Flask(__name__) @app.route('/',methods=['GET','POST']) def index(): #月取得(テーブル編) monthlist=goiris.getMonthTbl() if request.method=='GET': defaultmonth=7 else: result=request.form defaultmonth=result['selectmonth'] #print(defaultmonth) #データ取得(テーブル編) result=goiris.createChartFromTbl(defaultmonth) rdate=result[0] steps=result[1] #参考にしたページ:https://shiren-blog.com/flask-matplotlib-graph-demo/ #グラフ作成 fig = plt.figure(figsize=(10, 5)) ax = fig.add_subplot(111) if defaultmonth=="5": color="green" elif defaultmonth=="6": color="orange" else: color="blue" ax.plot(rdate, steps, label="test",marker="o",color=color,linestyle="-.") #バッファに保存 buf=BytesIO() fig.savefig(buf,format='png') #グラフをHTMLに埋め込むように変換 data=base64.b64encode(buf.getbuffer()).decode('ascii') image_tag = f'<img src="data:image/png;base64,{data}"/>' return render_template("index.html",image=image_tag,monthlist=monthlist,selectmonth=defaultmonth) if __name__=="__main__": #app.run(debug=True,host='0,0,0,0',port="8081") app.run(debug=True,host='0.0.0.0') ​ 3-2) グローバルを利用する場合 IRISからデータを取得する処理は、global_goiris.py に記述しています。 getMonthGlo()関数では、保存されている歩数データの「月」情報を取得し、Pythonリストに格納し戻しています(ObjectScriptで$Order()してるのと同じイメージで記述できます)。 def getMonthGlo(): glo=iris.gref("^MySteps") monthlist=[] month="" while True: month=glo.order([2022,month]) if (month==None): break monthlist.append(month) return monthlist createChartFromGlo()関数では、指定月の日付と歩数を得し、Pythonリストに格納し戻しています(ObjectScriptで$Order()してるのと同じイメージで記述できます)。 def createChartFromGlo(monthnumber): glo=iris.gref("^MySteps") rdate=[] steps=[] date="" while True: date=glo.order([2022,monthnumber,date]) if (date==None): break rdate.append(date) steps.append(glo[2022,monthnumber,date]) return rdate,steps global_goiris.py で作成したリストを利用して、global_app.pyの中でグラフを生成しています。 matplotlibで作成したグラフを、HTMLに埋め込む方法については、こちらのページ(https://shiren-blog.com/flask-matplotlib-graph-demo/)を参考にさせていただきました。 (imgタグのsrcにBase64でエンコードしたグラフのデータをセットし、index.htmlに当てはめる方法をとっています)​​​ import base64 from io import BytesIO import matplotlib.pyplot as plt from flask import Flask, render_template, request import global_goiris as goiris app = Flask(__name__) @app.route('/',methods=['GET','POST']) def index(): #月取得(グローバル編) monthlist=goiris.getMonthGlo() if request.method=='GET': defaultmonth=7 else: result=request.form defaultmonth=result['selectmonth'] #print(defaultmonth) #データ取得(グローバル編) result=goiris.createChartFromGlo(defaultmonth) rdate=result[0] steps=result[1] #参考にしたページ:https://shiren-blog.com/flask-matplotlib-graph-demo/ #グラフ作成 fig = plt.figure(figsize=(10, 5)) ax = fig.add_subplot(111) if defaultmonth=="5": color="green" elif defaultmonth=="6": color="orange" else: color="blue" ax.plot(rdate, steps, label="test",marker="o",color=color,linestyle="-.") #バッファに保存 buf=BytesIO() fig.savefig(buf,format='png') #グラフをHTMLに埋め込むように変換 data=base64.b64encode(buf.getbuffer()).decode('ascii') image_tag = f'<img src="data:image/png;base64,{data}"/>' return render_template("index.html",image=image_tag,monthlist=monthlist,selectmonth=defaultmonth) if __name__=="__main__": #app.run(debug=True,host='0,0,0,0',port="8081") app.run(debug=True,host='0.0.0.0') 4)サンプルデータの作成 サンプルデータの作成に利用するMyHealth.StepクラスをIRISのUSERネームスペースにインポートします。​​​ スタジオを利用されている場合は、USERネームスペースに接続先を変更した後、*.cls をスタジオにドラッグ&ドロップするとインポートできます。 VSCodeを利用されている場合は、使用するIRISのUSERネームスペースに接続した後、MyHealth.Step.clsをワークスペースで開き、保存します(保存と同時にコンパイルが実行されます)。 管理ポータルからインポートする場合は、管理ポータル > システムエクスプローラ > クラス (USERネームスペース選択) の画面で「インポート」ボタンからインポートできます。 続いて、IRISにログインし(またはターミナルを開き)USERネームスペースに接続していることを確認し、以下実行します。 テーブルを利用する場合: do ##class(MyHealth.Steps).create() グローバルを利用する場合:​​​ do ##class(MyHealth.Steps).createGlobal() ※2022年5月1日~7月31日の歩数データがランダムに作成されます(実行毎に再作成するようにしています)。 5)実行! 5-1)Windows以外で試す場合 IRISインストールディレクトリ/bin/irispythonコマンドを利用して table_app.py または global_app.py を実行します。 impor irisを行うため、irispythonを利用しています。 IRISインストールディレクトリが、 /usr/irissys である場合の例は以下の通りです(実行環境に合わせてディレクトリはご変更ください)。 ※実行する table_app.py または global_app.py もフルパスで指定しています。 テーブル編 /usr/irissys/bin/irispython /home/isjedu/WalkSteps/Linux/table_app.py グローバル編 /usr/irissys/bin/irispython /home/isjedu/WalkSteps/Linux/global_app.py 5-2)Windowsで試す場合 実行前の準備が完了しているかご確認ください(リンク先の「3.実行前の確認」をご確認ください)。 Pythonコマンドの後に、table_app.py または global_app.py をフルパスで指定してください。 テーブル編 python c:\WorkSpace\WalkSteps\Windows\table_app.py グローバル編 python c:\WorkSpace\WalkSteps\Windows\global_app.py いかがでしたでしょうか。FlaskもPythonもとても便利ですね!🐍 もっと良い方法をご存知の方いらっしゃいましたら、ぜひ共有いただけると嬉しいです! コミュニティへの投稿、お待ちしております_(._.)_ 👇Embedded Python概要やEmbedded Pythonでデータベースプログラミング(SQLアクセス編)を解説するYouTubeプレイリストとサンプルコード一式公開中です!👇【はじめてのInterSystems IRIS】Embedded Python セルフラーニングビデオシリーズ公開!
記事
Tomohiro Iwamoto · 2020年8月25日

CloudFormationを使ってAWSにICMをデプロイする

本稿について ICM(InterSystems Cloud Manager)のセットアップは難しいものではありませんが、様々な理由でそもそもDockerが使いづらいという状況があり得ます。また、セキュリティ的に堅固な環境を得るために、既存VPC内のプライベートサブネット上にIRISクラスタをデプロイする方法のひとつに、同VPC内でICM実行する方法があります。本稿では、ICMをAWSにデプロイする作業を、CloudFormationで自動化する方法をご紹介します。ICMに関しては、こちらの記事をご覧ください。 更新: 2020年11月24日 デフォルトVPC以外でも動作するよう変更しました。 ICMは、マルチクラウドに対してIRISクラスタをプロビジョン、アンプロビジョンするためのユーティリティですので、CloudFormationとは機能的に重なる部分があります。必要であれば、CloudFormationでIRISのミラー構成をプロビジョンすることも可能です。ここでは割り切って、CloudFormationはICMをデプロイすることだけに利用しています。 また、ICMキット入手方法が今までのWRCサイトからの手動ダウンロードに加えて、InterSystems Container Registryから直接Pullする方法が利用可能となりました。本稿はこれを利用しています。 前提条件 EC2インスタンスをプロビジョンする先としてVPC、サブネット、セキュリティーグループ(SSHがインバウンド可)が存在していること。 事前準備 もしお持ちでなければSSH接続のためのEC2キーペアを作成します。ICMで使用するAWSリソースの操作に必要なポリシーを持つロールを用意します。本稿ではAmazonEC2FullAccessポリシーを持つロール(iwamoto-ICM-role)を使用しています。 このロールはICMをデプロイするEC2インスタンスに付与されますので、使用するEC2キーペアの管理にはご注意ください(わざわざ言うまでもありませんね)。 事前準備はこれだけです。本稿では扱いませんが、同ロールに、AmazonS3ReadOnlyAccessを加えておくと、コンテナレスのデプロイを行う際に使用するIRISのインストーラキット(tar形式)やライセンスキーを自前のS3バケットからダウンロード出来るので、ICMのスクリプト機能を利用して、アプリケーション配布まで含めた完全な自動化を実現できます。 手順 1. CloudFormationテンプレートの入手 こちらから入手できます。 2. スタックの作成 AWS CloudFormationコンソールで「スタックの作成」「新しいリソースを使用」を選択します。「テンプレートファイルのアップロード」で先ほど入手したymlをアップロードします。 ウィザードに沿って「次へ」進みます。 [スタックの詳細を指定]画面では、各種パラメータを指定します。 スタックの名前 任意の文字列 ICMKitVersionParameter ICMのキットのバージョン IamInstanceProfileParameter 事前準備したロール名 InstanceSecurityGroupParameter EC2インスタンスに適用するセキュリティーグループサブネットと同じVPCに属している必要があります。SSHをインバウント可能にしてください。 InstanceTypeParameter EC2インスタンスタイプ KeyNameParameter 事前準備したEC2キーペアの名前 LatestAmiIdParameter 使用するAMI(本稿ではAmazon Linux2) SSHLocationParameter SSH接続を許可するホストのCIDR(0.0.0.0/0は全て許可。自分のグローバルIPを適用するのが望ましいです) SubnetIdParameter EC2インスタンスを起動するサブネットセキュリティーグループと同じVPCに属している必要があります。 WRCTokenParameter https://containers.intersystems.com から得たトークン WRCUserParameter 同サイトへのログインに使用したユーザ名 アップロードしたテンプレートファイルは、自動でS3に保存されます。わずかとは言え課金対象ですので、デプロイ後、不要であれば削除します。 ウィザードに沿って「次へ」進みます。 [スタックオプションの設定]はデフォルトのままで構いません。ウィザードに沿って「次へ」進みます。 [レビュー]画面で値の最終確認を行います。 先ほど指定したパラメータに誤りがなければ「スタックの作成」を実行します。 スタック名と実行日時に下にステータスがCREATE_IN_PROGRESSと表示されていると思います。リフレッシュ矢印ボタンを押してステータスがCREATE_COMPLETEになれば完了です。私の場合、1分ほどで完了しました。 もし、EC2Instanceのステータスが以下のような「状況の理由」でCREATE_FAILEDした場合は、セキュリティーグループとサブネットが同じVPCに属しているか確認してください。 Security group sg-XXXXXXX and subnet subnet-YYYYYY belong to different networks. [リソース]で、どのようなリソースを作成したのかを確認できます。 [出力]を表示して、PublicDNS値を記録してください。 3. 作成されたEC2インスタンスへのログイン 先ほど指定したEC2キーペアを使用して、PublicDNSのホストにsshします。 C:\Users\iwamoto>ssh -i iwamoto20200714.pem ec2-user@ec2-18-179-52-235.ap-northeast-1.compute.amazonaws.com __| __|_ ) _| ( / Amazon Linux 2 AMI ___|\___|___| https://aws.amazon.com/amazon-linux-2/ [ec2-user@ip-172-31-22-166 ~]$ あるいは、定番のターミナルエミュレータからですと ICMがインストールされている事を確認します。イメージ名のレポジトリ名がcontainers.intersystems.com/intersystems/icmになっていることにご注意ください。 [ec2-user@ip-172-31-22-166 ~]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE containers.intersystems.com/intersystems/icm 2020.1.0.215.0 00d66fae9030 4 months ago 889MB [ec2-user@ip-172-31-22-166 ~]$ docker run --rm containers.intersystems.com/intersystems/icm:2020.1.0.215.0 icm version Version: 2020.1.0.215.0 [ec2-user@ip-172-31-22-166 ~]$ AWSのCLIを実行して、指定したロールが備わっていることを確認します。 [ec2-user@ip-172-31-22-166 ~]$ aws ec2 describe-instances --query "Reservations[].Instances[].InstanceId" [ "i-0aaa33da1842f875a" ] 先ほど確認した[出力]のInstanceIdと同じですね。 ロールにS3へのアクセス権を付与していれば、S3からキットやライセンスキーをダウンロード出来るので便利(なにより別途クレデンシャル情報を取り扱わない分、セキュア)です。 [ec2-user@ip-172-31-22-166 ~]$ aws s3 cp s3://mybucket/IRIS-2020.1.0.215.0-lnxrhx64.tar.gz . download: s3://mybucket/IRIS-2020.1.0.215.0-lnxrhx64.tar.gz to ./IRIS-2020.1.0.215.0-lnxrhx64.tar.gz もし、上記のような結果が得られなければ何か問題が発生しています。下記にログや実行されたシェルが保存されていますので、内容を確認してください。 [ec2-user@ip-172-31-22-166 ~]$ cat /var/log/cloud-init-output.log [ec2-user@ip-172-31-22-166 ~]$ sudo cat /var/lib/cloud/instances/[EC2インスタンスID]/user-data.txt 以後、ICMの操作を行います。 4.スタックの削除 不要になったら忘れずにリソース(特にEC2インスタンス)を削除しましょう。その際、EC2インスタンス等を個別に削除するのでなく、AWS CloudFormationのコンソールの[削除]で全てのリソースを一括削除します。[スタックの情報]で、ステータスがDELETE_IN_PROGRESSからDELETE_COMPLETEに変われば削除終了です。 ICMのEC2インスタンスを削除すると、ICMでプロビジョンしたIRISクラスタへの制御情報も完全に失われますのでご注意ください。
記事
Mihoko Iijima · 2021年1月15日

文字列の前後の半角スペース及び全角スペースを取り除く方法

これは InterSystems FAQ サイトの記事です。 $ZSTRIP() 関数を使用します。 この関数を使用すると、指定文字列から、文字のタイプと文字を削除できます。 下記の例のように、第2引数で、"<"、">"、"<>"を指定することにより、SQLのLTRIM、RTRIM、TRIM関数と同等の処理が可能になります。 // アクションコード "<>" を指定すると前後の空白を削除する // マスクコード:W で空白 ($C(9), $C(32), $C(160)) を削除する // 第3引数(全角スペース)は $C($ZHEX("3000")) でも指定可能 USER>Set a=" 全角 ・半角 スペースを含む文字列 " USER>Set b=$ZSTRIP(a,"<>W"," ") USER>Write "["_b_"]" [全角 ・半角 スペースを含む文字列] USER>Set c=$ZSTRIP(a,"*W"," ") // アクションコード "*" を指定すると全ての空白を削除する USER>Write "["_c_"]" [全角・半角スペースを含む文字列] USER> ※上記実行例コメントの、$ZHEX("3000")は16進数の3000のことで、Unicodeでの全角スペースの文字コードです。 $ZSTRIP()関数の引数詳細については、ドキュメントをご参照ください。 バージョン2018.1以前はこちらのドキュメントをご参照ください。 関連情報として以下記事もご参照ください。 文字列の中から数値だけを抜き出す方法はありますか?
記事
Mihoko Iijima · 2021年2月25日

【IRISベース】トラブル発生時の情報収集方法(IRIS / IRIS for Health / UCR 編)

これは InterSystems FAQ サイトの記事です。 復旧を優先される場合を除き 【トラブル発生状態のまま】弊社サポートセンターまでご連絡ください。 その際、専用ツールを利用して情報収集いただくことで(所要時間約 5分)、サポートセンターによる状況確認がスムーズに行えます。 ツール使用方法については、PDF または以下ビデオでご紹介しています。 ※ Caché/Ensemble/Caché ベースの HealthConnect をご利用の方は、こちらの記事をご参照ください。 ぜひ 1 度、テスト/開発環境で実行をお試しいただき、万が一の場合に備えていただければ思います。 ビデオの目次(YouTubeでもご覧いただけます) 0:00~1:40 情報収集ツールを使用する上での大事なポイント 1:41~2:24 ツールの種類について 2:24~3:45 どのツールを実行したらいいか困った時の考え方 3:45~5:04 管理ポータルの診断レポートの例 5:04~6:30 ^SystemCheckの実行例 6:30~7:50 IRISHungスクリプトの実行例(Linuxの例) 7:50~8:50 IRISHungスクリプトの実行例(Windowsの例) 8:50~9:52 ツールから生成されたHTMLのファイル名について 9:52~11:32 ツールから生成されたHTMLの中身について 11:32~ まとめ
記事
Hiroshi Sato · 2021年11月29日

イメージファイルをFTPサーバからアップロード/ダウンロードする方法

これは、InterSystems FAQサイトの記事です。 FTPサーバから、アップロード/ダウンロードする方法は以下の通りです。 1. FTPサーバにイメージファイルをアップロードする set tmpfile="c:\temp\test.jpg" set ftp=##class(%Net.FtpSession).%New() // ftp サーバへ接続する do ftp.Connect("","<ユーザ名>","<パスワード>") // 転送モードをBINARYに設定 do ftp.Binary() // アップロードするディレクトリに移動 do ftp.SetDirectory("/temp/upload") // アップロードするファイルのストリームを用意 set file=##class(%File).%New(tmpfile) do file.Open("UK\BIN\") // ファイルをアップロード // 第1引数: アップロード先に作成するファイル名 // 第2引数: アップロードするファイル・ストリーム do ftp.Store("test.jpg",file) // ftp サーバからログアウト do ftp.Logout() // ファイルを閉じる do file.Close() // (オプション) アップロードしたファイルを削除する //do ##class(%File).Delete(tmpfile) 2. FTPサーバからイメージファイルをダウンロードする set ftp=##class(%Net.FtpSession).%New() // ftp サーバへ接続する do ftp.Connect("","<ユーザ名>","<パスワード>") // 転送モードをBINARYに設定 do ftp.Binary() // ダウンロードして格納するファイル・ストリームを用意 set stream=##class(%FileBinaryStream).%New() do stream.LinkToFile("c:\temp\testdownload.jpg") // ダウンロードするディレクトリに移動 do ftp.SetDirectory("/temp/download") // ファイルをダウンロードしてストリームを閉じる do ftp.Retrieve("test.jpg",stream) do stream.SaveStream() Set stream="" // ftp サーバからログアウト do ftp.Logout()
記事
Hiroshi Sato · 2022年3月27日

.Net Gateway(オブジェクトゲートウェイ)で外部DLLを使用する方法

これはInterSystems FAQ サイトの記事です。 まず予め Visual Studioを使用して、呼び出したい内容のクラスライブラリを作成します。 そのプロジェクトをコンパイルし、DLLを作成します。 管理ポータルでオブジェクトゲートウェイを作成します。   システム管理 > 構成 > 接続性 > オブジェクトゲートウェイ ゲートウェイ名 : testGateway サーバ名 / IPアドレス : 127.0.0.1 ポート : 55000 (後はデフォルト) testGateway を開始します。 ※管理ポータルから、もしくはコマンドから開始できます。 do ##class(%Net.Remote.Service).StartGateway(gateway.Name) 以下のいずれかの方法でDLLを呼び出すプロキシクラスを作成します。 a. コマンドで作成する場合 set dllPath="C:\temp\TestDll.dll do ##class(%Net.Remote.Gateway).%ExpressImport(dllPath, 55000, "127.0.0.1") b. スタジオで作成する場合  [ツール] - [アドイン] - [.Net ゲートウェイウィザード] ⑥ 以下のような手順でコードを実行します。 例: Set gateway=##class(%Net.Remote.Gateway).%New() set host="localhost" set port=55000 set namespace="USER" set timeout=2 Set classPath=##class(%ListOfDataTypes).%New() Set samplePath="C:\temp\TestDll.dll" Do classPath.Insert(samplePath) Set status=gateway.%Connect(host,port,namespace,timeout,classPath) write !,"status: ",status set cl=##class(TestDll.MyDllClass).%New(gateway) do cl.test(gateway) 最後の行の do cl.test(..) は、VisualStudioで作成したクラスライブラリの関数になります。 呼び出し引数は、作成したプロキシクラスに従ってください。
記事
Mihoko Iijima · 2021年5月27日

HL7 プロダクションでサイズの大きなグローバルがある場合の削除方法について

これは InterSystems FAQ サイトの記事です。 HL7 メッセージの送受信を行うプロダクションでは、以下3個のグローバルが非常に大きくなることがあります。 グローバルの大きさを確認する場合は、^%GSIZEユーティリティを利用します。詳細は関連トピック/記事をご参照ください。 ^EnsHL7.Segment^EnsLib.H.MessageD^EnsLib.H.MessageI HL7メッセージは EnsLib.HL7.Message.cls で定義されます。^EnsLib.H.MessageD はデータを保存するグローバル、^EnsLib.H.MessageI はインデックスを保存するグローバルです。 また、HL7メッセージは多数のセグメントで構成されており、メッセージデータを含むそれらのセグメントは ^EnsHL7.Segment に保存されます。 ^EnsLib.H.MessageD グローバルの値は、^EnsHL7.Segment グローバルの添え字にリンクしています。 これらメッセージ関連のグローバルの削除については、任意の保持日数を指定して手動および定期的に削除することができます。パージ(Purge)用ユーティリティについては、以下のドキュメントをご参照ください。 プロダクション・データのパージ【IRIS】 プロダクション・データのパージ 関連トピック/記事 データサイズを調べる方法はありますか? Interoperability管理データを削除(パージ)する方法
記事
Hiroshi Sato · 2021年9月9日

グローバルマッピングをプログラミングで登録する方法

これは InterSystems FAQ サイトの記事です。システムクラス Config.MapGlobals を使用して登録することができます。 ネームスペース USER からデフォルトデータベース以外のデータベース SAMPLES にある ^Sample.PersonD をグローバルマッピングする方法は以下の通りです(ターミナルでの実行例)。 USER>zn "%SYS" %SYS>set ns="USER" %SYS>set glo="Sample.PersonD" %SYS>set vals("Database")="SAMPLES" %SYS>set st=##class(Config.MapGlobals).Create(ns,glo,.vals) ※ Config.MapGlobals クラスの Create()メソッドの第3引数は参照渡しのため、変数名前にピリオド(.)を付与して指定します。 Config.MapGlobals クラスを使用する方法以外に、インストールマニフェストクラスを利用して定義することもできます。 インストールマニフェストクラスの作成方法詳細については添付をご参照ください。 以下例は、インストールマニフェストでの定義例です(クラス定義は添付内に含まれています)。 XData Test [ XMLNamespace = INSTALLER ]{<Manifest><Namespace Create="no" Name="USER" Code="USER" Data="USER"><Configuration><GlobalMapping Global="Sample.PersonD" From="SAMPLES"/></Configuration></Namespace></Manifest>} 詳細については、ドキュメントもご参照ください。 インストールマニフェストについて【IRIS】インストールマニフェストについて
お知らせ
Makiko Kokubun · 2021年7月5日

【FHIR ハンズオンセミナー】IRIS for Health でFHIRリポジトリを作って RESTやWebアプリから操作を体験してみよう!

開発者の皆さん、こんにちは! インターシステムズでは、7/30(金)に、InterSystems IRIS for Healthを使った FHIR のハンズオンセミナーをオンラインで開催致します。 FHIR R4リソースリポジトリを構築する上で知っておきたい、FHIR リソースのRESTを使った操作を体験し、サンプルアプリケーションを通してFHIRアプリケーション構築方法を学習します。 FHIR ハンズオンセミナー 概要 日時:2021年7月30日(金)16:00~18:00(2時間) 参加費:4,000円(Webからの事前登録制) 開催形式:オンライン(Teams会議+演習環境用システムを利用) 定員:10名 詳細・事前登録はこちらから 満席となりましたため、受付を締め切らせて頂きました。キャンセルが出ましたら、受付を再開致します。 ハンズオンを通して以下の内容をご理解・ご体験いただけます。 IRIS for Health でFHIR R4リソースリポジトリを作成する方法 FHIRリソース同士のリファレンスの意味 FHIRリソースの検索方法 サンプルWebアプリケーションから作成したR4リポジトリへアクセスする方法 CSV→FHIR変換処理の操作体験 SS-MIX2→FHIR変換処理の操作体験 ぜひご受講ご検討ください!
記事
Toshihiko Minamoto · 2022年2月9日

IRIS-NativeAPI-Nodejs-compact (jp)

これは、前回の「[DockerマイクロサーバーとしてのIRIS Native APIを使用するWebSocketクライアントJS](https://jp.community.intersystems.com/node/507846)」のフォローアップです。 すべてのピースが1つのDockerイメージにまとめられたため、インストールがはるかに簡単になりました。 作業が楽になります。 ただしもちろん、マイクロサービスの原則はわかりにくくなくなっています。 オールインワンのバンドルパッケージであるため、 コンパクトになっています。 動作には変更がないため、 下位互換性のあるマイナーリリースと解釈されてしまう可能性があります。 これには、intersystems/iris-community:2020.2.0.204.0が含まれています。 実行するのは、以下の通りです。 * docker pull **rcemper/rcc:iris-nodejs-compact** _(1回)_ * docker **run** --rm --init -d \ --name=iris1 -p 52773:52773 -p 51773:51773 \ rcemper/rcc:iris-nodejs-compact _(コンテナーを起動)_ * docker **exec** -it iris1 bash wsgo.sh _(マイクロサービスを起動)_ * docker **exec** -it iris1 bash wsdemo.sh _(テストデータを作成する制御を開始し、echoServerに送信して受信)_ * docker exec -it iris1 bash wsstop.sh _(制御から実行されない場合は、最終的にサービスを停止)_ * docker **stop** iris1 _(コンテナーを終了)_ それだけです。 2021年7月7日: 正規化された**V2**がリリースされました。 * `git clone https://github.com/rcemper/IRIS-NativeAPI-Nodejs-compact.git` * `docker-compose up -d` * `docker-compose exec iris iris session iris %ZSocket` * `docker-compose exec iris node WsockIris.js`  
記事
Mihoko Iijima · 2022年10月19日

VSCode:クラスメソッド実行文をワンクリックでコピーできるようになりました!(VSCode:ObjectScriptエクステンション)

開発者の皆さん、こんにちは! ターミナルでクラスメソッドを実行するとき、パッケージ名やクラス名などの入力候補が出てこないので、 ##class(パッケージ名.クラス名).メソッド名() の記述をミスったりちょっと面倒だな・・と感じること、ありませんか??(第1回 InterSystems Idea-A-Thon(アイデアソン) でも、もっとシンプルに呼び出せるようにしよう!のアイデアが投稿されていたようです。) (私も含めて)そんな方に、朗報です!📣 なんと、VSCode ObjectScriptエクステンションに新機能「Copy Invocation」が追加されました! クラスメソッドを記述すると、定義の上に Copy Invocation のリンクが表示され、クリックするとクラスメソッドの実行文がバッファにコピーされるんです! Copy Invocation をクリックした後で、ターミナルで 右クリック→貼り付け をやってみてください。 ちゃんと実行文がコピーされていることを確認できます(下図の黄色い線の文章がコピーされます)。 あとは、Do や Write や Set 文を記述するだけでいいんです! ぜひ、お試しください!​​​​​​ VSCode contributorの皆さん、素敵な機能追加をありがとうございました!