検索

クリアフィルター
記事
Mihoko Iijima · 2024年2月27日

REST経由で情報を入力する場合の Interoperability(相互運用性機能)のサンプル

これは InterSystems FAQ サイトの記事です。 InterSystems製品のInteroperability(相互運用性機能)を利用する際、REST経由で情報入力を行う場合の作成方法についてサンプルプロダクションを利用しながらご紹介します。 サンプルはこちら👉https://github.com/Intersystems-jp/FAQ-Interop-REST 作成概要 サンプルプロダクションの流れ 作成方法 サンプルのインポート ​作成概要 REST経由で情報を受信できるようにIRISでRESTサーバを作成し、対応するメソッドの中からビジネスサービスを呼び出します。 準備するクラスは以下の通りです。 RESTディスパッチクラス(%CSP.RESTを継承したクラス) アダプタを使用しないビジネスサービスクラス RESTディスパッチクラスの作成方法については、コミュニティの記事:【はじめてのInterSystems IRIS】セルフラーニングビデオ:アクセス編:(REST)手動で作成するディスパッチクラス をご参照ください。 サンプルプロダクションの流れ 指定URLに対してPOST要求で以下のJSONを送付するとビジネスサービスを呼び出し、後続の処理を呼び出します。 { "Name":"テスト太郎", "Email":"taro@mail.com" } 例では、エンドポイント /myservice 以下に /request を指定するとRESTディスパッチクラス:FAQSample.REST.clsのメソッド:PostRequest() が実行され、渡された情報からプロダクションで使うメッセージ:FAQSample.Interop.Messageを作成し、アダプタ無しのビジネスサービス:FAQSample.Interop.NonAdapterに作成した情報(メッセージ)を渡します。 情報を受け取ったビジネスサービス:FAQSample.Interop.NonAdapterは、ビジネスプロセス:FAQSample.Interop.Processにメッセージを送信します。 メッセージを受信したビジネスプロセス:FAQSample.Interop.Processでは、メッセージの Name プロパティの値の有無によって以下の処理を実行します。 値が空の場合:イベントログに「Nameが空です!」と記録します。 値が空ではない場合:ファイルアウトバウンドアダプタを使用したビジネスオペレーション:FAQSample.Interop.FileOperationにメッセージを渡し、ファイル出力を行います。 Interoperabilityの仕組みやコンポーネントの役割については、コミュニティの記事:【はじめてのInterSystems IRIS】Interoperability(相互運用性)を使ってみよう!をご参照ください。 作成方法 1. アダプタのないビジネスサービスを作成する Ens.BusinessServiceクラスを継承し、アダプタを持たないビジネスサービスクラスを作成します。 (パラメータ:ADAPTERを設定しないビジネスサービスを用意します) 例:FAQSample.Interop.NonAdapter Class FAQSample.Interop.NonAdapter Extends Ens.BusinessService { /// 第1引数はRESTディスパッチクラスで作成したメッセージが格納されるように変更 Method OnProcessInput(pInput As FAQSample.Interop.Message, Output pOutput As %RegisteredObject, ByRef pHint As %String) As %Status { set status=..SendRequestAsync("FAQSample.Interop.Process",pInput) quit status } } OnProcessInput()の第1引数のタイプをオリジナルのタイプから入力予定のメッセージクラス名に変更します。(FAQSample.Interop.Message) 後は、第1引数のメッセージを次のコンポーネントであるビジネスプロセス:FAQSample.Interop.Processに送信すればいいので、..SendRequestAsync() の第2引数にOnProcessInput()の第1引数の情報を渡しています。 コンパイルを行った後、作成したビジネスサービスをプロダクションに追加します。 2. ビジネスサービスを呼び出すRESTディスパッチクラスを作成する %CSP.RESTを継承するRESTディスパッチクラスを作成します。 (例:FAQSample.REST) /request に対してPOST要求で以下JSONを送付したとき、以下のコードが実行されます。 { "Name":"テスト太郎", "Email":"taro@mail.com" } POST要求のボディに含まれるJSON情報を取得し、サーバ側で処理しやすいようにダイナミックオブジェクトに変換します。 なおHTTP要求はRESTディスパッチクラスの中では %request 変数で操作できます。ボディの情報は Content プロパティでアクセスできます。(この変数は%CSP.Requestのインスタンスです) set body={}.%FromJSON(%request.Content) ダイナミックオブジェクトからプロダクションで必要なメッセージを作成します。 set request=##class(FAQSample.Interop.Message).%New() set request.Name=body.Name set request.Email=body.Email 次に、アダプタ無しビジネスサービスのインスタンスを生成します。第1引数はプロダクションに登録したビジネスサービスの名称を指定します。第2引数は生成されたビジネスサービスのインスタンスを格納する変数を参照渡しで指定します。 set status=##class(Ens.Director).CreateBusinessService("FAQSample.Interop.NonAdapter",.bs) 戻り値を確認し$$$OKであればインスタンスの生成に成功しているので、ビジネスサービスのProcessInput()メソッドに作成したメッセージクラスを引数に指定し、実行します。 set status=bs.ProcessInput(request) (戻り値を確認し、1が返ってきていれば正常にサービスに情報を送信できています。) 3.エンドポイントを作成する 管理ポータルを使用してエンドポイントを作成します。 管理ポータル > システム管理 > セキュリティ > アプリケーション > ウェブ・アプリケーション > 「新しいウェブ・アプリケーションを作成」ボタンをクリック 図例では、/myservice の名称で USER ネームスペースに配置したRESTディスパッチクラスを指定しています。認証方法には「認証なし」と「パスワード」を設定しています。 4.テスト 設定が正しく行えているかどうか、RESTクライアントからテストします。 (図例はPostmanを使用しています) 次に、ヘッダーを確認します(Content-Typs に application/json;charset=utf-8を指定します)。 ボディを以下のように指定できたら「SEND」ボタンをクリックします。(rawでJSONを指定します) ※ 製品版IRISをご利用の場合、本番運用環境下ではIRISインストール時含まれるプライベートWebサーバ経由でのリクエストではなく、正式なWebサーバ(IISやApacheなど)経由でリクエストしてください。 5.トレースでメッセージを確認 ビジネスサービス:FAQSample.Interop.NonAdapterに入力されたメッセージを確認します。 入力情報のNameの値が空だった場合のメッセージは以下の通りです。(イベントログに「Nameが空です!」と記録されます) サンプルのインポート VSCodeを利用している場合は、IRISに接続後、FAQSample以下のファイルを全て保存します(またはFAQSampleを右クリックし、「Import and compile」を選択し一括保存+コンパイルを行います) この他の方法では、クラス定義の一括エクスポートを行ったファイル:FAQInteropREST-sample.xmlをインポートします。 管理ポータルでインポートする場合は、管理ポータル > システムエクスプローラ > クラス > 対象ネームスペース選択 > インポートボタンクリック後、FAQInteropREST-sample.xmlを選択しインポートします。 インポート後、プロダクション構成画面を開き、ビジネスオペレーション:FAQSample.Interop.FileOperation の「ファイル・パス」を適切な場所に変更してください。 《方法》 管理ポータル > Interoperability > 一覧 > プロダクション に移動したら、FAQSample.Interop.Production の行を選択して「開く」ボタンをクリックします。 オペレーション:FAQSample.Interop.FileOperation の名称をクリックし、画面右の設定欄にある「ファイル・パス」をファイル出力可能なディレクトリに変更します。 変更後、適用ボタンをクリックします。 この設定により、REST経由で送信した情報が「ファイル・パス」で設定したディレクトリ以下に作成される test.txt に出力されます。 変更が完了したら「開始する」ボタンをクリックしてプロダクションを開始します。 (確認のダイアログが出力されるのですべてOKボタンをクリックします。)
記事
Toshihiko Minamoto · 2022年12月20日

