#InterSystems IRIS for Health

0 フォロワー · 887 投稿

InterSystems IRIS for Health™は、世界で最も重要なデータを管理する医療アプリケーションの迅速な開発を目的に特別に設計された世界初、かつ唯一のデータプラットフォームです。 トランザクションの処理と分析、拡張可能な医療データモデル、FHIRベースのソリューション開発、医療情報の相互運用性に関わる標準規格への対応など、すぐに使える強力な機能を搭載しています。 これらすべての機能により、開発者は価値を実現し、画期的なアプリケーションをすばやく構築することができます。 詳細はこちらをご覧ください

記事 Mihoko Iijima · 6月 29, 2023 3m read

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

LOAD DATAは、バージョン2022.1から追加されたSQLコマンドで、CSVファイルやJDBCソースからデータをテーブルにロードするコマンドです。
データが存在するテーブルにLOAD DATAを実行した場合、データは追記されます。

※ バージョン2022.1をご利用いただく場合は、バージョン2022.1.3 をご利用ください。(2022.1.0~2022.1.2は、使用するJARファイルの不備により動作しません。)

LOAD DATAを利用する際、Javaの外部サーバ(Javaゲートウェイ)を使用するため、IRISをインストールした環境にJavaのインストールが必要です。
サポート対象のJavaバージョンについては、ドキュメントの「サポート対象Javaテクノロジ」をご参照ください。

LOAD DATAを利用するためには、Javaインストール済、かつ外部言語サーバで %Java_Server 設定済の環境である必要があります。

※ 環境変数JAVA_HOMEの設定がある場合は以下 %Java_Serverの設定は不要です。

%Java_Server 設定詳細は以下の通りです。

  • Javaホームディレクトリ:インストールしたJavaのホームディレクトリを指定します。

 

利用手順は以下の通りです。

以下のCSVを読み込む場合の手順を説明します。

0
0 1150
記事 Toshihiko Minamoto · 6月 29, 2023 13m read

         

コミュニティの皆さん、こんにちは。
この記事では、InterSystems Embedded Python の使用方法を説明します。以下のトピックが含まれます。

  • 1- Embedded Python の概要
  • 2- Embedded Python の使用方法
    • 2.1- ObjectScript から Python ライブラリを使用する
    • 2.2- Python から InterSystems API を呼び出す
    • 2.3- ObjectScript と Python を同時に使用する
  • 3- Python 組み込み関数の使用
  • 4- Python モジュール/ライブラリ 
  • 5- Embedded Python のユースケース
  • 6- まとめ

では、概要から始めましょう。

 

1- Embedded Python の概要

Embedded Python は、Python 開発者が InterSystems IRIS の全データと全機能に直接アクセスできるようにする、InterSystems IRIS データプラットフォームの機能です。

InterSystems IRIS には、データプラットフォーム内で解釈、コンパイル、および実行される ObjectScript と呼ばれる強力なプログラミング言語が組み込まれています。

ObjectScipt は InterSystems IRIS のコンテキスト内で実行されるため、データプラットフォームのメモリとプロシージャ呼び出しに直接アクセスできます。

Embedded Python は、InterSystems IRIS プロセスコンテキスト内で Python コードを実行を可能にする Python プログラミング言語の拡張機能です。

ObjectScript と Python のいずれも同じオブジェクトメモリで動作するため、Python オブジェクトは ObjectScript オブジェクトを単にエミュレートするのではなく、ObjectScipt オブジェクトであると言えます。

これらの言語の共平等性により、ジョブに最適な言語か、アプリケーションの記述に最も使いやすい言語を選択することができます。

 

2- Embedded Python の使用方法

Embedded Python を使用する場合、3 つの異なる方法でコードを記述できます。

2.1- ObjectScript から Python ライブラリを使用する

まず、通常の .py ファイルを記述し、InterSystems IRIS コンテキストからそれを呼び出します。 この場合、データプラットフォームは Python プロセスを起動し、IRIS と呼ばれるモジュールをインポートできるようにします。これにより、Python プロセスが IRIS カーネルに自動的に接続されるため、Python コードのコンテキストから ObjectScript のすべての機能にアクセスできるようになります。

2.2- Python から InterSystems API を呼び出す

次に、通常の ObjectScript コードを記述し、%SYS.Python パッケージを使って Python オブジェクトをインスタンス化します。 この ObjectScript パッケージを使うと、Python モジュールとライブラリをインストールし、ObjectScript 構文でコードベースを操作できるようになります。
%SYS.Python パッケージを使うと、ObjectScript 開発者は Python の知識が無くてもリッチな Python ライブラリエコシステムを ObjectScript コードで使用できるようになります。

2.3- ObjectScript と Python を同時に使用する

最後に、InterSystems クラス定義を作成し、Python でメソッドを記述します。 そのメソッドを呼び出すと、Python インタープリターが起動します。 このメソッドは、メリットとして、それを含むクラスのインスタンスへの参照を使って、Python コードのそのブロックの self キーワードを埋めることができます。 また、Python を使って InterSystems クラスにクラスメソッドを書き込むことで、SQL で、テーブルに新しい行が追加されたなどの異なるデータエントリイベントを処理するメソッドを簡単に実装できます。
カスタムストアドプロシージャを Python で迅速に開発することも可能です。

ご覧のとおり、Embedded Python を使用すると、パフォーマンスを犠牲にすることなく、ジョブに最適なプログラミング言語を選択できます。

3- Python 組み込み関数の使用

Python インタープリターには、常に利用できる多数の関数と型が組み込まれています。 以下に、アルファベット順でリストしています。

組み込み関数
AELR
abs()enumerate()len()range()
aiter()eval()list()repr()
all()exec()locals()reversed()
any()round()
anext()FM
ascii()filter()map()S
float()max()set()
Bformat()memoryView()setattr()
bin()frozenset()min()slice()
breakpoint()GNstaticmethod()
bytearray()getattr()next()str()
bytes()globals()sum()
Osuper()
CHobject()
callable()hasattr()oct()T
chr()hash()open()tuple()
classmethod()help()ord()type()
compile()hex()
complex()PV
Ipow()vars()
Did()print()
delattr()input()property()Z
dict()int()zip()
dir()isinstance()
divmod()issubclass()-
iter()__import__()

