0 フォロワー · 72 投稿

初心者タグは、InterSystemsのデータプラットフォームを使い始めた人のための記事と質問をまとめたものです。

記事 Mihoko Iijima · 11月 20, 2020 3m read

これはInterSystems FAQ サイトの記事です。

(2025/2/17更新)担当される役割や学習目的に合わせた最適なラーニングパス(学習経路)を確認できるページ :InterSystems ラーニングパス をご利用ください(ページの使い方については、記事「学習目的に合わせた最適なラーニングパス(学習経路)を確認できるページ」をご参照ください)。

また、現在ご覧いただいている開発者コミュニティの中では、初心者(beginner)タグ があり、下記セルフラーニング用資料/ビデオをご用意しています。ぜひご参照ください。

セルフラーニングビデオ以外にも、過去に開催したウェビナーアーカイブビデオも公開しています👉「開発者向けウェビナー:アーカイブビデオ一覧

ぜひご参照ください。

0
1 616
記事 Mihoko Iijima · 10月 16, 2025 1m read

開発者の皆さん、こんにちは!

この記事では、Developer Hub にまたまた新チュートリアル:InterSystems IRIS for Health:デジタルヘルスの相互運用性 が追加されましたので、体験内容についてご紹介します。(準備不要でブラウザがあれば試せるチュートリアルです!)

チュートリアルでは、InterSystems IRIS for Health を使用しているのですが、IRIS for Health の持つ機能により以下のような相互運用性シナリオを作成できます。

  • HL7、CDA、FHIR、DICOM のデータルーティングを管理
  • HL7 から FHIR への変換、CDA から HL7 への変換、FHIR から CDA への変換
  • 異なるシステムと API との間のデータフローを確立

チュートリアルの中では、あるシステムから入力される HL7 メッセージを他のシステムに送信する流れをご体験いただけます。

また、データ変換が必要な場合の対応方法や HL7 メッセージの一部をテーブルに保存する流れなどもご体験いただけます。

例)HL7 メッセージの一部をテーブルに格納

アカウント作成やログインも不要で  ボタンをクリックするだけで始められます👍

ぜひ、お試しください!​​​​​​

0
0 20
記事 Mihoko Iijima · 10月 9, 2025 1m read

開発者の皆さん、こんにちは!

この記事では、Developer Hub にあるチュートリアルに新しいチュートリアル:InterSystems IRIS ベクトル検索を使用した RAG が追加されましたので内容をご紹介します。(準備不要でブラウザがあれば試せるチュートリアルです!)

このチュートリアルでは、生成 AI アプリケーションの精度向上に向けて、ベクトル検索と検索拡張生成(Retrieval Augmented Generation)の活用を体験できます。

具体的には、InterSystems IRIS のベクトル検索機能を活用し、生成 AI チャットボット向けのナレッジベースをサンプルコードを利用して作成します。

また、Streamlit を使用して作成したチャットボットを動かしながら、ナレッジベースの情報を追加することで生成 AI からの回答が変化していくことを確認していきます。

アカウント作成やログインも不要で  ボタンをクリックするだけで始められます👍

チュートリアルへのリンクは「開発者コミュニティのリソース」からも辿れます!

ぜひ、お試しください!​​​​​​

0
0 33
お知らせ Mihoko Iijima · 2月 17, 2025

皆さん、こんにちは!

これから InterSystems 製品で開発を始める/未使用の機能を確認したい/運用保守を担当する  など、担当される役割や学習目的に合わせた最適なラーニングパス(学習経路)を確認できるページを公開しました!

💡InterSystems ラーニングパス💡

学習経路に沿った学習内容(数分の解説ビデオ、対象となる日本語ドキュメント、コミュニティ記事、セルフラーニングビデオ、体験環境付き演習(英語のみ)、オンラインラーニング(英語のみ)、講師付きトレーニングコース)を確認しながらご自身のペースで学習を進めていただくことができます。

以下、ページの使い方を簡単にご紹介します。下図のように、役割毎に各種パスが用意されています。

0
1 80
記事 Mihoko Iijima · 12月 7, 2022 2m read

開発者の皆さん、こんにちは!

InterSystems全製品のサーバ側コードで利用できる「ObjectScript」の基本の使い方から、困ったときのヒント集、エラーの読み方など、日本語ドキュメントの逆引きになるようなページを目指して、「ObjectScriptクックブック」を作成しました!

ObjectScriptの基本の「き」

Hello Worldの出力から始めたい方に最適です。

2024/3/25更新:8. デバッグ方法 を追加しました。ぜひご参照ください。

CookBook(こんなときどうする?集)

ObjectScriptの記述に困ったときに読んでいただけるヒント集です。コミュニティに寄せられたご質問をどんどん掲載していきます。

ObjectScriptでエラーが発生したら

ObjectScriptのプログラムでエラーが発生したときのエラーメッセージの読み方から、エラー情報の取得方法などを解説しています。

1
0 413
記事 Mihoko Iijima · 10月 22, 2020 11m read

皆さんこんにちは!Virtual Summit ご覧いただけていますでしょうか。

Virtual Summit で VSCode ObjectScript 用エクステンションバージョン1.0 のリリースが👏正式発表👏されましたので、さっそく利用方法を投稿してみました。

来週の技術セッションではさらに詳しい説明があると思いますので、ご登録がまだの方は、ぜひご登録ください!
(ご登録いただくとオンデマンド配信でいつでもセッションのビデオを視聴できます。機械翻訳ではありますがビデオには日本語字幕が付いています。)

この記事では、以下の操作方法をご紹介します。

  1. ObjectScript用エクステンションのインストール方法
  2. サーバへ接続する 👉《2025/8/7:更新》GUI を使って接続情報を作成できる図解を追加しています
  3. クラス定義を作ってみる
  4. ルーチンを作ってみる
  5. デバッグを実行してみる 👉《2024/1/17:更新》最新のObjectScriptエクステンションに合わせて内容を更新しました。
  6. Webサーバ使用時:デバッグの注意点 👉《2024/1/17追加》プライベートWebサーバではない通常のWebサーバを使用する場合の注意点を追加しました。

操作前の準備

VSCodeのインストール を行います。

1
1 4042
記事 Mihoko Iijima · 10月 3, 2023 4m read

開発者の皆さん、こんにちは!

この記事では、Muhammad Waseem さんが(US開発者コミュニティに)投稿された「SQLのスキルを次のレベルに引き上げることのできる5つの便利なSQL関数」の記事についてご紹介します。

✅ SQLに関わらず、IRIS/Caché全般で日頃利用されている便利な機能、使い方、関数などなどありましたら、ぜひコミュニティで共有いただければと思います。

✅ 現在「技術文書ライティングコンテスト」開催中です! 🎁 参加賞/特賞 🏆ありますので、ぜひチャレンジしてみてください!

以下、Muhammad さんの記事です。


この記事では、5つの便利なSQL関数の説明を実行例と共にご紹介します👇

  • COALESCE
  • RANK
  • DENSE_RANK
  • ROW_NUMBER
  • Function to Get Running Totals

まずは、COALESCE関数から始めてみましょう

0
0 639
記事 Mihoko Iijima · 6月 28, 2020 2m read

基本操作編ビデオシリーズ:その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)

2
0 1925
記事 Mihoko Iijima · 7月 14, 2023 4m read

開発者の皆さん、こんにちは!

InterSystems IRIS 、InterSystems IRIS for Healthのコミュニティエディションは、WindowsやLinuxにインストールするキットの他にコンテナ版も公開されています。

コンテナ版はダウンロードページからではなく、InterSystemsコンテナレジストリ よりpullいただけます。

この記事では、InterSystemsコンテナレジストリ の使い方と、コンテナ開始までの流れをご紹介します。

0
1 297
記事 Mihoko Iijima · 3月 28, 2021 4m read

皆さんこんにちは!

この記事でご紹介する「開発環境テンプレート」は、最近 医療 IT で注目を集めている 医療情報交換標準規格  FHIRを体験できるコンテナです。