Apache Webサーバインストール廃止に関する FAQ

概要 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 サーバが含まれていない場合の作業です。(このコードは既存のまま提供されており、サポートされていません。また、ミッションクリティカルなアプリケーションやデータ機密性の高いアプリケーションをホストするには不十分であることにご注意ください)。 プライベートWebサーバとは? インターシステムズは、利便性のために、すべてのバージョンの IRIS と共に Web サーバをインストールし ていました。 InterSystems IRIS 2023.1 (予定) 以降、インターシステムズは Web サーバをインストールしませんが、Apache (*nix) および IIS (Windows) の構成の支援は継続します。 インターシステムズでは、プライベート Web サーバ (PWS) を使用せず、任意の Web サーバを使用すること を推奨しています。 WなぜPWSのインストールを廃止するのか? セキュリティの向上 - PWSのインストールは、ほぼ期限切れとなったバージョンをインストールすることになります。 クリティカルでない - 現代のWebは数年たったものよりもとてもシンプルで、yum install httpd と同じくらい簡単です。 冗長性の低減 - 独自のWebサーバーを使用しないといけない場合と、プライベートWebサーバーを使用する場合の混乱がなくなる 使用するWebサーバの更新やセキュリティへの対応が迅速になる コンテナやインストーラが若干小さくなる どのWebサーバがサポート対象なのか? インターシステムズではApache、Nginx、IIS の 3つのWebサーバをサポートしています。 Nginxは手動による設定作業が必要です。 IRIS インストーラはWebサーバの設定を支援するのか? はい。InterSystems IRIS インストーラは同じマシンにインストールされているApacheやIISを設定することができます。そのように動作させるためには、IRISをインストールする前にApacheやIISをインストールする必要があります。 もしWebサーバとIRISが同じサーバにインストールされていない場合、ApacheやIISの設定に WebGatewayを使うことができます。 ただ、インターシステムズはWebサーバのインストレーションを支援する立場にはありません。 インストーラでは、Webサーバの削除について聞かれますか? はい!インストーラは、ローカルの Web サーバがあるかどうかを検出し、ない場合はインストールを中断するか、またはインストールを続行するかを選択します。インストーラがローカルの Web サーバを検出した場合、その Web サーバの設定を変更するかどうかを尋ねます。 PWSがインストールされている環境に新たなバージョンをインストールするとどうなりますか? 既存のPWSがある場合、IRISはそれを引き続き使用します。 IRISインストーラは変更されましたか? はい。インストール中に、IRISはローカルWebサーバーがインストールされているかどうかを確認します。 すでにローカルWebサーバーがインストールされている場合は、インストーラーがそれを設定するかどうかを尋ねます。 Yesと答えると、インストーラがWebサーバーを設定します。 Web サーバーがインストールされていない場合、インストーラは Web サーバーが見つからなかったことをユーザーに伝え、IRIS のインストールを中断するかどうかを尋ねます。 Web サーバを構成せずに IRIS をインストールすることを選択した場合、Web サーバはインストールも構成もされません。 InterSystems IRIS Community Editionはどうなりますか? Community Edition では、これまでと同様にインストールと PWS が行われます。 コンテナ以外では、PWS をインストールしないリリースでは、Community Edition を localhost に制限する予定です。評価版は、Community Edition 用の特別なライセンス・キーであり、これまでと同様に機能します。したがって、変更の必要はありません。 コンテナでの動作はどのようになりますか? Community Editionのコンテナは変更されません(CEインストーラと一致します) irisコンテナには、Apacheがインストールされません。 このことは、使い始めのスピードバンプになることを認識しています(以下の緩和策を参照)。 iris-lockeddown コンテナには、これまで Web サーバが含まれていなかったので、変更はありません。 ← 本番環境では、ロックダウンされたコンテナを使用することを推奨します。 --> 緩和策 irisコンテナのユーザが管理コンソールに簡単にアクセスできるようにするため、以下を提供し、維持する必要があります。 ベースとなるirisコンテナから、WebサーバとWebゲートウェイを追加・設定するDockerfileの例 正しく設定されたWebゲートウェイをirisコンテナの横で実行するdocker-composeとpodman-composeのファイル例 同じく実証するkubernetesのYAML例 言い換えれば、現在の機能に戻るための簡単な「コピー&ペースト」の練習にしたいのです PWSを削除したい場合、どのようなプロセスを踏めばよいですか? お客様がプライベートWebサーバーから移行された後、手動で削除する必要があります。 (将来のドキュメントにリンクを追加 以前は、同じマシン上のすべてのIRISインストールに独自のWebサーバーがありました。今はどのように動作するのでしょうか? ApacheまたはIISのインストールは1つで十分です。IRISインストーラが自動的にApacheまたはIISを検出し、IRISインスタンスをそのWebサーバーに追加します(インストールダイアログでユーザーがそのオプションを選択しなかった場合を除く)。 自動インストーラではどのような動作になりますか? 自動インストーラには、Web サーバー設定に関するパラメータ(ISC_PACKAGE_WEB_CONFIGURE)がすでにあります。 デフォルト値は N (いいえ) に設定されており、インターシステムズが完全に構成されたプライベート Web サーバ (PWS) を出荷しているため、うまく機能しました。 PWS をインストールしないバージョンでは、このオプションのデフォルトで Y (はい) になりますので、自動インストーラを実行する前に Web サーバがインストールされている必要があります。独自にWebサーバー設定を行うか、Central Webサーバーを使用したいお客様は、明示的にISC_PACKAGE_WEB_CONFIGURE設定をN(No)に変更する必要があります。 自動インストーラは、Apache (*nix プラットフォーム) と IIS (Windows) がローカルにインストールされている場合にのみ、設定します。
記事
Toshihiko Minamoto · 2022年1月6日

IRISデータベースへのPython JDBC接続 - 簡易メモ

キーワード: Python、JDBC、SQL、IRIS、Jupyterノートブック、Pandas、Numpy、および機械学習  ## 1. 目的 これは、デモの目的で、Jupyterノートブック内でPython 3によってIRIS JDBCドライバーを呼び出し、SQL構文でIRISデータベースインスタンスにデータを読み書きする、5分程度の簡単なメモです。  昨年、私は[CacheデータベースへのPythonバインディング](https://jp.community.intersystems.com/node/505841)(セクション4.7)について簡単に触れました。 そこで、Pythonを使ってIRISデータベースに接続し、そのデータをPandasデータフレームとNumPy配列に読み込んで通常の分析を行ってから、事前処理済みまたは正規化されたデータをML/DLパイプラインに通すためにIRISに書き込む作業においてのオプションと議論について要約しましょう。 すぐに思い浮かぶ簡単な**オプション**がいくつかあります。 1.    **ODBC**: Python 3とネイティブSQLを使ったPyODBCを使ってはどうでしょうか? 2.    **JDBC**: Python 3とネイティブSQLを使ったJayDeBeApiはどうでしょうか? 3.    **Spark**: PySparkとSQLを使ったら? 4.    **IRIS用PythonネイティブAPI**: 前に使用したCache用Pythonバイディングを拡張してみたらどうでしょうか? 5.   **IPtyhon Magic SQL %%sql**とした場合、 [それ](https://github.com/catherinedevlin/ipython-sql)はまだIRISで動作するでしょうか?  ここで見逃されたオプションがほかにありますか?  それらも試してみたいですね。  ## 2. 範囲  通常のJDBCアプローチからはじめましょう。 ODBC、Spark、PythonネイティブAPIについては、次回の簡易メモで要約することにします。  ### 範囲内: このクイックデモでは、以下の一般的なコンポーネントについて触れています。 Anaconda Jupyterノートブック  Python 3 JayDeBeApi JPyPe Pandas NumPy IRIS 2019.xのインスタンス ###  範囲外: この簡易メモでは、以下の項目には触れていません。重要な項目であり、具体的なサイトソリューション、デプロイ、およびサービスで個別に対処される可能性があります。  エンドツーエンドのセキュリティ 機能しないパフォーマンスなど トラブルシューティングとサポート ライセンス    ## 3. デモ ### 3.1 IRISインスタンスを実行する 私は単にIRIS 2019.4コンテナーを「リモート」データベースサーバーとして実行しましたが、 適切な承認済みのアクセス権を持つIRISインスタンスであれば、どれでも使用できます。 zhongli@UKM5530ZHONGLI MINGW64 /c/Program Files/Docker Toolbox$ docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                PORTS                                              NAMESd86be69a03ab        quickml-demo        "/iris-main"        3 days ago          Up 3 days (healthy)   0.0.0.0:9091->51773/tcp, 0.0.0.0:9092->52773/tcp   quickml ### 3.2 AnacondaとJupyterノートブック  Anacondaについては[こちら](https://jp.community.intersystems.com/node/505841)のセクション4.1に説明されたセットアップアプローチ、Jupyterノートブックについては[こちら](https://jp.community.intersystems.com/node/506626)に説明されたセットアップアプローチをノートパソコンで再利用します。  Python 3.xはこのステップでインストールされます。 ### 3.3 JayDeBeApiとJPyPeをインストールする 私は自分のJupyterノートブックを起動してから、そのセルで以下を実行し、Python-to-JDBC/Javaブリッジをセットアップしました。     !conda install --yes -c conda-forge jaydebeapi この記事の執筆時点(2020年1月)では、JeDeBeApiはJPype 0.7を使用していますが、既知のバグによって機能しないため、0.6.3にダウングレードする必要がありました。 !conda install --yes -c conda-forge JPype1=0.6.3 --force-reinstall ### 3.4 JDBC経由でIRISデータベースに接続する  公式の[JDBCからIRISへの接続に関するドキュメント](https://docs.intersystems.com/irislatestj/csp/docbook/DocBook.UI.Page.cls?KEY=AFL_jdbc)はこちらにあります。  JDBCでPyshon SQLを実行するには、以下のコードを例として使用しました。 このIRISインスタンスの「USER」ネームスペース内にある「`DataMining.IrisDataset`」というデータテーブルに接続します。  ### 1. Set environment variables, if necessary#import os#os.environ['JAVA_HOME']='C:\Progra~1\Java\jdk1.8.0_241'#os.environ['CLASSPATH'] = 'C:\interSystems\IRIS20194\dev\java\lib\JDK18\intersystems-jdbc-3.0.0.jar'#os.environ['HADOOP_HOME']='C:\hadoop\bin'  #winutil binary must be in Hadoop's Home ### 2. Get jdbc connection and cursorimport jaydebeapiurl = "jdbc:IRIS://192.168.99.101:9091/USER"driver = 'com.intersystems.jdbc.IRISDriver'user = "SUPERUSER"password = "SYS"#libx = "C:/InterSystems/IRIS20194/dev/java/lib/JDK18"jarfile = "C:/InterSystems/IRIS20194/dev/java/lib/JDK18/intersystems-jdbc-3.0.0.jar" conn = jaydebeapi.connect(driver, url, [user, password], jarfile)curs = conn.cursor() ### 3. specify the source data tabledataTable = 'DataMining.IrisDataset'  ### 4. Get the result and displaycurs.execute("select TOP 20 * from %s" % dataTable)result = curs.fetchall()print("Total records: " + str(len(result)))for i in range(len(result)):    print(result[i]) ### 5. CLose and clean - I keep them open for next accesses.#curs.close()#conn.close()   Total records: 150 (1, 1.4, 0.2, 5.1, 3.5, 'Iris-setosa') (2, 1.4, 0.2, 4.9, 3.0, 'Iris-setosa') (3, 1.3, 0.2, 4.7, 3.2, 'Iris-setosa') ... ... (49, 1.5, 0.2, 5.3, 3.7, 'Iris-setosa') (50, 1.4, 0.2, 5.0, 3.3, 'Iris-setosa') (51, 4.7, 1.4, 7.0, 3.2, 'Iris-versicolor') ... ... (145, 5.7, 2.5, 6.7, 3.3, 'Iris-virginica') ... ... (148, 5.2, 2.0, 6.5, 3.0, 'Iris-virginica') (149, 5.4, 2.3, 6.2, 3.4, 'Iris-virginica') (150, 5.1, 1.8, 5.9, 3.0, 'Iris-virginica')   ここで、JDBCでPythonが機能していることをテストしました。 以下はちょっとした日常業務的なデータ分析と通常のMLパイプラインのプリプロセッシングであり、後のデモと比較で何度も触れる内容です。ここでは、利便的に添付しています。  ### 3.5 SQL結果をPandasデータフレーム、そしてNumPy配列に変換する PandasとNumPyパッケージがインストールされていない場合は、上記のセクション3.3と同様に、Condaを使ってインストールします。 次に、以下のコードを例として実行しました。 ### transform SQL results "sqlData"to Pandas dataframe "df", then further to NumPy array "arrayN" for further ML pipelines import pandas as pdsqlData = "SELECT * from DataMining.IrisDataset"df= pd.io.sql.read_sql(sqlData, conn)df = df.drop('ID', 1)df = df[['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth', 'Species']] # set the labels to 0, 1, 2, for NumPy matrixdf.replace('Iris-setosa', 0, inplace=True)df.replace('Iris-versicolor', 1, inplace=True)df.replace('Iris-virginica', 2, inplace=True) # turn dataframe into Numpy arrayarrayN = df.to_numpy() ### 6. CLose and clean - if connection is not needed anymore?#curs.close()#conn.close() いつものように現在のデータを覗いてみましょう。 df.head(5) df.describe() データフレームと、ソースデータテーブルから正規化されたNumPy配列を取得して、使用できるようになりました。   もちろん、[こちらのリンクのように](http://www.lac.inpe.br/~rafael.santos/Docs/CAP394/WholeStory-Iris.html)、MLユーザーが以下のようにPython で行うような様々なルーチン分析を試して、Rを置き換えることができます。 データソースはこちらから引用されています。   ### 3.6 SQLでデータを分割してIRISデータベースに書き込む 確かに、以降でIRISの刺激的なML機能で使用できるように、データを通常どおりトレーニングセットと検証またはテストセットに分割し、一時データベーステーブルに書き込むことができます。 import numpy as np from matplotlib import pyplotfrom sklearn.model_selection import train_test_split # keep e.g. 20% = 30 rows as test data; trained on another e.g. 80% = 120 rowsX = arrayN[:,0:4]y = arrayN[:,4]X_train, X_validation, Y_train, Y_validation = train_test_split(X, y, test_size=0.20, random_state=1, shuffle=True) # make 80% of random rows into a Train setlabels1 = np.reshape(Y_train,(120,1))train = np.concatenate([X_train, labels1],axis=-1) # make 20% of left rows into Test setlTest1 = np.reshape(Y_validation,(30,1))test = np.concatenate([X_validation, lTest1],axis=-1) # write the train data set into a Pandas framedfTrain = pd.DataFrame({'SepalLength':train[:, 0], 'SepalWidth':train[:, 1], 'PetalLength':train[:, 2], 'PetalWidth':train[:, 3], 'Species':train[:, 4]})dfTrain['Species'].replace(0, 'Iris-setosa', inplace=True)dfTrain['Species'].replace(1, 'Iris-versicolor', inplace=True)dfTrain['Species'].replace(2, 'Iris-virginica', inplace=True) # write the test data into another Pandas framedfTest = pd.DataFrame({'SepalLength':test[:, 0], 'SepalWidth':test[:, 1], 'PetalLength':test[:, 2], 'PetalWidth':test[:, 3], 'Species':test[:, 4]})dfTest['Species'].replace(0, 'Iris-setosa', inplace=True)dfTest['Species'].replace(1, 'Iris-versicolor', inplace=True)dfTest['Species'].replace(2, 'Iris-virginica', inplace=True) ### 3. specify temp table names#dataTable = 'DataMining.IrisDataset'dtTrain = 'TRAIN02'dtTest = "TEST02" ### 4. Create 2 temporary tables - you can try drop tables then re-create them every timecurs.execute("Create Table %s (%s DOUBLE, %s DOUBLE, %s DOUBLE, %s DOUBLE, %s VARCHAR(100))" % (dtTrain, dfTrain.columns[0], dfTrain.columns[1], dfTrain.columns[2], dfTrain.columns[3], dfTrain.columns[4]))curs.execute("Create Table %s (%s DOUBLE, %s DOUBLE, %s DOUBLE, %s DOUBLE, %s VARCHAR(100))" % (dtTest, dfTest.columns[0], dfTest.columns[1], dfTest.columns[2], dfTest.columns[3], dfTest.columns[4])) ### 5. write Train set and Test set into the tales. You can try to delete old record then insert everytime. curs.fast_executemany = Truecurs.executemany( "INSERT INTO %s (SepalLength, SepalWidth, PetalLength, PetalWidth, Species) VALUES (?, ?, ?, ? ,?)" % dtTrain,     list(dfTrain.itertuples(index=False, name=None)) )curs.executemany( "INSERT INTO %s (SepalLength, SepalWidth, PetalLength, PetalWidth, Species) VALUES (?, ?, ?, ? ,?)" % dtTest,     list(dfTest.itertuples(index=False, name=None)) ) ### 6. CLose and clean - if connection is not needed anymore?#curs.close()#conn.close() ここで、IRIS管理コンソールまたはターミナルSQLコンソールに切り替えると、120行のTRAIN02と30行のTEST02という2つの一次テーブルが作成されているのがわかります。 この記事は非常に短い簡易メモを目的としているため、本内容はここまでとします。 ## 4. 警告 * 上記のコンテンツは変更または改善される場合があります。  ## 5. 今後の内容 簡易メモを貢献していただける方がいらっしゃらなければ、セクション3.3と3.4をPyODBC、PySPark、およびIRIS用PythonネイティブAPIに置き換えることにします。貢献していただけるのであれば、大感謝です。    
記事
Tomoko Furuzono · 2020年11月24日

例:PHPから Caché Web サービスへの接続

最近、InterSystems 内で PHP から Caché ベースの Web サービスに接続が必要になる事例がいくつかありました。 これらの最初の事例とは、実はこの開発者コミュニティそのものであり、他の InterSystems サイト/アプリケーションとのシングルサインオンに Web サービスを使用しています。 次の例は、パスワード認証を使用して PHP から Caché ベースの Web サービス(具体的には SAMPLES ネームスペースの Web サービス)に接続する方法を示しています。 (注意: この例は、/csp/samples に対してパスワード認証が有効になっていることを前提としています。) <?php// ユーザー名/パスワード用の標準 SOAP ヘッダー// 出典元: http://stackoverflow.com/questions/13465168/php-namespaces-in-soapheader-child-nodes class WSSESecurityHeader extends SoapHeader { public function __construct($username, $password) { $wsseNamespace = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'; $security = new SoapVar( array(new SoapVar( array( new SoapVar($username, XSD_STRING, null, null, 'Username', $wsseNamespace), new SoapVar($password, XSD_STRING, null, null, 'Password', $wsseNamespace) ), SOAP_ENC_OBJECT, null, null, 'UsernameToken', $wsseNamespace )), SOAP_ENC_OBJECT ); parent::SoapHeader($wsseNamespace, 'Security', $security, false); }}// Web サービスに接続するための主要パラメーター:$location = "http://localhost:57772/csp/samples/SOAP.Demo.cls";$uri = "http://tempuri.org";$username = "_SYSTEM";$password = "SYS";// SOAP クライアントを WSDL から構築する場合、または(その目的のために存在するさまざまなツールを使用して)// WSDL を使用して PHP クラスを生成する場合、?WSDL=1 とユーザー名/パスワードは// URL の最後に追加する必要があります: $wsdl = $location . "?WSDL=1&CacheUserName=" . $username . "&CachePassword=" . $password;// 理論的に言えば、次のようなことができるようになります。 // $client = new SoapClient($wsdl, array("trace"=>1)); // 多くの場合はこれで十分です。// ただし、SAMPLES ネームスペース内の SOAP.Demo の WSDL は次のように他のクラスで// 定義されている追加のスキーマを参照します:// <s:import namespace="http://tempuri.org/QueryByName_DataSet" schemaLocation="http://localhost:57772/csp/samples/SOAP.Demo.QueryByName.DS.cls?XSD"/> // PHP の WSDL 処理で CSP セッション Cookie を使用させたり、これらを取得する際に URL 内で // 資格情報を渡す方法はないようですので、これは失敗します。 回避策は代わりに location/uri を使用し、// WSDL なしで SoapClient を作成することです。// SoapClient オブジェクトを作成 $client = new SoapClient(null, array( "trace" => 1, "location" => $location, "uri" => $uri, "style" => SOAP_DOCUMENT, "use" => SOAP_LITERAL)); // セキュリティヘッダーを追加します。$client->__setSoapHeaders(new WSSESecurityHeader($username, $password));// ID でPersonを取得します。ここでは URL から取得しますが、デフォルトでは ID 1であるため、常に何かが表示されます。$id = 1;if (isset($_GET["id"])) { $id = $_GET["id"];}// SOAP 呼び出しのパラメーター名と値を持つオブジェクト$request = new stdClass();$request->id = $id;// これは FindPersonSoapIn のキーを持つ連想配列になります(WSDL を参照)$params = array();$params['FindPersonSoapIn']=$request;// ソープコールのオプションの配列では、参照するWSDLがないので、 soapactionを指定しなければなりません。// PHP のデフォルト値 は <uri>#<method> ですが、これは正しくありません。$options = array('soapaction'=>$uri.'/SOAP.Demo.FindPerson');// 実際に Web サービスを呼び出します。$result = $client->__soapCall("FindPerson",$params,$options);// 応答をページにダンプします。var_dump($result);?>
記事
Hiroshi Sato · 2020年12月15日

クラス定義をスタジオ、Atelier以外を使用して作成する方法

これはInterSystems FAQ サイトの記事です。 InterSystems OpenExchangeのVS Code用のプラグインを利用することでVS Code上でクラス定義の編集が可能です。 (今後は、AtelierではなくVS Codeの使用を推奨しています。) 詳細は、以下ページをご参照ください。 vscode-objectscript また、逆にテーブル定義からクラス定義を生成することも可能です。 方法①として、他社RDBMS用に作成したDDL文をインターシステムズ製品上で実行、またはインポートする方法があります。 詳細は、以下ドキュメントをご参照ください。 DDL文の実行について【IRIS】DDL文の実行について 方法②として、クラス定義クラス・%Dictionary.ClassDefinitionで定義されているAPIを利用し、プログラミングにより操作する方法があります。 クラス定義クラスは、システムクラスであり、スタジオや他のエディターで作成されたクラスは全てこのシステムクラスを使いクラスディクショナリに定義情報が格納されています。 このクラス詳細については、以下ドキュメントをご参照ください。 %Dictionaryパッケージ(クラス定義クラス)について【IRIS】%Dictionaryパッケージ(クラス定義クラス)について方法②については、サンプルに処理の詳細をまとめています。 以下のGitHubリポジトリをご参照ください。 クラス定義ファイルを読んでクラスを生成する サンプルの中では、プロパティやメソッドなど設定項目は、外部のファイルを読み込みながら作成しています。 サンプルプログラムは、クラスメソッドとして処理を記述していますが、ルーチンで作成しても動作します。 サンプルクラスメソッドの詳細は、 以下の通りです。 ■ クラスメソッド=CreatePro (プロパティ追加用)  引数1:パッケージ名.クラス名 → 作成されたい名前  引数2:読込みファイル(フルパス指定)→設定したいプロパティ  引数3:ファイルのデリミタ(省略時タブが使用されます)  <サンプルファイル>  Customerクラス用=Customer-pro.txt  Companyクラス用=Company-pro.txt ターミナルからの実行例は以下の通りです。 Set file="C:\temp\Company-pro.txt" Do ##Class(ClassDef.Utility).CreateMethod("パッケージ名.クラス名",file) ■ クラスメソッド=CreateMethod (メソッド追加用)  引数1:パッケージ名.クラス名 → 追加対象のクラスを指定  引数2:読込みファイル(フルパス指定)→設定したいプロパティ  引数3:ファイルのデリミタ(省略時タブが使用される) <サンプルファイル>  Csutomerクラスへの追加用=Customer-method.txt ターミナルからの実行例は以下の通りです。 Set file="C:\temp\Customer-method.txt" Do ##Class(ClassDef.Utility).CreateMethod("パッケージ名.クラス名",file) <メモ>スタジオでのサンプルファイルインポート方法 スタジオ: [ツール] > [ローカルからインポート] > [添付のXMLファイルを指定しインポート]
記事
Megumi Kakechi · 2021年7月19日

エラーが発生する場合の対処法について

これは InterSystems FAQ サイトの記事です。 <STORE> エラーは サーバ上のプロセスが使用しているプロセス個別メモリ容量が上限に達した場合に発生します。このメモリはオブジェクトを開いたり、ローカル変数を使用することで消費されるものとなります。このエラーは サーバ上のプロセスでメモリを大量に使用した場合に発生します。Caché バージョン2012.2以降、プロセス個別のメモリ容量の最大値が大幅に拡張されました(約2TB)。 この変更により、ローカル変数の使用領域を大幅に増やすことができるようになったため 特別な状況が発生しない限り(プログラムのバグにより大量のローカル変数を作成し続ける等) エラーを回避できるようになりました。 但し、このためのメモリ領域は、プログラムが動作するハードウェアが提供する資源の一つですので物理的な制限は当然あります。システム全体の資源管理を念頭に置き慎重な使用をお勧めします。 設定値詳細については以下ドキュメントをご参照ください。 プロセスあたりの最大メモリ(KB)の設定値についてインターシステムズ製品のプロセス・メモリについて プロセスが使用可能なメモリの上限は、管理ポータル(バージョン2010.2以前では[システム管理ポータル])から変更できます。システム構成パラメータ名は bbsiz で、既定値には、262,144 KB が設定され bbsiz で設定した値まで拡張します。※IRIS 2022.1 以降は、既定値が -1(最大値:制限なし) になりました。 bbsiz の設定は以下より行います。 管理ポータル:[システム管理] > [構成] > [システム構成] > [メモリと開始設定] : [プロセスあたりの最大メモリ(KB)] ※補足 既定値については、IRIS 2021.1 以前では、262,144 KB が設定されます。 IRIS 2022.1 以降は、-1(最大値:制限なし) になりました。 設定値の範囲については以下の通りです。  【IRIS 2021.1 ~】 256 ~ 2,147,483,648 KB or -1 【~ IRIS 2020.1】 128 ~ 2,147,483,648 KB  【Caché/Ensemble 2012.2~】 128 ~ 2,147,483,648 KB 【Caché/Ensemble 2009.1~2012.1】 128 ~ 49,536 KB 【~Caché/Ensemble 2008.2】 128 ~ 47,630 KB 以下、エラーが発生する例を示します。(ターミナルでの実行例) USER>for i=1:1 set a(i)="some string....."FOR i=1:1 SET a(i)="some string....." ^<STORE>USER> プロセスのメモリ使用状況は、管理ポータルの [システムオペレーション] > [プロセス] の一覧表示から各プロセスの詳細を表示すると、“使用中のメモリ” の項目で確認できます。 以下の関連トピックもあわせてご参照ください。 InterSystems製品のプロセスが使用するメモリ量を教えてください。 ローカル変数は最大どのくらいまで使うことができるのか
記事
Megumi Kakechi · 2024年7月1日

This CPU is not supported by this version of IRIS***, which requires "AVX" and "BMI" CPU instructions.

これは InterSystems FAQ サイトの記事です。 IRIS2024.1以降のバージョンをインストールしようとした際に、以下のようなエラーになることがあります。 This CPU is not supported by this version of IRISHealth, which requires “AVX” and “BMI” CPU instructions. これは、2024.1以降のバージョンより最小CPUの条件として、AVX および BMI 拡張命令が含まれることが条件となっているのですが、ご使用の環境に含まれない(仮想環境やFTサーバ等の特殊なシステムでは無効化されている場合も)ときに出力されるエラーです。 最小CPUサポートバージョンについては、以下のドキュメントをご覧ください。Minimum Supported CPU 現在使用中のCPUの拡張命令セットの情報の確認方法については、以下のDC記事をご覧ください。CPU のマイクロアーキテクチャファミリと命令セットの判定方法 Linuxの場合は、lscpuコマンド、または lshw -class processor コマンドで確認できます。 実行例: # lscpuアーキテクチャ: x86_64CPU 操作モード: 32-bit, 64-bitバイト順序: Little EndianCPU: 1オンラインになっている CPU のリスト: 0コアあたりのスレッド数: 1ソケットあたりのコア数: 1ソケット数: 1NUMA ノード数: 1ベンダー ID: GenuineIntelBIOS Vendor ID: GenuineIntelCPU ファミリー: 6モデル: 142モデル名: Intel(R) Core(TM) i7-8665U CPU @ 1.90GHzBIOS Model name: Intel(R) Core(TM) i7-8665U CPU @ 1.90GHzステッピング: 12CPU MHz: 2112.006BogoMIPS: 4224.01ハイパーバイザのベンダー: VMware仮想化タイプ: 完全仮想化L1d キャッシュ: 32KL1i キャッシュ: 32KL2 キャッシュ: 256KL3 キャッシュ: 8192KNUMA ノード 0 CPU: 0フラグ: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xsaves arat flush_l1d arch_capabilities または $ sudo lshw -class processor *-cpu:0 description: CPU: capabilities: lm fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp x86-64 constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xsaves arat flush_l1d arch_capabilities Windowsの場合は、coreinfo ユーティリティで確認できます。 実行例: C:\work\Coreinfo>Coreinfo64.exeCoreinfo v3.6 - Dump information on system CPU and memory topologyCopyright (C) 2008-2022 Mark RussinovichSysinternals - www.sysinternals.com 13th Gen Intel(R) Core(TM) i7-1365UIntel64 Family 6 Model 186 Stepping 3, GenuineIntelMicrocode signature: 00004114:AES * Supports AES extensionsAVX * Supports AVX instruction extensionsAVX2 * Supports AVX2 instruction extensionsAVX-512-F - Supports AVX-512 Foundation instructionsAVX-512-DQ - Supports AVX-512 double and quadword instructionsAVX-512-IFAMA - Supports AVX-512 integer Fused multiply-add instructionsAVX-512-PF - Supports AVX-512 prefetch instructionsAVX-512-ER - Supports AVX-512 exponential and reciprocal instructionsAVX-512-CD - Supports AVX-512 conflict detection instructionsAVX-512-BW - Supports AVX-512 byte and word instructionsAVX-512-VL - Supports AVX-512 vector length instructionsFMA * Supports FMA extensions using YMM stateMSR * Implements RDMSR/WRMSR instructionsMTRR * Supports Memory Type Range RegistersXSAVE * Supports XSAVE/XRSTOR instructionsOSXSAVE * Supports XSETBV/XGETBV instructionsRDRAND * Supports RDRAND instructionRDSEED * Supports RDSEED instruction CMOV * Supports CMOVcc instructionCLFSH * Supports CLFLUSH instructionCX8 * Supports compare and exchange 8-byte instructionsCX16 * Supports CMPXCHG16B instructionBMI1 * Supports bit manipulation extensions 1BMI2 * Supports bit manipulation extensions 2ADX * Supports ADCX/ADOX instruction::(※ * になっていればOK) 【ご参考】InterSystems IRIS ミニマムサポート CPU モデル
記事
Mihoko Iijima · 2025年7月7日

503 Service Unavailable エラーが出る原因

これは InterSystems FAQ サイトの記事です。 一般的に、500番台はサーバー側で発生したエラーを表していて、503番エラーはサーバーが何らかの理由で機能を停止していてクライアントの要求に回答できない場合に出現するエラーです。 外部サイトの説明:503エラー 【HTTP 503 Service Unavailable】 以下、InterSystems 製品の使用で発生する503エラーの考えられる原因について一覧します。 REST/CSPページにアクセスできない 原因:ライセンスが割り当てられない場合に発生します(ライセンスが「同時接続ユーザ」での購入である場合、ユーザ数が制限を迎えたためライセンスが割り当てられずこのエラーが発生します)。 アプリケーションが「認証なし」アクセスを使用している場合、以下の原因により503エラーが発生します。 REST では、「認証なし」アクセスの場合は処理が終了しても10秒間ライセンスが保持されます。このため、保持するライセンス数を超えるような使用方法となっている可能性があります。 CSPアプリケーションでは、ブラウザごとにセッションを作成します。明示的にセッション終了を指定する、またはセッションタイムアウトを迎えるまでライセンスを保有し続けます。ユーザが使用しなくなったが終了していないセッションが残る可能性もありライセンス超過が発生する場合があります。 「認証なし」アクセスを利用している場合の回避策としては、認証を行うアクセスに変更し、CSPアプリケーションの場合はアプリケーション終了を明示的に指定するように変更します。 IIS環境で503エラーが発生する 原因:IIS で使用するためにサードパーティ・モジュール (ネイティブ・モジュールおよび ISAPI モジュールの両方) を構成しているときによく発生する問題で、既定のアプリケーション・プールが終了しているために発生します。 回避策:以下トラブルシューティングの手順をお試しください。トラブルシューティング データベースミラーリングのプライマリチェック時に発生する ※ 使用されているウェブアプリケーション実行時に発生する503エラーとは異なります。 解説:ターゲットインスタンスがプライマリーメンバーではない場合に発生します。 以下アクセス成功時、対象サーバはプライマリーメンバーであることを示しています。 例)http://Webサーバー/csp/bin/mirror_status.cxw プライマリ―メンバーではないサーバにアクセスすると503エラーが発生します。 詳細は記事:「仮想IPアドレスを使用しないデータベースミラーリング」をご参照ください。
記事
Toshihiko Minamoto · 2024年6月14日