Python 組み込み 関数の使用

Python 組み込み関数を使用するには、"builtins" をインポートする必要があります。その後、関数を呼び出せるようになります。

set builtins = ##class(%SYS.Python).Import("builtins")

Python の print() 関数は、実際には組み込みモジュールのメソッドであるため、ObjectScript からこの関数を使用できるようになりました。

USER>do builtins.print("hello world!")
hello world!
USER>set list = builtins.list()
 
USER>zwrite list
list=5@%SYS.Python  ; []  ; <OREF>

同様に、help() メソッドを使って、リストオブジェクトのヘルプを取得できます。

USER>do builtins.help(list)
Help on list object:
class list(object)
 |  list(iterable=(), /)
 |
 |  Built-in mutable sequence.
 |
 |  If no argument is given, the constructor creates a new empty list.
 |  The argument must be an iterable if specified.
 |
 |  Methods defined here:
 |
 |  __add__(self, value, /)
 |      Return self+value.
 |
 |  __contains__(self, key, /)
 |      Return key in self.
 |
 |  __delitem__(self, key, /)
 |      Delete self[key].

 

4- Python モジュールまたはライブラリ

一部の Python モジュールまたはライブラリはデフォルトでインストールされるため、すでに利用することができます。 help("module") 関数を使うと、これらのモジュールを表示できます。
Python libraries list output 1

Python モジュールまたはライブラリのインストール

これらのモジュールとは別に、Python には数百ものモジュールとライブラリがあり、pypi.org で確認できます。Python Package Index(PyPI)は Python プログラミング言語のソフトウェアリポジトリです)

他のライブラリが必要な場合は、intersystems irispip コマンドを使ってライブラリをインストールする必要があります。

たとえば、Pandas は Python データ分析ライブラリです。 以下のコマンドは、パッケージインストーラーの irispip を使用して、Windows システムに Pandas をインストールします。

C:\InterSystems\IRIS\bin>irispip install --target C:\InterSystems\IRIS\mgr\python pandas

C:\InterSystems は InterSystems インストールディレクトリに置き換えられることに注意してください。

5- Embedded Python のユースケース

5.1- Python Reportlab ライブラリを使った PDF の印刷

irispip コマンドを使用して Reportlab ライブラリをインストールしてから、objectscript 関数を作成します。

ファイルの場所を指定すると、以下の CreateSamplePDF() という ObjectScript メソッドによって、サンプル PDF ファイルが作成され、その指定場所に保存されます。

Class Demo.PDF
{

ClassMethod CreateSamplePDF(fileloc As%String) As%Status
{
    set canvaslib = ##class(%SYS.Python).Import("reportlab.pdfgen.canvas")
    set canvas = canvaslib.Canvas(fileloc)
    do canvas.drawImage("C:\Sample\isc.png", 150, 600)
    do canvas.drawImage("C:\Sample\python.png", 150, 200)
    do canvas.setFont("Helvetica-Bold", 24)
    do canvas.drawString(25, 450, "InterSystems IRIS & Python. Perfect Together.")
    do canvas.save()
}

}

メソッドの最初の行では、ReportLab の pdfgen サブパッケージから canvas.py ファイルをインポートしています。 コードの 2 行目は、Canvas オブジェクトをインスタンス化し、InterSystems IRIS オブジェクトのメソッド呼び出しと同じ方法で、メソッドを呼び出しています。

その後、通常の方法でメソッドを呼び出せるようになります。

do ##class(Demo.PDF).CreateSamplePDF("C:\Sample\hello.pdf")

以下の PDF が生成され、指定された場所に保存されます。
InterSystems ロゴ、Python ロゴ、および InterSystems and Python のテキストを含む 1 ページ PDF。 併用による完璧な機能。

 

5.2- Python Qrcode ライブラリを使った QR コードの生成

QR コードを生成するには、irispip コマンドを使用して Qrcode ライブラリをインストールする必要があります。次に、以下のコードを使用すると、QR コードを生成できます。

 

5.3- Python Folium ライブラリを使った地理的位置情報の取得

地理データを取得するには、irispip コマンドを使用して Folium ライブラリをインストールする必要があります。次に、以下の objectscript 関数を作成します。

Class dc.IrisGeoMap.Folium Extends%SwizzleObject
{

// Function to print Latitude, Longitude and address details ClassMethod GetGeoDetails(addr As%String) [ Language = python ]
{
    from geopy.geocoders import Nominatim
    geolocator = Nominatim(user_agent="IrisGeoApp")
    try:
        location = geolocator.geocode(addr)
        print("Location:",location.point)
        print("Address:",location.address)
        point = location.point
        print("Latitude:", point.latitude)
        print("Longitude:", point.longitude)
    except:
        print("Not able to find location")
}
}

IRIS ターミナルに接続して以下のコードを実行します

do ##class(dc.IrisGeoMap.Folium).GetGeoDetails("Cambridge MA 02142")

以下が出力されます。

画像

 

5.4- Python Folium ライブラリを使ったインタラクティブ地図への場所の生成とマーキング

同じ Python Folium 伊良部らりを使用して、インタラクティブ地図に場所を生成し、それをマーキングします。以下の objectsctipt 関数によって、これを実行します。