一式は、こちら(https://github.com/Intersystems-jp/IRIS-FHIR-Oximeter-Template)で公開しています。

コンテナビルド時、InterSystems IRIS for Health コミュニティエディションを使用した FHIR R4 リソースリポジトリの用意と、REST 用エンドポイントが用意されます。

作成されるエンドポイントに対して、REST クライアントから直接 FHIR R4 リソースリポジトリへアクセスすることもできますし(使用例はこちらビデオの解説はこちら)、Patient リソースと Observation リソースの操作体験が行えるサンプル Web アプリケーション(使用例はこちらビデオの解説はこちら)もコンテナに含まれていますので、お好みの方法で操作を体験できます。

この開発環境テンプレートでは、さらに! FHIR  サーバーサイドアプリケーション(=プロダクション)のサンプルも用意しています(図例はこちら)。

プロダクションは、新生児につけたパルスオキシメーターの測定値が定期的に送信されてくることを仮定して作られています。

2
1 1704
記事 Toshihiko Minamoto · 6月 14, 2023 11m read

オンラインコース「Hands-On with InterSystems API Manager for Developers」のフィードバック 

Docker コンテナと REST API の基本的な知識で、InterSystems API Manager による API とマイクロサービスの制御に挑戦したいと思い、 ホストにローカルの IRIS インスタンス(Windows OS)を使用し、Linux VM で IAM (ゲスト)を実行するこのオンラインコースを実行してみました。 

まず InterSystems API Manger(IAM)を紹介してから、ローカル環境をセットアップするための手順を説明し、最後にコースの各章の内容を確認しましょう。

はじめに

今日では、API トラフィックの管理、監視、および保護が UI ポータルに集約される 簡単なデプロイのメリットを生かして、API を管理することが非常に重要となっています。

InterSystems API Manger(IAM)は、IRIS アプリケーションが消費し公開する API とマイクロサービスを制御します。 下流と上流のシステムの間の API ゲートウェイであり、どの API がどれくらいの頻度で誰に呼び出されたのかを視覚的に追跡する方法も備わっています。 

IAM を使用するメリット:

  • HTTP ベースの API の監視
  • トラフィックの制御 
  • セキュリティメカニズムによる API の保護 
  • 新しいオンボーディング開発者にとっての使いやすさ

IAM のセットアップ

IAM のセットアップを開始する前にインストールしたもの

  • Windows(IRIS インスタンスをインストール)
  • Linux VM(Docker をインストール)

InterSystems IRIS インスタンスで IAM を使用できるようにします。

  1. IRIS インスタンスの管理ポータルを開き、IAM を有効にします。

    1. 管理ポータルで、[システム管理]>[セキュリティ]>[ユーザー]を選択し、IAM ユーザーを選択します。 2. [パスワード]ラジオボタンをオンにします。 3. IAM ユーザーのパスワードを入力し、確認します。 4. [ユーザーを有効化済み]チェックボックスをオンにします。 5. [保存]を選択します。
  2. IAM Web アプリケーションを有効にします(IRIS ライセンスに「API Management」が指定されていることを確認してください)。 

    1. 管理ポータルで、[システム管理]>[セキュリティ]>[アプリケーション]>[Web アプリケーション]を選択し、"/api/iam" を選択します。  2. [アプリケーションを有効にする]チェックボックスをオンにします。 3. [保存]を選択します。

IAM インストールファイルをダウンロードして解凍します。

  1. Linux 環境内の WRC から IAM インストールキットをダウンロードします。
  2. tar ファイルを解凍します(iam-image.tar は IAM Docker イメージであるため、解凍しないでください)。

IAM のセットアップと起動 

このステップでは、ROOT ユーザーを使用しました。Linux ユーザーで sudo を使用すると、「Cannot load the Manager Potal properly(Manager Portal を正しく読み込めません)」というエラーが発生するか、セットアップスクリプトが環境変数値を docker-compose.yaml ファイルに渡せなかったためです。 後者の場合、"sudo -E" を使って環境変数を渡すと回避できました。

  1. IAM アーカイブを解凍したディクショナリで "docker load -i iam_image.tar" コマンドを実行してターミナルを開きます。
  2. 現在のディレクトリで "source ./scripts/iam-setup.sh" を実行するか、scripts フォルダで "source ./iam-setup.sh" を実行します。
    1. https://containers.intersystems.com/contents の正確な IAM イメージ名とリポジトリ名を入力します。例: intersystems/iam:3.0.2.0-2(このステップは必須です。これを実行しない場合、"docker compose" を行ったときにリポジトリの認証に失敗したというエラーメッセージが表示されます。)
    2. ホストマシンの正確な IP アドレスを入力します(IPV4 の仕様は Windows の設定で確認できます。localhost や 127.0.0.1 を入力しないでください)。  
    3. Windows OS の IRIS インスタンスのポート番号を入力します(例: 52773)。 
    4. IAM ユーザーのパスワードを 2 回入力します。
  3. scripts ディレクトリ内で、"iam-test.sh" を実行して、接続をテストしてください。
  4. scripts ディレクトリ内で、"docker compose up -d" を実行して IAM を起動します。
  5. 次のアドレスにアクセスし、Linux の IAM ポータルを起動します: http://localhost:8002/overview

VM を使ってホストアドレスを ping できない場合は、Windows ファイアウォールの詳細設定にある[受信の規則]を確認してください。 [ファイルとプリンタの共有(エコー要求 - ICMPv4-In)プロファイル: プライベート、パブリック]を有効にします。

IAM のテスト

インストールキットの scripts ディレクトリ内に iam-test.sh というスクリプトがあります。 

"./iam-test.sh" と入力して実行し、IAM と IRIS インスタンス間の接続のテストを開始します。 

注意: テスト結果に「サービスを作成中にエラーが発生しました。 HTTP ステータスコード:000 またはサービス作成中のエラー。 HTTP ステータスコード:409」が表示された場合は、Docker のステータスを確認してください。健全であるにも関わらず、動作しない場合は、コンテナをシャットダウンし、もう一度 docker compose を実行してください。私の経験では、VM を一時停止すると、これが発生することがあります。

詳細については、こちらの IAM セットアップドキュメントをご覧ください: https://docs.intersystems.com/components/csp/docbook/DocBook.UI.Page.cls?KEY=CIAM3.0_install#CIAM3.0_install_setupIAM

ハンズオン演習: https://learning.intersystems.com/course/view.php?name=IAMExercise

コースの各章

この演習の後に 3 つの章を完了したので、その内容を共有したいと思います。

  • サービスのセットアップ
  • ルートのセットアップ
  • コンシューマーとプラグインの設定

IAM を使用し始める前、この演習では GET メソッドを使って REST リクエストを行うことが求められていました。この HTTP リクエストはクライアントサーバーからのもので、IRIS インスタンスにビルドされた Web アプリケーションを直接エンドポイントとしてポイントしています。 

次のステップでは、API リクエストが転送されるサービスと着信リクエストを分析して最適な API に割り当てるルートのセットアップ方法が説明されていました。

サービスとルーターのセットアップ

サービスとは? 

サービスは、API Manager を InterSystems IRIS に接続するように構成されます。そのため通常は、InterSystems IRIS 内の REST サービスまたは Web アプリケーションごとに、サービスは 1 つです。 たとえば、ベースパスが /rest/coffeemakerapp の Web アプリケーションがある場合、この URL に対し、API Manager 内で 1 つのサービスを構成します。 サービスは通常、ルートの前に定義されます。

ルートとは?

ルートは、クライアントアプリケーションが InterSystems API Manger に対して呼び出すものを定義します。 インターフェースを使用すると、定義されたサービスからそれに対応するルートが簡単に作成されるようになっているため、通常は、ルートの前にサービスを定義します。 ルートは一般に、InterSystems IRIS 内のパスを単純化したものです。 次の例では、 /test、/coffeemakers、/coffeemaker、および /newcoffeemaker のルートを作成します。 ルートが具体的であるほど、メトリックの表示と特定のルートへのプラグインの追加において、API Manager 内で API をより細かく制御できます。

サービスを作成する:

  1. IAM 管理ポータルに移動し、[サービス]タブを選択します。
  2. [新しいサービス]をクリックして名前を付けます。
  3. [URL を使用して追加]を選択します。
  4. Web アプリケーションに指定した正確な URL パスを[ベース URL]に指定し、インスタンスの IP アドレスが正しいことを再確認します(localhost または 127.0.0.1 を使用しないでください)。

ルートを作成する:

  1. サービスの要約まで下にスクロールし、[ルートを追加]をクリックしアンス。
  2. [名前]、[プロトコル」、[パス]を指定します。
  3. [サービス]フィールドに、サービスの詳細が自動的に生成されます。
  4. この演習では、[詳細]フィールドの[パスをストリップ]をオフにするように求められました。オンである場合、InterSystems IRIS にリクエストを送信する際に、InterSystems IRIS エンドポイントに接続するために重要となるパスが削除されてしまいます。

サービスとルートが作成されたら、Postman などの REST クライアントを使用して、直接 IAM にリクエストを送信し、「200 ok」のレスポンスを受信することができます。例: GET http://10.0.0.1:8000/test(/test は作成されたルートです。)

注意: 私の場合、HTTP リクエストの URL は Linux VM の IP アドレスと一致していますが、この IP アドレスは[設定]> [ネットワーク]で確認するか、ターミナルで "ifconfig" コマンドを実行して調べてください。 

IAM 管理ポータルを開いてリクエストを確認すると、すべての coffeemakers が REST クライアントから IAM に正しく記録されているのがわかります。

HTTP リクエストを直接 IRIS Web アプリケーションに送信するのではなく、基本的な CRUD リクエストであっても、IAM を使用すると、視覚的な表現によって API を制御し、エンドポイントのセキュリティを維持することができます。

プラグインの使用

IAM を使用するメリットの 1 つに、スロットリングに役立つレート制限プラグイン、ACL プラグイン、OAuth2.0 プラグインなど、多数のプラグインの存在が挙げられます。 個人的なケースとして、basic-auth の有効化とコンシューマーの作成における体験を紹介します。

basic-auth プラグインを有効にする

  1. IAM 管理ポータルに移動し、[プラグイン]タブを選択します。
  2. [新しいプラグイン]>[基本認証]>[作成]をクリックします。

Basic Auth に必要な IRIS ユーザーを作成する 

  1. IRIS 管理ポータルを開きます。 
  2. [システム管理]>[セキュリティ]>[ユーザー]>[新規ユーザーの作成]に移動します。
  3. ユーザーの名前とパスワードを設定します。
  4. 他は空のままにして、[保存]をクリックします。私の場合は "CoffeeManager" というユーザーを作成しました。

コンシューマーを作成して、資格情報をセットアップする

  1. IAM 管理ポータルに移動し、[コンシューマー]タブを選択します。
  2. [新しいコンシューマー]をクリックし、[ユーザー名]に「CoffeeManger」(私の場合)と入力して、[作成]をクリックします。
  3. CoffeeManager 情報ページ >[資格情報]>[新しい Basic Auth 資格情報]に移動します。
  4. IRIS インスタンスで作成したユーザー資格情報を使用し、保存します。

これで、basic-auth プラグインを機能させるための要件がすべて揃いました。

前のステップで作成した "CoffeeManager" の資格情報で Basic Auth を使って、HTTP リクエストを送信します。 

CoffeeManager 情報ページ >[アクティビティ]に移動すると、リクエストが成功したことが記録されていることを確認できます。

まとめ

まとめると、InterSystems API Manager(IAM)とは何か、またそのメリットを最初に紹介しました。 続いて、Linux VM で IAM をセットアップする方法と基本機能を実装して IAM を使用する方法を示し、サービスとルートの作成、プラグインとコンシューマーの有効化を行いました。

ご質問やコメントがございましたら、お気軽にご連絡ください。

IAM をお楽しみください!

0
0 106
記事 Mihoko Iijima · 6月 1, 2023 21m read

開発者の皆さん、こんにちは!

この記事では、システム連携の自動的な流れの中にユーザからの指示を介入できる「ワークフローコンポーネント」のサンプル でご紹介した内容を、お手元のIRIS、IRIS for Healthを利用して体験いただくための手順を解説します。

なお、ワークフローコンポーネントでどんなことができるのか?の概要説明については、ウェビナーをご参照ください。

A.事前準備

1) InterSystems IRIS または、IRIS for Healthのインストール環境をご用意ください。

まだインストール環境がない場合は、コミュニティエディション(コンテナ版かキット版)をご利用ください。

0
0 390
記事 Mihoko Iijima · 3月 28, 2023 3m read

開発者の皆さん、こんにちは。

前の記事では「機械学習を試せるチュートリアル:IntegratedML」で試せる内容をご紹介しましたが、この記事では Interoperability(相互運用性)チュートリアル の内容を少しご紹介します。

Interoperability(相互運用性)チュートリアルでは、Redditに新しく投稿された記事=(https://www.reddit.com/new/)を一定間隔で取得し、全投稿の中から「猫(cat)」🐈について記載されている情報のみを抽出し、対象記事をファイル出力する流れをご体験いただけます。

0
0 340
記事 Mihoko Iijima · 3月 9, 2023 2m read

開発者の皆さん、こんにちは!

前の記事では、開発者向け情報を集めた「Developer Hub」をご紹介しましたが、この記事では Developer Hub のチュートリアルの中から「機械学習」をテーマとしたチュートリアル:IntegratedML についてご紹介します

 InterSystems IRISには、機械学習を行うために必要なプロセスのいくつかを自動化するAutoMLの機能が組み込まれていて、機能名として「IntegratedML」と呼んでいます。機能概要については、末尾のビデオをご参照さい。

チュートリアルを始めるための準備は不要で、 ボタンをクリックするだけでチュートリアルを開始できます。

0
0 209
記事 Mihoko Iijima · 2月 21, 2023 3m read

開発者の皆さん、こんにちは!

開発者向け情報を集めた「Developer Hub」ページが新たに登場しました!

(2025/10/9更新: 新たなチュートリアルが加わりましたので情報更新しました。)

このページには、5種類のチュートリアルが用意されています。チュートリアはブラウザ上で動作し、VSCodeやIRISターミナル、管理ポータルなどチュートリアルで使用するすべての画面が1つのタブ内で開くようになっています。

チュートリアルを試すための事前準備は不要で、クリック1回ですぐにお試しいただけます!(ユーザ登録も不要です)(チュートリアル開始方法は、ページ末尾をご覧ください。)

0
0 335
記事 Toshihiko Minamoto · 1月 29, 2023 1m read

数ヶ国語を知っていて、世界のさまざまな地域のユーザーと知識を共有したいとお考えですか?

でしたら、今こそあなたが輝く時です 🤩

開発者コミュニティでは、あなたのオリジナル記事とその翻訳を簡単にリンクさせることができます(翻訳を依頼することも可能です)

ではどのように翻訳記事を作成するのか説明しましょう。

0
0 128
お知らせ Mihoko Iijima · 11月 10, 2022

開発者の皆さん、こんにちは!

開発者コミュニティのYouTubeプレイリストにEmbedded Pythonの新しいセルフラーニングビデオを公開しましたのでお知らせします📣!

◆ Embedded Pythonでデータベースプログラミング:オブジェクトアクセス編

※YouTubeに移動していただくとプレイリストの中から好きなビデオを選択してご覧いただけます。

0
0 142
お知らせ Mihoko Iijima · 11月 9, 2022

開発者の皆さん、こんにちは!

InterSystems IRIS と InterSystems IRIS for Health のコミュニティエディションですが、InterSystems IRIS ダウンロードページからお好みのプラットフォームのキットを自由にダウンロードいただけます。

この記事では、改めてダウンロードページの使い方をご紹介いたします!

 👈開発者コミュニティのページの左端にこんなリンク集がありますので、「InterSystems IRIS ダウンロードページ」をクリックします。

クリック後、ログイン画面が表示されます。

開発者コミュニティのアカウントか、WRCダイレクトのアカウントでログインします。

開発者コミュニティのアカウントはオンラインラーニングのアカウントと共通です。

アカウントをお持ちでない方は、「Register for a new account」のリンクからアカウント登録をお願いします。

0
0 1045
お知らせ Mihoko Iijima · 11月 7, 2022

開発者の皆さん、こんにちは!

開発者コミュニティのYouTubeプレイリストに新しいセルフラーニングビデオを公開しましたのでお知らせします📣!

◆ IRISでPythonを使ってみよう!

※YouTubeに移動していただくとプレイリストの中から好きなビデオを選択してご覧いただけます。

0
0 238
記事 Toshihiko Minamoto · 10月 5, 2022 5m read

開発者の皆さん
こんにちは。
 

誰かのヘルプが必要だったり、興味のある機能を議論したり、みんなにアナウンスしたり、知識を共有したりしませんか?
この記事ではそのすべての方法について説明します。

より簡単に投稿方法にたどり着くために以下の項目を用意しました。

一般的なガイドライン

最初に、開発者コミュニティサイトのトップメニューにある「新しい投稿」ボタンをクリックします。

その後、質問やアナウンス、記事、議論の作成が選択できるエディタが表示されます。投稿の種類に応じて必須項目と任意項目が表示されます。

0
0 140
記事 Mihoko Iijima · 6月 28, 2022 5m read

開発者の皆さん、こんにちは!

この記事では、Embedded Pythonをご自身の好きなタイミングで学習できる📚セルフラーニングビデオ📚の YouTube プレイリストをご紹介します!

👆こんな具合に👆学習内容別 Embedded Python セルフラーニングビデオを公開しています!

この記事では、これから Embedded Python でプログラミングを開始してみたい方向けに最適なビデオをご紹介します!
​​​​​​

◆ Embedded Python概要から学習を始めたい方はこちら👇

以下の内容を確認できるプレイリスト:1-Embedded Python概要編 - YouTube をご用意しています。

  • Embedded Pythonとは?
  • Python開発者から見た使い道(解説&実演)
  • IRIS開発者からみた使い道(解説&実演)

この後、実際の操作を試されたい場合は、次のプレイリスト:2-Embedded Python利用前の準備 - YouTube が最適です。

◆ Embedded Python利用前の準備 を知りたい方はこちら👇

操作を開始する前に、必要な利用前の準備についてご紹介しているプレイリスト:2-Embedded Python利用前の準備 - YouTube をご用意しています。

0
0 803
記事 Mihoko Iijima · 6月 28, 2020 1m read

Python から InterSystems IRIS へ接続する方法の1つである「PyODBC」(※)の利用方法をご説明します。

※ Python からのアクセスは、PyODBCの他に、Native API を利用した接続方法もあります。Native APIを利用してIRISのグローバル変数にアクセスする方法については、別の記事でご説明します。

もくじ

最初~0:52 復習ビデオ/関連ビデオについて (セルフラーニングビデオの索引記事もご参照ください)

0:52~2:04 今回の説明内容解説

2:05~3:44 PyODBCについてと準備

PyODBCのGitHub

3:43~5:25 IRISに接続する

5:25~7:55 CREATE TABLEの実行

7:55~10:16 INSERTの実行

10:16~14:04 SELECTの実行

14:04~最後まで まとめ

※ YouTubeでご覧いただくと、「もくじ」の秒数クリックでビデオをジャンプできます。

サンプルコード(Git)

HelloWorldPyODBC.ipynb

4
0 889
お知らせ Mihoko Iijima · 6月 6, 2022

開発者のみなさん、こんにちは!

前回のウェビナー開催から少し時間がたってしまいましたが、2022年06月28日 (火曜日) 12時半~ 30分程度のウェビナーを開催します!

今回は、新たに開講する「Embedded Python トレーニングコース」の内容をご紹介するウェビナーです。

新規開講コースでは、

  • Python開発者からみた Embedded Python でできること
  • IRIS開発者からみた Embedded Python でできること

を実際の操作を通してご理解いただけるよう、コースを3種類に分けております。

ウェビナーでは、

  •  Embedded Python とは?
  •  Embedded Python でできること
  •  新規開講コース(3種類)内容ご紹介

について、ご説明いたします。

まだ、インターシステムズ製品を使ったことがない!という方でもご参加いただけます。

特に、以下内容についてご興味をお持ちの方々にお勧めするウェビナーです。

  • Pythonに興味がある
  • Pythonの便利さを体験してみたい
  • Pythonでデータベースプログラミングをしてみたい

お申し込みは👉 こちらから!

皆様のご参加、心よりお待ち申し上げておりますlaugh

0
0 142
記事 Toshihiko Minamoto · 4月 19, 2022 9m read

Raspberry を FHIRserver として実行する

一年ほど前、
Raspberry Pi での HAPI FHIRserver のインストールに関する記事を書きました。 当時、FHIR 標準の基本しか知らず、FHIR サーバーの背後にあるテクノロジーや Raspberry についてほとんど知りませんした。 試して、失敗して、諦めて、もう一度試すことで、たくさんのことを学びました。1 年以上が経ち、いまだに「忍耐力に長けるアマチュア」ではありますが、その間、FHIR のフル環境を Raspberry で構築し、HTML/JavaScript/jQuery/Bootstrap によるアプリケーションや PHP アプリケーションを多数作成してきました。 Raspberry の認証サーバーや承認サーバーについてもいくらか経験し、SMART on FHIRを使った実験も行いました。

最後の機能しなかったバージョンと、明らかに私が作成した成功バージョンの違いが判らないまま動作することもありましたが、作業や実験のほとんどは動作しました。 今でも驚いています。 振り返ると、システム開発について適切に学習しておくべきだったと思います(私は山林学専攻で卒業し、現在はその分野を中心にボランティア活動を行っています。 まぁ、本題からは外れてしまいますが)。

Raspberry Pi は実験には十分ですが、本稼働には適していないことに注意してください。 したがって、信頼性、継続性、セキュリティ、プライバシーといった要素が必要である、または期待されているヘルスケアなどの分野で、Raspberry を本稼働システムとして使用しないでください。 実験目的では完璧で安価なコンピュータであり、幾度も私の期待を超えていますが、「産業耐久性」に欠けています。

InterSystems FHIRserver

入手しやすさと、非常に早い段階で結果を得られたことを理由に、当時 HAPI FHIR を選択しました。 以前の同僚で、現在では InterSystems に勤めている人から、InterSystems の FHIRserver でも試用することをすでに提案されていました。

InterSystems については非常によく知っており(というより、「i.know」と言うべきでしょうか 😉)、面白そうに思えましたが、当時、一年以上前は、ARM プロセッサ向けに適したバージョンの Iris は存在していませんでした(Raspberry は ARM で動作します)。 それとは別に、Iris の Community バージョンは Docker コンテナとして配布されていましたが、私には Docker に関する知識がまったくありませんでした。

Raspbian から Ubuntu へ

それから 1 年が過ぎました。 現在では、さらに強力になった新しい Raspberry Pi が登場しています(在庫のある限り…)。 新しい Raspberry 4 は、Raspberry 3 と同様に、64 ビット Unix をサポートしています。 IRIS Community バージョンは ARM にも対応しており、コンテナと Docker についてもいくらかさらに学習しました。

こういった改善すべてを基に、昨年の年末にオランダで施行されたわけのわからない「ロックダウン」が、IRIS Community バージョンを Raspberry Pi で実行させる新しい実験を開始するチャンスとなりました。

振り返ると、これは非常に簡単なことでした。 実際、注意すべき点は 3 つしかありません。

  1. 64 ビットをサポートする Raspberry が必要です。 つまり、Raspberry 3 または 4 が必要となります。
  2. (64 ビット)Raspbian ではうまくいきませんでした(ちなみに非常に新しいものです)。 しかし、64 ビット Ubuntu では成功しました。
  3. InterSystems FHIRserver は、HAPI FHIRserver よりも FHIR 呼び出しに関して厳格さが増しているようです。 これについては別の機会に説明しますが、これを悪いことだとは思っていません。 (ヘルス)ケア環境における中央リポジトリであるため、標準について厳格である必要があるためです。そうでなければ、「ガベージイン・ガベージアウト」になってしまうでしょう。

それでも、HAPI FHIRserver でうまく実行していたアプリケーションが IRIS では失敗することを理解するのには、いくらか時間がかかりました。 ネタバレ注意: 問題は私のアプリケーションにありました。

それにしても、Raspberry Pi のような、100 ユーロもかからない小さなコンピュータで、InterSystems IRIS フルプラットフォームが実行し、管理ポータル、Ensemble、Caché、そして FHIRserver が備わっているのを目の当たりにするのは、楽しく本当に価値以上の価値があります。

以降では、そこに至るまでに私が行ったことを、順を追って説明します。 Ubuntu の歴史、Docker の背後の意ある哲学など、長々とした話にはなりません。 そちらの方に関心のある方は、インターネットをご覧ください。 ここでは「楽しく進められるフロー」に焦点を当て、どこで初めて間違ったのかについて言及する場合にのみ、注釈したいと思います。

InterSystems FHIRserver のインストール

フェーズ 1: Ubuntu 64 ビット

  1. _SD カードをフォーマット_し、そこに ARM プロセッサ用 64 ビット Ubuntu を配置します。 私の場合、圧縮バージョンの名前は「ubuntu-20.04.3-preinstalled-server-arm64+raspi.img.xz」でした。これは http://cdimage.ubuntu.com にあります。 (もちろん、SD カードに置く前に、.img ファイルを解凍する必要があります!)

RaspberryPi-imager は、誤ったバージョンを提供するため、使用しないでください。 私は Win32DiskImager を使用しました。

  1. _新しいイメージで Raspberry を開始_します。 ubuntu-account のパスワードを変更します(そして記憶しましょう!)。 あくまでも ubuntu-account のパスワードです。

  2. この時点で Raspberry は Ubuntu で実行していますが、まだ準備はできていません

以下を見てください。

この Ubuntu-version はまだ 32 ビットになっています!

今すぐこれを直しましょう。

  1. Pi にログインします。

  2. sudo rpi-update

  3. sudo reboot now

  4. sudo copy /boot/config.txt /boot/config-ok.txt(検出したエラーを逃してしまった場合に備えます)

  5. sudo nano /boot/config.txt   [pi4] の下に次のテキストを追加します: arm_64bit=1

  6. boot/config.txt を保存します。(nano で: <ctrl>O )

  7. nano を終了します。(<ctrl>X)

  8. sudo reboot now

これで、64 ビットで実行するようになりました。 自分で確認してみましょう:

Pi のIP アドレスをメモし(sudo hostname -I。I は大文字のアイです)、Ubuntu では SSH はデフォルトで有効になっているため、別の場所に保管しておきます。

フェーズ 2: Docker

  1. sudo curl -fsSL https://get.docker.com -o get-docker.sh

  2. sudo sh get-docker.sh 

しばらくすると、これは、「non-priviledged user」として使用することに関する Docker の詳細な通知が得られます。

  1. sudo usermod -aG docker $USER

  2. ログオフしてから、もう一度ログインします。

  3. docker container run hello-world

Docker はシステム上の「hello-world」イメージを探すようになりました。 見つからない場合は、Docker リポジトリからダウンロードします。 その後、Docker はイメージを Pi 上のコンテナに配置し、「hello-world」イメージを開始します。

Docker の別のテキストブロックで、「Hello from Docker」のウェルカムメッセージと共に確認できます。

フェーズ 3: InterSystems の IRIS FHIRserver の Docker イメージ

1.  以下のコマンドを一度に発行します。

sudo docker run --name my-iris -d --publish 9091:1972 --publish 9092:52773 containers.intersystems.com/intersystems/irishealth-community-arm64

多数のイベントが順に発生します。

  • Docker は Irishealthから「community edition」を取得し、それをローカルの Docker リポジトリに配置します。
  • Docker は「my-iris」という Docker コンテナで Community エディションを起動します。
  • Docker はコンテナで実行している IRIS のポート 1972 を Raspberry のポート 9091 にマッピングします。
  • 同じパターンに従って、IRIS のポート 52773(コンテナ内)は Raspberry のポート 9092 になります。

以下のようにすると、何が起きたのかを確認できます。

  1. sudo docker container ls  ただし、これを確認するには別のはるかに印象的な方法があります。

フェーズ 4: InterSystems IRIS for Health Fhirserver の起動

ネットワークで Web ブラウザを起動します。英語版 PC の場合は次の場所に移動してください。

    _ <Raspberry の IP アドレス>:9092/csp/sys/UtilHome.csp .

IRIShealth の管理ポータルが表示されます。 このポータルは、自動的にPC の言語設定に調整されます。

標準アカウントは _SYSTEM(先頭のアンダースコアを含む)で、初回パスワードは SYS(アンダースコアはありません)です。 IRIS からすぐにパスワードを変更するように求められます。

これで、次に記載されている指示に従って IRIS for Health FHIRserver を構成し、起動できるようになりました。https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI.Page.cls?KEY=HXFHIR_server_install

「Foundation」を構成して「Endpoint」(FHIR 3 または 4)を定義する必要があります。

「Endpoint」は、FHIRserver にアクセスできる URI となります。 私の場合は、http://192.168.1.29:9092/csp/healthshare/fhironpi/fhir/r4/Patient にある「Patient」リソースです(外部からはアクセスできません!)。

まとめ

手間を取る価値があったでしょうか? そのとおり!それ以上の価値があります。 まず、それほどの手間はありませんでした。 Raspbian ではうまくいきませんでしたが、それは簡単に解決しました。 そして、IRIS-for-health プラットフォームを Raspberry Pi のようなデバイスで実行できるのは素晴らしいことです。 ダッシュボード(DeepSee)、データ変換ツール、Ensemble(Enterprise Service Bus とその他多数のツール)、CSP ページ、および Caché(多次元データベース)すべてを実験できるようですし、自然言語処理の I.know も管理ポータルに表示されています。 IRIS-for-health プラットフォームには、FHIRserver 単体よりもはるかに多くの機能が備わっており、1 つの記事ではとても説明しきれません。

私個人としては、ほぼリリース直後から Ensemble を使用してきましたし(アーキテクトとして)、それとは別に、IRIS-for-health の起源は 20 世紀後半だったため、思い入れがあります。 ヘルスケアアプリケーション向け MUMPS 開発環境(MUMPS/マンプス: マサチューセッツ総合病院ユーティリティマルチプログラミングシステム)は、ほとんどが Digital Corp の Vax コンピュータシステムで実行されていたのですが、私の IT キャリアが始まったのも同時期なのです。

MUMPS、Caché、Ensemble、そして今日には IRIS-for-Health プラットフォームの安定性は非常に高く、必要なサポートとメンテナンスは比較的控え目です。 InterSystems 製品のドキュメントは広範に用意されており、簡単に見つけることができます。

IRIS と FHIRserver での実験をさらに続ていく予定です。最低でも後 1 つ、FHIR 標準への厳格な準拠に対する私の「奮闘」に関する記事を絶対に公開いたします!

健康を大切に、思考を繰り返して、実験し続けましょう! Bob

0
0 301
記事 Mihoko Iijima · 2月 4, 2022 7m read

開発者の皆さん、Python好きの皆さん、こんにちは!

ドキュメントをみながら IRIS 2021.2 に追加された Embedded Python を試してみました!

IRIS にログインしてるのに Pythonシェルに切り替えできて Python のコードが書けたり、Python で import iris するだけで SQL を実行できたりグローバルを操作できるので、おぉ!✨という感じです。

ぜひ、みなさんも体感してみてください!

では早速。

まず、IRISにログインします。Windows ならターミナルを開きます。Windows 以外は以下実行します。

IRIS のインストール方法を確認されたい方は、【はじめての InterSystems IRIS】セルフラーニングビデオ:基本その1:InterSystems IRIS Community Edition をインストールしてみよう!をチェックしてみてください!

iris session iris
0
1 838
記事 Toshihiko Minamoto · 11月 25, 2021 17m read

キーワード:   Jupyterノートブック、TensorFlow GPU、Keras、ディープラーニング、MLP、HealthShare    

1. 目的

前回の「パート1」では、ディープラーニングデモ環境をセットアップしました。今回「パート2」では、それを使ってできることをテストします。

私と同年代の人の中には、古典的なMLP(多層パーセプトロン)モデルから始めた人がたくさんいます。 直感的であるため、概念的に取り組みやすいからです。

それでは、AI/NNコミュニティの誰もが使用してきた標準的なデモデータを使って、Kerasの「ディープラーニングMLP」を試してみましょう。 いわゆる「教師あり学習」の一種です。 これを実行するのがどんなに簡単かをKerasレベルで見ることにします。

後で、その歴史と、なぜ「ディープラーニング」と呼ばれているのかについて触れることができます。流行語ともいえるこの分野は、実際に最近20年間で進化してきたものです。 

HealthShareにも関連しているため、最終的には、少々実現的なユースケースを想像または予測できるようになることを願っています。

2. 範囲と免責事項

次のことを行います。 

  • tensorflow-gpu環境用に新しいJupyterカーネルをセットアップします。
  • ANNコミュニティで一般的な標準のMNISTサンプルを使って、Keras MLPモデルを定義、トレーニング、および検証(テスト)します。
  • 重要なパラメーターのほんの一部の非常に単純なものを簡単に説明します。
  • デモデータを簡単に調べます。データを理解することは、あらゆる実験において常に重要なことです。 
  • データサンプルをCache/HealthShareに保存し、予測(分類)と推論を行うために読み取り直す作業がどれほど簡単であるかを実演します。

その後で、テストサンプルを少し回転させ、トレーニング済みのモデルをどれくらい混乱させられるかを確認し、それによって明確な制限を理解します。

学術的・数学的な部分は省略しますが、仕組みについて簡単に説明するところもあります。

免責事項: MNISTデータサンプルは、このデモの目的で公開されています。 ほとんどのデモコードは最小限に縮減されており、エラー処理の含まれないベアなコードでした。 Kerasコードのソースは「謝辞」に記載されています。  この内容は、必要に応じていつでも変更されます。

3. 前提条件

前の「パート1」の記事に記載されているとおりにデモ環境をセットアップする以外で、以下の実験のための前提条件はありません。 

4. Jupyterノートブックのセットアップ

前回インストールした「tensorflow-gpu」環境で次のコマンドを実行しました。 

(tensorflow-gpu) C:\>conda install ipykernel
Solving environment: done

... ...

(tensorflow-gpu) C:\>python -m ipykernel install --user --name tensorflow-gpu --display-name "Tensorflow-GPU"
Installed kernelspec tensorflow-gpu in C:\Users\zhongli\AppData\Roaming\jupyter\kernels\tensorflow-gpu

こうすることで、「Tensorflow-GPU」などと呼ばれる新しいJupyterカーネルを作成しました。

これで、Anaconda Promptから次のようにしてJupyterノートブックを起動できるようになりました。

(tensorflow-gpu) C:\anaconda3\keras\Zhong>jupyter notebook
[... ... 
[I 10:58:12.728 NotebookApp] The Jupyter Notebook is running at:
[I 10:58:12.729 NotebookApp] http://localhost:8889/?token=6b40f6e6749e88b80a338eec3330d06c181ead9b644cffe1
[I 10:58:12.734 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 10:58:12.835 NotebookApp] ... ... 

ブラウザのUIが以下のように起動していることを確認できます。 [New]をクリックすると、新しい「Tensorflow_GPU」タブが開きます。

5. ディープラーニングMLPモデルのトレーニング

標準のディープラーニングMLPモデルデモを試してみましょう。

 5.1 環境のテスト

Jupyterタブを「MLP_Demo_ HS」のような名前に変更し、そのセル [1] で以下の行を実行して「Run」をクリックします。

print('Hello World!')

Hello World!

 

5.2 PythonからHealthShareへの接続のテスト 

セル[2]でPythonサンプルを実行し、まだ「パート1」の記事に記載されたとおりにHealthShareデータベースインスタンスに接続できるかをテストします。

import codecs, sys
import intersys.pythonbind3

try:
    print ("Simple Python binding sample")

    port = input("Cache server port (default 56778)? ")
    port = port.rstrip()
    if (port == ""):
        port = "56778"

    url = "localhost["+port+"]:SAMPLES"
    print ("Connection string: " + url)

    print ("Connecting to Cache server")
    conn = intersys.pythonbind3.connection( )
    conn.connect_now(url, "_SYSTEM", "SYS", None)
    print ("Connected successfully")

    print ("Creating database")
    database = intersys.pythonbind3.database( conn)

    print ("Opening Sample.Person instance with ID 1 with default concurrency and timeout")
    person = database.openid( "Sample.Person", "1", -1, -1)

    print ("Getting the value of the Name property")
    name = person.get("Name")
    print ("Value: " + name)

    print ("Test completed successfully")
except intersys.pythonbind3.cache_exception( err):
    print ("InterSystems Cache' exception")
    print (sys.exc_type)
    print (sys.exc_value)
    print (sys.exc_traceback)
    print (str(err))

Simple Python binding sample
Cache server port (default 56778)?
Connection string: localhost[56778]:SAMPLES
Connecting to Cache server
Connected successfully
Creating database
Opening Sample.Person instance with ID 1 with default concurrency and timeout
Getting the value of the Name property
Value: Zevon,Mary M.
Test completed successfully

 

5.3 説明 - MLPモデルのトポロジーとMNISTデータセット

MLPネットワークのトポロジーは、以下に示すとおり単純です。 通常、1つの入力と1つの出力のレイヤーがあり、多数の非表示レイヤーがあります。 

各レイヤーには多数のニューロン(ノード)があります。 各ニューロンには活性化関数があります。 以下のように、2つの異なるレイヤーのニューロン間に完全にメッシュ化された接続(「密度」モデル)が存在することになります。 

関連画像

これに対応し、以下でテストしているKeras MLPモデルには次のものが含まれます。

  • 28 x 28ノードの計784ノードの入力レイヤー(ようするに28x28ピクセルの小さな画像であり、それぞれは「0」から「9」の手書きの数字です。MNISTデータセットにはこのような画像がトレーニング用に60,000個、テスト用に10,000個含まれています
  • 10ノードの出力レイヤー(0から9の間の入力画像の分類結果を表します)
  • 2つの非表示レイヤー(各レイヤーには512個のノードがあります)

これが、このデモモデルの主要トポロジーです。 他の詳細については今のところは省略して、実際に実行することにしましょう。 

関連画像  

5.4. GoogleパブリッククラウドからMNISTサンプルデータを読み込む    

では、上記のモデルをまったく最初から作成し始めることにしましょう。KerasパッケージとMNISTデータをJupyter Cellにロードして、  メニューの[Run]ボタンをクリックします。

### Import Keras modules 
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop

### Define key training parameter
batch_size = 128  # weights adjusted in 128 steps
num_classes = 10  # 10 classification results on the output layer
epochs = 20       # run the set of samples 20 times.

###load the data from Google public cloud 
# load the MNIST sample image  data, split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()

注意: 問題がある場合は、例外の内容に従うか(ほとんどの場合が、パッケージが見つからないといった例外です)、Googleで答えを探すか(99%の確率で回答を得られます)、以下に質問を投稿してください。

コードの最後の行で、60,000個と10,000個の全データセットが3次元整数のPython配列にロードされました。  トレーニングサンプルの1つをHealthShareデータベースに読み込んでみてみましょう。

5.5 データサンプルをHealthShareのグローバルに読み込む

HealthShare -> SAMPLESネームスペース - > Sample.Person.clsで、この最も単純なクラスメソッドをスクラッチします。

ClassMethod SetTrainGlobals(d1 As %Integer = , d2 As %Integer = , value As %String = "", target As %String = "") As %BigInt [ SqlProc ]
{
Set ^XTrainInput(d1, d2) = value
Set ^YTrainTarget(d1) = target
return $$$OK
}

1つの入力トレーニングサンプルを文字列としてグローバル^XTrainInputに取り込み、入力トレーニングターゲットを^YTrainTargetに保存します。

リコンパイルし、セクション5.2に従って接続を更新してから、以下のようにPythonのセルから呼び出しを実行します。

result1 = person.run_obj_method("SetTrainGlobals", [0, 2, str(x_train[0]), str(y_train[0])])

HealthShare -> Samplesで、^XTrainGlobal(0, 2) というグローバルが2次元整数の文字列で作成されたことがわかります。

後で、別の単純なメソッドを実行し、データをサンプルとしてPython変数に読み戻すことができます。  

5.6 モデルを実行してトレーニング実行する

JupyterでのMLPモデルの定義とトレーニングを完了しましょう。

基本的に以下のコードの「reshape」は、それぞれの28 x 28のサンプルを0から255の値の1x 784個の値に変換し、その後で0から1.0の浮動小数点型に正規化します。

Model.SequentialからModel.Summaryまでのコードは、784 x 512 x 512 x 10ノードのMLPを、「relu」活性化関数を使って定義するするものです。 

最後に、 model.fitでトレーニングし、model.evaluteでテスト結果を評価します。   

x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255

print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(num_classes, activation='softmax'))

model.summary()

model.compile(loss='categorical_crossentropy',
              optimizer=RMSprop(),
              metrics=['accuracy'])

history = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    epochs=epochs,
                    verbose=1,
                    validation_data=(x_test, y_test))

score = model.evaluate(x_test, y_test, verbose=1)

print('Test loss:', score[0])
print('Test accuracy:', score[1])

Using TensorFlow backend.
60000 train samples
10000 test samples
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
dense_1 (Dense)              (None, 512)               401920
_________________________________________________________________
dropout_1 (Dropout)          (None, 512)               0
_________________________________________________________________
dense_2 (Dense)              (None, 512)               262656
_________________________________________________________________
dropout_2 (Dropout)          (None, 512)               0
_________________________________________________________________
dense_3 (Dense)              (None, 10)                5130
=================================================================
Total params: 669,706
Trainable params: 669,706
Non-trainable params: 0
_________________________________________________________________
Train on 60000 samples, validate on 10000 samples
Epoch 1/20
60000/60000 [==============================] - 11s 178us/step - loss: 0.2476 - acc: 0.9243 - val_loss: 0.1057 - val_acc: 0.9672
Epoch 2/20
60000/60000 [==============================] - 6s 101us/step - loss: 0.1023 - acc: 0.9685 - val_loss: 0.0900 - val_acc: 0.9730
Epoch 3/20
60000/60000 [==============================] - 6s 101us/step - loss: 0.0751 - acc: 0.9780 - val_loss: 0.0756 - val_acc: 0.9783
Epoch 4/20
60000/60000 [==============================] - 6s 100us/step - loss: 0.0607 - acc: 0.9816 - val_loss: 0.0771 - val_acc: 0.9801
Epoch 5/20
60000/60000 [==============================] - 6s 101us/step - loss: 0.0512 - acc: 0.9844 - val_loss: 0.0761 - val_acc: 0.9810
Epoch 6/20
60000/60000 [==============================] - 6s 102us/step - loss: 0.0449 - acc: 0.9866 - val_loss: 0.0747 - val_acc: 0.9809
Epoch 7/20
60000/60000 [==============================] - 6s 101us/step - loss: 0.0377 - acc: 0.9885 - val_loss: 0.0765 - val_acc: 0.9811
Epoch 8/20
60000/60000 [==============================] - 6s 101us/step - loss: 0.0334 - acc: 0.9898 - val_loss: 0.0774 - val_acc: 0.9840
Epoch 9/20
60000/60000 [==============================] - 6s 101us/step - loss: 0.0307 - acc: 0.9911 - val_loss: 0.0771 - val_acc: 0.9842
Epoch 10/20
60000/60000 [==============================] - 6s 105us/step - loss: 0.0298 - acc: 0.9911 - val_loss: 0.1015 - val_acc: 0.9813
Epoch 11/20
60000/60000 [==============================] - 6s 102us/step - loss: 0.0273 - acc: 0.9922 - val_loss: 0.0869 - val_acc: 0.9833
Epoch 12/20
60000/60000 [==============================] - 6s 99us/step - loss: 0.0247 - acc: 0.9926 - val_loss: 0.0945 - val_acc: 0.9824
Epoch 13/20
60000/60000 [==============================] - 6s 101us/step - loss: 0.0224 - acc: 0.9935 - val_loss: 0.1040 - val_acc: 0.9823
Epoch 14/20
60000/60000 [==============================] - 6s 100us/step - loss: 0.0219 - acc: 0.9939 - val_loss: 0.1038 - val_acc: 0.9835
Epoch 15/20
60000/60000 [==============================] - 6s 104us/step - loss: 0.0227 - acc: 0.9936 - val_loss: 0.0909 - val_acc: 0.9849
Epoch 16/20
60000/60000 [==============================] - 6s 100us/step - loss: 0.0198 - acc: 0.9944 - val_loss: 0.0998 - val_acc: 0.9826
Epoch 17/20
60000/60000 [==============================] - 6s 101us/step - loss: 0.0182 - acc: 0.9951 - val_loss: 0.0984 - val_acc: 0.9832
Epoch 18/20
60000/60000 [==============================] - 6s 102us/step - loss: 0.0178 - acc: 0.9955 - val_loss: 0.1150 - val_acc: 0.9839
Epoch 19/20
60000/60000 [==============================] - 6s 100us/step - loss: 0.0167 - acc: 0.9954 - val_loss: 0.0975 - val_acc: 0.9847
Epoch 20/20
60000/60000 [==============================] - 6s 102us/step - loss: 0.0169 - acc: 0.9956 - val_loss: 0.1132 - val_acc: 0.9832
10000/10000 [==============================] - 1s 71us/step
Test loss: 0.11318948425535869
Test accuracy: 0.9832 

 

以上で、「トレーニング済み」となりました。 ほんの数行のコードで、このKerasディープラーニングMLPは、「tensorflow-gpu」環境でかなり効率的に実行します。 これまでのすべてのキットインストールを検証します。 

6 サンプルを使用してモデルをテストする

以下の指定されたサンプルを使用してトレーニング済みのモデルをテストしましょう。

10,000個のx_testセットから特定のサンプルをランダムに選択し、別のHealthShareグローバルに保存してから、そのグローバルからPython配列にデモサンプルとして読み戻します。 それを使用してトレーニング済みのモデルをテストします。

次に、この入力サンプルを90度、180度、および270度に回転させてモデルを再テストし、混乱が生じないかを確認します。 

6.1 サンプルをHealthShareに保存する - デモ 

サンプルをランダムに選択しましょう。たとえば、10,000個のテストサンプルから12番目のサンプルを選択し、HSグローバルに保存します。

HealthShare -> SAMPLE -> Sample.Personクラスに新しいクラスメソッドを追加します。

ClassMethod SetT2Globals(d1 As %Integer = 0, d2 As %Integer = 0, d3 As %Integer = 0, value As %String = "", target As %String = "") As %BigInt [ SqlProc ]
{
         Set ^XTestInput(d1, d2, d3) = value
         Set ^YTestTarget(d1, d2) = target
         return $$$OK
}

Sample.Person.cls をリコンパイルします。  Jupyterノートブックで、セクション5.2のコードを再実行し、データベースのバインディングを更新します。次に、この行を実行して、28 x 28 個の数字サンプルをグローバル^XTestInputに保存します。

import re
n = 12  # randomly choose a sample 
for i in range(0, len(x_train[n])):
     r1 = person.run_obj_method("SetT2Globals", [1, n, i, re.sub('0\s0', '  0   0', str(x_test[n][i])), str(y_test[n])])

これで、2次元配列のサンプルがHS SAMPLEグローバル^XTestInputに保存されていることがわかりました。 それぞれの数字は、0~255のピクセルグレースケールです。 以下のHS管理ポータルから、それが「9」であることが簡単にわかります。

   

6.2 HealthShareグローバルからサンプルを読み取る - デモ

HSデータベースグローバルからサンプルを確実に読み取ることができます。  

別のクラスメソッドをSample.Person.clsに追加して、それをリコンパイルします。

ClassMethod GetT2Globals(d1 As %Integer = 0, d2 As %Integer = 0, d3 As %Integer = 0) As %String [ SqlProc ]
{
     Set value = ^XTestInput(d1, d2, d3)
     return value
}

Jupyterで、前述のようにDBバインディングを更新してから、このPythonコードを実行してHealthShareから文字列としてグローバルを読み取り、1 x 2次元数値配列に変換します。

import re, ast
sample = ""
for i in range(0, len(x_train[n])):
   sample += person.run_obj_method("GetT2Globals", [1, n, i])
#convert it to numpy ndarray
as1  = np.array(ast.literal_eval(re.sub('\s+', ',', re.sub('0\]', '0', re.sub('\[  ', '', re.sub('\]\[', ' ', sample))))))   
Sample12 = as1.reshape(1, 28, 28)
print(Sample12)

6.3 トレーニング済みモデルをテストする 

これで、Jupyterで、この配列「Sample12」をトレーニング済みのモデルに送信できるようになりました。  model.predictmodel.predict_classesがこの作業を行います。

Sample12  = Sample12.reshape(1, 784)
Sample12f = Sample12.astype('float32')/255  # normalise it to float between [0, 1]
Result12f = model.predict(Sample12f)   #test the 1x784 sample, the result is a 1d matrix
print(Result12f)

Result12 = model.predict_classes(Sample12f)  #test the sample, the result is a clasified lable.
print(Result12)

[[2.5672970e-27 1.1168821e-25 1.3736557e-20 6.2964843e-17 7.0107062e-09 6.2905544e-17 1.5294099e-28 7.8019199e-17 3.5748028e-16 1.0000000e+00]]
[9]

結果には出力レイヤーのニューロン#9に最大値「1.0」があることが示されているため、分類結果は「9」となります。  これは正しい結果です。

確かに、人工的な28 x 28整数のサンプルをモデルに送信して試してみることができます。

6.4 サンプルを回転させてモデルを再テストする

このサンプルを反時計回りに90度回転させて、もう一度試してみることはできるでしょうか? 

Sample12 = Sample12.reshape(28, 28)  #reshape to 2D array values
Sample1290 = np.rot90(Sample12)  #rotate in 90 degree
print(Sample1290)

次に、モデルを再テストします。

Sample12901  = Sample1290.reshape(1, 784)
Sample1290f = Sample12901.astype('float32')/255  
Result1290f = model.predict(Sample1290f)   
print(Result1290f)

Result1290 = model.predict_classes(Sample1290f)  
print(Result1290)

[[2.9022769e-05 1.2192334e-20 1.7143857e-07 3.0004558e-11 2.4583075e-11 6.2443775e-01 2.5749558e-05 3.7550735e-01 2.0722151e-08 5.5368415e-10]]
[5]

さて、モデルは「5」と認識しました。ニューロン#5が最大出力値でトリガーされています。  どうやら少し混乱しているようです! (確かに縦向きのものが「5」のように見えるので仕方ありませんね)。

では今度はサンプルを180度回転させましょう。モデルはどのように認識するでしょうか?  

[[3.3131425e-11 3.0135434e-27 8.7524540e-23 7.1371946e-24 2.4029167e-13 4.2327470e-09 1.0000000e+00 1.7086377e-18 1.3129146e-18 2.8595145e-22]]
[6]

もちろん、間違いなく「6」と認識しました!  人間も「9」ではなく「6」と認識するでしょう。 

では、最後に270度回転させてみましょう。 

どうやら、また混乱しているようです。今度は「4」と認識しました。

[[1.6130849e-06 3.0311636e-14 2.1490927e-03 2.7108688e-03 9.9499077e-01 1.4130991e-04 6.2298268e-06 8.6649310e-09 2.9320630e-12 1.5710594e-07]]
[4]

 

6.5 パブリッククラウドツールとの比較

上記の配列をPythonコードの行を介してPNGにエクスポートし、回転して、反転して、画像上にまとめました。 次のようになっています。

 

次に、それぞれ「Google Vision API」、「Amazon Rekognition」、および「Microsoft Computer Vision API」にアップロードすると、結果はどうなるでしょうか。

この場合、AWSの「数字」のスコアが95%とわずかに最高となっています(これは絶対に代表的な結果ではありません)。 

1. Google Vision APIの結果:

 

2. AWS Rekognitionの結果:

3. Microsoft Computer Visionの結果: 

 

7. 次の内容

次は、以下のような他のいくつかの簡単なポイントについてフォローアップします。 

  • 一言で、MLPはどのように機能するのか?
  • 制限と考えられるユースケースは?
  • 現在のスタックで実行可能な最も一般的なML/DL/ANNモデルの簡単なウォークスルー  
  • 謝辞 
0
0 181
記事 Toshihiko Minamoto · 10月 26, 2021 10m read

InterSystems IRISを初めて使用し始める際には、最低限のセキュリティレベルでのみシステムをインストールするのが通例です。 パスワードを入力する回数が少なくて済むため、初めて作業を始めるときに、開発サービスやWebアプリケーションの操作がより簡単になるからです。 また、開発済みのプロジェクトまたはソリューションをデプロイする際には、最小限のセキュリティを適用している方が便利な場合があります。 それでも、プロジェクトを開発環境から非常に敵対的な可能性のあるインターネット環境に移行する時が来れば、本番環境にデプロイされる前に、最大限のセキュリティ設定(つまり、完全なロックダウン状態)でテストしなければなりません。 これがこの記事の論点です。 InterSystems Caché、Ensemble、およびIRISにおけるDBMSセキュリティ問題をさらに包括的に説明した記事については、私の別の記事、「Recommendations on installing the InterSystems Caché DBMS for a production environment」(本番環境向けにInterSystems Caché DBMS をインストールするための推奨事項)をご覧ください。 InterSystems IRISのセキュリティシステムは、さまざまなカテゴリ(ユーザー、サービス、リソース、特権、およびアプリケーション)に異なるセキュリティ設定を適用する概念に基づいています。 ユーザーにはロールを割り当てることができます。 ユーザーとロールには、データベース、サービス、およびアプリケーションといったリソースに対し、さまざまな読み取り、書き込み、および使用の権限を付与することができます。 ユーザーとロールには、データベースのSQLテーブルに対するSQL特権も与えられます。

セキュリティレベルの違い

InterSystems IRISをインストールするときに、最小、通常、またはロックダウンというセキュリティレベルを選択できます。 レベルは、ユーザーエンゲージメントの程度、使用可能なロールとサービス、およびサービスとアプリケーションの認証方法の構成に違いがあります。 詳細については、『InterSystems IRISのインストール準備』ガイドの「InterSystemsセキュリティの準備」セクションをご覧ください。
ドキュメントには、レベルごとのセキュリティ設定を説明する、以下の表が含まれています。 この設定の変更は、システム管理ポータルのインターフェースで行えます。

ユーザーセキュリティの初期設定

セキュリティ設定最小限通常ロックダウン
パスワードのパターン3.32ANP3.32ANP8.32ANP
非アクティブになる期間090日90日
_SYSTEMユーザーの有効化不可
UnknownUserに割り当てられるロール%Allなしなし

サービスの初期プロパティ

サービスプロパティ最小限通常ロックダウン
パブリック許可を使用はいはいいいえ
認証が必要いいえはいはい
有効化されたサービスほとんどいくつか最小限

初期設定で有効にされているサービスの設定

サービス最小限通常ロックダウン
%Service_Bindings有効有効無効
*%Service_CSP有効有効有効
%Service_CacheDirect有効無効無効
%Service_CallIn有効無効無効
%Service_ComPort無効無効無効
%Service_Console有効有効有効
%Service_ECP無効無効無効
%Service_MSMActivate無効無効無効
%Service_Monitor無効無効無効
%Service_Shadow無効無効無効
%Service_Telnet無効無効無効
%Service_Terminal有効有効有効
%Service_WebLink無効無効無効

*InterSystems IRISの場合、%Service_CSPは%Service_WebGatewayを適用します。 使用されるサービスは、オペレーティングシステムごとにわずかに異なります。

セキュリティを向上させるには

有効なサービスごとに、適切な認証方法(非認証、パスワード、Kerberos、または委任)を選択する必要があります。 また、システムで使用されていないWebアプリケーションを無効にする必要もあります。 有効になっているWebアプリケーションについては、正しい認証方法(認証済み、パスワード、Kerberos、委任、ログイン、またはcookie)を選択する必要があります。 もちろん、プロジェクトは顧客の要件に従って機能できるように、管理者がプロジェクトやソリューションごとにセキュリティ設定を選択するため、 ユーザーが作業を実際に行えるようにシステムの利便性を十分に維持しながら、侵入者を寄せ付けないように十分なセキュリティを保つバランスを常に取らなければなりません。 ご承知のとおり、最も安全なシステムは無効化されたシステムです。

システムのセキュリティレベルを何度も手動で引き上げる必要があるのであれば、それは、そういった問題を解決するソフトウェアモジュールを記述する必要があるという兆候に違いありません。 実際、InterSystems Open Exchangeには、セキュリティの向上に役立つロックダウンプログラムがあります。 プログラムのソースコードは、InterSystems isc-apptools-lockdownページのリポジトリにあります。 LockDownプログラムは以下のことを行います。

まず、プレインストールされた以下のユーザーのパスワードを変更します。

  • Admin
  • CSPSystem
  • IAM
  • SuperUser
  • UnknownUser
  • _Ensemble
  • _SYSTEM

次に、以下を除くすべてのサービスを無効にします。

  • %%service_webゲートウェイ
  • %service_console
  • %service_login
  • %service_terminal

さらに、以下を含むすべてのWebアプリケーションにパスワード保護を設定します。

  • /csp/ensdemo
  • /csp/samples
  • /csp/user
  • /isc/studio/usertemplates
  • /csp/docbook
  • /csp/documatic
  • /isc/studio/rules
  • /isc/studio/templates

最後に、以下のようなシステムワイドのセキュリティパラメーターを設定します。

  • パスワードの複雑さ「8.32 ANP」
  • 90日間の非利用アカウント制限
  • 監査およびすべてのセキュリティ関連イベント LockDownプログラムは、GitHubからLockDown.clsをダウンロードして、システムにインストールできます。 そして、ターミナルモードで、以下を入力します。
USER>zn “%SYS”
%SYS>do $system.OBJ.Load("/home/irisusr/LockDown.cls","ck")

または、以下のコマンドを使用して、パブリックレジスタからZPMバッチマネージャを使ってインストールすることも可能です。

USER>zn “%SYS”
%SYS> zpm “install isc-apptools-lockdown”

ロックダウンの実行

ロックダウンを実行する前に、バックアップを作成しておくことを強くお勧めします。 LockDownプログラムは、%SYS領域から実行する必要があります。 プレインストールされたすべてのユーザーのパスワードを変更しない場合は、最初のパラメーターを空のままにします。 IRIS Studio、Atelier、またはVSCodeを使ってプログラムとクラスを編集する機能を維持する場合は、%Service_Bindingsサービスを無効にしないでください。 これを確実に機能させるには、バインディング引数を1に設定する必要があります。 次に例を示します。 do ##class(App.Security.LockDown).Apply("New Password 123",.msg,1) このモジュールには、システムパスワードが改ざんされた場合やロックダウンを実行せずにプレインストールされたすべてのアカウントを入れ替える必要がある場合に役立つ関数も含まれています。 次のようにして実行することができます。 do ##class(App.Security.LockDown).Change Password("New Password 123", "Admin,CSPSystem,IAM,SuperUser,Unknown User, _Ensemble,_SYSTEM") ほとんどの場合、ロックダウンを実行した後は、アプリケーションあまたはプロジェクトが動作しなくなります。 これを修正するには、いくつかのセキュリティ設定を元の状態に復元する必要があります。 これは、管理ポータルインターフェース(セキュリティセクション)またはプログラムで実行できます。

ロックダウン後のセキュリティ設定の変更

ロックダウン後、Webアプリケーションがパスワード以外の認証方法を使用している場合、それらを有効にする必要があります。 zpm-registry-test-deploymentというソフトウェアモジュールを実行することをお勧めします。これには、ZPM-registryプロジェクト向けのLockDownの使用例が含まれています。 次のコードは、インストールの最後に適用されています。 プロジェクトは、最小限のセキュリティレベルでIRISにインストールされました。 以下は、コードが実行する必要のあった項目です。

  • プレインストールされたすべてのユーザーのパスワードを変更する。
  • このプロジェクトで使用されていないすべてのサービスを無効にする。
  • Webアプリケーション/レジストリ(許可されていないユーザーはレジストリのパッケージのリストを取得できます)を除く、システム上の全アプリケーションのパスワード保護を有効にする。
  • レジストリに新しいパッケージを公開する権限を持つ新しいユーザーを作成する。 このユーザーには、IRISAPPデータベースのプロジェクトテーブルに対する書き込み権限が必要です。

新しいユーザーを作成します。

set tSC= ##class(App.Security.LockDown).CreateUser(pUsername, "%DB_"_Namespace, pPassword, "ZMP registry user",Namespace)
If $$$ISERR(tSC) quit tSC
write !,"Create user "_pUsername

新しいユーザーと許可されていないユーザーの特権を追加します。

set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "1,ZPM.Package", "s", "UnknownUser")
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "1,ZPM.Package", "s", pUsername)
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "1,ZPM.Package_dependencies", "s", pUsername)
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "1,ZPM_Analytics.Event", "s", pUsername)
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "9,ZPM.Package_Extent", "e", pUsername)
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "9,ZPM_Analytics.Event_Extent", "e", pUsername)
If $$$ISERR(tSC) quit tSC
write  !,"Add privileges "

