検索

クリアフィルター
記事
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上での共有メモリの割り当てについて
記事
Megumi Kakechi · 2024年8月20日

messages.logに「Updates may become suspended due to low available buffers」のエラーが出ています

これは InterSystems FAQ サイトの記事です。messages.logに「Updates may become suspended due to low available buffers」のエラーが出ている場合、このインスタンスのバッファ利用可能サイズが低下していることが考えられます。 上記メッセージが頻繁に出力するようであれば以下の対処をご検討ください。 データベースキャッシュの設定値が小さければ、値を増やします(ただし、その分物理メモリに余裕が必要です。) データベースキャッシュの設定値が十分に大きな設定値であれば、ライトデーモンのバッファの書き込み処理でのディスク性能不足の可能性が考えられる為、更新処理を分散して時間当たりの更新量を減らすか、ディスク装置の性能を上げます。 ※ストレージのメンテナンス(スナップ等によるバックアップ)や、他のサーバによるI/O負荷などによる影響も考えられます。 メッセージの意味は以下のようになります。(1) 03/04/24-04:56:28:499 (3872) 1 Available buffers are getting low (25% above the threshold for suspending updates) (2) 03/04/24-04:56:58:599 (3872) 2 Updates may become suspended due to low available buffers(3) 03/04/24-05:11:07:694 (3872) 0 Available buffers have been recovered 上記メッセージ(1)は、データベースキャッシュ内の利用可能なバッファが、キャッシュ全体の75%を下回った際に出力します(1:警告)。上記メッセージ(2)は、データベースキャッシュ内の利用可能なバッファが、キャッシュ全体の50%を下回った際に出力します(2:エラー)。上記メッセージ(3)は、データベースキャッシュ内の利用可能なバッファが、キャッシュ全体の75%を上回った際に出力します(0:解消=通常)。 【注意】 データベースキャッシュを増やした分ライトデーモンが書き込む量が増えて、アプリケーションのレスポンスが遅くなる場合があります。 更新が集中しないように注意することが必要です(バックアップやバッチ処理などの、システムメンテナンスによる大量更新がないかの確認も必要です)。 ディスク装置のパフォーマンスを上げるには、ストレージ(HDD/SSD等)を買い替える必要があります。 更新量を減らすか、ディスクI/O性能を上げるか、どちらかの対応が必要となります。 データベースキャッシュの推奨のサイズは、最大で 物理メモリの50% までとなります。以下のドキュメントに、メモリの見積もりの概要について記載しております。※メモリ要件の見積もり> InterSystems IRIS インスタンスの共有メモリに必要な量 メモリ要件の見積もり
記事
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アプリケーションにアクセスすると、通常のユーザー名・パスワードの入力に続いて、ワンタイム・パスワードコードを入力する画面が出てきますので、そこに、スマートフォン認証アプリで表示されるコードを入力し、アクセスできることを確認します。
記事
Hiroshi Sato · 2025年7月27日

ODBCログの取得方法(Windows)