ClassMethod MarkGeoDetails(addr As%String, filepath As%String) As%Status [ Language = python ]
{
    import folium
    from geopy.geocoders import Nominatim
    
    geolocator = Nominatim(user_agent="IrisGeoMap")
    #split address in order to mark on the map
    locs = addr.split(",")
    if len(locs) == 0:
        print("Please enter address")
    elif len(locs) == 1:
        location = geolocator.geocode(locs[0])
        point = location.point
        m = folium.Map(location=[point.latitude,point.longitude], tiles="OpenStreetMap", zoom_start=10)
    else:
        m = folium.Map(location=[20,0], tiles="OpenStreetMap", zoom_start=3)
    
    for loc in locs:
        try:
            location = geolocator.geocode(loc)
            point = location.point
            folium.Marker(
                    location=[point.latitude,point.longitude],
                    popup=addr,
                ).add_to(m)         
        except:
            print("Not able to find location : ",loc) 
              
    map_html = m._repr_html_()
    iframe = m.get_root()._repr_html_()
    fullHtml = """
             
                
                    
                     """
    fullHtml = fullHtml + iframe            
    fullHtml = fullHtml + """                                             
                
                
    """try:
        f = open(filepath, "w")
        f.write(fullHtml)
        f.close()
    except:
        print("Not able to write to a file")
}

IRIS ターミナルに接続し、MarkGeoDetails 関数を呼び出します

dc.IrisGeoMap.Folium クラスの MarkGeoDetails() 関数を呼び出します。
この関数には、以下の 2 つのパラメーターが必要です。

  1. 場所("," 区切りで、複数の場所を渡すことができます)
  2. HTML ファイルパス

以下のコマンドを実行し、地図に Cambridge MA 02142、NY、London、UAE、Jeddah、Lahore、および Glasgow の場所をマークして、 "irisgeomap_locations.html" ファイルとして保存します。

do ##class(dc.IrisGeoMap.Folium).MarkGeoDetails("Cambridge MA 02142,NY,London,UAE,Jeddah,Lahore,Glasgow","d:\irisgeomap_locations.html")

上記のコードによって、以下のインタラクティブ HTML ファイルが生成されます。

画像

 

5.5- Python Pandas ライブラリを使ったデータ分析

irispip コマンドを使用して Pnadas ライブラリをインストールする必要があります。次に、以下のコードを使用すると、データが表示されます。

 

6- まとめ

InterSystems Embedded Python(IEP)は、Python コードと InterSytems アプリケーションをシームレスに統合できる強力な機能です。 IEP を使用すると、Python で利用可能な広範なライブラリとフレームワークを活用して、InterSystems アプリケーションの機能を強化できます。 この記事では、IEP の主な機能とメリットを説明しました。

IEP は、InterSystems アプリケーション内から Python オブジェクトを操作し、Python コードを実装できるようにする一連のライブラリとして実装されています。 これにより、単純で有効な方法によって、Python コードを InterSystems アプリケーションに統合できるため、データ分析、機械学習、自然言語処理など、InterSystems ObjectScript での実装が困難なタスクを実行できるようになります。

IEP を使用する主なメリットの 1 つには、Python と InterSysems の間のギャップのかけ渡しを得られることが挙げられます。 このため、両方の言語の持つ力を使って、両分野の長所を組み合わせた強力なアプリケーションを作成しやすくなります。

IEP には、Python の機能を活用して、InterSystems アプリケーションの機能を拡張する方法も備わっています。 つまり、InterSystems ObjectScript で実装するには困難なタスクに、Python で利用できる膨大な数のライブラリをフレームワークを利用して実行できます。

InterSystems Embedded Python には、Python の機能を活用して、InterSystems アプリケーションの機能を拡張する強力な方法が備わっています。 Python コードを InterSystems アプリケーションに統合することで、Python で利用できる膨大な数のライブラリとフレームワークを利用し、InterSystems ObjectScript での実装が困難な複雑なタスクを実行できます。

以上です!

0
0 568
記事 Megumi Kakechi · 6月 27, 2023 1m read

Apache経由でREST通信する場合、ApacheでRESTを動かす場合の設定方法 (含:Webゲートウェイのインストール手順) の方法 で設定を行います。

この際、Apachの構成ファイル(httpd.conf)にRESTを動かすための設定を入れるのですが、設定後のシンタックスチェックで以下の警告が出る場合があります。

※httpd -t 実行時
Apache Configuration: CSP directive 'csp' detected in VirtualHost, only supported at default server level


こちらは、<VirtualHost> ~ </VirtualHost>  内に、CSP ディレクティブ の内容を設定している場合に出力されます。

 CSP on
 CSPFileTypes *

などの IRIS にアクセスをするための設定は、<VirtualHost>  ディレクティブの外に設定するようにしてください。

詳細は以下のドキュメントをご覧ください。
追加ファイル・タイプを渡すための Apache の構成 (すべてのプラットフォーム)

0
0 148
記事 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
記事 Megumi Kakechi · 6月 22, 2023 2m read

プロセスの単位の詳細情報(使用メモリサイズ、ユーザ名、実行ルーチンなど)は管理ポータルで確認できますが、それらをコマンドで取得する方法をご紹介します。 

管理ポータル:
[システムオペレーション] > [プロセス]  (プロセス毎の)詳細リンク 

%SYS.ProcessQuery クラスを使用して、以下のように行います。

USER>setx=##class(%SYS.ProcessQuery).%OpenId(<PID>)   // 自プロセスの場合は <PID> = $JOB
USER>writex.MemoryUsed
188
USER>writex.UserName
UnknownUser
USER>writex.ClientIPAddress
127.0.0.1
USER>zwritex// 全てのプロパティを確認したいとき


Embedded Python で呼び出したい場合は以下のようにします。

0
0 221
InterSystems公式 Seisuke Nakahashi · 6月 21, 2023

2023.2 の開発者プレビュープログラムの一環として、4番目の開発者プレビューを公開いたします。今回リリースされたのは、InterSystems IRIS と InterSystems IRIS for Health です。

本リリースの注目点

2023.2では、多くの機能修正と改善に加えて、時間認識モデリングや 強化された外部テーブル読み込み専用の FEDERATED テーブルといった新機能が含まれる予定です。これら新機能の一部は、今回の開発者プレビュー版にはまだ含まれていません。ご注意ください。

2023.2の別の注目点は、プライベート・ウェブサーバ (PWS) がインストーラから削除されることです。このことは昨年に発表され、インターシステムズ製品のインストーラから削除予定ですが、今回のプレビュー版ではまだPWSは存在します。詳細はこちらのドキュメントをご覧ください。