LockDownプログラムを実行します。

set tSC= ##class(App.Security.LockDown).Apply(NewPassSys)
If $$$ISERR(tSC) quit tSC

Change the settings for the web app so that an unknown user can log in:
set prop("AutheEnabled")=96
set tSC=##class(Security.Applications).Modify("/registry",.prop)
If $$$ISERR(tSC) quit tSC
write !,"Modify /registry "

Change the settings for the %service_terminal service, changing the authorization method to Operating System, Password:
set name="%service_terminal"
set prop("Enabled")=1
set prop("AutheEnabled")=48 ; Operating System,Password
set tSC=##class(Security.Services).Modify(name,.prop)
If $$$ISERR(tSC) quit tSC
write !,"Modify service terminal"

まとめ

この記事では、システムのセキュリティレベルを引き上げる理由とこれをプログラムで実行する方法を説明し、InterSystems LockDownプログラムを使った例を紹介しました。 最初にシステム内のすべてを終了する方法を使用しました(つまり、最大セキュリティレベルを設定しました)。 次に、プロジェクトが機能するのに必要なサービスとアプリケーションのみを開いて、セキュリティを緩和しました。 他の方法やベストプラクティスが必ず存在すると思っています。コミュニティによるこの記事のディスカッションの一環として、それらについてぜひ聞かせてください。