これは InterSystems FAQ サイトの記事です。 ODBCクライアントからのアクセスでエラーが発生した場合、返ってきたエラーメッセージやコンソールログ上の情報だけでは原因がよくわからない場合があります。 そのような場合にODBCドライバのクライアントログを有効にすることで、エラーについての詳細情報を取得することができます ODBCログの有効化については以下をご参照ください。 ODBCログの有効化 Windowsの場合は、上記に記載されている通り、2種類のログが取得できます。 クライアント・ドライバのログを有効にするには、ODBCデータソースアドミニストレータで使用しているDSNの「ODBCログ」チェックボックスをチェックします。 ドライバー・マネージャのログを有効にするには、[トレース]タブをクリックして[トレースの開始]ボタンをクリックします。 変更の反映にはODBCクライアントアプリケーションを再起動する必要があります。 既定のODBCクライアントログファイル名は IRISODBC.log で、既定の場所は C:¥Users¥Public¥Logs です。 既定のトレースログ名は、SQL.logで、既定の場所は、c:¥Users¥<ユーザー名>AppData¥Local¥Temp¥です。 (すべてのユーザーIDのコンピュータ全体のトレースをチェックしない場合) 複数回ODBCリクエストが実行された場合、上書きではなくログが追記されます。 クライアントのプロセス毎に個別にログを取得することもできます。 クライアントログが正常に取得できている場合、以下の様な内容が書き込まれます。 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Started At: Tue Mar 25 22:44:02 2025 Driver Name: IrisODBC3564.DLL Unicode Client Version: 2024.2.0.247.0 Compiled at: Jul 16 2024 09:17:19 ODBC Version: 03.51 Locale Setting: Japanese_Japan.932 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- LoadConnect returned: 0x4DBC0000 LoadConnect returned sm_pfnIRISconnectToHostPort: 0x4DBC6750 LoadConnect returned sm_pfnIRISconnectSend: 0x4DBC62B0 LoadConnect returned sm_pfnIRISconnectRecv: 0x4DBC5E70 LoadConnect returned sm_pfnIRISconnectClose: 0x4DBC2CA0 LoadConnect returned sm_pfnIRISconnectGetErrorCode: 0x4DBC34C0 LoadConnect returned sm_pIRISconnectGetErrorText: 0x4DBDC000 LoadConnect returned sm_pfnIRISconnectGetSecurityLevel: 0x4DBC35F0 LoadConnect returned sm_pfnIRISconnectSetSecurityLevel: 0x4DBC6670 LoadConnect returned sm_pfnIRISconnectGetSocketDescriptor: 0x4DBC3610 LoadConnect returned sm_pfnIRISconnectLoginToHostPort: 0x4DBC4AE0 LoadConnect returned sm_pfnIRISconnectGeneratePrincipalName: 0x4DBC3120 LoadConnect returned sm_pfnIRISconnectGetLicenseId: 0x4DBC3530 LoadConnect returned sm_pfnIRISconnectSetTraceFilePtr: 0x4DBC6740 LoadConnect returned sm_pfnIRISconnectGetTSClientName: 0x4DBC3620 LoadConnect returned sm_pfnIRISconnectSetLocalBindings: 0x4DBC64E0 LoadConnect returned sm_pfnIRISconnectSetMode: 0x4DBC6630 LoadConnect returned sm_pfnIRISconnectGetRdlen: 0x4DBC35E0 GetLocalizedResources: (03/25/25-22:44:02:636) Found resources for locale JPN (400) in C:\Program Files\Common Files\InterSystems\IRIS\IrisODBCJPN.DLL --> ConfigDSNW: (03/25/25-22:44:02:636) hParent = 0x000a1350 request 2 <-- ConfigDSNW: (03/25/25-22:44:11:189) returning 1 トレースログが正常に取得できている場合、以下の様な内容が書き込まれます。 EXCEL acec-31b4 ENTER SQLAllocHandle SQLSMALLINT 1 <SQL_HANDLE_ENV> SQLHANDLE 0x0000000000000000 SQLHANDLE * 0x000002D12FAA60A0 EXCEL acec-31b4 EXIT SQLAllocHandle with return code 0 (SQL_SUCCESS) SQLSMALLINT 1 <SQL_HANDLE_ENV> SQLHANDLE 0x0000000000000000 SQLHANDLE * 0x000002D12FAA60A0 ( 0x000002D11D6A1070) EXCEL acec-31b4 ENTER SQLSetEnvAttr SQLHENV 0x000002D11D6A1070 SQLINTEGER 200 <SQL_ATTR_ODBC_VERSION> SQLPOINTER 3 <SQL_OV_ODBC3> SQLINTEGER -6 ログの内容の解析は専門的な知識が必要となりますので、取得後インターシステムズサポートセンターまでお送りください。
記事
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クラスタへの制御情報も完全に失われますのでご注意ください。
記事
Toshihiko Minamoto · 2021年7月8日

ランダム読み出しIOストレージパフォーマンスツール

