検索

クリアフィルター
記事
Mihoko Iijima · 2022年12月7日

ObjectScript クックブック

開発者の皆さん、こんにちは! InterSystems全製品のサーバ側コードで利用できる「ObjectScript」の基本の使い方から、困ったときのヒント集、エラーの読み方など、日本語ドキュメントの逆引きになるようなページを目指して、「ObjectScriptクックブック」を作成しました! - ObjectScriptの基本の「き」 Hello Worldの出力から始めたい方に最適です。 - CookBook(こんなときどうする?集) ObjectScriptの記述に困ったときに読んでいただけるヒント集です。コミュニティに寄せられたご質問をどんどん掲載していきます。 - ObjectScriptでエラーが発生したら ObjectScriptのプログラムでエラーが発生したときのエラーメッセージの読み方から、エラー情報の取得方法などを解説しています。 各ページの をクリックすると項目に移動できたり、項目の絞り込みが行えます。 CookBook(こんなときどうする?集)については、皆様より寄せられるご質問やより良い方法など、どんどん追加していこうと思います。 開発者の皆さんに共有したい使い方や、ご質問などありましたらぜひコミュニティへ投稿してください!
記事
Toshihiko Minamoto · 2023年1月29日

インターシステムズ認定プログラムを開発者コミュニティのプロファイルに追加する方法

開発者コミュニティの皆さんこんにちは。 インターシステムズの認定プログラムに合格された方の中には、プロフィールのアバターに緑色の目印を付けたい方や、開発者コミュニティのプロフィールに全ての認定証を掲載し、他の人に知ってもらいたいと考えている方もいらっしゃると思います。 そこで、DC プロフィールに認定証を追加するために実行する3 つの簡単な手順をステップを紹介します。 1️⃣ 開発者コミュニティのプロファイルに移動します。 2️⃣ InterSystems certifications (インターシステムズ認証)セクションに移動します。 3️⃣ Load my certification(s) ボタンをクリックします。 以上です! システムは、開発者コミュニティの電子メールを使用してCredlyにリクエストを送信します。証明書が同じメールにリンクされている場合、証明書は自動的に読み込まれます。 読み込まれない場合は、ページに記述された手順に従って操作してください。 これで完了です。認定証が追加され、誰もが見れるようになりました!
お知らせ
Seisuke Nakahashi · 2023年5月8日

早期アクセスプログラム (EAP) のご紹介

インターシステムズは現在、早期アクセスプログラム (EAP) に非常に注力しています。このプログラムは、私たちの製品がリリースされる前に、ユーザのみなさまにボランティアとして関わっていただくものです。次のグローバルサミットにおいても、あらためてプログラムを紹介させていただきます。 関わっていただくソフトウェアは、InterSystems IRIS 製品そのものの場合もありますが、たいていは、私たちがユーザ様の意見をいただきたい新機能に絞った単体ソフトウェアになります。 早期アクセスプログラムの参加利用規約は、評価いただくソフトウェアごとに変わります。 プログラムに参加いただく方法はとても簡単です。こちらのリンク(英語)から、フォームに必要事項をご記入ください。 EAPに関する最新情報を入手されたいみなさまは、このページ をブックマークいただくか、このハッシュタグ を開発者コミュニティでフォローしてください。 より詳細な情報が必要な方は、このページでご質問いただくか、 EarlyAccess@InterSystems.com までメールをお送りください。
記事
Mihoko Iijima · 2023年6月13日

プロダクションをリセットする方法、インバウンドアダプタが持つ情報をリセットする方法

これは InterSystems FAQ サイトの記事です。 注意:本番環境では実行しないでください。テスト環境でご利用ください。 開発時にプロダクションに残っているキューを一括でクリアしたり、プロダクションに関連した一次的な情報をすべて消去したい場合、以下メソッドを利用して実行中のプロダクション情報をリセットできます。 set $namespace="プロダクションのあるネームスペース名指定" do ##class(Ens.Director).CleanProduction() ドキュメント:ネームスペースでのプロダクションのリセット プロダクション全体ではなく、一部コンポーネントの実行中データをリセットする場合は、アダプタの ClearAllAppData() を使用します。引数にはプロダクションに登録している構成名を指定してください。 例)SQLインバウンドアダプタが保持している永続値をリセットする do ##class(EnsLib.SQL.InboundAdapter).ClearAllAppData("構成名称") ドキュメント:受信アダプタで以前に処理された行のリセット 例)FTPインバウンドアダプタが処理したファイルの情報をリセットする do ##class(EnsLib.FTP.InboundAdapter).ClearAllAppData("構成名称")
記事
Mihoko Iijima · 2023年5月30日