0
0 394
記事 Toshihiko Minamoto · 10月 7, 2021 5m read

これは、オンラインドキュメントのさまざまな場所に表示される主題に関する概要であり、主に注釈として表示され、専用の章として表示されることはありません。

むかしむかし、ある所に...  おっと、おとぎ話ではありません。
Cachéの初めの頃(それからその前にも)、自分のコードを実行するためのパーティションを用意していたことがあるでしょう。 そのパーティションの一部は、すべてのローカル変数が%、A~Z、a~zでうまくソートされていた領域でした。

また、ローカルに保存する値や情報が何であれ、すべてはそこに保存されており、パーティションでどんなコードを実行する場合でも、可視状態であり、利用することができました。 完全なドキュメントと優良な規律をもって共同作業できている開発者チームであれば、問題はありません。
[残念ながら、これをおとぎ話にしてはいけません]。

実際に、(独自または外部の)ソフトウェアパッケージを使って作業することは、当時は悪夢であり、コードそのものよりも競合しない変数の使用方法を見つけることに労力を要していました。 言うまでもなく、有意義な命名は例外になっていたのです。 その頃助けとなっていたのは、
スタックに変数をプッシュして後で復元するNEWコマンドです。
https://docs.intersystems.com/ens20181j/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_cnew

Caché 5.0(2002)での実際のソリューションは、これらのコードブロック専用の変数に、空の独立した領域を使用して、プロシージャとメソッドに別々のスコープを作成することでした。 変数の誤使用や同一名の使用から保護することが困難でなくなりました。
クラスとメソッドの定義において、パラメーターの名前はProcedurBlockになったのです。
http://docs.intersystems.com/latestj/csp/docbook/DocBook.UI.Page.cls?KEY=ROBJ_method_procedureblock
http://docs.intersystems.com/latestj/csp/docbook/DocBook.UI.Page.cls?KEY=GORIENT_class_method_keywords

