クリアフィルター
お知らせ
Seisuke Nakahashi · 2023年5月7日
5月16日以降、 バージョン 2017.1 以前のInterSystems Caché® と InterSystems Ensemble® のドキュメントは、弊社ドキュメントウェブサイトで PDF フォーマットのみ公開されるよう変更となります。ご理解いただけますよう、どうぞよろしくおねがいします。もちろん、お手元の Caché / Ensemble のドキュメントについては、これまで通りのフォーマットでブラウザからご覧いただけます。
記事
Mihoko Iijima · 2020年6月28日
基本操作編ビデオシリーズ:その1
Windows、Linux、クラウドのマーケットプレイスでの InterSystems IRIS Community Edition インストール方法を解説しています。
コミュニティエディションのインストールキット入手方法については、「InterSystems IRIS/InterSystems IRIS for Health コミュニティエディションのダウンロード方法」をご参照ください。
2025/4/8 追記:バージョン2025.1以降 コンテナ以外のインストールキットを使用したインストールでは、初期セキュリティ設定のオプションデフォルトが「ロックダウン(Locked down)」に変更されました。詳しくは👉「バージョン2025.1インストール時に指定する初期セキュリティオプションのデフォルトが「ロックダウン」に変わりました」をご参照ください。
コンテナ版IRISの利用方法については、「InterSystemsコンテナレジストリの使い方とコンテナ開始までの流れ(解説ビデオ付き)」をご参照ください。
もくじ
0:00 ~ IRIS community Edition インストール方法概要
1:36 ~ WindowsでのIRISインストール
11:24 ~ LinuxでのIRISインストール
20:50 ~ マーケットプレイス(Azure)
29:45 ~ Docker Hub (Docker for Windows)
※2023/7/14追記:コンテナ版IRISは「InterSystemsコンテナレジストリ」に公開するように変更となりました。使い方について詳しくは以下記事をご参照ください。「InterSystemsコンテナレジストリの使い方とコンテナ開始までの流れ(解説ビデオ付き)」
36:18 ~ TRY-IRIS(インターシステムズプライベートクラウド)
※2023/2/20追記:TRY-IRISページが大幅にリニューアルされ、ユーザ登録が不要となりました。使い方について詳細は、「Developer Hub:チュートリアルのご紹介」をご参照ください。
※YouTubeでご覧いただくと、もくじの秒数にジャンプできます。 ビデオの最後にご紹介している「TRY-IRIS」を開始する流れが少し変わりました。
詳細は「【GettingStarted with IRIS】無料体験環境:Sandbox 開始手順について」をご参照ください。 ビデオの 29:45 ~ ご紹介しているコンテナ版IRISの使い方ですが、InterSystemsコンテナレジストリ の登場により、pull する際ご参照いただくページが変わりました。
詳細は「InterSystemsコンテナレジストリの使い方とコンテナ開始までの流れ(解説ビデオ付き)」をご参照ください。
記事
Toshihiko Minamoto · 2020年10月13日