--> PWSが含まれないインストーラにご興味のある方は、こちらのフォームからEAPに登録してください。その際、オプションで「No Private Web Server」をお選びください。このEAPに関する情報はこちらをご参照ください。

0
0 106
InterSystems公式 Masahito Miura · 6月 14, 2023

インターシステムズは、InterSystems IRIS 製品でプロセスメモリの使用量が増加する不具合を修正しました。

対象バージョン: 
  InterSystems IRIS                      2022.2, 2022.3, 2023.1.0
  InterSystems IRIS for Health   2022.2, 2022.3, 2023.1.0
  HealthShare Health Connect   2022.2, 2022.3, 2023.1.0
  Healthcare Action Engine         2022.1


  
対象プラットフォーム: すべて

問題の詳細:
ローカル変数に対して $Order$Query または Merge を実行する際に、プロセスのローカル変数テーブルのメモリ消費量の増加が発生します。 この問題は、ほとんどの実行環境では悪影響を与えませんが、プロセス数が多い環境、またはプロセス当たりの最大メモリを厳密に制限している環境では、影響を受ける可能性があります。 また、一部のプロセスで <STORE>エラーが発生する場合があります。

解決方法:
この問題は修正 ID : DP-423127 および DP-423237 で解決します。
これらの修正は、今後のすべてのバージョンに含まれる予定です。 

0
0 193
記事 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月 13, 2023 1m read

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

注意:本番環境では実行しないでください。テスト環境でご利用ください。

開発時にプロダクションに残っているキューを一括でクリアしたり、プロダクションに関連した一次的な情報をすべて消去したい場合、以下メソッドを利用して実行中のプロダクション情報をリセットできます。

set$namespace="プロダクションのあるネームスペース名指定"do##class(Ens.Director).CleanProduction()

ドキュメント:ネームスペースでのプロダクションのリセット

プロダクション全体ではなく、一部コンポーネントの実行中データをリセットする場合は、アダプタの ClearAllAppData() を使用します。
引数にはプロダクションに登録している構成名を指定してください。

例)SQLインバウンドアダプタが保持している永続値をリセットする

do##class(EnsLib.SQL.InboundAdapter).ClearAllAppData("構成名称")

ドキュメント:受信アダプタで以前に処理された行のリセット

例)FTPインバウンドアダプタが処理したファイルの情報をリセットする

do##class(EnsLib.FTP.InboundAdapter).ClearAllAppData("構成名称")
0
0 140
記事 Mihoko Iijima · 6月 12, 2023 2m read

FHIRドキュメント(診療情報提供書や退院時サマリ―など)をFHIRリポジトリにPOSTする場合、

エンドポイント/Bundle

上記URLでPOSTできます。(以下の例では、IRIS for Healthに用意したFHIRリポジトリを使用しています。)

GET要求で確認してみます。

登録できたことを確認できました。

FHIRリポジトリに登録したFHIRドキュメントですが、文書番号を指定してGETできると便利なのですが、現時点(バージョン2023.1)のIRIS for HealthのFHIRリポジトリでは、FHIR標準仕様にあるBundle の SearchParameter :composition について未対応のため、Composition.identifier を指定した Bundleリソースに対する GET要求が行えません。

そこで回避策として、Bundle登録時 Composition.identifier.value に設定している文書番号を Bundle.identifier.value にも設定しPOSTします。こうすることで、Bundle の Search Parameter:identifier に文書番号を指定でき、対象となるBundleリソースをGETできます。

文書例:(長いので途中までの抜粋です)

0
0 360
記事 Mihoko Iijima · 6月 11, 2023 2m read

IRIS for HealthのFHIRリポジトリには、「条件付き削除結果の最大数」がデフォルトで3件に設定されています。

そのため、条件指定のDELETE要求で4件以上が対象となる場合、以下のエラーが発生します。

例えば、あるcodeで条件指定したリソースが5件あるとします。

これをDELETE要求に変えて実行すると、以下のようにHTTPステータス412が戻り、「Conditional delete search found more than maximum allowed number of 3 results」のエラーが発生します。

HTTP応答を確認すると、ConditionalDeleteOverflowのエラーが発生しています。

これは、条件付き削除の最大値が3件で設定されているため、発生しています。

ということで、FHIR Configuration画面を開き、設定を確認します。

管理ポータル > [Health] > ネームスペース選択 > [FHIR Configuration] > [Server Configuration]

対象のエンドポイントを選択すると以下の設定画面が表示されます。

Max Conditional Delete Results の項目に 3 と設定されています。

0
0 171
記事 Mihoko Iijima · 6月 9, 2023 2m read

FHIRリソースをリポジトリから削除するには、対象リソースに対してDELETE要求を使用すればよいのですが、例えば「テスト的に登録していたリソースばかりなので、リポジトリのデータを一括で全消去したい!」という場合の方法をご紹介します。

実行前に、エンドポイントのURLを確認します。

管理ポータル > [Health] > ネームスペース選択 > [FHIR Configuration] > [Server Configuration] で確認できます。

データの全消去を行うには、IRIS for HealthのFHIRサーバ機能で提供されているAPIを使用します。実行のため IRISのターミナルを開く、またはIRISにログインします。

ご参考:HS.FHIRServer.Storage.Json.RepoManagerクラスにあるDeleteService()メソッドを使用して削除します。

WindowsにIRISをインストールされている場合は、タスクバー上のIRISランチャー  をクリックし、ターミナルを選択します。

Windows以外でお試しいただいてる場合は、iris session コマンドでIRISにログインしてください。

※ iris session インスタンス名 (インスタンス名=インストール時に指定した名称)

iris session irishealth
0
1 264
記事 Mihoko Iijima · 6月 8, 2023 3m read

FHIR関連トレーニングの中で複数の方よりいただいたご質問をご紹介していきます。