Embedded Pythonから%SYSTEMパッケージ以下クラスを呼び出す方法

これは InterSystems FAQ サイトの記事です。 %SYSTEMパッケージには沢山の便利なシステムクラスがあり、Embedded Pythonでも一般クラスと同様に%SYSTEMパッケージ以下クラスを操作できます(iris.cls("クラス名").メソッド名()で呼び出せます)。 ObjectScriptでは、$SYSTEM特殊変数を利用して、%SYSTEMパッケージ以下クラスのメソッドを呼び出すことができますが、Embedded Pythonでは、iris.system を利用して実行することができます。 以下実行例をご紹介します。 現在のネームスペースを取得する 一般クラスと同じ呼び出し方の例 iris.cls("%SYSTEM.SYS").NameSpace() iris.systemを利用する例 iris.system.SYS.NameSpace() binディレクトリのパスを返す 一般クラスと同じ呼び出し方の例 iris.cls("%SYSTEM.Util").BinaryDirectory() iris.systemを利用する例 iris.system.Util.BinaryDirectory() SQL関連をまとめたSQLクラスの例は以下の通りです。 YYYY-MM-DDから$horolog形式の日付を返す 一般クラスと同じ呼び出し方の例 iris.cls("%SYSTEM.SQL").DATE("1999-01-01") iris.systemを利用する例 iris.system.SQL.DATE("1999-01-01") ※ 現時点(2023/5/1)では、%SYSTEM.SQLクラス以下メソッドの多くは deprecated であるため、%SYSTEM.SQL.Functionsや%SYSTEM.SQL.UtilなどSQLパッケージ以下にあるクラスメソッドへの切り替えを推奨していますが、現時点のEmbedded Pythonでは、%SYSTEM.SQLクラスにあるメソッドをご利用ください。
記事
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() ​
記事
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製品のプロセスが使用するメモリ量を教えてください。 ローカル変数は最大どのくらいまで使うことができるのか
記事
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に置き換えることにします。貢献していただけるのであれば、大感謝です。    
記事
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) がローカルにインストールされている場合にのみ、設定します。
記事
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 ※日本語ドキュメントは、英語ドキュメントを日本語訳したもので、同バージョンの英語ドキュメントより遅れて公開されます。よって、タイミングにより、英語ドキュメントと日本語ドキュメントの内容に差異が生じる場合がございます。ご了承ください。
記事
Megumi Kakechi · 2020年11月13日

Interoperability管理データを削除(パージ)する方法

これは InterSystems FAQ サイトの記事です。 管理ポータルから行う手動のパージ(Purge)と、タスクを利用する方法があります。 データを手動でパージするには、[Interoperability] > [管理] > [管理データの削除] ページを使用します。(このページではバックグラウンド・ジョブとしてパージを実行しますので、ページがタイムアウトしても問題ありません。) タスクでパージする場合は、[システムオペレーション] > [タスクマネージャ] > [新しいタスク] の画面でInteroperabilityプロダクションのネームスペースを指定し、タスクタイプに「Ens.Util.Tasks.Purge」を指定します。 タスクの場合は、「TypesToPurge」の項目で以下のパージ対象タイプを選択できます(図参照)。 イベント・ログ (Events) メッセージ (Messages) ビジネス・プロセス・ログ (Business Processes) ビジネス・ルール・ログ (Rule Logs) I/O アーカイブ・ログ (I/O Logs) モニター・カウンター (Host Monitor Data) 管理対象アラート (Managed Alerts) 詳細は、以下のドキュメントをご参照ください。 プロダクション・データのパージ【IRIS】 ※注意 2022.1以降のバージョンでは、プロダクションの管理データを削除するためには、新しい特権 "%Ens_PurgeSchedule:USE" リソースが必要となりました。このリソースは "%EnsRole_Administrator" ロールで付与されます。また、カスタムロールに追加することも可能です。 詳細は、こちらのドキュメント をご覧ください。
記事
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の使用例について