[GraphQL](http://graphql.org/)は、クライアントとサーバー間のミドルウェア層として機能する、データ構造とデータアクセスのメソッドを選択するための標準です。 GraphQLについて聞いたことがない方は、[ここ](https://medium.freecodecamp.org/so-whats-this-graphql-thing-i-keep-hearing-about-baf4d36c20cf)と[ここ](https://blog.apollographql.com/graphql-vs-rest-5d425123e34b)と[ここ](https://blog.apollographql.com/the-anatomy-of-a-graphql-query-6dffa9e9e747)にある、有用なオンラインリソースをご覧ください。
この記事では、InterSystemsテクノロジーに基づいて、プロジェクトでGraphQLを使用する方法を説明します。
InterSystemsプラットフォームは現在、クライアント/サーバーアプリケーションを作成する方法をいくつかサポートしています。
- REST
- WebSocket
- SOAP
では、GraphQLのメリットは何でしょうか。 たとえばRESTと比較した場合、どのようなメリットが提供されるのでしょうか。
GraphQLのリクエストにはいくつかの種類があります。
- **クエリ** - RESTを使用してデータをフェッチするために推奨されるGETリクエストに類似する、データ取得用のサーバーリクエスト。
- **ミューテーション** - RESTのPOST(PUT、DELETE)リクエストに類似する、サーバー側データ変更を担う。 ミューテーションとクエリはともにデータを返すことができます。ミューテーションを実行した直後に、サーバーに更新済みのデータをリクエストする場合に便利です。
- **サブスクリプション** - データを出力する同じクエリタイプ。 唯一の違いは、ミューテーションによってサブスクリプションがアクティブ化される間に、クライアント側でレンダリングされたページでクエリが発行されることです。
## GraphQLの主な機能とメリット
### どのデータが返されるかはクライアント次第
GraphQLの主な機能の1つに、返されるデータの構造とボリュームがクライアントアプリケーションによって定義されることがあります。 クライアントアプリケーションは、JSON 形式によく似た宣言的なグラフのような構造を使用して、受信するデータを指定します。 レスポンス構造は、クエリの構造に対応しています。
簡単なGraphQLクエリは次のようになります。
```json
{
Sample_Company {
Name
}
}
```
JSON形式のレスポンス:
```json
{
"data": {
"Sample_Company": [
{
"Name": "CompuSoft Associates"
},
{
"Name": "SynerTel Associates"
},
{
"Name": "RoboGlomerate Media Inc."
},
{
"Name": "QuantaTron Partners"
}
]
}
}
```
### 単一エンドポイント
GraphQLを使ってデータを操作する場合、必ず単一の**エンドポイント**であるGQLサーバーに接続し、クエリの構造、フィールド、パラメーターを変更して異なるデータを取得します。 RESTは、それとは対照的に、複数のエンドポイントを使用します。
簡単な例を使用して、RESTとGraphQLを比較してみましょう。

ユーザーのコンテンツを読み込む必要があるとします。 RESTを使用している場合、サーバーに3つのクエリを送信する必要があります。
1. IDでユーザーのデータを取得する
2. ユーザーのIDを使用してその投稿を読み込む
3. ユーザーのIDを使用してフォロワー/サブスクライバーのリストを取得する
以下は、上記のクエリに対応するRESTマップです。
```
```
新しいデータセットを取得するには、このRESTマップを新しいエンドポイントで更新する必要があります。
GraphQLはこれを1つのクエリで処理します。 リクエストの本文に次のように指定してください。
```
{
operationName: null, //a query can have a name ( query TestName(...){...} )
query: "query {
User(id: "ertg439frjw") {
name
posts {
title
}
followers(last: 3) {
name
}
}
}",
variables: null // initialization of the variables used in the query
}
```
このクエリに対応するRESTマップ:
```
```
これがサーバーの唯一のエンドポイントです。
## GraphQLとGraphiQLのインストール
GraphQLを使用し始めるには、いくつかの手順を完了する必要があります。
1. GitHubから[最新リリース](https://github.com/intersystems-ru/GraphQL/releases)をダウンロードし、必要なネームスペースにインポートします。
2. システム管理ポータルに移動し、InterSystemsデータプラットフォーム製品(Caché、Ensemble、またはIRIS)に基づいて、新しいWebアプリケーションを作成します。
- 名前 - **/**
- ネームスペース - **SAMPLESなど**
- ハンドラクラス - **GraphQL.REST.Main**
3. GraphiQL — GraphQLクエリをテストするためのシェルです。 [最新ビルド](https://github.com/intersystems-ru/GraphQL/releases)、または独自のソースの[ビルド](https://github.com/graphql/graphiql)をダウンロードします。
4. 新しいWebアプリケーションを作成します。
- 名前 - **/graphiql**
- ネームスペース - **SAMPLESなど**
- CSPファイルへの物理パス - **C:\InterSystems\GraphiQL\**
## 結果を見てみましょう
ブラウザで、**http://localhost:57772/graphiql/index.html**(localhost — サーバー、57772 — ポート)に移動します。

**クエリ**と**レスポンス**のネームスペースについて明確に説明できたでしょうか。 **スキーマ**は、ネームスペースに格納されているすべてのクラスに対して生成されるドキュメントです。
スキーマには次の項目が含まれます。
- クラス
- プロパティ、引数、それらの型
- コメントから生成される上記すべての説明
**Sample_Company**クラスのスキーマを詳しく見てみましょう。

GraphiQLは、**Ctrl + Space**キーを押してアクティブ化できる自動コード補完機能もサポートしています。

## クエリ
クエリは、単純なクエリや、複数のデータのセットで使用する複雑なクエリであったりあします。 以下は、**Sample_Person**と**Sample_Company**という異なるクラス間でのサンプルクエリです。

## フィルタリング
現在のところ、厳密な等価のみがサポートされています。

## ページネーション
ページネーションは、必要な結果を得るために組み合わせて子よできる4つの関数を通じてサポートされています。
- **after: n** – nより大きいidを持つすべてのレコード
- **before: n** – nより小さいidを持つすべてのレコード
- **first: n** – 最初のn件のレコード
- **last: n** – 最後のn件のレコード

## 可視領域
ほとんどの場合、アプリケーションのビジネスロジックは、特定クライアントのみに特定のネームスペースクラスへのアクセスを与えています(ロールベースの許可)。 それに基づき、クライアントのクラスの可視性を制限する必要がある場合があります。
- ネームスペースのすべてのクラス(**GraphQL.Scope.All**)
- スーパークラスから継承されたクラス(**GraphQL.Scope.Superclass**)
- 特定のパッケージに属するクラス(**GraphQL.Scope.Package**)
可視性制限のメソッドを変更するには、Studioを開き、必要なネームスペースに切り替えて、**GraphQL.Settings**クラスを開きます。 これには、**GraphQL.Scope.All**というデフォルト値を使用する**SCOPECLASS**パラメーターがあります。これがネームスペースのクラスの可視性制限の説明が含まれるクラスです。  クラスの可視性制限を変更するには、上記に示されるいずれかの値(**GraphQL.Scope.Package**または**GraphQL.Scope.Superclass**)に設定する必要があります。
**GraphQL.Scope.Package**を選択した場合、そのクラスに移動して、**Package**パラメーターの値を必要なパッケージの名前(**Sample**など)に変更する必要があります。 これにより、このパッケージのすべての格納済みクラスを完全に利用できるようになります。

**GraphQL.Scope.Superclass**を選択した場合は、もう一度必要なクラスで、このクラスから継承します。

## 現在のサポート状況
クエリ:
- 基本
- 埋め込みオブジェクト
- 多対1の関係のみ
- 単純な型のリスト
- オブジェクトのリスト
## 現在開発中
クエリ:
- 埋め込みオブジェクト
- すべての型のリレーションのサポート
- フィルタリング
- 不等価のサポート
## 今後の予定
- ミューテーション
- [エイリアス](https://graphql.github.io/learn/queries/#aliases)
- [ディレクティブ](https://graphql.github.io/learn/queries/#directives)
- [フラグメント ](https://graphql.github.io/learn/queries/#fragments)
→ プロジェクトリポジトリへの[リンク](https://github.com/intersystems-community/GraphQL) → デモサーバーへの[リンク](http://37.139.6.217:57773/graphiql/index.html)
ぜひプルリクエストを発行してください。 今後のプロジェクト情報にご期待ください!
記事
Toshihiko Minamoto · 2020年11月16日
InterSystems API Management(IAM)は、IT インフラストラクチャ内の Web ベースの API との間のトラフィックを監視、制御、および管理できる InterSystems IRIS Data Platform の新機能です。 アナウンスを見逃した方は、[こちらのリンク](https://community.intersystems.com/post/announcing-release-intersystems-api-manager)を参照してください。 また、[IAM](https://community.intersystems.com/post/introducing-intersystems-api-manager) の使い方を説明した記事もあります。
この記事では、InterSystems API Management を使用して API の負荷を分散します。
この例では、2 つの InterSystems IRIS インスタンスを使用し、クライアントに `/api/atelier` REST API を公開したいと思います。
そのようにしたいと思う理由は、次のようにさまざまです。
* 負荷分散により、サーバー間でワークロードを分散する。
* ブルーグリーンデプロイの実践。片方を「本番用」、もう片方を「開発用」とする 2 台のサーバーを用意し、それらを切り替えられるようにする。
* カナリアデプロイの実践。1 台のサーバーでのみ新しいバージョンを公開し、クライアントの 1 %をそこに移動する。
* 高可用性構成の実現。
* その他。
しかし、いずれの場合も実行する必要のある手順は同じようなものです。
### **前提条件**
* 2 つの InterSystems IRIS インスタンス
* InterSystems API Management インスタンス
### **作業開始**
必要な作業を以下に掲載します。
**1. アップストリームの作成**
アップストリームは仮想ホスト名を表し、複数のサービス(ターゲット)で着信リクエストの負荷を分散するために使用されます。 例えば、`service.v1.xyz` という名前のアップストリームはホストが `service.v1.xyz` であるサービスのリクエストを受け付けます。 このサービスのリクエストは、アップストリーム内で定義されたターゲットにプロキシされます。
アップストリームには、リクエストを処理する能力の有無に基づいてターゲットを有効または無効にできるヘルスチェッカーも含まれています。
はじめに、次の手順を実行します。
* IAM 管理ポータルを開く
* ワークスペースに移動する
* ワークスペースを選択する
* アップストリームを開く
* [New Upstream] ボタンをクリックする
[New Upstream] ボタンをクリックすると、アップストリームに関する基本情報を入力できるフォームが表示されます(他にも多くのプロパティがあります)。
_name_ にサービスが使用する仮想ホスト名を入力します。 この値は DNS レコードとは無関係です。 混乱を避けるために、存在しない値に設定することをお勧めします。 残りのプロパティについて確認したい場合は、[ドキュメントを参照してください](https://docs.intersystems.com/irislatest/csp/docbook/apimgr/1.0.x/admin-api.html#upstream-object)。 スクリーンショットでは、新しいアップストリームに `myupstream` という仮の名前を付けています。
**2. ターゲットの作成**
ターゲットは、リクエストを実行して結果をクライアントに送り返すバックエンドサーバーです。 アップストリームに移動し、作成したアップストリーム名をクリックします([Update] ボタンではありません)。
既存のすべてのターゲット(現時点では存在しません)と [New Target] ボタンが表示されます。 このボタンを押します。
そして、新しいフォームでターゲットを定義します。 ここで使用できるパラメーターは次の 2 つだけです。
* target - バックエンドサーバーのホストとポート
* weight - このサーバーに与えられた相対的な優先度(wight の値が大きいほど、より多くのリクエストがこのターゲットに送信されます)
ここでは次のように 2 つのターゲットを追加しました。
**3. サービスの作成**
アップストリームを作成しましたので、今度はそのアップストリームにリクエストを送信する必要があります。 そのためにはサービスを使用します。
サービスエンティティは、その名前が示すように各アップストリームサービスを抽象化したものです。 サービスの例としては、データ変換、
マイクロサービス、課金 API などがあります。
IRIS インスタンスをターゲットとするサービスを作成してみましょう。[Service] に移動し、[New Service] ボタンを押します。
次の値を設定します。
| フィールド | 値 | 説明 |
| -------- | ------------ | ------------ |
| name | myservice | このサービスの論理名 |
| host | myupstream | アップストリーム名 |
| path | /api/atelier | 提供したいルートパス |
| protocol | http | サポートしたいプロトコル |
上記以外はデフォルト値のままにしてください(port: 80 を含みます)。
作成したサービスは、サービスのリストに表示されます。 サービスの id をどこかにコピーしておいてください。後で必要になります。
**4. ルートの作成**
ルートは、クライアントのリクエストに一致するルールを定義します。 各ルートはサービスに関連付けられ、サービスには複数のルートを関連付けることができます。
特定のルートに一致するすべてのリクエストは、関連するサービスにプロキシされます。
ルートとサービスを組み合わせる(およびそれらの関係を分離する)ことで強力なルーティング機構を実現し、インフラストラクチャのさまざまなアップストリームサービスにつながる IAM できめ細かなエントリポイントを定義することができます。
それでは、ルートを作成しましょう。 [Routes] に移動し、[New Route] ボタンを押します。
ルートの作成フォームで次の値を設定します。
| フィールド | 値 | 説明 |
| -------- | ------------ | ------------ |
| path | /api/atelier | 提供したいルートパス |
| protocol | http | サポートしたいプロトコル |
| service.id | 3のguid | サービス id の値(前のステップの guid) |
以上です!
`http://localhost:8000/api/atelier/`(最後のスラッシュに注意)に送信されたリクエストは、2 つのバックエンドのいずれかによって処理されます。
### **まとめ**
IAM は詳細にカスタマイズ可能な API 管理インフラストラクチャを提供し、開発者と管理者が API を制御できるようにします。
### **リンク**
* [ドキュメント](https://docs.intersystems.com/irislatest/csp/docbook/apimgr/index.html)
* [IAM のアナウンス](https://community.intersystems.com/post/announcing-release-intersystems-api-manager)
* [IAM を取り扱った記事](https://community.intersystems.com/post/introducing-intersystems-api-manager)
### **質問**
IAM を使用してどのような機能を実現してほしいですか?
お知らせ
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構成例
皆様のご参加をお待ちしております。