IRIS for HealthのFHIRリポジトリでは、リソースPOST時のデフォルトの動作としてリポジトリ内でユニークな論理ID(id)を自動的に付与します。

例えば、以下のようなPatientリソースをPOSTした場合

0
0 267
InterSystems公式 Seisuke Nakahashi · 6月 8, 2023 3m read

2023.2 の開発者プレビュープログラムの一環として、3番目の開発者プレビューを公開いたします。今回リリースされたのは、InterSystems IRIS と InterSystems IRIS for Health です。

本リリースの注目点

2023.2では、多くの機能修正と改善に加えて、時間認識モデリングや 強化された外部テーブル読み込み専用の FEDERATED テーブルといった新機能が含まれる予定です。これら新機能の一部は、今回の開発者プレビュー版にはまだ含まれていません。ご注意ください。

2023.2の別の注目点は、プライベート・ウェブサーバ (PWS) がインストーラから削除されることです。このことは昨年に発表され、インターシステムズ製品のインストーラから削除予定ですが、今回のプレビュー版ではまだPWSは存在します。詳細はこちらのドキュメントをご覧ください。

--> PWSが含まれないインストーラにご興味のある方は、こちらのフォームからEAPに登録してください。その際、オプションで「No Private Web Server」をお選びください。このEAPに関する情報はこちらをご参照ください。

0
0 104
記事 Megumi Kakechi · 6月 6, 2023 4m read

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

こちらでは、InterSystems Container Registry(ICR) より入手可能なDockerコンテナイメージを使用する方法をご案内します。

WRCDirectのダウンロードサイト より入手可能なイメージを使用する場合も同じようにできます。
 その際、Name:Web でフィルタリングしていただくと、Web Gateway の Docker イメージが見つけやすくなります。
※インターシステムズが提供する webgateway コンテナイメージには、Web ゲートウェイと Apache Web サーバの両方が含まれています。


【手順】

1. ブラウザより https://containers.intersystems.com/ にアクセスし、インターシステムズWRC認証情報でログインします。

2. Dockerログイントークンかログインコマンドを取得します。


3. 取得した認証情報を使い、Dockerインターフェース(PowerShellウインドウやLinuxコマンドラインなど)でICRへの認証を行います。
    以下の例のように、表示されるDocker ログインコマンドをコピー、ペーストすることで認証できます。

0
0 332
記事 Mihoko Iijima · 6月 6, 2023 5m read

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

ターミナルでルーチンやクラスのコンパイルを行う際、コンパイル結果が画面に表示されるのでエラーが発生した場合でも確認しやすいですが、一括コンパイルの場合は、大量のコンパイル結果の中にエラー情報が含まれてしまうためエラー情報だけを取得したい場合には少し工夫が必要です。

以下、ルーチン/クラスの一括コンパイル時の結果からエラー情報を取得する方法をご紹介します。

ルーチンの場合

ネームスペースにあるルーチンをターミナルで一括コンパイルするには、%Library.Routine クラスの CompileAll() メソッドを使用します。

以下実行例は、USERネームスペースにあるルーチンを一括コンパイルした結果です。TestRoutine1でコンパイルエラーが発生しています。

0
0 262
記事 Mihoko Iijima · 6月 2, 2023 6m read

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

この記事では、ワークフローコンポーネントを使ってみよう!~使用手順解説~ でご紹介したユーザ操作画面(ユーザポータル)を任意のWebアプリに変更する際に便利な REST API の使用方法をご紹介します。

ワークフロー用 REST APIですが、開発者コミュニティのサンプル公開ページ:Open Exchange に公開されているAPIでどなたでも自由にご利用いただけます。

Open Exchangeの検索ボックスに「Workflow rest」と入力すると出てきます。EnsembleWorkflow が対象のサンプルです。

ちなみに、2023年6月2日時点で724のアプリケーションが公開されているようです👀

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

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

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

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

A.事前準備

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

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

0
0 390
記事 Mihoko Iijima · 6月 1, 2023 7m read

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

先日のウェビナーでご紹介した「ワークフローコンポーネント」をお試しいただけるサンプルを公開しました。👉 https://github.com/Intersystems-jp/WorkFlow-DC

《サンプルのテーマ》

店舗で販売している商品に付けるPOPメッセージ候補を予めテーブルに登録できる仕組みが既にある、と仮定しています。

IRISの Interoperability を利用してPOPメッセージ候補が登録されるテーブルに対して一定間隔でSELECT文を実行し、未処理のメッセージを取得します。
新たなレコードが存在する場合、ワークフローコンポーネントを利用して担当者に審査を依頼します。

担当者は、ワークフローユーザポータルを使用して、POPメッセージ候補の承認/却下を指示できるようにしています。

0
0 206
記事 Mihoko Iijima · 5月 30, 2023 2m read

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

%SYSTEMパッケージには沢山の便利なシステムクラスがあり、Embedded Pythonでも一般クラスと同様に%SYSTEMパッケージ以下クラスを操作できます(iris.cls("クラス名").メソッド名()で呼び出せます)。

ObjectScriptでは、$SYSTEM特殊変数を利用して、%SYSTEMパッケージ以下クラスのメソッドを呼び出すことができますが、Embedded Pythonでは、iris.system を利用して実行することができます。

以下実行例をご紹介します。

現在のネームスペースを取得する

一般クラスと同じ呼び出し方の例

iris.cls("%SYSTEM.SYS").NameSpace()

iris.systemを利用する例

iris.system.SYS.NameSpace()

 

binディレクトリのパスを返す

一般クラスと同じ呼び出し方の例

iris.cls("%SYSTEM.Util").BinaryDirectory()

iris.systemを利用する例

iris.system.Util.BinaryDirectory()

 

SQL関連をまとめたSQLクラスの例は以下の通りです。

YYYY-MM-DDから$horolog形式の日付を返す

一般クラスと同じ呼び出し方の例

0
0 128
記事 Megumi Kakechi · 5月 30, 2023 3m read

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

Apache環境でRESTを動かすための設定方法は以下のとおりです。


1. Webゲートウェイをインストールします