### 目的 このツールは、データベース内からランダム読み出し入力/出力(IO)を生成するために使用されます。 このツールの目的は、目標IOPSを達成し、許容範囲内のディスク応答時間の維持を確保するために、可能な限り多くのジョブを駆動することです。 IOテストから収集された結果は、IOサブシステムに基づいて構成ごとに異なります。 これらのテストを実行する前に、対応するオペレーティングシステムとストレージレベルの監視が、今後の分析のためにIOパフォーマンスの測定データーを保存するように設定されていることを確認してください。 ### 方法論 少数のプロセスでプロセスごとに10,000回の反復から始めます。 オールフラッシュストレージアレイでは、プロセスごとに100,000回の反復を使用します。 次に、10ジョブから開始して、10、20、40など追加し、プロセスの数を増やしていきます。 応答時間が一貫して10ミリ秒を超えるか、計算されたIOPSが直線的に増加しなくなるまで、個々のテストを実行し続けます。   目安として、8KBおよび64KBのデータベースランダム読み出し(キャッシュされていない)の次の応答時間は、通常、オールフラッシュアレイで許容されます。 * 平均2ミリ秒以下 * 5ミリ秒を下回らない このツールでは、事前に拡張された空のIRIS.DATデータベースが、サーバーのメモリサイズの少なくとも2倍であり、ストレージコントローラーのキャッシュサイズの少なくとも4倍である必要があります。 読み出しがファイルシステムキャッシュにキャッシュされてしまわないように、データベースをメモリ容量よりも大きくする必要があります。  このツールは、データベースブロックをメモリに読み込ませるObjectScript VIEWコマンドを使用するため、期待した結果が得られない場合は、恐らくすべてのデータベースブロックがすでにメモリ内にあるということになります。 ### 仕様と目標 次の表に、環境の仕様と目標を記入してください。 | 仕様  | 例 | | --------- | --------------------------------------------------------------------- | | ストレージ | ストレージアレイの仕様 | | 物理サーバー | CPU、メモリ仕様 | | 仮想マシン | Red Hat Enterprise Linux 7 24 vCPU, 40GB vRAM | | データベースサイズ | 200GB | | 共有メモリ | Huge Pagesを使用して割り当てられた26956MBの共有メモリ:24000MBのグローバルバッファ、1000MBのルーチンバッファ | | 目標IOPS | 2000 | | 目標応答時間 | 5ミリ秒以下 | ### インストール [こちら](https://github.com/intersystems/random-read-performance-tool)からGitHubで**PerfTools.RanRead.xml**ツールをダウンロードします。 **PerfTools.RanRead.xml**をUSERネームスペースにインポートします。 USER> do $system.OBJ.Load("/tmp/PerfTools.RanRead.xml","ckf") Helpメソッドを実行して、すべてのエントリポイントを確認します。 すべてのコマンドが%SYSで実行されます。 USER> do ##class(PerfTools.RanRead).Help()   InterSystems Random Read IO Performance Tool -------------------------------------------- do ##class(PerfTools.RanRead).Setup(Directory,DatabaseName,SizeGB,LogLevel)     - 同じ名前でデーターベースとネームスペースを作成します。 ログレベルは0〜3の範囲である必要があります。0は「なし」、3は「詳細」となります。 do ##class(PerfTools.RanRead).Run(Directory,Processes,Iterations)     - ランダム読み出しIOテストを実行します。 do ##class(PerfTools.RanRead).Stop()     - 全てのバックグラウンドジョブを終了します。 do ##class(PerfTools.RanRead).Reset()     - ^PerfTools.RanRead* に保管されているランダム読み出し履歴を削除します do ##class(PerfTools.RanRead).Export(directory)     - 全てのランダム読み出しテストの履歴の概要をタブ区切りテキストファイルにエクスポートします。 ### セットアップ テストする物理ホストのメモリの約2倍のサイズのZRANREADという空の(事前に拡張された)データベースを作成します。 空のデータベースがストレージコントローラーのキャッシュサイズの少なくとも4倍であることを確認します。 手動で作成するか、次の方法を使用してネームスペースとデータベースを自動的に作成できます。 USER> do ##class(PerfTools.RanRead).Setup("/usr/iris/db/zranread","ZRANREAD",100,1)   Creating 100GB database in /usr/iris/db/zranread/ Database created in /usr/iris/db/zranread/ Run %Installer Manifest... 2016-05-23 13:33:59 0 PerfTools.RanRead: Installation starting at 2016-05-23 13:33:59, LogLevel=1 2016-05-23 13:33:59 1 CreateDatabase: Creating database ZRANREAD in /usr/iris/db/zranread// with resource 2016-05-23 13:33:59 1 CreateNamespace: Creating namespace ZRANREAD using ZRANREAD/ZRANREAD 2016-05-23 13:33:59 1 ActivateConfiguration: Activating Configuration 2016-05-23 13:34:00 1 EnableEnsemble: Enabling ZRANREAD 2016-05-23 13:34:00 1 ActivateConfiguration: Activating Configuration 2016-05-23 13:34:00 0 PerfTools.RanRead: Installation succeeded at 2016-05-23 13:34:00 2016-05-23 13:34:00 0 %Installer: Elapsed time 1.066633s Database /usr/iris/db/zranread/ ready for testing. do ##class(PerfTools.RanRead).Run(directory,processes,iterations) e.g. do ##class(PerfTools.RanRead).Run("/usr/iris/db/zranread/",1,10000) ### 実行 プロセスの数を増やしながらRunメソッドを実行して、応答時間をメモします。 テストが速すぎる場合や結果が期待どおりでない場合は、反復回数を10000に増やします。 USER> do ##class(PerfTools.RanRead).Run("/usr/iris/db/zranread",20,10000)   InterSystems Random Read IO Performance Tool -------------------------------------------- Starting 20 jobs in the background. To terminate jobs run:  do ##class(PerfTools.RanRead).Stop() Waiting for jobs to finish......................... Random read background jobs finished. 20 processes (1000 iterations) average response time = 7.18ms Calculated IOPS = 2787 ### 結果 各実行の結果は、USERのPerfTools.RanReadというSQLテーブルに保存されます。 次のSQLクエリを実行すると、結果の概要を確認できます。 SELECT RunDate,RunTime,Database,Iterations,Processes, {fn ROUND(AVG(ResponseTime),2)} As ResponseTime, {fn ROUND(AVG(IOPS),0)} As IOPS FROM PerfTools.RanRead GROUP BY Batch 結果セットをタブ区切りのテキストファイルにエクスポートするには、次の手順を実行します。 USER> do ##class(PerfTools.RanRead).Export("/usr/iris/db/zranread/")   Exporting summary of all random read statistics to /usr/iris/db/zranread/PerfToolsRanRead_20160523-1408.txt Done. ### 分析 エクスポートしたテキストファイルをExcelで開いてコピーし、PerfToolsRandomRead \ _Analysis \ _Template.xlsxスプレッドシートに貼り付け、グラフ化します。  ![](/sites/default/files/inline/images/perftoolsrandomread_analysis_chart.png) サンプルスプレッドシートは[こちら](https://github.com/intersystems/random-read-performance-tool)からGitHubでダウンロードすることができます。 ### クリーンアップ テストの実行が終了したら、次のコマンドを実行して履歴を削除します。 %SYS> do ##class(PerfTools.RanRead).Reset() ​
記事
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 · 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で作成したクラスライブラリの関数になります。 呼び出し引数は、作成したプロキシクラスに従ってください。
記事
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()
記事
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以前はこちらのドキュメントをご参照ください。 関連情報として以下記事もご参照ください。 文字列の中から数値だけを抜き出す方法はありますか?
記事
Hiroshi Sato · 2024年9月12日

