クリアフィルター
お知らせ
Makiko Kokubun · 2021年1月28日
開発者のみなさん、こんにちは!
インターシステムズは、2/16(火)~ 2/18日(木)の3日間にかけて、オンラインカンファレンス「InterSystems Japan Virtual Summit 2021」を開催致します。
⚡️ 現在、事前登録受付中です! ⚡️
テーマは「データプラットフォーム最前線 ニューノーマル時代に求められるアジリティとレジリエンス」です。InterSystems IRIS 、IRIS for Health の最新技術情報を多くのセッションを通してお届け致します。ぜひご参加ください。*本セミナーは日本語での開催となります。
InterSystems Japan Virtual Summit 2021
DAY1 2/16(火)10:00-11:40
基調講演:適応力と柔軟性を高めるデータプラットフォームの最新情報について
DAY2 2/17(水)15:00-17:30
先進データテクノロジーセッション:既にインターシステムズ製品をお使いの方向けに、IRISへのマイグレーションやパフォーマンスについての技術セッション
HL7® FHIR® によるインターオペラビリティセッション: FHIR の概要や最新情報と、IRIS for Healthでの医療データ共有、最新機能について
DAY3 2/18(木)15:00-17:15
先進データテクノロジーセッション :Python、Kubernetes など、最新技術を活用した IRIS の運用と開発、IntegratedMLなどIRISの最新機能について
昨年行われた「InterSysetms Virtual Summit 2020」の技術セッションもオンデマンドで公開します(字幕付き)。
開催形式:オンライン配信
参加費:無料(事前登録制)
詳細・申込Webはこちらから
3日間で数多くの技術コンテンツをお届けいたします。ぜひご参加ください!
記事
Toshihiko Minamoto · 2020年12月25日
InterSystems は自社が提供する InterSystems IRIS の Dockerイメージについて、Linux 環境での使用のみをサポートしています。 Docker for Windows は Linux プラットフォームのようにコンテナをネイティブプロセスとして実行するのではなく、Windows の仮想化機能である Hyper-V で実行される Linux VM を作成してコンテナをホストします。 このような追加レイヤーによって複雑度が増しているため、InterSystems は現時点で Docker for Windows をサポートすることができません。
ただし、テストやその他の特殊な目的のために InterSystems の IRIS ベースのコンテナを Docker for Windows 環境で実行する必要があることは私たちも理解しています。 この記事では、InterSystems が提供するコンテナイメージの使用に関して InterSystems が認識している Docker for Windows と Docker for Linux の違いについて説明します。 その他にも予期しない問題が発生する可能性はあります。 Windows プラットフォームで InterSystems IRIS のイメージとコンテナを使用する場合は、参考のために [Docker ドキュメント](https://docs.docker.com/)(特に「[Getting started with Docker for Windows](https://docs.docker.com/docker-for-windows/)」)にアクセスできることを確認してください。
Docker for Windows 環境のコンテナで外部永続ストレージを操作する場合は、Windows および Linux のファイルシステムとファイル操作の両方が関係してくるため、ここでは主にストレージに関係する違いを説明しています。
InterSystems が提供するイメージを使用して InterSystems IRIS を Docker コンテナで実行する場合の一般的な情報については、「[Running InterSystems IRIS in Docker Containers](http://docs.intersystems.com/iris201811/csp/docbook/DocBook.UI.Page.cls?KEY=ADOCK)」と「[First Look: InterSystems IRIS in Docker Containers](http://docs.intersystems.com/iris201811/csp/docbook/DocBook.UI.Page.cls?KEY=AFL_containers)」を参照してください。
### ディスクドライブを共有する
Windows では Docker が存在するディスクドライブを共有し、Docker に操作対象となるすべてのストレージへのアクセスを許可する必要があります。 1 台以上のドライブを共有するには、次の手順に従ってください(この手順は前の項目の手順と組み合わせることができます)。
1. システムトレイの Docker アイコンを右クリックし、[**Settings ...**] を選択します。
2. [**Shared Drives**] タブを選択し、ストレージが配置されているドライブを選択してから [**Apply**] をクリックします。 ドライブがすでに選択されている場合は(デフォルトでは C ドライブが選択されています)、チェックボックスをオフにして [**Apply**] をクリックし、ドライブを選択してから [**Apply**] をもう一度クリックします。
3. プロンプトが表示されたら、ログイン資格情報を入力します。
4. 変更を適用すると、Docker が自動的に再起動します。再起動しなかった場合はシステムトレイの Docker アイコンを右クリックし、[**Restart**] を選択します。
### コンテナ内で外部ファイルをコピーする
Docker を使用する場合は、一般的には外部ファイルシステム内のディレクトリをコンテナ内のボリュームとしてマウントし、それをコンテナ内のソフトウェアが必要とするすべての外部ファイル用の場所として使用するのが便利です。 例えば、あるボリュームをマウントし、**iris-main** プログラムの **--key** オプションとパスワード変更スクリプトがそれぞれアクセスする外部ディレクトリにある InterSystems IRIS のライセンスキー(**iris.key**)や所定の InterSystems IRIS のパスワードを含むファイルを配置できます(「_Running InterSystems IRIS in Containers_」の「[The iris-main Program](docs.intersystems.com/iris201811/csp/docbook/DocBook.UI.Page.cls?KEY=ADOCK#ADOCK_iris_iscmain)」と「[Changing the InterSystems IRIS Password](docs.intersystems.com/iris201811/csp/docbook/DocBook.UI.Page.cls?KEY=ADOCK#ADOCK_iris_images_password)」を参照してください)。 ただし、Docker for Windowsではファイル操作とアクセス許可の違いにより、マウントされた外部ボリューム上のファイルがコンテナ内のプログラムによって適切に使用されない場合があります。 多くの場合はプログラムでコンテナ内のファイルをコピーしてからそのコピーを使用することで、アクセス許可の問題を解決できます。
例えば、**iris-main --before **オプションはコンテナ内の InterSystems IRIS インスタンスのパスワードを変更するためによく使用されます。以下に例を示します。
--before "changePassword.sh /external/password.txt"
この方法を使っても Windows で意図したとおりにパスワードを変更できない場合は、以下を試してください。
--before "cp /external/password.txt /external/password_copied.txt && \changePassword.sh /external/password_copied.txt"
### 名前付きボリュームを使用する
動的に変更されるファイルが多数存在する場合、個別にマウントしてすべてのファイルをコピーできたとしても、コンテナ内に Windows ファイルシステムを直接マウントすると問題が発生する可能性があります。 InterSystems IRIS の場合、これは特にインスタンス固有データを永続的に保管するための Durable %SYS 機能(「Running InterSystems IRIS in Containers」の「Durable %SYS for Persistent Instance Data」を参照してください)とジャーナルファイルの保管の両方に当てはまります。 この問題は名前付きボリュームをマウントすることで解決できます。名前付きボリュームは、システム上のコンテナをホストしている Linux VM のファイルシステムにマウントポイントを持つストレージボリュームです。 VM はファイルシステムベースであるため、このようなボリュームの内容は Docker やシステムがダウンした場合でも VM の他の部分と一緒に Windows ディスクに保存されます。
例えば InterSystems IRIS コンテナを実行中に Durable %SYS を有効化する場合、一般的には外部ボリュームをマウントし、**--env** オプションを使用して **ISC\_DATA\_DIRECTORY** 環境変数をそのボリュームの場所に設定します。以下に例を示します。
docker run ... \--volume /nethome/pmartinez/iris_external:/external \--env ISC_DATA_DIRECTORY=/external/durable/
この方法は Docker for Windows では使えません。代わりに、docker volume create コマンドで名前付きボリュームを作成し、Durable %SYS ディレクトリをそこに配置する必要があります。 また、Linux とは異なり、ISC_DATA_DIRECTORY には最上位の Durable %SYS ディレクトリである /irissys を指定する必要があります。 したがって、Windows では次のようなオプションになります。
docker volume create durabledocker run ... \--volume durable:/durable \--env ISC_DATA_DIRECTORY=/durable/irissys/
インスタンスのジャーナルファイルにこの方法を使用するには、上記の Durable %SYS の例と同じように名前付きボリュームを作成してマウントし、任意の構成方法(**^JOURNAL** ルーチン、管理ポータルの [Journal Settings] ページ、または **iris.cpf** ファイル)を使用して現在および代替のジャーナルディレクトリを名前付きボリュームの場所に設定します。 現在のジャーナルディレクトリと代替のジャーナルディレクトリを分離するには、それぞれに対応する名前付きボリュームを作成してマウントする必要があります (この方法は_**十分に検証されておらず**_、ジャーナルファイルが危険にさらされる可能性がありますのでご注意ください)。
VM 内の名前付きボリュームにある Linux ファイルシステムのマウントポイントを検出するには、次のように **docker volume inspect** コマンドを使用します。
docker volume inspect durable_data[ { "CreatedAt": "2018-05-04T12:11:54Z", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/durable_data/_data", "Name": "durable_data", "Options": null, "Scope": "local" }]
### コマンドの比較
上記の内容をすべて考慮し、「_First Look: InterSystems IRIS in Docker Containers_」の「[Run and Investigate the InterSystems IRIS-based Container](docs.intersystems.com/iris201811/csp/docbook/DocBook.UI.Page.cls?KEY=AFL_containers#AFL_containers_deploy_run2)」に記載されている Linux プラットフォームでの実行を想定した最終的な **docker run** コマンドと Docker for Windows を使用した同等の **docker run** コマンドを比較すると次のようになります。
#### Linux
$ docker run --name iris3 --detach --publish 52773:52773 \ --volume /nethome/pmartinez/iris_external:/external \ --env ISC_DATA_DIRECTORY=/external/durable \ --env ICM_SENTINEL_DIR=/external iris3:test --key /external/iris.key \ --before "changePassword.sh /external/password.txt"
#### Windows
C:\Users\pmartinez>docker volume create durableC:\Users\pmartinez>docker volume create journalsC:\Users\pmartinez>docker run --name iris3 --detach --publish 52773:52773 \--volume durable:/durable\--volume journals:/journals--env ISC_DATA_DIRECTORY=/durable/irissys \--env ICM_SENTINEL_DIR=/durable iris3:test --key /external/iris.key \--before "cp /external/password.txt /external/password_copied.txt && \changePassword.sh /durable/password_copied.txt"
Docker for Windows での InterSystems 提供コンテナの使用に関する情報をご提供可能な方は、こちらにコメントを追加するか、記事の投稿をお願いします!
記事
Toshihiko Minamoto · 2021年1月26日
2019年 10月 17日
Anton UmnikovInterSystems シニアクラウドソリューションアーキテクトAWS CSAA、GCP CACE
[AWS Glue](https://aws.amazon.com/glue/) は、完全に管理された ETL (抽出、変換、読み込み) サービスです。データの分類、クリーンアップ、強化、そして様々なデータストア間でデータを確実に移動させるという作業を簡単にかつコスト効率の良いかたちで行えるようにするものです。
InterSystems IRIS の場合、AWS Glue を使用すれば、大規模なデータをクラウドとオンプレミスのデータソースの両方から IRIS に移動させることができます。 ここで考えられるデータソースは、オンプレミスのデータベース、CSV、JSON、S3 バケットに保管されている Parquet ファイルならびに Avro ファイル、AWS Redshift や Aurora といったクラウドネイティブのデータベースを含みますが、これらに限定されません。
本記事では、読者の皆さんが、AWS Glue について少なくとも [AWS Glue の入門チュートリアル](https://aws.amazon.com/glue/getting-started/) を完了している程度の基本的な知識をお持ちであるという前提で話を進めていきます。 InterSystems IRIS をデータターゲット、すなわち「データシンク」として使用するかたちで AWS Glue Jobs を設定する際の技術的な側面に着目します。
画像ソース
AWS Glue Jobs は「サーバーレス」で実行されます。 ジョブの実行に必要なリソースはすべて、ジョブが実際に実行されている間だけ AWS により動的にプロビジョニングされ、ジョブが完了すると同時に破棄されます。つまり、必要なインフラストラクチャにかかる継続的なコストをプロビジョニングしたり、管理したり、負担したりすることが不要であり、ジョブが実際に実行されている間だけ請求が発生するため、ジョブのコードを書くことだけに労力を費やすことができます。 「アイドル」時間中は、S3 バケット、ジョブコードの保管、および設定に使用される以外のリソースが消費されることはありません。
通常、Glue Job は動的にプロビジョニングされる Apache Spark で実行され、また PySpark コードで記述されますが、選択肢は他にも複数存在します。 Glue Job は、データがデータソースから抽出される _ _the _"Extract"_、Glue API を使ってビルドされる一連の _"Transformations"_、そして最後に最終変換データがターゲットシステムに書き込まれる _"Load"_ または _「シンク」_の各部分で構成されます。
AWS Glue が IRIS と対話できるようにするには、以下を確認する必要があります。
* Glue から関連する IRIS インスタンスへのネットワークアクセスが確立されている
* Glue Job は IRIS JDBC ドライバーの JAR ファイルにアクセスできる
* Glue Job は InterSystems IRIS JDBC と互換性のある API を使用している
それでは、必要な各ステップを詳しく見ていきましょう。
## IRIS との接続を確立する
AWS コンソールで、AWS Glue->Connections->Add Connection、と順に選択します。
接続名を入力し、Connection Type に「JDBC」を選択します。
JDBC の URL 欄に、IRIS インスタンスの JDBC 接続文字列、ユーザー名、パスワードを入力します。
次のステップは非常に大切で、_**Glue がそのエンドポイントを IRIS インスタンスと同じ VPC に配置することを確認する必要があります。**_IRIS インスタンスの VPC と Subnet を選択します。 すべての TCP ポートにおいて自己参照する受信規則が設定されたセキュリティグループであれば、どれでも使用できます。 (IRIS インスタンスのセキュリティグループなど)
## JDBC ドライバーへのアクセス権を持つ IAM ロール
まだ行っていない場合は、S3 バケットに IRIS JDBC ドライバーの JAR ファイル「intersystems-jdbc-3.0.0.jar」をアップロードしてください。 この例では、s3://irisdistr バケットを使用しています。 アカウントによって異なると思います。
_**そのファイルにアクセスできる (Glue Job の) IAM ロール**_を Glue がスクリプトやログなどを保管するのに使用する別の S3 バケットと一緒に作成する必要があります。
それが JDBC ドライバーのバケットに対して読み取りアクセスを持っていることを確認してください。 今回は、このロール (GlueJobRole) と事前定義されている AWSGlueServiceRole にすべてのバケットへの読み取り専用アクセスを与えています。 このロールのアクセス権限はさらに制限することができます。
## Glue Job の作成と設定
新規 Glue Job を作成します。 先ほどのステップで作成した IAM ロールを選択します。 それ以外はすべてデフォルトのままにします。
「Security configuration, script libraries, and job parameters (optional)」で、「Dependent jars path」を S3 バケット内にある intersystems-jdbc-3.0.0.jar の場所に設定します。
ソースには、既存のデータソースの 1 つを使用します。 先ほど触れたチュートリアルの内容を実行された方は、少なくとも 1 つはお持ちのはずです。
「Create tables in your data target」オプションを使い、前のステップで作成した IRIS への接続を選択します。 それ以外はすべてデフォルトのままにします。
ここまでの手順を正しく行っていれば、下のような画面が表示されるはずです。
もう少しです! IRIS にデータを読み込むには、スクリプトに小さな変更を 1 つだけ加える必要があります。
## スクリプトの調整
Glue が生成したスクリプトには、Spark を対象とした AWS の専用拡張機能 [AWS Glue Dynamic Frame](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-extensions-dynamic-frame.html) が使用されています。 ETL ジョブにいくつかのメリットがあるほか、AWS がマネージドサービスオファリングを提供していないデータベースにはデータが書き込まれないようにしてくれます。
ここで良いお知らせです。データベースにデータを書き込む時点では、「ダ―ディ」なデータに対してスキーマを強制しないなど、Dynamic Dataframe が提供する利点はすべて不要となりました (データを書き込む段階でデータは「クリーン」と判断されるため)。また、Dynamic Dataframe を AWS に管理されるターゲットだけでなく IRIS にも対応できる Spark のネイティブ Dataframe に変換するという作業も簡単に行えます。
変更が必要な行は、上の画像で示す40行目です。 最終行の 1 つ前の行です。
以下のように変更する必要があります。
#datasink4 = glueContext.write_dynamic_frame.from_jdbc_conf(frame = dropnullfields3, catalog_connection = "IRIS1", connection_options = {"dbtable": "elb_logs", "database": "USER"}, transformation_ctx = "datasink4")
dropnullfields3.toDF().write \
.format("jdbc") \
.option("url", "jdbc:IRIS://172.30.0.196:51773/USER/") \
.option("dbtable", "orders") \
.option("user", irisUsername) \
.option("password", irisPassword) \
.option("isolationlevel","NONE") \
.save()
irisUsername と irisPassword には、IRIS JDBC への接続に使うユーザー名とパスワードが入ります。
_**注意:** パスワードは絶対にソースコードに保管してはいけません!! [AWS Secrets Manager](https://aws.amazon.com/secrets-manager) などのツールを使用することをおすすめしますが、本記事でセキュリティの詳細をそこまで深く掘り下げるのは、割愛させていただきます。 AWS Glue における AWS Secrets Manager の使用法については、こちらの[記事](https://aws.amazon.com/blogs/big-data/use-aws-glue-to-run-etl-jobs-against-non-native-jdbc-data-sources/)をおすすめします。_
「Run Job」ボタンをクリックした後は、AWS Glue が ETL を実行してくれるのでリラックスしてお待ちください。
まあ最初はエラーがいくつか出ると思いますが... 珍しいことではないと思います。 入力ミスがあったり、セキュリティグループのポートが間違っていたり... AWS Glue は CloudWatch を使って、すべての実行データやエラーログを保存します。 問題の原因については、ロググループ _/aws-glue/jobs/error_ と _ /aws-glue/jobs/output_ を参照してください。
クラウドで ETL をお楽しみください!
-Anton
記事
Toshihiko Minamoto · 2021年2月4日
開発者の皆さん、こんにちは!
InterSystems ObjectScript でライブラリやツール、パッケージなどを開発していると、「このパッケージはどうすればターゲットマシンに展開できるのか?」という疑問がよく浮かびます。
また、私たちは、既に別のライブラリがインストールされていることを想定したり、その特定のバージョンのことを考慮したりしながらパッケージを開発しています。
JavaScript や Python などでコーディングを行うと、依存関係を管理しながらパッケージを展開するのに [パッケージ管理システム](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0) が必要になります。
これを踏まえ、 [InterSystems ObjectScript Package Manager](https://openexchange.intersystems.com/package/ObjectScript-Package-Manager-2) のリリースを発表したいと思います!
**注意!**
**免責事項**
**pm.community.intersystems.com にある InterSystems ObjectScript Package Manager サーバー、および pm.community.intersystems.com または [Github](https://github.com/intersystems-community/zpm) からインストール可能な InterSystems ObjectScript Package Manager クライアントは、インターシステムズではサポートされておらず、MIT ライセンスに従い現状有姿の状態で表示されます。 このツールの使用や開発、このツールに対する貢献は自己責任とさせていただきます。**
**どのような仕組みか?**
InterSystems ObjectScript Package Manager は、2 つの部分で構成されています。 Package Manager サーバーは、ObjectScript パッケージをホストし、ZPM クライアントがパッケージを展開、一覧表示できるよう API を 開示します。 現在、 [pm.community.intersystems.com](http://pm.community.intersystems.com) より Developers Community Package Manager サーバーをご使用いただけます。
IRIS システムにインストールした ZPM クライアントを使用すれば、どのようなパッケージでも InterSystems IRIS にインストールできます。
**InterSystems Package Manager の使用方法とは?**
1. 使用可能なパッケージの一覧を確認する
https://pm.community.intersystems.com/packages/-/all を開き、現在使用可能なパッケージの一覧を確認します。
[{"name":"analyzethis","versions":["1.1.1"]},{"name":"deepseebuttons","versions":["0.1.7"]},{"name":"dsw","versions":["2.1.35"]},{"name":"holefoods","versions":["0.1.0"]},{"name":"isc-dev","versions":["1.2.0"]},{"name":"mdx2json","versions":["2.2.0"]},{"name":"objectscript","versions":["1.0.0"]},{"name":"pivotsubscriptions","versions":["0.0.3"]},{"name":"restforms","versions":["1.6.1"]},{"name":"thirdpartychartportlets","versions":["0.0.1"]},{"name":"webterminal","versions":["4.8.3"]},{"name":"zpm","versions":["0.0.6"]}]
各パッケージには、それぞれ名前とバージョンがあります。
InterSystems IRIS にパッケージをインストールするには、最初に InterSystems ObjectScript Package Manager クライアント (別名 ZPM クライアント) をインストールする必要があります。
**2. Package Manager クライアントをインストールする**
ZPM サーバーから ZPM クライアントの最新リリースを取得します
https://pm.community.intersystems.com/packages/zpm/latest/installer
これは XML の ObjectScript パッケージなので、Management Portal を使ってクラスにインポートするか、以下のコマンドを実行すればインストールできます。
USER>Do $System.OBJ.Load("/yourpath/zpm.xml","ck")
ZPM クライアントは %SYS に Z パッケージとしてインストールされるので、インストールが完了した後はどのネームスペースからでも呼び出すことができます。
**3. ZPM クライアントの操作**
ZPM クライアントには CLI インターフェースがあります。 ZPM は以下のようにどのネームスペースでも呼び出せます。
USER>zpm
zpm: USER>
使用可能なコマンドの完全な一覧は、ヘルプを呼び出してください。
現在使用可能なパッケージの一覧は ZPM サーバーでご確認ください (pm.community.intersystems.com)
zpm: USER>repo -list-modules -n registry
deepseebuttons 0.1.7 dsw 2.1.35 holefoods 0.1.0 isc-dev 1.2.0 mdx2json 2.2.0 objectscript 1.0.0 pivotsubscriptions 0.0.3 restforms 1.6.1 thirdpartychartportlets 0.0.1 webterminal 4.8.3 zpm 0.0.6
**パッケージをインストールする**
パッケージをインストールするには、以下のコマンドを実行します
install package-name version
これでパッケージとすべての依存関係が一緒にインストールされます。 「version」を省けば、最新のパッケージを取得できます。 ウェブターミナルの最新バージョンは、以下のコマンドでインストールします。
zpm: USER> install webterminal
**既にインストールされているものを確認する方法**
「list」コマンドを呼び出します
zpm:USER> list
zpm 0.0.6
webterminal 4.8.3
**パッケージをアンインストールするコマンド**
zpm: USER> uninstall webterminal
**サポートされている InterSystems のデータプラットフォーム**
現在、ZPM は InterSystems IRIS と InterSystems IRIS for Health をサポートしています。
**自分のパッケージを Package Manager の一覧に載せたい**
可能です。 要件は以下のとおりです。
* InterSystems IRIS で実行できるコードを使っている
* ルートディレクトリに module.xml がある。
Module.xml は、パッケージの構造を示すファイルで、デプロイ段階でセットアップされる必要があります。 module.xml の例はいたって単純です。
[ObjectScript の例](https://github.com/evshvarov/objectscript/blob/master/module.xml)
比較的シンプルな例:
[Samples BI](https://github.com/isc-zpm/Samples-BI/blob/master/module.xml) (以前の HoleFoods)
ウェブターミナル
**依存関係のあるモジュール**
DeepSee Web は MDX2JSON がインストールされていることを前提とします。その時のmodule.xml に記載されている内容はこちらをご覧ください:
[DeepSeeWeb](https://github.com/isc-zpm/DeepSeeWeb/blob/master/module.xml)
ご自身のアプリケーションが Community Package Manager の一覧に記載されることをご希望の方は、この記事にコメントしていただくか、私まで直接ご連絡ください。
**コラボレーションとサポート**
ZPM サーバーのソースコードは現時点では使用いただけませんが、近々ご用意いたします。
ZPM クライアントのソースコードは [こちら](https://github.com/intersystems-community/zpm) からご使用いただけます。また、現在同ソースコードは、InterSystems開発者コミュニティでサポートされていますが、インターシステムズではサポートされていません。 [問題](https://github.com/intersystems-community/zpm/issues)や[プルリクエスト](https://github.com/intersystems-community/zpm/pulls)があれば、お気軽に送信してください。
**ロードマップ**
現在のロードマップは以下のとおりです。
* Open Exchange のサポートを導入する
* パッケージの更新とアップロードを自動化するオートメーションを導入する
* ZPM サーバーをオープンソースとして提供する
今後も最新情報にご期待ください。InterSystems IRIS で InterSystems ObjectScript パッケージを開発しましょう!
記事
Mihoko Iijima · 2021年5月7日
開発者の皆さん、こんにちは!
この記事では、Java から IRIS へ接続する方法の中から XEP(ゼップ)を利用して、GPS (GPX)データを高速に取り込むサンプルをご紹介します。
Java の実行環境や IRIS がお手元になくても大丈夫です!コンテナ 🐳 のビルド+開始で体験できる「実行環境テンプレート」をご用意しました。
ソースコードは コミュニティの Git で公開 していますので、docker、docker-compose 、git がインストールされた環境であれば、すぐにお試しいただけます(Javaの実行環境はコンテナでご提供するので準備不要です)。
操作方法は、Gitの README に記載しています。ぜひお試しください。
この記事の中では、コード解説を追加しています。ぜひ、最後までお付き合いください!
1)処理概要
GPX データを IRIS へ渡す迄の流れにリアクティブプログラミングが行える RxJava2 のライブラリを使用しています。
メモ:サンプルコードの中では、GPS データを直接受信するのではなく、Google マイマップやサンプル GPS データから GPX ファイルに変換したデータを入力に使用しています。
実行時、複数(数十~千)の GPS データが含まれる GPX ファイルを引数に指定し情報を入力します。 XMLからリストを作成し、作成したリストを RxJava2 の Flowable に渡し、データのフィルタリングを行い、IRIS へデータを渡しています。
サンプルの GPX ファイルは、Google マイマップから作成しています。マイマップから作成した GPS には、残念ながら速度が含まれません。
弊社パートナーのビズベース様より、速度が含まれる GPS データをご提供いただきました(ファイル:Test-DriveData13.gpx.xml )。ビズベース様提供データ Test-DriveData13.gpx.xml を入力した場合は、0km/h より速いデータだけを処理するように記載しています。
1-1) Java から IRIS へ接続する方法
4 手法あります(サンプルでは、この中の 1 つを利用しています)。
SQLでアクセスする場合に便利な JDBC の利用
大量データを高速に登録したい場合に最適な XEP
キーバリュー形式でデータを設定/取得したい場合の Native API
Hibernate を利用する方法
サンプルは、2) 大量データを高速に登録したい場合に最適な XEP(ゼップ) を利用しています。
1-2) XEP について
XEP は、Javaで作成したオブジェクトを IRIS に永続化する際に使用する接続方法です(事前に IRIS 側でクラス/テーブルの作成は不要)。
データ登録までの流れは以下の通りです。
IRIS に永続化したいオブジェクトを Java クラスで用意
XEP を利用して IRIS に接続し、Java クラスのスキーマ情報を IRIS へ投影(Java クラスを分析し、スキーマをインポート)
永続化したい Java オブジェクを 1 つ以上作成し、Java の配列にセット
IRIS へ渡して永続化(store() メソッドを利用して登録)
XEPについて詳しくは、ドキュメントをご参照ください。
2) 実行環境テンプレートの使用方法
テンプレートはコンテナを利用しています。 Docker、docker-compose、git が利用できる環境でお試しください。
使用するコンテナのイメージ
データ登録後、ストリートビューで表示を確認できます。
URL: http://お使いのホスト:62774/csp/user/StreetView.html
ストリートビューの正確な表示には、GoogleのAPIキーが必要となります。
APIキーを入手されたら、Git clone 後、./IRIS/web 以下にある apikey.txt に API キーを保存してから IRIS 用コンテナのビルドを行ってください(ビルド時に、apikey.txt の中身を反映しながらコンテナを作成しています。記載がない場合はキー無しの状態でお試しいただけます)。
コンテナ開始までの手順詳細については、以下リンク先をご参照ください。
2-1) ダウンロード (git clone)
2-2) ストリートビューの表示をお試しいただくための準備
2-3) Java実行環境用コンテナを使う場合
3) Java の実行をホストで行う場合
3-1) Linuxの場合
3-2) Windows の場合
2-3) の手順例
サンプルコードについて
実行に使用している Start.java では、引数に渡される GPX ファイルから、リストを作成しています(リストの作成には GPXInput.java を使用)。
リストには、GPXInput クラスのインスタンスを登録しています。
GPXInput クラスのインスタンスには、GPX ファイルから取得した、緯度(lat)、経度(lon)、速度(speed)を設定しています。
Google マイマップで線を引いた GPS データは、速度が入ってこないため、速度データがある場合のみ speed にデータを設定しています。
(以下、GPXInput.java から一部抜粋)
public class GPXInput extends DefaultHandler {
Double lat;
Double lon;
Double speed;
Double heading;
//XMLから読み取った情報をListに格納
public static List<GPXInput> datalist = new ArrayList<GPXInput>();
GPXInput クラスのインスタンスが入ったリスト作成後、Start.java の中で、IRISに接続するために必要なインスタンスを作成しています(以下、抜粋して記載しています。IRISへの接続情報は、 Start.java の 12~16 行目をご参照ください)。
// XMLからGPXInputインスタンスを設定するリストを作成
List<GPXInput> datalist=GPXInput.GPXToList(Paths.get(args[0]).toFile().toString());
System.out.println("リストの個数=" + datalist.size());
// EventPersisterを利用してIRISへ接続し、スキーマ作成
EventPersister xepPersister = PersisterFactory.createPersister();
xepPersister.connect(host,port,namespace,username,password);
// 既存にクラスがある場合、テストデータのため全消去
String classname="JavaXEPSample.GPXInput";
xepPersister.deleteExtent(classname);
// フラットスキーマとしてインポート
xepPersister.importSchema(classname);
最後の行の xepPersister.importSchema(classname); では、Java クラスのインスタンスを永続化するため、Java クラス名(ここでは、JavaXEPSample.GPXInput)を引数に指定し、スキーマをインポートしています。
残りの処理は、作成したリストを IRIS へ渡し、永続化するだけです。
今回のサンプルでは、本物の GPS データが流れてくるわけではないのですが、そうなっても対応できるようにリアクティブプログラミングが行える RxJava2 のライブラリを使用しています。
サンプルでは、EmitData.java の中で記述しています。
EmitData.java では、最初に Java クラスのインスタンス永続化などに使用する「イベント」を作成しています。
イベントの作成は、 EventPersister から作成します(例文の xepPersister は、EventPersister のインスタンスで、EmitData.java の Start() 関数の第1引数で受け取っています)。
Event xepEvent = xepPersister.getEvent(Javaクラス名); //イベントを操作するインスタンスを作成しています
この後の永続化の処理ですが、GPS データ受信の度に1件ずつ永続化するか、全件まとめて永続化するか、タイミングを選択できます。
本物の GPS データを受信している場合は、通知(subscripbe()の第1引数)のタイミングが良いと思いますが、サンプルでは GPX ファイルからデータを一括で取得しているのもあるので、データ送付の完了通知(subscripbe()の第3引数)のタイミングで一括登録しています(XEP は 1件だけ/一括 のどちらでも登録できます)。
インスタンスの永続化を命令している行は、以下の1行です。
xepEvent.store(storedata);
ということで、処理全体は以下の通りです。
public class EmitData {
public static void Start(EventPersister xepPersister,List<GPXInput> datalist,String classname) throws InterruptedException{
// EventPersisterからEventを作成
Event xepEvent = xepPersister.getEvent(classname);
//フィルタされた値をためておくList
List<GPXInput> storelist = new ArrayList<GPXInput>();
Flowable.fromIterable(datalist)
.subscribeOn(Schedulers.io())
.filter(obj->(obj.speed == null) || ((obj.speed !=null)&&(obj.speed>0)))
.subscribe(
// データ通知時
// ** 1件ずつIRISへ登録することもできますが、対象全件一括登録を行うため一旦リストに格納しています **
obj -> {
storelist.add(obj);
System.out.println("onNext:" + obj.lat + "-" + obj.lon + "-" + obj.speed);
},
// 第2引数:エラー通知時
error -> System.out.println("エラー=" + error),
//第3引数:完了通知
() -> {
System.out.println("フィルタ後の個数: " + storelist.size());
GPXInput[] storedata = storelist.toArray(new GPXInput[storelist.size()]);
xepEvent.store(storedata);
System.out.println("データ登録完了!");
});
Thread.sleep(2000);
}
}
ここまでが、Java で行っている流れです。
サンプルでは、この他に IRIS に登録した GPS (緯度と経度)を REST で取得し、ストリートビューで確認できるようにもしています(IRIS 内に REST ディスパッチクラス を用意しています)。
IRIS で作成する REST サーバについてご興味ある方は、ぜひこちらの記事もご参照ください。
GPX に含まれる経度と緯度の情報だけでも、ストリートビューは表示できますが、視点の向きを安定させるため Java 実行後に IRIS に用意したルーチン(enrich.mac)を呼び出し、情報を追加しています。
(以下、一部抜粋)
calcdegree(x1,y1,x2,y2)
set rd=($ZPI/180)
set temp1=$zsin((x2-x1)*rd) if temp1=0 {return ""}
set temp2=$zcos(y1*rd) * $ztan(y2*rd)- $zsin(y1*rd)*$zcos((x2-x1)*rd)
set degree=90-($zarctan(temp2/temp1)*180/$ZPI)
if (x2-x1)>=0 {
set degree=90-($zarctan(temp2/temp1)*180/$ZPI)
}
else {
set degree=270-($zarctan(temp2/temp1)*180/$ZPI)
}
return degree
サンプルの GPX ファイルは、桜島、江の島、戸隠へ向かう道、有馬温泉へ向かう道、哲学の道、サグラダファミリア付近、ピラミッド付近、など用意しています。こんな時期ですので、ちょっとした 🚴 お散歩感覚 🚙 でストリートビューの表示をお楽しみいただけたらと思います。
最後までお付き合いいただきありがとうございました!
<参考にさせていただいたページ>
ストリートビューの表示:https://www.asobou.co.jp/blog/web/streetview
XMLの読み込み:https://engineer-club.jp/java-xml-read
お知らせ
Mihoko Iijima · 2021年8月23日
開発者の皆さん、こんにちは!
第1回 InterSystems 技術文書ライティングコンテスト が終了し、23 の素晴らしい記事🔥が掲載されました!
初開催の技術文書ライティングコンテストへご参加いただいた皆様、ありがとうございました!
この記事では、受賞作品をご紹介します!
第1回 InterSystems 技術文書ライティングコンテストの受賞者と記事は以下の通りです!
⭐️ エキスパートアワード – InterSystems のエキスパートが選出した記事:
🥇 1位: @Ron.Sweeney1582 さんが投稿した BILLIONS - Monetizing the InterSystems FHIR® Accelerator Service with Google Cloud's Apigee Edge
🥈 2位: @Yuri.Gomes さんが投稿した Learning Path for beginners
🥉 3位: @Yuri.Gomes さんが投稿した InterSystems IRIS REST Application Patterns
⭐️ コミュニティアワード – 開発者コミュニティメンバーからの「いいね!」が最も多かった記事:
🎉 Winner: @Henry.HamonPereira さんが投稿した Let's fight against the machines!
⭐️ 今回のコンテストに多くの記事を投稿してくださった開発者の皆さんをご紹介します!
@Nigel Salm: 3 articles 🤩
@Kurro Lopez: 3 articles 🤩
@Oliver Wilms: 3 articles 🤩
@Robert Cemper: 2 articles 🤩
@YURI MARX GOMES: 2 articles 🤩
WOW!この偉大な貢献をされた方々に 🎁 Nike Utility Speed Backpack 🎁をプレゼントいたします!
⭐️ 投稿してくださった開発者の皆さん、ありがとうございました! community.intersystems.com/contests/1:
@Robert Cemper
@Nigel Salm
@Henrique Dias
@Dmitry Maslennikov
@Kurro Lopez
@Herman Slagman
@Sergei Mihaylenko
@Iryna Mykhailova
@Oliver Wilms
@Julian Matthews
@Muhammad Waseem
@Crys
開発者コミュニティに素晴らしい記事を投稿いただき、ありがとうございました。
P.S. 賞品は現在制作中です。賞品の発送準備が整い次第、参加者の皆様にご連絡いたします。
第1回 技術文書ライティングコンテストは、開発者の皆様からの多くの記事の投稿により、素晴らしいコンテストになりました!
参加された皆様、記事の作成にご尽力いただきありがとうございました!
さて、次回開催は.....?
次の InterSystems 技術文書ライティングコンテストもご期待ください! 😉
お知らせ
Yoichi Miyashita · 2021年12月1日
InterSystems 製品のキットには Apache Web サーバが含まれています。これにより、お客様が外部Webサーバをインストールせずに Caché/IRIS 管理ポータルを動作させる為の便利な方法を提供しています。ただし、このWebサーバを実稼働インスタンスに使用しないでください。お客様は、システムに応じたニーズとセキュリティ/リスク要件に適合するWebサーバを別途インストールする必要があります。
最近のテストでは、現在含まれている Apache Web サーバにいくつかのセキュリティ問題があることがわかっていますが InterSystems が管理していないテクノロジである為、InterSystems は、Apache または別のサードパーティから直接取得した Web サーババージョンをインストールし、付属の Apache Webサーバ を無効にすることをお勧めします。InterSystems は、今後のリリースに Apache Web サーバの新しいバージョンを含める予定です。現在のバージョンと同様に、そのバージョンも本番インスタンスには使用できません。当社の製品の将来のリリースでは、InterSystems はWeb サーバを同梱またはインストールしません。計画の詳細については、今後、更新情報を提供する予定です。
お知らせ
Mihoko Iijima · 2021年12月27日
開発者の皆さん、こんにちは!
第2回 InterSystems 技術文書ライティングコンテストが終了し、多くの記事が掲載されました!
🌟 25 AMAZING ARTICLES 🌟
この記事では、受賞作品をご紹介します!
⭐️エキスパートアワード – InterSystems のエキスパートが選出した記事:
🥇 1位: Data anonymization, introducing iris-Disguise by @Henry.HamonPereira
🥈 2位: IntegratedML hands-on lab by @José.Pereira
🥉 3位は2名が受賞されました。
VSCode-ObjectScript on GitHub by @Dmitry.Maslennikov
Invite the FHIR® Accelerator Service to your Kubernetes Microservice Party by @Ron.Sweeney1582
⭐️ コミュニティアワード – 開発者コミュニティメンバーからの「いいね!」が最も多かった記事:
🏆 Data anonymization, introducing iris-Disguise by @Henry.HamonPereira
この当選が、当選者の皆様への素敵なクリスマスプレゼント🎁になることを願っています!
⭐️ 今回のコンテストに多くの記事を投稿してくださった開発者の皆さんをご紹介します!
@Yuri.Gomes: 4 記事を投稿されました!
@MikhailenkoSergey: 3 記事を投稿されました!
お二人には、Apple AirPods Pro または Amazon Kindle 8G Paperwhite または InterSystems IRIS Community Edition ARM がインストールされた Raspberry Pi 4 8GB がプレゼントされます!
投稿してくださった開発者の皆さん、ありがとうございました!👉 https://community.intersystems.com/contests/2
@Robert.Cemper1003
@Henrique.GonçalvesDias
@Muhammad.Waseem
@Rob.Tweed
@John.Murray
@alex.kosinets
@Irene.Mikhaylova
@Oliver.Wilms
@Rizmaan.Marikar2583
開発者コミュニティに素晴らしい記事を投稿いただき、ありがとうございました。
素敵な年末年始休暇をお過ごしください!🎅
なお、賞品は現在制作中です。発送の準備ができ次第、参加者の皆様にご連絡させていただきます。
記事
Toshihiko Minamoto · 2022年3月15日
これまでの記事では、メールサーバーのメールボックスからのメッセージを処理する IMAP プロトコルの基本的な使用方法を学習しました。 とても興味深いものではありましたが、他の人が作成してすぐに利用できるようにライブラリに提供されている実装を利用することも可能です。
IRIS データプラットフォームの改善の 1 つに、同じ IRIS プロセスで ObjectScript に並行して Python コードを記述できる機能があります。 この新機能は、[組み込み Python](https://community.intersystems.com/post/start-learning-about-embedded-python) と呼ばれます。 組み込み Python を使用すると、ObjectScript コードに巨大な [Python エコシステムのライブラリ](https://pypi.org/)の力を取り込むことができます。
この記事では、[imaplib](https://docs.python.org/3/library/imaplib.html) というライブラリを使用して IMAP クライアントを実装し、それを [IRIS Email フレームワーク](hhttps://jp.community.intersystems.com/node/512306) に統合することにします。 また、Python エコシステムの力を借りて、組み込み Python を使用して、IRIS プラットフォームでの実際の課題を解決する方法を示す実用的な例も確認します。
ここで実装されているすべてのコードは、こちらの GitHub [リポジトリ](https://github.com/jrpereirajr/iris-imap-inbound-adapter-demo)の [python ディレクトリ](https://github.com/jrpereirajr/iris-imap-inbound-adapter-demo/tree/main/src/dc/demo/imap/python)にあります。
Python コードは最近の IRIS バージョンでのみ機能することに注意してください。 この例で使用されているバージョンは、2021.1.0.215.3-zpm です。 組み込み Python に関する最新情報は、[こちら](https://jp.community.intersystems.com/tags/python)でフォローできます。
## 組み込み Python の使用
組み込み Python を使用するための鍵は、%SYS.Python クラスにあります。 このクラスを使用すると、次のことを行えます。
* Python ライブラリのインポート: `##class(%SYS.Python).Import(“package-name”)`
* ローカルシステムへの利用可能なカスタム Python モジュール(*.py ファイル)のインポート: `##class(%SYS.Python).Import(“module-file.py”)`
* 次のような、割り当てまたはパラメーターでの Python の組み込み型の使用:
* Python None オブジェクト: `##class(%SYS.Python).None()`
* Python True オブジェクト: `##class(%SYS.Python).True()`
* Python False オブジェクト: `##class(%SYS.Python).False()`
* ObjectScript 文字列から Python Bytes オブジェクト(8 ビット文字列)への変換: `##class(%SYS.Python).Bytes(“ObjectScript string”)`
これらのメソッドは、Python オブジェクトを作成し、ObjectScript オブジェクトを返すため、 その Python オブジェクトのプロパティとメソッドを直接 ObejctScript コードで使用することができます。
たとえば、secrets ライブラリを使ってパスワードを生成するために、この Python [レシピ](https://docs.python.org/ja/3/library/secrets.html#recipes-and-best-practices)をどのように実装できるか見てみましょう。
USER>Set string = ##class(%SYS.Python).Import("string")
USER>Set secrets = ##class(%SYS.Python).Import("secrets")
USER>ZWrite secrets // let's check what this object is...
secrets=1@%SYS.Python ; ;
USER>ZWrite string // same for this one...
string=2@%SYS.Python ; ;
USER>Set alphabet = string."ascii_letters" _ string.digits // here we are accessing Python properties from string object
USER>Set pwd = ""
USER>For i=1:1:8 { Set pwd = pwd _ secrets.choice(alphabet) }
USER>Write pwd
Qv7HuOPV
上記のコードでは、Python オブジェクトからいくつかのプロパティとメソッドを使用して、ObjectScript 変数を設定しています。 ObjectScript 変数は、Python オブジェクトメソッドのパラメーターとして使用します。
埋め込み Python を使用する上でのもう 1 つの重要なポイントは、魔法のメソッドと呼ばれることもある特有の属性とメソッドです。 [Python データモデル](https://docs.python.org/3/reference/datamodel.html)のすべてはオブジェクトであるため、これらの属性とメソッドは、Python インタープリターのインターフェースを提供します。 たとえば、次のように、[\_\_getitem\_\_](https://docs.python.org/ja/3/reference/datamodel.html#object.\_\_getitem\_\_) という特殊メソッドを使用し、アイテムのインデックスを使ってリストからアイテムを取得することができます。
USER>Set b = ##class(%SYS.Python).Import("builtins")
USER>Set list = b.list() // creates a Python list
USER>Do list.append(1)
USER>Do list.append(2)
USER>Do list.append(3)
USER>ZWrite list
list=4@%SYS.Python ; [1, 2, 3] ;
USER>w list."__getitem__"(0) // in Python, indexes are 0-based
1
USER>w list."__getitem__"(2)
3
同様に、リストの長さについても、\_\_len\_\_ 特殊メソッドを使用して取得することができます。
USER>Set listLen = list."__len__"()
USER>ZWrite listLen
listLen=3
これらを組み合わせて、ObjectScript を使用してリストを反復処理することができます。
USER>For i=0:1:(listLen - 1) { Write list."__getitem__"(i), ! }
1
2
3
None、True、False のような定数値を使用する必要がある場合は、%SYS.Python クラスから次のメソッドを使用することができます。
USER>Set none = ##class(%SYS.Python).None()
USER>Set true = ##class(%SYS.Python).True()
USER>Set false = ##class(%SYS.Python).False()
USER>ZWrite none, true, false
none=5@%SYS.Python ; None ;
true=6@%SYS.Python ; True ;
false=7@%SYS.Python ; False ;
同様に、ObjectScript 文字列を Python Bytes オブジェクトに変換することができます。
USER>Set bytes = ##class(%SYS.Python).Bytes("This is a string")
USER>ZWrite bytes
bytes=8@%SYS.Python ; b'This is a string' ;
最後に、カスタム Python モジュールを定義して、ObjectScript コンテキストにインポートします。
組み込み Python の使用方法に関するその他の便利なリソースは、[こちら](https://jp.community.intersystems.com/tags/python)をご覧ください。 たとえば、[Robert Cemper](https://community.intersystems.com/user/robert-cemper-0) の[例](https://community.intersystems.com/post/websocket-client-embedded-python)はお勧めです。
## 代替 IMAP クライアントの作成
imaplib を使用して IMAP クライアントを実装するには、通常の [ObjectScript](https://community.intersystems.com/post/implementing-imap-client-intersystems-iris-part-i) を使用します。 最初から IMAP プロトコルを実装する代わりに、メソッドを impalib メソッドでオーバーライドします。
まず、dc.demo.imap.python.IMAPPy という新しいクラスを作成します。 このクラスは、2 つのプロパティを使用して Python オブジェクトへの参照を格納します。
Class dc.demo.imap.python.IMAPPy Extends dc.demo.imap.IMAP
{
/// Stores the imaplib object reference
Property imaplib As %SYS.Python;
/// Stores the imaplib client instance
Property client As %SYS.Python;
...
次に、imaplib ライブラリを ObjectScript コンテキストのクラスコンストラクタにインポートします。
Method %OnNew() As %Status [ Private ]
{
Set ..imaplib = ##class(%SYS.Python).Import("imaplib")
Return $$$OK
}
これで、imaplib クラスプロパティを使用して、すべての impalib プロパティとメソッドにアクセスできるようになりました。 最初にオーバーライドするメソッドは、Connect メソッドです。 このメソッドは imaplib の IMAP4_SSL メソッドを使用して、IMAP サーバーへの接続を行います。 imaplib クライアントインスタンスをクライアントプロパティとして格納します。
imapilb クライアントの login メソッドは、次のようにしてログインリクエストを認証します。
Method Connect(pServer As %String, pUserName As %String, pPassword As %String) As %Status
{
If ..Connected Return $$$ERROR($$$ConnectedError)
Set sc = $$$OK
Try {
Set ..Server = pServer
Set ..UserName = pUserName
Set ..client = ..imaplib."IMAP4_SSL"(..Server)
Set resp = ..client.login(..UserName, pPassword)
Set ..Connected = 1
}
Catch ex {
Set sc = ex.AsStatus()
}
Return sc
}
次にオーバーライドするメソッドは Disconnect メソッドです。 このメソッドは、imaplib クライアントから logout メソッドを呼び出すようになります。
Method Disconnect() As %Status
{
Set sc = $$$OK
Try {
If ..Connected {
Set tuple = ..client.logout()
Set ..Connected = 0
}
}
Catch ex {
Set sc=ex.AsStatus()
}
Return sc
}
GetMailBoxStatus メソッドは、imaplib から select メソッドを使用してアクセスするメールボックスを指定するようにオーバーライドされています。
Method GetMailBoxStatus(ByRef NumberOfMessages As %Integer, ByRef NumberOfBytes As %Integer) As %Status
{
Set sc = $$$OK
Try {
Do ..CheckConnection()
Set resp = ..client.select(..MailboxName)
Set ackToken = resp."__getitem__"(0)
Set dataArray = resp."__getitem__"(1)
Set NumberOfMessages = dataArray."__getitem__"(0)
Set NumberOfBytes = -1
}
Catch ex {
Set sc=ex.AsStatus()
}
Return sc
}
このメソッドはタプルを返すため、特殊な \_\_getitem\_\_ メソッドによって、情報を取得することができることに注意してください。 また、タプルは別のタプルを格納することができるため、再帰的に \_\_getitem\_\_ を使用できることを忘れないでください。
次にオーバーライドするメソッドは、GetSizeOfMessages です。 このメソッドは、select メソッドを使用して現在のメールボックスを選択し、fetch メソッドを使用して MessageNumber パラメーターに格納されたメッセージのサイズを取得するようになります。
Method GetSizeOfMessages(MessageNumber As %String = "", ByRef ListOfSizes As %ArrayOfDataTypes) As %Status
{
Set sc = $$$OK
Try {
Do ..CheckConnection()
// select the mailbox
Set resp = ..client.select(..MailboxName)
// hack to ensure that MessageNumber is of type %String
Set MessageNumber = MessageNumber_""
Set resp = ..client.fetch(MessageNumber, "(RFC822.SIZE)")
Set ackToken = resp."__getitem__"(0)
Set dataArray = resp."__getitem__"(1)
Set:('$ISOBJECT($Get(ListOfSizes))) ListOfSizes = ##class(%ArrayOfDataTypes).%New()
Set data = dataArray."__getitem__"(0)
Set msgIdx = +$Piece(data, " ", 1)
Set size = +$Piece(data, " ", 3)
Do ListOfSizes.SetAt(size, msgIdx)
}
Catch ex {
Set sc=ex.AsStatus() }
Return sc
}
同様に、GetMessageUIDArray メソッドも fetch メソッドを使用するようにオーバーライドしますが、これは、UID コードを取得するために使用します。
Method GetMessageUIDArray(MessageNumber As %String = "", ByRef ListOfUniqueIDs As %ArrayOfDataTypes) As %Status
{
Set sc = $$$OK
Try {
Do ..CheckConnection()
// select the mailbox
Set resp = ..client.select(..MailboxName)
Set mailboxSize = resp."__getitem__"(1)."__getitem__"(0)
If (mailboxSize > 0) {
// hack to ensure that MessageNumber is of type %String
Set MessageNumber = MessageNumber_""
// then get the mailbox UIDs
Set param = $CASE(MessageNumber, "":"1:*", :MessageNumber)
Set resp = ..client.fetch(param, "UID")
Set ackToken = resp."__getitem__"(0)
Set dataArray = resp."__getitem__"(1)
Set len = dataArray."__len__"()
} Else {
Set len = 0
}
Set:('$ISOBJECT($Get(ListOfUniqueIDs))) ListOfUniqueIDs = ##class(%ArrayOfDataTypes).%New(len)
For i = 1:1:len {
Set data = dataArray."__getitem__"(i - 1)
Set msgIdx = +$Piece(data, " ", 1)
Set size = +$Piece(data, " ", 3)
Do ListOfUniqueIDs.SetAt(size, msgIdx)
}
}
Catch ex {
Set sc=ex.AsStatus()
}
Return sc
}
dataArray 変数のタプルを反復処理するために、 \_\_getitem\_\_ メソッドと \_\_len\_\_ メソッドを使用しているところに注意してください。
…
Set len = dataArray."__len__"()
…
For i = 1:1:len {
Set data = dataArray."__getitem__"(i - 1)
Set msgIdx = +$Piece(data, " ", 1)
Set size = +$Piece(data, " ", 3)
Do ListOfUniqueIDs.SetAt(size, msgIdx)
}
次に、Fetch メソッドをオーバーライドします。これは、メッセージ本文全体を取得するために使用します。
Method Fetch(MessageNumber As %Integer, ByRef Msg As %Net.MailMessage, Delete As %Boolean, messageStream As %BinaryStream) As %Status
{
Set sc = $$$OK
Try {
Do ..CheckConnection()
// select the mailbox
Set resp = ..client.select(..MailboxName)
// hack to ensure that MessageNumber is of type %String
Set MessageNumber = MessageNumber_""
// get the whole message
Set resp = ..client.fetch(MessageNumber, "BODY.PEEK[]")
Set rawMsg = ..TransversePythonArray(resp."__getitem__"(1))
...
}
Catch ex {
Set sc=ex.AsStatus()
}
Return sc
}
TransversePythonArray メソッドが存在することに注意してください。 fetch メソッドで返されるメッセージ本文は複合コレクションであるため、このコレクションを再帰的に横断して単一の文字列にフラット化するために、このメソッドを作成しています。
ClassMethod TransversePythonArray(pArray As %SYS.Python) As %String
{
Set acc = ""
If ($IsObject(pArray)) {
Set len = pArray."__len__"()
For i = 1:1:len {
Set item = pArray."__getitem__"(i - 1)
If ($IsObject(item)) {
Set acc = acc_..TransversePythonArray(item)
} Else {
Set acc = acc_item
}
Set acc = acc_$Char(13, 10)
}
} Else {
Set acc = pArray_$Char(13, 10)
}
Return acc
}
また、imaplib noop メソッドを使用するように Ping メソッドをオーバーライドします。
Method Ping() As %Status
{
Set sc = $$$OK
Try {
Do ..CheckConnection()
Set resp = ..client.noop()
}
Catch ex {
Set sc=ex.AsStatus()
}
Return sc
}
オーバーライドする最後のメソッドは CommitMarkedAsDeleted メソッドです。 store メソッドと expunge メソッドを使用して、メッセージに削除マークを付けてその操作をコミットするようになります。
Method CommitMarkedAsDeleted() As %Status [ Internal, Private ]
{
Set sc = $$$OK
Try {
Do ..CheckConnection()
// select the mailbox
Set resp = ..client.select(..MailboxName)
// transverse array in inverse order to keep numbers integrity,
// that is, ensures that when the number is deleted no other
// message can assume such number
Set messageNumber = $Order(..MarkedAsDeleted(""), -1)
While (messageNumber '= "") {
// hack to ensure that messageNumber is of type %String
Set messageNumber = messageNumber_""
Set resp = ..client.store(messageNumber, "+FLAGS", "\Deleted")
Set messageNumber = $Order(..MarkedAsDeleted(messageNumber), -1)
}
Kill ..MarkedAsDeleted
Set resp = ..client.expunge()
}
Catch ex {
Set sc=ex.AsStatus()
}
Return sc
}
## まとめ
この方法は、IRIS TCP コマンドを使用して各 IMAP コマンドを手動で実装する必要のある元の方法に比べ、はるかに簡単に実装できます。 機能性豊かな Python ライブラリエコシステムを実際の問題に使用する優れた方法の例を確認できたので、あなたの ObjectScript アプリケーションをパワーアップし始めましょう!
## 参考情報
* [imaplib — IMAP4 プロトコルクライアント](https://docs.python.org/3/library/imaplib.html)
* [動画: Embedded Python in InterSystems IRIS: Sneak Peek](https://community.intersystems.com/post/new-video-embedded-python-intersystems-iris-sneak-peek)
* [Embedded Python: Bring the Python Ecosystem to Your ObjectScript App](https://learning.intersystems.com/course/view.php?id=1572)
* [Learn Python Network Programming: Python - IMAP](https://www.tutorialspoint.com/python_network_programming/python_imap.htm)
* [Python ドキュメント: レシピとベストプラクティス](https://docs.python.org/3/library/secrets.html#recipes-and-best-practices)
* [Python ドキュメント: データモデル](https://docs.python.org/3/reference/datamodel.html)
* [WebSocket Client with Embedded Python](https://community.intersystems.com/post/websocket-client-embedded-python)
* [Intersystems 開発者コミュニティ: #Python](https://jp.community.intersystems.com/tags/python)
お知らせ
Toshihiko Minamoto · 2022年3月21日
InterSystems Kubernetes Operation (IKO) バージョン 3.3 が WRC ダウンロードページ やInterSystems Container Registry よりダウンロード可能となりました。
IKO は、使いやすい irisClusterリソース定義を提供することにより、Kubernetesにおける InterSystems IRIS やInterSystems IRIS for Health との連携を簡素化します。 簡単なシャーディング、ミラーリング、ECP構成などの機能一覧は ドキュメント をご覧ください。
IKO 3.3の主な修正点:
InterSystems IRIS 、 IRIS for Healthのバージョン 2021.2 、 2022.1 のサポート
Kuberentes 1.21のサポート
irisCluster の一部として共通のSystem Alerting and Monitoring (SAM) コンフィグレーションのデプロイ
irisCluster の一部として InterSystems API Manager (IAM) のデプロイや管理
ミラーリングのアクティブ側の自動タグ付けにより、サービスは常にアクティブなミラーメンバーを指すことができます。
お知らせ
Maki Hashizawa · 2022年3月24日
開発者のみなさん、こんにちは。
"Innovation in Data - データによるデジタル変革の推進" をテーマに、DX推進に不可欠な健全なデータの提供とデータプラットフォームの最新情報をお届けしました「InterSystems Japan Virtual Summit 2022」の全てのセッションを、4月22日(金)までオンデマンドで配信しております。
見逃した方や、もう一度セッションをご覧になりたい方など、是非、この機会にご覧いただければと思います。
お申込み・視聴はこちらから
■テーマ:Innovation in Data - データによるデジタル変革の推進
■オンデマンド配信:2022年4月22日(金)まで
■参加:無料(登録制)
お申込み・視聴はこちらから
《技術セッション》
■Embedded Python で広がる InterSystems IRISの世界
■SQLでどこまでできる? ~データロードから機械学習まで~
■オープンソースだけで IRIS on Kubernetesを動かそう
■VSCode、Jenkinsを使用したCICD環境の構築
■FHIR SQL Builder
■ストレージの節約方法について
■ミラーリングを使用したHAおよびDR構成例
皆様のご参加をお待ちしております。
お知らせ
Mihoko Iijima · 2022年6月19日
開発者の皆さん、こんにちは!21回目の InterSystems プログラミングコンテストを開催します!
お題は👉 🏆 InterSystems Full Stack コンテスト 2022 🏆 です!
期間: 2022年6月27日~7月17日まで(詳細は末尾をご参照ください)
💰賞金総額: $10,000 💰
コンテストのテーマ:
💡 Full Stack アプリケーション 💡
InterSystems IRIS、InterSystems IRIS For Health、または、IRIS Cloud Servies をバックエンドに使用して、Full Stack ソリューションを開発してください!
今回のコンテストでの「Full Stack」の対象ですが、REST API、Native API、ODBC/JDBC、Embedded Python を介して InterSytems IRIS にデータを追加、変更、削除を行うフロントエンドWebまたはモバイル・アプリケーション です。
さらに、
今回、開発者の皆様に、地球規模の課題の解決に挑戦していただくことを決定しました。 気候変動問題への取り組みに焦点を当てたソリューションでこのコンテストに参加されることをお勧めします。
1) 地球温暖化や気候変動に関する問題を解決できるアプリケーションであれば、特別なボーナスが与えられます。
2) また、地球温暖化や気候変動に関連するデータセットを作成し、Open Exchange に公開すると、別のボーナスもあります。
さぁ! さらなるサステナブルな世界のために、あなたの革新的な貢献を期待しています。デジタル技術を磨いて、気候変動問題の解決策を開発しましょう!
一般的な応募条件:
応募可能なアプリケーション
Open Exchange アプリケーションの新規作成、または既存アプリケーションであっても大幅に改善されているものであればご応募いただけます。
コミュニティの担当チームは、コンテストへの応募を承認する前に申請された全アプリケーションをレビューします。
全てのアプリケーションは IRIS Community Edition 、 IRIS for Health Community Edition 、 IRIS Advanced Analytics Community Edition のいずれかで動作する必要があります。
アプリケーションはオープンソースであり、GitHubで公開されている必要があります。
アプリケーションの README ファイルは、英語で記述してください(日本語で記述したものがあればそのまま掲載いただき、英文の追記をお願いします。翻訳アプリを使用しますが翻訳をお手伝いすることもできますのでお気軽にお知らせください!)。また、インストール手順や、アプリケーションがどのように動作するかの説明、またはビデオデモを含めてください
優勝特典:
1. Experts Nomination – 審査員から多く票を集めたアプリケーションには、以下の賞金が贈られます。
🥇 1位 - $4,000
🥈 2位 - $2,000
🥉 3位 - $1,000
🌟 4-15位 - $100
2. Community winners – 開発者コミュニティで多く票を集めたソリューションには、以下の賞金が贈られます。
🥇 1位 - $1,000
🥈 2位 - $750
🥉 3位 - $500
✨ 受賞者全員にグローバルマスターズ・バッジをプレゼントします!!
複数の参加者が同数の票を獲得した場合、全参加者が勝者となり賞金は勝者間で分配されます。
スケジュール:
🛠 アプリケーション開発と応募期間:
2022年6月27日(00:00 EST): コンテスト開始!
2022年7月10日(23:59 EST): 応募締め切り!
✅ 投票期間:
2022年7月11日(00:00 EST): 投票開始!
2022年7月17日(23:59 EST): 投票締め切り!
応募、投票期間中、アップロードしたアプリケーションは改良できます。
参加資格:
どなたでもご参加いただけます!(InterSystems 開発者コミュニティのアカウントを作成するだけでご応募いただけます)
👥 開発者がチームを組んで共同でアプリケーションを作成し、応募することもできます! 1チーム 2~5名 までご参加いただけます。
チームでご応募いただく場合は、アプリケーションの README にチームメンバー名の記載をお忘れなく!!(開発者コミュニティのプロファイルのリンクもお願いします)
Helpful Resources:
✓ Full Stack アプリケーションに合った InterSystems IRIS Docker テンプレート:
IRIS Full Stack template
Basic InterSystems IRIS Docker template
IRIS REST API template
Native API template
IntegratedML template
IRIS Analytics template
✓ オンラインコース(英語)
Implementing RESTful Applications
✓ ビデオ
REST API design and Development
REST API in 5 minutes
Data-Driven Web Apps
【はじめてのInterSystems IRIS】セルフラーニングビデオ:アクセス編:(REST)手動で作成するディスパッチクラス
【はじめてのInterSystems IRIS】セルフラーニングビデオ:アクセス編:(REST)APIファーストで作成するRESTディスパッチクラス
✓ For beginners with IRIS:
Build a Server-Side Application with InterSystems IRIS
Learning Path for beginners
【はじめての InterSystems IRIS】セルフラーニングビデオ 索引
✓ For beginners with ObjectScript Package Manager (ZPM):
How to Build, Test and Publish ZPM Package with REST Application for InterSystems IRIS
Package First Development Approach with InterSystems IRIS and ZPM
✓コンテストへの応募方法
Need Help?
ご質問がある場合は、この投稿へコメントいただくか、InterSystems の Discord server チャンネルにご参加ください!
皆様からのアプリケーションのご応募、お待ちしております!👍
❗️ コンテストに参加された場合、こちらに記載されているコンテスト規約に同意したものとみなされます。ご応募の際、ご一読いただきますよう、お願い申し上げます❗️
ご応募方法について
以下の応募方法ビデオをご参照ください。
以下、コンテストに応募する迄の手順をご説明します。
コンテスト応募までの流れは以下の通りです(※ビデオでは、3番以降の内容をご紹介しています)。
1、IRISプログラミングコンテスト用テンプレートを使用して、開発環境を準備します。
2、コンテスト用アプリケーションを作成します。
3、コンテストの準備が完了したら、ソースコードをローカルのGitリポジトリへコミットします。
初回コミット時に、Gitの初期設定がないためコミットが失敗することがあります。その場合は、以下のコマンドでGitユーザ名とEmailを設定します。
git config --global user.name "ここにユーザ名"
git config --global user.email "ここにメールアドレス”
4、ローカルのGitリポジトリのコミットが完了したら、リモートのGitリポジトリを作成します。
リポジトリ作成後、リモートリポジトリのURLをコピーします。
5、リモートのGitリポジトリへPushします。
git push ここにリモートのリポジトリのURL
6、OpenExchangeにログインし、アプリケーションを追加します。
※事前にDeveloper communityでユーザアカウントを作成する必要があります。ログイン後、Profile→Applications から Application をクリックし、4 でコピーしたリモートのGitリポジトリのURLを設定します。
アプリケーションを登録すると、画面右上に「Send Approval」のボタンが表示されるので、クリックします。
再度作成したアプリケーションを開くと、「Apply for Contest」ボタンが表示されるので、クリックすると応募が完了します。
お知らせ
Mihoko Iijima · 2022年7月19日
開発者の皆さん、こんにちは!
InterSystems Full Stack コンテスト 2022 の投票結果か発表されました!この記事ではコンテスト受講者を発表します 📢
受賞された開発者の皆さん、👏おめでとうございます!🎊
Experts Nomination:
🥇 1位 - $4,000 は、Kozo を開発された @Sean.Connelly さんに贈られました。
🥈 2位 - $2,000 は、 iris-climate-change を開発された @Muhammad.Waseem さんに贈られました。
🥉 3位 - $1,000 は、Carbon Footprint Counter を開発された @Yuri.Gomes さんに贈られました。
さらに!
🏅 $100 - interoperability-manager を開発された @Oliver.Wilms さんに贈られました。
🏅 $100 - Arctic sea ice viewer を開発された @Oleh.Dontsov さんに贈られました。
🏅 $100 - iris-for-money を開発された @Oliver.Wilms さんに贈られました。
Community Nomination
🥇 1位 - $1,000 は、Kozo を開発された @Sean Connelly さんに贈られました。
🥈 2位 - $750 は、iris-climate-change を開発された @Muhammad Waseem さんに贈られました。
🥉 3位 - $500 は、Carbon Footprint Counter を開発された @Yuri Marx さんに贈られました。
🎊 受賞者の皆様、おめでとうございます!👏
今回も、コンテストにご注目いただきありがとうございました!
では、また、次のコンテストをお楽しみに!😎
記事
Toshihiko Minamoto · 2020年8月13日
皆さん、こんにちは。
InterSystems System Alerting and Monitoring (SAM)をご存知でしょうか。InterSystems IRIS 2020.1以降に対応し、IRISやそのアプリケーションの監視を行うソリューションです。といってもシステム監視を行うPrometheus、アラートを管理するAlertManager、ダッシュボードとしてグラフ等を表示させるGrafanaなどを組み合わせたものですが、IRISの利用者に合わせて設定しやすくなっています。
なお、これらのコンポーネントはDockerコンテナを使用しますので、Docker(19.3.098以降)ならびにDocker compose(1.25以降)をインストールいただく必要があります。
IRISの監視APIについてはこちらをご覧ください。
インストール手順
1. アプリケーションのインストール
アプリケーション自体はDockerコンテナにて提供されますので、DockerComposeのファイルやシェルスクリプトを以下のGitHubリポジトリからダウンロードします。https://github.com/intersystems-community/sam
以下のgzipファイルをダウンロードし、展開します。sam-1.0.0.XXX-unix.tar.gz
$ tar zpxvf sam-1.0.0.115-unix.tar.gz
展開されたディレクトリに移動し、start.shを実行します。
$ ./start.sh
以上で、各種コンテナがダウンロードされ、起動されます。
2. IRISサーバの設定
インストールが完了すると、ブラウザから以下のURLにアクセスします。
http://localhost:8080/api/sam/app/index.csp
ブラウザを実行しているホストとコンテナをインストールしたホストが異なる場合は、localhostの代わりにコンテナをインストールしたホスト名を入力してください。
以下のようにユーザ名、パスワードを聞いてきますので、ユーザ名:Admin、パスワード: SYSを入力し、ログインボタンをクリックします。
ログインに成功しますと新たなパスワードを求めてきますので、Old Passwordには「SYS」、「New Password」、「Retype New Password」には新たなパスワードを入力し「Login」ボタンをクリックします。
Welcomeメッセージが表示されますので、「Create Your First Cluster」ボタンをクリックします。
以下の画面が表示されますので、「Cluster name」欄にクラスタ名の内容を記述し。「Add Cluster」をクリックします。
つづいてインスタンス名の設定を記載します。以下のようにClusterの選択画面が表示されていますので、画面中央右の「+New」というボタンをクリックします。
以下の画面が表示されますので、IRISサーバのIPアドレスかホスト名、Webアクセス用のポート番号、インスタンス名を入力し、「Add Instance」ボタンをクリックします。
以上で設定は終了です。
3. サーバの監視
設定が終了すると、以下のようにclusterごとに各サーバの状態が表示されます。
各インスタンスをクリックしますと、以下のような画面が表示され、CPU使用率などのメトリックがグラフ表示されます。
画面右手中央の「View in Grafana」をクリックしますと、Grafanaを使用してダッシュボードのグラフをカスタマイズできます。
最後に
IRISサーバの監視が意外(?)と簡単な設定でできたと思います。ぜひ一度お試しください。英語になりますが、インストール方法の詳細はhttps://docs.intersystems.com/sam/csp/docbook/Doc.View.cls?KEY=ASAMをご参照ください。
ご意見、ご質問等もお待ちしています。
SAMではアプリケーションに合わせて監視項目を追加することも可能です。まず、%SYS.Monitor.SAM.Abstractクラスを継承したクラスを作成し、PRODUCTパラメータにアプリ名、GetSensors()メソッドにてSetSensor()メソッドを使用し、メトリックを登録し、クラスをコンパイルします。試しに先日作成した温湿度計のデータを取得するようにしました。
Class REST.Monitor Extends %SYS.Monitor.SAM.Abstract
{
Parameter PRODUCT = "temperature";
Method GetSensors() As %Status
{
set lastdate=$order(^Temp(""),-1)
quit:lastdate="" $$$OK
set lasttime=$order(^Temp(lastdate,""),-1,data)
quit:lasttime="" $$$OK
set temp=$lg(data),hum=$lg(data,2)
set now=$horolog
do ..SetSensor("temperature",temp)
do ..SetSensor("humidity",hum)
do ..SetSensor("latency",$piece(now,",")-lastdate*86400+$piece(now,",",2)-lasttime)
quit $$$OK
}
}
ターミナルを起動し%SYSネームスペースに移動、以下のメソッドを実行します。(第2パラメータのUSERはREST.Monitorが存在するネームスペース)
%SYS>set status = ##class(SYS.Monitor.SAM.Config).AddApplicationClass("REST.Monitor", "USER")
戻り値の変数statusが1でしたら、正常に登録できています。
登録が終わりましたら、以下のURLにアクセスし、先ほどクラスを作成したホストを選択します。http://localhost:8080/api/sam/app/index.csp
画面右手中央の「View Grafana」をクリックします。
画面上部に以下のようなアイコンが表示されますので、「Add Panel」(赤枠部分)をクリックします。
以下のようにパネルが作成されますので、「Add query」をクリックします。
Queryのメトリックスを指定し、Legend欄にデータのコメントを入力します。
グラフが追加されましたら、画面上方の「Save Dashboard」(赤枠部分)をクリックします。
SAM (http://localhost:8080/api/sam/app/index.csp) にアクセスしますと、新たにパネルが追加されています。
以上です。
お知らせ
Yoichi Miyashita · 2020年7月12日
InterSystems IRIS データ・プラットフォーム および InterSystems IRIS for Health バージョン 2020.2 CD をリリースしました。こちらはCD(continuous delivery)リリースになりますので、OCI(Open Container Initiative)と呼ばれるDockerコンテナー形式でのみ使用可能です。
リリースのビルド番号は 2020.2.0.211.0 です。
InterSystems IRIS データ・プラットフォームバージョン 2020.2 は、以下の拡張機能を備えた重要なセキュリティアップデートを提供します。
・TLS 1.3のサポート・SHA-3のサポート
InterSystems IRIS for Health バージョン 2020.2 にはさら以下の機能が含まれます。
・FHIR R4データ変換・FHIRサーバーの新しい構成UI・IHE RMUプロファイルのサポート・IHEコネクタソンの更新
これらの詳細はドキュメント(英語)でご覧いただけます。InterSystems IRIS データ・プラットフォームhttps://docs.intersystems.com/iris20202/csp/docbook/DocBook.UI.Page.clsInterSystems IRIS for Healthhttps://docs.intersystems.com/irisforhealth20202/csp/docbook/DocBook.UI.Page.cls
リリースノートもご覧ください。InterSystems IRIS データ・プラットフォームhttps://docs.intersystems.com/iris20202/csp/docbook/Doc.View.cls?KEY=GCRNInterSystems IRIS for Healthhttps://docs.intersystems.com/irisforhealth20202/csp/docbook/DocBook.UI.Page.cls?KEY=HXIHRN
サポートプラットフォームは、以下のドキュメントをご覧ください。 InterSystems IRIS データ・プラットフォームhttps://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=ISPInterSystems IRIS for Healthhttps://docs.intersystems.com/irisforhealthlatest/csp/docbook/Doc.View.cls?KEY=ISP
InterSystems IRIS Studio 2020.2 は、Microsoft Windowsでサポートされるスタンドアロンの開発イメージです。 InterSystems IRISとIRIS for Healthバージョン 2020.2 以前、およびCache と Ensemble で動作します。
キットが必要なお客様は、カスタマーサポートセンターまでご連絡いただき、必要なプラットフォームをお知らせください。WRC Direct ユーザの方は以下のURLより入手可能です。 https://wrc.intersystems.com/wrc/coDistribution2.csp
x64 および arm64 のコミュニティエディションは、次の Docker Store から入手できます。InterSystems IRIS データ・プラットフォームdocker pull store/intersystems/iris-community:2020.2.0.211.0docker pull store/intersystems/iris-community-arm64:2020.2.0.211.0InterSystems IRIS for Healthdocker pull store/intersystems/irishealth-community:2020.2.0.211.0docker pull store/intersystems/irishealth-community-arm64:2020.2.0.211.0