添付(Webゲートウェイインストール手順.pdf)の手順に従い、Webゲートウェイをインストールします。
Webゲートウェイをインストールする前に、Apacheを停止してください。


2. Apache 構成ファイルの設定を行います

/etc/httpd/conf/httpd.conf の末尾に以下を追加します。
追加後、Apacheを再起動してください。

<Location />
    CSP On
    SetHandler csp-handler-sa
</Location>


こちらの設定では、Apacheに対するすべてのリクエストをWebゲートウェイに渡す設定になります。
 <Location />ではなく、<Location /rest> にすると、/rest のみWebゲートウェイに渡すようになります。
 (既に他の目的でApacheを使用している場合、<Location /> の設定にするとそちらが動かなくなりますのでご注意ください)

Apacheの再起動:

0
0 662
記事 Mihoko Iijima · 5月 26, 2023 6m read

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

IRISではジャーナルファイルが自動的に圧縮される仕組みが導入されています。

ジャーナルファイルの圧縮機能について詳しくは、別の記事「ジャーナル圧縮機能について」をご参照ください。

例えば、CachéからIRISへ移行された後に、念のためIRISで更新されたデータを手動でCachéにも反映させたいことばある場合に、IRISのジャーナルファイルをCachéにリストアすることができます。

手順は以下の通りです。

(手順1) IRISのジャーナルファイル(YYYYMMDD.nnnz) ファイルを解凍する
(手順2,3) 解凍した ジャーナルファイルを Cachéに転送してリストアする

リストアの方法として、以下の2パタンをご紹介

(A) 指定グローバルとデータベースについて、指定ジャーナルから、全エントリをリストア
(B) 指定グローバルとデータベースについて、指定ジャーナルから、特定のアドレスまでリストアする

(A) 指定グローバルとデータベースについて、指定ジャーナルから、全エントリをリストア

(手順1) IRISサーバ上で以下のコマンドにより、ジャーナルを解凍する

IRIS 2022.1 以降、現在実行中のジャーナル以外は、拡張子 z で圧縮されています。

以下のコマンドで解凍し、指定のフォルダにコピーします。

0
0 214
InterSystems公式 Seisuke Nakahashi · 5月 24, 2023

2023.2 の開発者プレビュープログラムの一環として、2番目の開発者プレビューを公開いたします。今回リリースされたのは、InterSystems IRIS と InterSystems IRIS for Health です。

本リリースの注目点

2023.2では、多くの機能修正と改善に加えて、時間認識モデリングや 強化された外部テーブル読み込み専用の FEDERATED テーブルといった新機能が含まれる予定です。これら新機能の一部は、今回の開発者プレビュー版にはまだ含まれていません。ご注意ください。

2023.2の別の注目点は、プライベート・ウェブサーバ (PWS) がインストーラから削除されることです。このことは昨年に発表され、インターシステムズ製品のインストーラから削除予定ですが、今回のプレビュー版ではまだPWSは存在します。詳細はこちらのドキュメントをご覧ください。

--> PWSが含まれないインストーラにご興味のある方は、こちらのフォームからEAPに登録してください。その際、オプションで「No Private Web Server」をお選びください。このEAPに関する情報はこちらをご参照ください。

0
0 107
記事 Toshihiko Minamoto · 5月 23, 2023 8m read

Web スクレイピングとは:

簡単に言えば、Web スクレイピングWeb ハーベスティング、または Web データ抽出とは、Web サイトから大量のデータ(非構造化)を収集する自動プロセスです。 ユーザーは特定のサイトのすべてのデータまたは要件に従う特定のデータを抽出できます。 収集されたデータは、さらに分析するために、構造化された形式で保存することができます。

Web スクレイピングとは? — James Le

Web スクレイピングの手順:

  1. スクレイピングする Web ページの URL を見つけます。
  2. 検査により、特定の要素を選択します。
  3. 選択した要素のコンテンツを取得するコードを記述します。
  4. 必要な形式でデータを保存します。

たったそれだけです!!

Web スクレイピングに使用される一般的なライブラリ/ツール

  • Selenium - Web アプリケーションをテストするためのフレームワーク
  • BeautifulSoup – HTML、XML、およびその他のマークアップ言語からデータを取得するための Python ライブラリ
  • Pandas - データ操作と分析用の Python ライブラリ

Beauthiful Soup とは?

Beautiful Soup は、Web サイトから構造化データを抽出するための純粋な Python ライブラリです。 HTML と XML ファイルからデータを解析できます。 これはヘルパーモジュールとして機能し、利用できる他の開発者ツールを使って Web ページを操作する方法と同じ方法かより優れた方法で HTML と対話します。

  • lxmlhtml5lib などの使い慣れたパーサーと連携して、有機的な Python の方法で、解析ツリーを移動操作、検索、および変更できるようにするため、通常、プログラマーは数時間または数日間に及ぶ作業を節約できます。
  • Beautiful Soup のもう 1 つの強力で便利な機能は、フェッチされるドキュメントを Unicode に変換し、送信されるドキュメントを UTF-8 に変換するインテリジェンスです。 ドキュメント自体にエンコーディングが指定されていないか、Beautiful Soup がエンコーディングを検出できない場合を除き、開発者がその操作に注意する必要はありません。
  • 他の一般的な解析またはスクレイピング手法と比較した場合も高速と見なされています。

今日の記事では、Embedded Python と Object Script を使用して、ae.indeed.com にある Python の求人情報と企業をスクレイピングします。

ステップ 1 - スクレイピングする Web ページの URL を見つけます。

Url = https://ae.indeed.com/jobs?q=python&l=Dubai&start=0

スクレイピングするデータのある Web ページは以下のようになります。

  単純化と学習の目的で、"Job Title"(役職)と "Company"(会社)を抽出します。出力は以下のスクリーンショットのようになります。

 