IIS上のWebGateway管理画面にアクセスすると404エラーが返ってくる場合の対処法

これは InterSystems FAQ サイトの記事です。 404エラーが返される場合に、以下の対応でエラーが解消されることがわかっています。 (1) binの接続を許可 /cspの構成エディタ>セクションで以下選択 system.webServer > security > requestFiltering > hiddenSegmets 選択 > (コレクション)の右欄(Count=xx)の右端 [...] クリック > segment欄に binの行があったので、選択して削除 > 画面戻って、右上の [適用] クリック または、IISの構成ファイルを直接編集することでも対応可能です。 C:\Windows\System32\inetsrv\config\applicationHost.config そのファイルから以下のような記述部分を探し、<add segment="bin" />の行を削除し、保存します。 <requestFiltering> <fileExtensions allowUnlisted="true" applyToWebDAV="true" /> <verbs allowUnlisted="true" applyToWebDAV="true" /> <hiddenSegments applyToWebDAV="true"> <add segment="web.config" /> <add segment="bin" /> <-- !! </hiddenSegments> </requestFiltering> Default Web Site全体の設定を変えることが可能であれば、以下の記事の「操作方法」の箇所から 要求のフィルターより非表示のセグメント bin を削除してください。 Microsoftのドキュメント (2) /cspのハンドラーマッピングで ISAPI-Dll が無効になっている 対処方法は以下の通りです。 /cspのハンドラーマッピング>ISAPI-Dll右クリック>機能のアクセス許可の編集>チェックボックスをすべて ON (1)または(2)の対処後、IISを再起動してください。
記事
Tomoko Furuzono · 2024年6月6日

JSON_Table(SQL)の利用