変数の従来のスコープはPUBLICでしたが、新しいスコープはPRIVATEになりました。
ただし、基本的なルールがあります。% ****で始まるものはすべてPUBLIC変数で、 そのほかには明示的な設定が必要というルールです。

キーワード ProcedureBlock(デフォルト=1)は、変数のPRIVATEスコープが利用できるかどうかを制御します。
見事な改善です!
使いやすい関数を実装することで、プロシージャはスコープの設定でより単純になったのです。
また、オブジェクトクラスでのメソッドの実装が、はるかに分かりやすくなっています。
今では、すべてのPUBLIC変数に並行して、大規模なセットのPRIVATE変数を持つことが可能になったのです。
(異様な名前を変数に付ける言い訳がなくなりました!)わかりやすく言うと、一連のPRIVATE変数に対し、映画『ハイランダー』の次の原則が適用されます。
「生き残れるのはただ一人!」 http://wiki.c2.com/?HighlanderPrinciple

ある時点で、1セットのPublic変数と1セットのPrivate変数がアクティブであるということです。

ただし、実際にはちょっとした例外があります。_ByReference_という変数を呼び出されたメソッド/プロシージャに渡す場合、呼び出し元のスコープに戻る小さな扉ができます。

ProcedureBlock=0 またはNot ProcedureBlockというバリアントは主に旧式のロジックに依存するレガシーコードにターゲットされていました。 ただし、たまに、生成されたコードには、それを依然として必要または使用する影の部分があります。

一般的に、変数スコープにおける競合は稀です。
2つの例外と1つの回避策があります。
http://docs.intersystems.com/latestj/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_usercode_indirxecjob

Xecuteは、基本的な定義でパブリック変数に対してのみ機能します。
プロシージャの呼び出しにそれとなく似てパラメータを渡すことのできる程度です。
http://docs.intersystems.com/latestj/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_cxecute
この方向での更なる拡張は、$Xecute() 関数によって行われます。
http://docs.intersystems.com/latestj/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_fxecute

間接参照は、パブリック変数でのみ機能します。 回避策はありません。
http://docs.intersystems.com/latestj/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_operators#GCOS_operators_indirection
間接参照に手を出さないようにするもう一つの理由と言えるでしょう。

変数スコープに関するその他の関連ドキュメントはこちらをご覧ください。
https://docs.intersystems.com/latestj/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_variables
http://docs.intersystems.com/latestj/csp/docbook/DocBook.UI.Page.cls?KEY=GORIENT_ch_cos#GORIENT_cos_scope
http://docs.intersystems.com/latestj/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_usercode#GCOS_usercode_args_byref

0
0 271