以下の 2 つの Python ライブラリを使用します。

  • requests Requests は、Python プログラミング言語の HTTP ライブラリです。 プロジェクトの目標は、HTTP リクエストを単純化し、人間が読みやすくすることです。  
  • bs4 for BeautifulSoup Beautiful Soup は、HTML と XML ドキュメントを解析するための Python パッケージです。 HTML からデータを抽出するために使用できる解析済みページの解析ツリーを作成します。Web スクレイピングに役立ちます。

以下の Python パッケージをインストールしましょう(Windows)。

irispip install --target C:\InterSystems\IRISHealth\mgr\python bs4

irispip install --target C:\InterSystems\IRISHealth\mgr\python requests

Python ライブラリを ObjectScript にインポートしましょう
 

Class PythonTesting.WebScraper Extends%Persistent
{

// pUrl = https://ae.indeed.com/jobs?q=python&l=Dubai&start=// pPage = 0ClassMethod ScrapeWebPage(pUrl, pPage)
{
    // imports the requests python libraryset requests = ##class(%SYS.Python).Import("requests")
    // import the bs4 python libraryset soup = ##class(%SYS.Python).Import("bs4")
    // import builtins package which contains all of the built-in identifiersset builtins = ##class(%SYS.Python).Import("builtins")
}

Requests を使って HTML データを収集しましょう。

注意: 「my user agent」でグーグル検索し取得した、ユーザーエージェント
URL は "https://ae.indeed.com/jobs?q=python&l=Dubai&start=" で、pPage はページ番号です。

Requests を使って URL に HTTP GET リクエストを行い、そのレスポンスを "req" に格納します。

set headers  = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"}
    set url = "https://ae.indeed.com/jobs?q=python&l=Dubai&start="_pPage
    
    set req = requests.get(url,"headers="_headers)

req オブジェクトには、Web ページから返された HTML が含まれます。

これを BeautifulSoup HTML パーサーで実行し、求人データを抽出できるようにします。

set soupData = soup.BeautifulSoup(req.content, "html.parser")
set title = soupData.title.text
W !,title

タイトルは以下のように表示されます

ステップ 2 - 検査し、必要な要素を選択します。

このシナリオでは、通常 <div> タグに含まれる求人リストに注目しています。ブラウザ内で要素を検査すると、その div クラスが見つかります。

ここでは、必要な情報は、「 <div class="cardOutline tapItem ... </div>」 に格納されています。

ステップ 3 - 選択した要素のコンテンツを取得するコードを記述します。

BeautifulSoup の find_all 機能を使用して、クラス名 "cardOutline" を含むすべての <div> タグを検索します。

//parameters to python would be sent as a python dictionaryset divClass = {"class":"cardOutline"}
set divsArr = soupData."find_all"("div",divClass...)

これによりリストが返されます。これをループ処理すると、Job Titles と Company を抽出できます。

###ステップ 4 - 必要なフォーマットでデータを保存/表示します。

以下の例では、データをターミナルに書き出します。

set len = builtins.len(divsArr)
    
W !, "Job Title",$C(9)_" --- "_$C(9),"Company"for i = 1:1:len {
    Set item = divsArr."__getitem__"(i - 1)
    set title = $ZSTRIP(item.find("a").text,"<>W")
    set companyClass = {"class_":"companyName"}
    set company = $ZSTRIP(item.find("span", companyClass...).text,"<>W")
    W !,title,$C(9)," --- ",$C(9),company
}

builtins.len() を使用して、divsArr リストの長さを取得していることに注意してください。

識別子名: ObjectScript と Python の識別子の命名規則は異なります。 たとえば、Python のメソッド名ではアンダースコア(_)を使用でき、_getitem_ や _class_ のようにいわゆる「ダンダー」といわれる特殊なメソッドや属性で実際に広く使用されています(「ダンダー」は「double underscore = 二重アンダースコア」の略です)。 このような識別子を ObjectScript で使用するには、二重引用符で囲みます:

識別子名に関する InterSystems ドキュメント

クラスメソッドの例

ClassMethod ScrapeWebPage(pUrl, pPage)
// pUrl = https://ae.indeed.com/jobs?q=python&l=Dubai&start=// pPage = 0ClassMethod ScrapeWebPage(pUrl, pPage)
{
    set requests = ##class(%SYS.Python).Import("requests")
<span class="hljs-keyword">set</span> soup = <span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%SYS.Python</span>).Import(<span class="hljs-string">"bs4"</span>)

<span class="hljs-keyword">set</span> builtins = <span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%SYS.Python</span>).Builtins()

<span class="hljs-keyword">set</span> headers  = {<span class="hljs-string">"User-Agent"</span>: <span class="hljs-string">"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"</span>}
<span class="hljs-keyword">set</span> url = pUrl_pPage

<span class="hljs-keyword">set</span> req = requests.get(url,<span class="hljs-string">"headers="</span>_headers)

<span class="hljs-keyword">set</span> soupData = soup.BeautifulSoup(req.content, <span class="hljs-string">"html.parser"</span>)

<span class="hljs-keyword">set</span> title = soupData.title.text

<span class="hljs-keyword">W</span> !,title

<span class="hljs-keyword">set</span> divClass = {<span class="hljs-string">"class_"</span>:<span class="hljs-string">"cardOutline"</span>}
<span class="hljs-keyword">set</span> divsArr = soupData.<span class="hljs-string">"find_all"</span>(<span class="hljs-string">"div"</span>,divClass...)

<span class="hljs-keyword">set</span> len = builtins.len(divsArr)