Windows の書き込みキャッシュ

(この記事は 2021 年 2 月にレビューされたものです。現在でも Caché ベースのインストールに関連性があり、同様に IRIS ベースのインストールに適用されます。) この記事では、停電やオペレーティングシステムのクラッシュが発生した場合にシステムをデータ損失または破損の危険にさらす可能性のある Windows の書き込みキャッシュ設定について説明しています。この設定は一部の Windows 構成においてデフォルトでオンになっています。 Windows のディスク書き込みキャッシュを有効にしておくと、(Caché が書き込みフェーズのある重要な時点で OS キャッシュからディスクへの書き込みをフラッシュする場合でも)、Caché(またはその他のプログラム)がそのディスクに書き込む内容の一部は耐久ストレージに必ずしも直ちにコミットされません。コンピューターへの電源が失われた場合、そのデバイスにキャッシュ済みの物は、そのデバイスのキャッシュが非揮発性であるか電源バックアップが備わっていない限り、失われます。Caché はデータの耐久性の保証をオペレーティングシステムに頼っています。このシナリオの場合、その保証が崩れてしまいます。Caché においては、データベースの破損やデータベースまたはジャーナルファイルのデータの欠損という結果に繋がる可能性があります。 InterSystems のドキュメントによると、書き込みイメージジャーナリングによって提供される保証を崩す可能性があるものの 1 つは、ライトバックキャッシュのコンテンツの損失です(http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GCDI_wij#GCDI_wij_limits を参照)。InterSystems Worldwider Response Center のデータ整合性チームは、この設定の値が原因でライトバックキャッシュのコンテンツが失われたことを示す、Windows プラットフォームでのデータ損失または破損の事例を多数調査しました。 ディスクには、この種の問題に対する堅牢性を提供するキャッシュを含むことができることに言及しておく価値があります。問題のディスクのキャッシュが非揮発性であるか、電源バックアップが備わっている場合、この設定がオンである場合でも、そのディスクへの書き込みは安全です。問題のストレージが直接接続されたディスクよりも複雑である場合は、このリスクを評価するために、そのストレージインフラストラクチャのどこに書き込みがキャッシュされており、それらのキャッシュが揮発性であるか電源バックアップを備えているかを理解する必要があります。 この設定は「デバイスマネージャー」に移動し、「ディスクドライブ」セクションを展開して特定のディスクのプロパティで確認することができます。関心のある設定は「ポリシー」タブにあります。 書かれている内容は必ずしもここに示すものと同じではなく、デバイスの種類によって異なる場合があります。ただし、これは一般的な記述であり、Windows は、この設定をオンにすると、マシンの電源が切れたりクラッシュしたりした場合にシステムがデータ損失の危険にさらされることを明確にしています。 次は、影響があまり明確でない、同じマシンの別のディスクからの例です。ここで「高いパフォーマンス」を選択すると、他の例の書き込みキャッシュを有効にするのと同じ懸念が生じます。 これらのいずれの例でも、選択された設定はそのデバイスのデフォルトであり、私は変更していません。最初の例ではデフォルトによってデバイスがリスクにさらされていますが、2 つ目の例ではさらされていません。私の知る限り、デバイスんタイプや Windows のバージョンに基づく汎用のデフォルトはありません。言い換えると、そのデバイスにリスクがあるかを知るには、デバイスごとにこの設定を確認する必要があるということです。 システム管理者としてこのシナリオに対応するには基本的に 3 つの方法があります。設定を無効にすることが最も単純な方法であり、確実にこのリスクにさらされないようにすることができます。ただし、設定を無効にすることによって、許容範囲を超えるパフォーマンスの影響が生じることもあり得ます。その場合には、設定をオンのままにし、コンピューターを無停電電源装置(UPS)に接続するのがよい場合もあります。UPS を使用すれば、停電が発生した場合に正常にシャットダウンする十分な時間を得られるため、データの損失や破損を引き起こす停電に対する保護が得られます。最後のオプションは、サーバーが電源を失ったりクラッシュしたリした場合にデータが損失するというリスクを単に受け入れることです。InterSystems はこのオプションは推奨していません。消費者向け UPS は比較的安価で入手できますが、整合性問題の検出と回復には時間がかかり、問題が発生する可能性があるためです。 InterSystems は、コンピューターが無停電電源装置に接続されていることを確認せずに、この設定をオンにすることを推奨していません。ストレージが外部デバイスである場合は、そのデバイスも UPS に接続されている必要があります。
記事
Mihoko Iijima · 2021年3月5日

累積バックアップと差分バックアップの違いについて

これは InterSystems FAQ サイトの記事です。 ※ ここで説明するバックアップ方法は、外部バックアップ(##class(Backup.General).ExternalFreeze()を使用する方法)ではご利用いただけません。 その1(差分) 毎週日曜日1時にフルバックアップ、月曜日~土曜日の1時に差分バックアップを取得しているとします。 差分バックアップは、前日の1時に取得したバックアップからの更新ブロックが含まれるバックアップです。 その2(累積) 毎週日曜日1時にフルバックアップ、月~火曜日の1時に差分バックアップ、水曜日1時に累積バックアップ、木~土曜日の1時に差分バックアップを取得するとします。 累積バックアップは、前回のフルバックアップからの更新ブロックが含まれるバックアップで、水曜日に累積バックアップを取得した場合、月曜日と火曜日の差分バックアップは水曜日に累積バックアップに含まれるため、累積バックアップ成功後、月曜日と火曜日に差分バックアップは破棄できます。 オンラインバックアップ詳細については「データベースのバックアップ方法について」や、下記ドキュメントをご参照ください。 オンライン・バックアップ【IRIS】 Cachéオンライン・バックアップ
記事
Hiroshi Sato · 2021年10月14日

文字コードを変換するときに利用できる変換テーブル名を取得する

これはInterSystems FAQ サイトの記事です。文字コードの変換に利用できる変換テーブル名は、以下のシステム関数で取得できます。 Write $$GetIONames^%SYS.NLS() 現在のロケールにおいて各デバイス(ファイル、ターミナル等)のデフォルトの変換テーブル名を取得するには、%SYS.NLS.Table クラスを使用します。 確認方法は以下の通りです。 (1) システムデフォルト設定を取得するため、%SYS.NLS.Table のインスタンスを生成します。(引数に、"System" を指定します。) set obj=##class(%SYS.NLS.Table).%New("System") (2) GetIOTable() メソッドを使用して、確認したいデバイスの現在の変換テーブル名を取得します。 メソッドの引数には、デバイス名に対応した番号を指定します。(詳細はクラスリファレンスをご参照ください。) 【ご参考】クラスリファレンスは、ドキュメントトップ > クラスリファレンス または、スタジオ→表示→クラスドキュメント から参照できます。 // ファイル入出力に使用する変換テーブル名を取得 write obj.GetIOTable(3) 【ご参考】 以下のドキュメントもご参照ください。 %SYS.NLS.Tableについて【IRIS】%SYS.NLS.Tableについて使用例については、以下のドキュメントの「システムおよびプロセス・テーブル・データの表示」をご参照ください。 %SYS.NLSの使用例について【IRIS】%SYS.NLSの使用例について
記事
Hiroshi Sato · 2021年9月23日

アプリケーション使用中にインデックス再構築を複数プロセスで実行する方法

これは InterSystems FAQ サイトの記事です。%IndexBuilder クラスを使用して、複数プロセスを利用してインデックス再構築を行うことができます。 Sample.Person の Home_State(連絡先住所の州情報)カラムに対して標準インデックス HomeStateIdx を定義する目的での例で記載します。 手順は以下の通りです。 1、追加/再構築予定のインデックス名をクエリオプティマイザから隠します。 >write $system.SQL.SetMapSelectability("Sample.Person","HomeStateIdx",0)1 2、新インデックスを定義するクラス定義のスーパークラスに %IndexBuilder を一番右端に追加します。 ///クラス定義文は以下の通りです(一番右端に追加します)Class Sample.Person Extends (%Persistent, %Populate, %XML.Adaptor, %Library.IndexBuilder) 3、クラス定義の INDEXBUILDERFILTER パラメータに再構築予定のインデックス名を登録します。 Index HomeStateIdx On Home.State;Parameter INDEXBUILDERFILTER = "HomeStateIdx"; 4、クラスをコンパイルします。5、%ConstructIndicesParallel() メソッドを使用して、並列処理でインデックスの再構築を行います。 set st=##class(Sample.Person).%ConstructIndicesParallel() 6、インデックス再構築が終わったら、追加したインデックスをオプティマイザに公開します。 >write $system.SQL.SetMapSelectability("Sample.Person","HomeStateIdx",1)1 詳細は以下ドキュメントをご参照ください。 インデックス再構築をアプリケーション実行中に行う方法について【IRIS】 インデックス再構築をアプリケーション実行中に行う方法について
記事
Megumi Kakechi · 2022年7月31日

任意のカスタムエラーを発生させる方法

これは InterSystems FAQ サイトの記事です。TRYブロック内で任意のカスタムエラーを発生させたい場合、以下のように throw で例外を渡すことが可能です。 以下のサンプルでは、Stcount が 1 より小さい場合にカスタムエラーを発生させています。 Class User.Test { ClassMethod ExceptionTest() { try { // : some codes if (Stcount<1) { throw ##class(%Exception.General).%New(" ユーザ定義エラー","5001","ロケーション","エラー時のデータ") // ユーザ作成エラーは5001以降 } } catch ex { write "エラー #", ex.Code, ": ", ex.Name, " : ", ex.Location, " ", ex.Data return } } } 上の例では、Stcount が 1 より小さい場合、以下のようなエラーが出力されます。 USER>do ##class(User.Test).ExceptionTest() エラー #5001: ユーザ定義エラー : ロケーション エラー時のデータ 詳細は以下のドキュメントをご覧ください。ObjectScriptコマンド_THROW また、任意のステータスコードを作成したい場合は以下のように行います。 USER>set st = ##class(%SYSTEM.Status).Error(5001,"これはユーザ定義エラーです") USER>zwrite st st="0 "_$lb($lb(5001,"これはユーザ定義エラーです",,,,,,,,$lb(,"USER",$lb("e^zError+1^%SYSTEM.Status.1^1","e^^^0"))))/* エラー #5001: これはユーザ定義エラーです */ USER>do $SYSTEM.Status.DisplayError(st) エラー #5001: これはユーザ定義エラーです 以下の関連トピックもあわせてご覧ください。 【FAQ】ユーザ定義のエラーを定義したいのですが、どのようにすればいいですか?【FAQ】プログラミングを行う際のエラー処理方法を教えてください。
お知らせ
Rie Tokue · 2023年5月8日

5月30日(火)オンラインセミナー「ワークフローコンポーネントの使い方」~自動処理にユーザからの指示を統合する方法~のご案内

開発者の皆さん、こんにちは。 ご好評をいただいております弊社主催・開発者向けオンラインセミナーを 5月30日(火)13時30分~14時に開催いたします。今回のテーマは「ワークフローコンポーネントの使い方」です。 (参加費無料・事前登録制) 【概要】 本ウェビナーでは、InterSystems IRIS Data Platform が持つ Interoperability(相互運用性)機能を利用してシステム連携を行う際、自動的な連携の流れにユーザからの指示を介入できる「ワークフローコンポーネント」の使い方についてご紹介します。 ワークフローコンポーネントは、IRISの標準機能でワークフロータスク担当者が指示を行うための専用ポータルも標準で用意されています。 ウェビナーでは、ワークフローコンポーネントの使い方についてご理解いただくため、以下の内容をご説明します。 動作の仕組み 開発手順 ユーザポータルの操作 コミュニティサポートのREST APIを利用したワークフローAPIの紹介 ※Interoperaiblity(相互運用性)機能概要ついてもご説明に含める予定です。 【対象者】 Interoperaiblity(相互運用性)機能に興味がある方 IRISに関わる技術者の方 ユーザからの指示を介入できるシステム連携に興味がある方 ご登録はこちらから。 ご多用中とは存じますが、皆様のご参加をお待ちしております。
記事
Tomoko Furuzono · 2020年11月24日

ランチャーからIRISの日本語ドキュメントを参照する方法

これは、InterSystems FAQサイトの記事です。 IRISおよびIRISforHealthのランチャーからドキュメントをポイントすると、Web上の英語ドキュメントを参照します。 以下の設定ファイルを下記のように修正することにより、ランチャーから日本語ドキュメントを参照できるようになります。 <インストールディレクトリ>\httpd\conf\httpd-doc.conf 【IRIS】[変更前]Redirect /csp/docbook/ http://docs.intersystems.com/iris20201/csp/docbook/ [変更後]Redirect /csp/docbook/ https://docs.intersystems.com/iris20201/csp/docbookj/ 【IRIS for Health】[変更前]Redirect /csp/docbook/ http://docs.intersystems.com/irisforhealth20201/csp/docbook/[変更後]Redirect /csp/docbook/ https://docs.intersystems.com/irisforhealth20201/csp/docbookj/ この変更でランチャーからクリックするドキュメント、メモリ詳細設定ページにある「ヘルプ」のリンクはIRIS日本語ドキュメントを表示するようになります。※設定ファイルの変更を有効にするには、IRISの再起動が必要です。 また、最新の日本語ドキュメントは、以下のリンクより参照できます。https://docs.intersystems.com/irislatest/csp/docbookj/DocBook.UI.Page.cls現在公開中のドキュメントのリストは、以下をご参照ください。https://www.intersystems.com/jp/jp_document ※日本語ドキュメントは、英語ドキュメントを日本語訳したもので、同バージョンの英語ドキュメントより遅れて公開されます。よって、タイミングにより、英語ドキュメントと日本語ドキュメントの内容に差異が生じる場合がございます。ご了承ください。