これは、InterSystems FAQサイトの記事です。 IRIS/IRIS for Health2024.1以降のバージョンのSQLで、JSON_TABLE関数がサポートされています。【ドキュメント】JSON_TABLE(SQL) これを使用することにより、JSON形式データを表形式で取得することが出来ます。【例】郵便番号情報を外部から取得し、表形式にマッピングする。(取得データ(JSON)) { "message": null, "results": [ { "address1": "東京都", "address2": "新宿区", "address3": "西新宿", "kana1": "トウキョウト", "kana2": "シンジュクク", "kana3": "ニシシンジュク", "prefcode": "13", "zipcode": "1600023" } ], "status": 200 } (SQL例) ※下記の実行には、SSL構成が必要になります。事前に構成を作成して、その構成名を使用してください。 SELECT address1,address2,address3,kana1,kana2,kana3,zipcode FROM JSON_TABLE(%Net.GetJson('https://zipcloud.ibsnet.co.jp/api/search?zipcode=1600023', '{"SSLConfiguration":"test"}') , '$.content.results' COLUMNS ( address1 VARCHAR(100) PATH '$.address1', address2 VARCHAR(100) PATH '$.address2', address3 VARCHAR(100) PATH '$.address3', kana1 VARCHAR(100) PATH '$.kana1', kana2 VARCHAR(100) PATH '$.kana2', kana3 VARCHAR(100) PATH '$.kana3', zipcode VARCHAR(10) PATH '$.zipcode') ) as zipinfo (取得結果(表形式)) 2024.1より前のバージョンで、同様のことを行いたい場合は、以下のようにJSONを取得してパースし、テーブルに格納する処理を作成して対応します。 (ObjectScript例) set httprequest=##class(%Net.HttpRequest).%New() set httprequest.Https=1 set httprequest.Server="zipcloud.ibsnet.co.jp" set httprequest.SSLConfiguration="test" set st=httprequest.Get() set st=httprequest.Get("/api/search?zipcode=1600023") set response=[].%FromJSON(httprequest.HttpResponse.Data) set results=response.results set iter=results.%GetIterator() while iter.%GetNext(.key,.resultobj) { //ZipInfoクラスにセット set zipinfo=##class(FAQTest.ZipInfo).%New() set zipinfo.address1=resultobj.address1 set zipinfo.address2=resultobj.address2 set zipinfo.address3=resultobj.address3 /*中略*/ set zipinfo.zipcode=resultobj.zipcode set st = zipinfo.%Save() }
記事
Tomoko Furuzono · 2022年3月29日

プログラムでCSVファイルを1行ずつ読み込む方法

これは、InterSystems FAQサイトの記事です。 %SQL.Util.Proceduresクラスの CSV() プロシジャを使用することにより、実現できます。下記が使用例のコードとなります。(test.csvというファイルが c:\temp にあるという前提) Set rowtype="Name VARCHAR(50),UID VARCHAR(50), PHONE VARCHAR(50)" Set filename="c:\temp\test.csv" Set result=##class(%SQL.Statement).%ExecDirect(,"call %SQL_Util.CSV(,?,?)",.rowtype,filename) Set rset =result.%NextResult() // 全件表示したい場合は、do rset.%Display() While rset.%Next() { Write "Name:",rset.%GetData(1)," UID:",rset.%GetData(2)," PHONE:",rset.%GetData(3),! } Set rset="",result="" Quit 上記を実行することにより結果セットとして各行およびフィールドにアクセスできます。実行例: USER>do ^CSVName UID PHONE山田,太郎 0001 080-1111-1111bbb 0003 090-2222-2222ccc 0009 "050-3333-3333"ddd 0010 0120-17-19724 Rows(s) Affected %SQL.Util.Proceduresクラスのクラスリファレンスも併せてご確認ください。クラスリファレンス:%SQL.Util.Procedures.CSV() @Tomoko.Furuzono さん 情報共有ありがとうございます!ちなみに%SQL.Util.Proceduresを利用する際、開くファイルに文字コードを指定することはできますか? Ohataさん、ご質問ありがとうございます!第6引数でTranslateTableを指定できるので、それにより実現可能です。上のコード例で指定するとすると、下記のようになります。 Set transtable="UTF8" Set result=##class(%SQL.Statement).%ExecDirect(,"call %SQL_Util.CSV(,?,?,,,?)",.rowtype,filename,transtable) @Tomoko.Furuzono さん ご回答いただきありがとうございます!試してみます!