<span class="hljs-keyword">W</span> !, <span class="hljs-string">"Job Title"</span>,<span class="hljs-built_in">$C</span>(<span class="hljs-number">9</span>)_<span class="hljs-string">" --- "</span>_<span class="hljs-built_in">$C</span>(<span class="hljs-number">9</span>),<span class="hljs-string">"Company"</span>
<span class="hljs-keyword">for</span> i = <span class="hljs-number">1</span>:<span class="hljs-number">1</span>:len {
        <span class="hljs-keyword">Set</span> item = divsArr.<span class="hljs-string">"__getitem__"</span>(i - <span class="hljs-number">1</span>)
        <span class="hljs-keyword">set</span> title = <span class="hljs-built_in">$ZSTRIP</span>(item.find(<span class="hljs-string">"a"</span>).text,<span class="hljs-string">"<>W"</span>)
        <span class="hljs-keyword">set</span> companyClass = {<span class="hljs-string">"class_"</span>:<span class="hljs-string">"companyName"</span>}
        <span class="hljs-keyword">set</span> company = <span class="hljs-built_in">$ZSTRIP</span>(item.find(<span class="hljs-string">"span"</span>, companyClass...).text,<span class="hljs-string">"<>W"</span>)
        <span class="hljs-keyword">W</span> !,title,<span class="hljs-built_in">$C</span>(<span class="hljs-number">9</span>),<span class="hljs-string">" --- "</span>,<span class="hljs-built_in">$C</span>(<span class="hljs-number">9</span>),company
 }

}

</div>

今後の内容..

ObjectScript とEmbedded Python と数行のコードを使用して、いつも使用する求人サイトのデータをスクレイピングし、求人タイトル、会社、給料、職務内容、メールアドレス/リンクを簡単に収集できます。

たとえば、ページが複数ある場合、ページを使用して簡単にそれらをトラバースできます。 このデータを Pandas データフレームに追加して重複を削除したら、関心のある特定のキーワードに基づいてフィルターを適用できます。 このデータを NumPy で実行してラインチャートを取得します。 または、One-Hot エンコーディングをデータに実行し、ML モデルを作成/トレーニングします。興味のある特定の求人情報がある場合は、自分に通知を送信するようにします。 😉

それではコーディングをお楽しみください!!!

「いいね」ボタンも忘れずに押してください 😃

0
0 431
記事 Megumi Kakechi · 5月 21, 2023 2m read

すべての永続クラス (%Persistent) およびシリアルクラス(%SerialObject) をコンパイルすると、ストレージ定義 が展開されます。
ストレージ定義には、オブジェクト保存と検索用のグローバル構造情報、ストレージインタフェースによって使用される追加のパラメータや、ストレージクラスを定義する一連のキーワードや値などが含まれます。

スタジオや ObjectScript コマンドを使用して永続クラスをエクスポートする場合、既定では以下のようなストレージ情報が付与された状態でエクスポートされます。

Storage Default
{
<Data name="PersonDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>Name</Value>
</Value
:


こちらの記事では、このストレージ定義を除いた状態でクラスをエクスポートする方法をご紹介します。
 

/skipstorage」というエクスポート修飾子を指定すると、クラスのストレージ情報なしでエクスポートすることが可能です。

コマンドで使用する方法は以下のようになります。

0
0 130
記事 Megumi Kakechi · 5月 15, 2023 2m read

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

サブスクリプトレベルマッピングされたグローバルを、トップノードから全体をkillする場合、<SLMSPAN>エラーとなり削除ができません。

これは、サブスクリプトレベルマッピングされたグローバルについては、マッピングを跨いだサブスクリプト範囲の kill コマンドは行えないためです。

// 以下のように、別々のデータベースにサブスクリプトマッピンググローバルが存在する場合:^TEST(A*~K*) -> database A
^TEST(L*~Z*) -> database B

// Topレベルから Kill しようとすると、<SLMSPAN>エラーとなる
NAMESPACE>Kill^TEST
<SLMSPAN> <- このエラーが出力


現ネームスペース(データベース)のグローバルのみ削除するには、次のように指定して下さい。

NAMESPACE>Kill ^["^^."]TEST

サブスクリプトレベルでマッピングしているグローバルは、データベースに移動して直接Killする必要があります。
データベースに移動する場合は以下のようにします。

0
0 118
記事 Tomoko Furuzono · 5月 14, 2023 3m read

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

オペレーティング・システム・ベースの認証(OS認証)では、OSのユーザ ID を使用して、IRISを使用するユーザを識別します。

インストール時に選択する初期セキュリティ設定=最小の場合は、予め、OSログインユーザと同一名のユーザをInterSystems IRIS に作成する必要があります。(パスワードは異なっていても構いません。)
初期セキュリティ設定=通常以上の場合は、インストールユーザ名(OSログインユーザ名)で、ユーザが作成されていますので、このユーザを使用することができます。別のログインユーザで実行したい場合は、同様にIRISユーザを同名で作成してください。

​​ [インストール時の初期セキュリティ設定画面]

​​OS認証は、以下の3つのサービスに使用できます。

・コールイン (%Service_Callin)
・コンソール (%Service_Console)  ※Windowsのローカル接続
・ターミナル (%Service_Terminal)  ※Linux/Unixのローカル接続

※iris run(runw)/ccontrol run(runw) ではパスワード認証は使用できませんが、OS認証を使用してシステムにログインすることが可能となります。

OS認証を行うための設定手順は以下の通りです。

0
0 158
記事 Megumi Kakechi · 5月 12, 2023 2m read

こちらの記事 では、ヘルスモニタのセンサー値を ^%SYSMONMGR ユーティリティを使用して変更する方法をご紹介しました。
今回は、ヘルスモニターセンサー値を コマンド(プログラム)で変更する方法をご紹介します。


ヘルスモニタは、CPUUsage(CPU使用率)、DBLatency(DBからのランダム読取に要する時間)、DiskPercentFull(DBのディスク使用率)などの該当しきい値を超えた場合に、通知を生成します。
ヘルスモニタのセンサー値(閾値)について

センサーのしきい値を超えると、IRISのシステムログ(messages.log)に以下のようなメッセージが記録されます。

[SYSTEM MONITOR] CPUusage Warning: CPUusage = 81 ( Warnvalue is 75).
[SYSTEM MONITOR] DBLatency(c:\xxx\) Warning: DBLatency = 1092.228 ( Warnvalue is 1000).
[SYSTEM MONITOR] DiskPercentFull(/hs-connect/sys/mgr/) Alert: DiskPercentFull = 99.00, 99.02, 99.03 (Max value is 99).
0
0 203