検索

クリアフィルター
記事
Megumi Kakechi · 2021年10月28日

TIMESTAMP型のフォーマットについて

これは InterSystems FAQ サイトの記事です。 TIMESTAMP型はInterSystems製品では、%Library.TimeStampデータタイプ(=%TimeStamp)に対応していて、フォーマットは YYYY-MM-DD HH:MM:SS.nnnnnnnnn です。 小数点以下の精度を変更したい場合は、以下の方法で設定します。 1) システムワイドに設定する 管理ポータル:[システム管理] > [構成] > [SQLとオブジェクトの設定] > [一般SQL設定] GETDATE(), CURRENT_TIME, CURRENT_TIMESTAMP のデフォルト時刻精度 に 0~9 の範囲で桁数を指定できます。 設定内容の詳細については、下記のドキュメントページをご参照ください。追加構成設定~ - 一般SQL設定 - SQL タブ 2) SQLの関数で指定する CURRENT_TIMESTAMP()の引数を利用して、小数点以下の精度を 0~9 の範囲で桁数を指定できます。※CURRENT_TIMESTAMP()で返される値は、実行環境のタイムゾーンの現在の日付時刻を返します。 USER>do $SYSTEM.SQL.Shell()SQL Command Line Shell---------------------------------------------------- The command prefix is currently set to: <<nothing>>.Enter <command>, 'q' to quit, '?' for help.[SQL]USER>> << entering multiline statement mode, 'GO' to execute >> 1>>SELECT 2>> CURRENT_TIMESTAMP AS FullSecStamp, 3>> CURRENT_TIMESTAMP(2) AS FracSecStamp, 4>> $HOROLOG AS InternalFullSec 5>>go1. SELECT CURRENT_TIMESTAMP AS FullSecStamp, CURRENT_TIMESTAMP(2) AS FracSecStamp, $HOROLOG AS InternalFullSec FullSecStamp FracSecStamp InternalFullSec2021-10-12 15:46:18 2021-10-12 15:46:18.83 66029,56778 1 Rows(s) Affectedstatement prepare time(s)/globals/cmds/disk: 0.1017s/1046/177936/15ms execute time(s)/globals/cmds/disk: 0.0002s/0/651/0ms cached query class: %sqlcq.USER.cls7---------------------------------------------------------------------------[SQL]USER>> 詳細は下記ドキュメントページをご参照ください。CURRENT_TIMESTAMP
記事
Mihoko Iijima · 2021年6月1日

REST/JSON の簡単なサンプルご紹介

これは InterSystems FAQ サイトの記事です。 InterSystems 製品を利用した REST/JSON の操作方法を、簡単なサンプルを利用して解説します。 サンプルでは、REST クライアント、HTML、ターミナルからデータ(JSON)を送信し、サーバ(InterSystems製品)で JSON 形式のデータを返す REST ディスパッチクラスを使った簡単な流れになっています。 サンプルは、https://github.com/Intersystems-jp/FAQ-REST-SimpleSample からダウンロードいただけます。 サンプルの利用手順 (1) サンプルファイル(XML)のインポート RESTディスパッチクラスとサンプルHTMLファイルが含まれています (2) ウェブアプリケーションパスの設定 (3) 実行 (1) サンプルファイル(XML)のインポート 管理ポータルからインポートします(スタジオを利用されている場合は、スタジオでもインポートできます)。 管理ポータルは http://localhost:52773/csp/sys/UtilHome.csp でアクセスできます。 ※ ポート番号はお使いの環境に合わせて変更してください。 管理ポータルにアクセスできたら以下メニューでインポートを行ってください。 システムエクスプローラ > クラス > ネームスペース選択 > インポートボタンクリック > サンプルファイルを選択してインポート メモ:インポートファイルを選択すると、インポートアイテムが表示されます(下図)。 クラス定義(User.REST)とHTMLファイル(sampleJSON.html)がインポートされます。 (2) ウェブアプリケーションパスの設定 (1) でインポートしたクラス定義(User.REST)を REST ディスパッチクラスに指定したウェブアプリケーションパスを定義します。 管理ポータルを開き、以下メニューにアクセスします。 システム管理 > セキュリティ > ウェブ・アプリケーション > 「新しいウェブ・アプリケーションの作成」をクリックし、以下の図の設定を行ってください。 (サンプルでは、/simple を REST のベースパスとしています) ネームスペースはサンプルをインポートしたネームスペースを指定してください。 ディスパッチクラス名には、 (1)でインポートした User.REST を指定します。大文字小文字を区別します。記入時ご注意ください。 「許可された認証方法」は、「パスワード」を設定します。アクセス時、ユーザ名とパスワードの入力欄が出てきたらユーザ名:_system、パスワードは SYS(または設定したパスワード)を記入してログインします。 メモ:管理ポータルアクセス時にユーザ名、パスワードの入力欄が出ないアクセス(認証なしアクセス)では、デフォルト設定としてユーザ:_system に対するパスワードが SYS(大文字)で設定されています。サンプルテスト時ご利用ください。 (3) 実行 (2) で作成したRESTディスパッチクラスを起動するためのベースパス(/simple)を利用してテストできます。 REST ディスパッチクラスには UrlMap という定義があり、ベースパスのあとに指定したパスに合わせて、どのメソッドが実行されるか定義されています。 XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ] { <Routes> <Route Url="/req1" Method="GET" Call="req1"/> <Route Url="/req2" Method="GET" Call="req2"/> </Routes> } /simple/req1 を指定すると、以下のメソッドが実行されます。 ClassMethod req1() As %Status { set name1=%request.Get("NAME1") set name2=%request.Get("NAME2") set age=%request.Get("AGE") set tdobject = {} set tdobject.name=name1_" "_name2 set tdobject.age=age write tdobject.%ToJSON() quit $$$OK } 【メモ】 HTTP 応答の Content-Type ヘッダの設定は、REST ディスパッチクラスのクラスパラメータ CONTENTTYPE に "application/json" 、charset の指定は、クラスパラメータ CHARSET に "utf-8" を設定しているため、クラスメソッド内で指定する必要はありません。また、今回の例にはありませんが、メッセージボディの情報をクラスパラメータ CHARSET で自動的に変換させたい場合は、クラスパラメータ CONVERTINPUTSTREAM に 1 を設定します(設定例は以下例文をご参照ください)。 Parameter CONTENTTYPE = "application/json"; Parameter CHARSET = "utf-8"; Parameter CONVERTINPUTSTREAM = 1; 以下 URL を利用して、/simple/req1 のテストが行えます(クエリ文字列に指定した内容が JSON として返送されます)。 http://localhost:52773/simple/req1?NAME1=Yamada&NAME2=Taro&AGE=20 ※ ポート番号はお使いの環境に合わせて変更してください。 {"name":"Yamada Taro","age":"20"} サンプル HTML http://localhost:52773/csp/user/sampleJSON.html を利用してテストする場合は、Pushボタンをクリックすると、HTMLファイル内で設定したクエリ文字列を GET 要求で送信し、RESTディスパッチクラスで加工した文字列が JSON として返送されます(ポップアップで表示されます)。 以下、Pushボタン押下時の JavaScript です。 function go() { var url="/simple/req1"; var params = {"NAME1" : "山田", "NAME2":"太郎","AGE":20}; var queryparams= new URLSearchParams(params); url=url+"?"+ queryparams fetch(url,{ headers:{"Accept":"application/json"}, } ).then(function(Response) { console.log("status=" + Response.status); return Response.json(); }).then(function(json) { alert("取得結果=" +JSON.stringify(json)); }); } ポップアップに表示されるJSONは以下の通りです。 取得結果={"name":"山田 太郎","age":"20"} ターミナルで実行する場合は以下のように %Net.HttpRequest クラスを利用します。 set req=##class(%Net.HttpRequest).%New() set req.Server="localhost" set req.Port=52773 // ポート番号は環境に合わせて変更してください set base64=$system.Encryption.Base64Encode("_system:SYS") do req.SetHeader("Authorization","Basic "_base64) do req.SetParam("NAME1", "Yamada") do req.SetParam("NAME2", "Taro") do req.SetParam("AGE", "20") set sts=req.Get("/simple/req1") set ans=req.HttpResponse.Data.Read() write ans 関連するFAQトピックもご参照ください。 jQueryでCachéのデータをJSON形式で取得するにはどうすればいいですか? 関連する記事もご参照ください。 【はじめてのInterSystems IRIS】セルフラーニングビデオ:アクセス編:IRIS で作成する REST サーバの仕組み 【はじめてのInterSystems IRIS】セルフラーニングビデオ:アクセス編:(REST)手動で作成するディスパッチクラス 【はじめてのInterSystems IRIS】セルフラーニングビデオ:アクセス編:(REST)APIファーストで作成するRESTディスパッチクラス 【はじめてのInterSystems IRIS】セルフラーニングビデオ:アクセス編:IRIS での JSON の操作
記事
Toshihiko Minamoto · 2022年10月5日

Djangoへようこそ

IRIS における Python サポートの最近の改善と、InterSystems による [Python DB-API](https://docs.intersystems.com/irisforhealth20221/csp/docbookj/DocBook.UI.Page.cls?KEY=BTPI_pyapi) サポートへの継続的な作業により、 Django プロジェクトに IRIS サポートを実装しました。Python DB-API の使用により、他のデータベースと連携することが可能です。 Django で、IRIS にデータを保存する単純なアプリケーションを試してみましょう。 ![ToDo アプリ](https://raw.githubusercontent.com/caretdev/django-iris-todo/develop/staticfiles/todoApp.png) このアプリケーションは [GitHub](https://github.com/caretdev/django-iris-todo) にあります。それをクローンしましょう。 git clone https://github.com/caretdev/django-iris-todo cd django-iris-todo 次に、Docker-compose でビルドして起動します。 docker-compose up -d --build IRIS の起動にはしばらくかかりますが、Django アプリケーションは起動をキャッチしてそこにモデルを移行し、アプリケーションも起動します。起動が完了すると、http://localhost:8000/ で利用できるようになり、上記の図のようになります。 ### 仕組み 動作させるには、InterSystems Python DB-API がインストールされている必要があります。最新のプレビューバージョンが含まれているため、2022.1.0.114.0 以上のバージョンが必要です。これは、インスタンスの `<INSTALL_DIR>/dev/python/` フォルダにあります。 このファイルは、[こちらの GitHub リポジトリ](https://github.com/intersystems-community/iris-driver-distribution)からダウンロードすることもできます。  pip3 install intersystems_irispython-3.2.0-py3-none-any.whl Django の IRIS バックエンドは別のプロジェクトで実装されており、pip を使ってインストール可能です。当然 django そのものも必要なので、それらをインストールしましょう。 pip3 install django django-iris 別の方法として、requirements.txt ファイルを使用して必要なパッケージを Python にインストールすることができます。 pip3 install -r requirements.txt ただし、このファイルには以下の行が含まれます。 https://raw.githubusercontent.com/intersystems-community/iris-driver-distribution/main/intersystems_irispython-3.2.0-py3-none-any.whl Django~=4.0.2 django-iris~=0.1.5 Django アプリケーションを IRIS に接続して、todoApp/settings.py ファイルを開きましょう。 ![](/sites/default/files/inline/images/images/image(3445).png) DATABASES は、データベースへの接続設定を定義します。 ENGINE は django_IRIS である必要があります。 NAME は IRIS のネームスペースにポイントする必要があります。 接続できるものに変更しましょう。 たとえば、以下のようにします。 DATABASES = {     'default': {         'ENGINE': 'django_iris',         'NAME': 'DJANGOTODO',         'HOST': 'localhost',         'PORT': 1972,         'USER': '_SYSTEM',         'PASSWORD': 'SYS',     } } そして移行を開始します。 python3 manage.py migrate ![](/sites/default/files/inline/images/images/image(3446).png) エラーもなく、IRIS 側のすべてのテーブルが作成されました。 これで、アプリケーションを起動することができます。 python3 manage.py runserver ![](/sites/default/files/inline/images/images/image(3447).png) Django には管理者パネルがあります。 python3 manage.py createsuperuser ![](/sites/default/files/inline/images/images/screenshot_2022-02-25_at_13_35_32.png) 管理者パネルは、http://localhost:8000/admin/ で利用できます。  ![](/sites/default/files/inline/images/images/image(3448).png) IRIS にはこのように格納されています。 ![](/sites/default/files/inline/images/images/image(3449).png)   完全にサポートするには、ほかにもいくつかの作業が残っています。 InterSystems からの Python DB-API ドライバーはまだ開発中であり、この django-iris プロジェクトも進行中です。 Community Edition ではあまりうまく動作しない可能性があるので注意してください。これは Django がデータベースに接続する方法に起因しており、すべてのライセンスをかなり素早く消費してしまう可能性があるためです。 プロジェクトと、IRIS を使った今後のインパクトを気に入っていただけたら、[OpenExchange コンテスト](https://openexchange.intersystems.com/contest/current)でぜひ投票してください。
記事
Mihoko Iijima · 2020年12月8日

ターミナルのプロンプトを変更する方法

これは、InterSystems FAQサイトの記事です。 $SYSTEM.Process.TerminalPrompt() を使用してターミナルのプロンプトを変更できます。 プロンプトの表示形式は、以下情報の組み合わせで指定できます。 ホスト名 現在のネームスペース 構成名 現在の時刻 PID: オペレーティングシステム上でのプロセスID ユーザーネーム 最後のコマンドを実行してからの経過時間 例えば、Do $SYSTEM.Process.TerminalPrompt(1,3) ではホスト名と構成名をターミナルのプロンプトとして表示します。 *実行例は、ホスト名="HOST1"、構成名="IRIS"* USER>Do $SYSTEM.Process.TerminalPrompt(1,3) HOST1:IRIS>
記事
Hiroshi Sato · 2021年10月12日

DBリストア手順

これはInterSystems FAQ サイトの記事です。^BACKUP ユーティリティを使用して、DBリストアする方法をご紹介します。 添付のドキュメントでは、オンラインバックアップ と レガシー並行外部バックアップ の2種類のバックアップからのリストア処理の方法を紹介しています。 リストア処理の詳細は、下記ドキュメントページを参照してください。 オンライン・バックアップ・リストア・ユーティリティ【IRIS】Caché オンライン・バックアップ・リストア・ユーティリティについて
記事
Megumi Kakechi · 2021年5月13日

ロックテーブルの使用状況を簡単に確認する方法

これは InterSystems FAQ サイトの記事です。 システムクラス SYS.Lock のメソッド GetLockSpaceInfo() にてロックテーブルの空きサイズ、使用サイズが取得可能です。 %SYS>w ##class(SYS.Lock).GetLockSpaceInfo()4717392,4712512,1200 戻り値は、“AvailableSpace, UsableSpace, UsedSpace” になり、それぞれByte単位の値を表しています。 AvailableSpace:ロックテーブルサイズから使用サイズ(UsedSpace)を引いたサイズ UsableSpace:AvailableSpaceよりロック管理のための内部データを引いたサイズ→これがユーザの使用できるロックテーブル空き容量になります。 UsedSpace:使用サイズ 詳細は、クラスリファレンス をご覧ください。
記事
Mihoko Iijima · 2021年6月14日

TCP接続(OPEN)した際のクライアントのアドレス取得方法

これは InterSystems FAQ サイトの記事です。 接続先クライアントのIPアドレス取得するには、以下の方法で %SYS.ProcessQuery クラスを使用します。 (a) 対象プロセス ID を指定して、ClientIPAddress プロパティ を参照します。 Set Process=##CLASS(%SYS.ProcessQuery).%OpenId("8656") Write Process.ClientIPAddress (b) 全てのプロセスの情報を知りたい場合は、必要な情報のみ取得する SQL クエリを作成し、クラス内で実行することができます。 例) SELECT * FROM %SYS.ProcessQuery で詳細情報を取得できます。 詳細は、以下ドキュメントをご参照ください。%SYS.ProcessQueryについて【IRIS】%SYS.ProcessQueryについて
記事
Makiko Kokubun · 2021年7月14日

動画:KubernetesでのIRISの運用とそれを支える仕組み

*この動画は、2021年2月に開催された「InterSystems Japan Virtual Summit 2021」のアーカイブです。 本動画では、コンテナを開発・デモ環境で使用されている方を対象に、プロダクション環境をコンテナで運用することを目的として Kubernetes の基本及び IRIS data platform の運用を支える仕組みをデモを交えながらご紹介します。 この他にも、開発者コミュニティでは、コンテナやKubernetesに関連する技術情報を公開しています。こちらも合わせてご覧ください。
記事
Megumi Kakechi · 2022年1月30日

アプリケーションのログを^ERRORSグローバルに入れる方法

これは、InterSystems FAQサイトの記事です。 TRY-CATCHで行うことが可能です。以下のように行ってください。 #dim ex As %Exception.AbstractException TRY { "<何かエラーを発生させる処理>" } CATCH ex { do ex.Log() } ^%ETNを使用する場合は、^%ETNを呼び出す際にBACKエントリ(BACK^%ETN)から呼び出してください。 あわせて、以下の関連記事も是非ご覧ください。 アプリケーションエラー(^ERRORS)をコマンドで取得する方法【FAQ】アプリケーションから明示的にエラー詳細情報をログ出力する方法を教えてください。
記事
Megumi Kakechi · 2022年6月29日

ODBCツール等からアクセスした際に表示されるカラム順を制御する方法

これは InterSystems FAQ サイトの記事です。 デフォルトではテーブルのカラムの順番はシステムが自動的に決定します。 順番を変更するにはクラス定義を行う際にプロパティ・キーワード SqlColumnNumber でプロパティ毎に明示的に順番を設定してください。 例: Property Name As %String [SqlColumnNumber = 2]; ドキュメントは以下をご参照ください。 SqlColumnNumber なお、SQLテーブル名を変えたい場合は SqlTableName 、カラム名(フィールド名)を変えたい場合は SqlFieldName を指定します。 ともに、永続クラスのみに適用されます。
記事
Hiroshi Sato · 2020年9月28日

ルーチン一覧をプログラミングで取得する方法

これはInterSystems FAQ サイトの記事です。 %Library.Routine (以降、%Routine)クラスのRoutineListクエリを使用して、プログラムからルーチンの日付やサイズを取得できます。 RoutineListクエリには、引数があり、検索対象となるルーチン名を前方一致や中間一致で指定できます。(ワイルドカードには、* か ? を指定します。) 以下の例では、*.MAC を引数に指定して、検索をしています。 SET tStatement = ##class(%SQL.Statement).%New() DO tStatement.%PrepareClassQuery("%Routine","RoutineList") SET rs = tStatement.%Execute("*.MAC",,0) DO rs.%Display() ルーチン一覧の他に、クラス定義一覧も取得できます。

#iKnow

2 投稿0 フォロワー

#CaretDev

0 投稿0 フォロワー
お知らせ
Seisuke Nakahashi · 2023年2月20日

製品リリースの新しい頻度について

インターシステムズでは、お客様のニーズにお応えし、定期的に製品リリースのポリシーを変更しています。 今回新しくメンテナンスリリースの頻度を変更しました。これにより、大切なお客様やパートナーのみなさまが製品導入の計画をたてやすくなったり、機能改善の調整をしやすくなっていただければ幸いです。 本記事では、データプラットフォーム製品のリリース頻度を改めてお伝えするとともに、最新の変更点についてご案内いたします。 なぜ変更するのか? お客様に私たちの新バージョンをより早くお届けするため。 お客様に新しいプラットフォーム (OSバージョンや周辺技術) により早く適応いただくため。 特に3rdパーティーのライブラリにおいて発生する、セキュリティ問題により頻繁に対応するため。 お客様からの「より正確な製品スケジュール」へのリクエストに応えるため。 私たちのリリース頻度について変わらないこと インターシステムズでは InterSystems IRIS 2018 から、以下2つの製品ラインをリリースしてきました (オリジナル記事はこちら)。 CD (継続的デリバリー) リリース - 私たちの新機能をいち早くご提供します。これによりお客様のアプリケーションでは、継続的に更新しながら新機能を取り入れるような、理想的な開発と展開が可能となります。「快速列車 (fast train)」と呼ぶことがあります。 EM (拡張メンテナンス) リリース - CDリリースよりも頻度は下がりますが、より安定したリリースをご提供します。新機能を入手するより、メンテナンスリリースを通じて製品の修正を入手することがより大切となる、大規模なエンタープライズアプリケーションには理想的なリリースとなります。「鈍行列車 (slow train)」と呼ぶことがあります。 EMリリースは、バージョン番号が YYYY.1 となっているため、簡単に見分けがつきます (例: 2022.1、2023.1) CDリリースのバージョン番号は YYYY.2、YYYY.3 となります。 1年前にリリース頻度を更新し、CDリリースにキットを追加したり、InterSystems IRIS や InterSystems IRIS for Health 同様、HealthShare や Health Connect にもこれらのリリースサイクルを導入しました (こちらの記事もご覧ください)。CDリリースには以下3点の制限が残っています。まず、メンテナンスバージョンやセキュリティ修正はリリースされません。つぎに、Caché および Ensembleからのインプレース変換は出来ません。最後に、CDリリースからアップグレードできるのは、次のCDリリースか次のEMリリースに限定されます。 新機能のリリースは (EMリリース、CDリリースいずれも) お客様がダウンロードして新機能を試すことが出来るプレビュー段階を経て行われます。プレビュー版をお使いいただくことで、新リリースに先駆けて準備いただけます。プレビュー版は、新製品のフィードバックや、アプリケーションが新リリースで正常に動作することを確認する素晴らしい機会となります。2022.2 から、プレビュー版は2週間おきの水曜にリリースされています。 この新しいリリース頻度についてのお客様からのフィードバックは、非常に好意的なものでした。インターシステムズは、この2つの製品ラインを、高い品質を維持しながら運用してきました。 プラットフォームの更新 多くのお客様は現在、とくにクラウド環境においては、新しいOSにより早く適応されています。そこでインターシステムズはリリース頻度を変更しました。2022年から、メンテナンスリリースで新しいオペレーティングシステムを追加でサポートするようになりました。2022.1.1では Ubuntu 22.04のサポート、2022.1.2では RHEL 9 のサポートが追加されました。これにより、お客様が新しいオペレーティングシステムにいち早く適応いただけるようになりました。 セキュリティ更新は、特に OpenSSLのようなオペレーティングシステムにパッケージされた共有ライブラリでは、より頻繁に行われています。バージョン 2022.1 から、OpenSSL ライブラリは、オペレーティングシステムに同梱されたものを使用するよう変更しました。これにより、お客様がOS経由でセキュリティ更新を行うことができます。ただこれにより、Linuxオペレーティングシステムのメジャーバージョンごとに、InterSystemsの製品キットが異なるようになります。そのため EMリリースごとに、サポートするLinuxオペレーティングシステムは 2 メジャーバージョンに限定されます。新しいOSのサポートをメンテナンスリリースで追加した場合、古いOSバージョンのサポートは削除しません。このときは3種類のキットが存在する状況となり、次のEMリリースで2種類のキットに減ります。たとえば、2022.1.2 は、3種類の Red Hat キットがあります (RHEL 7、RHEL 8、RHEL 9)。 2022.1.3 も同じセットになりますが、2023.1.0 では RHEL8 と RHEL 9 のみになります。 プラットフォームの変化がスピードアップしているので、お客様に今後の予定を明確にお知らせしたいと考えています。インターシステムズは3か月ごとに「プラットフォーム・アップデート」をニュースレターとしてお伝えしてきました。このたび初めて、プラットフォーム・アップデートを開発者コミュニティで公開しました(英語)。ニュースのフォーマットや更新頻度について、ぜひフィードバックをお聞かせください。 メンテナンスバージョンとセキュリティの更新 CachéやEnsembleでのメンテナンス更新と同じく、InterSystems IRIS でも 2年間、メンテナンス更新をご提供します (ミニマムサポートバージョンをあわせてご覧ください)。メンテナンス更新に加えて、セキュリティ修正も提供しています。 関連製品やプラットフォームをひっくるめて、EMリリースの一連の更新を「ストリーム」と呼んでいます。たとえば、2021.1.0、2022.1.1、2022.1.2はひとつのストリームで、2022.1.0、2022.1.1、2022.1.2は違うストリームになります。つまりインターシステムズは、3つのストリームに対してメンテナンスバージョンを提供していることになります (InterSystems IRIS ・InterSystems IRIS for Health・Health Connect の最新EMと、1つ前のEM、そしてCaché・Ensemble の3つです - Caché・Ensemble は1つのストリームになっています)。 2023年4月から、インターシステムズはセキュリティ修正を、InterSystems IRIS の現在リリース中のバージョン ならびに 過去3年間のリリースに対して行います。Caché の最新メンテナンスリリースも同様です。つまりセキュリティ修正は、メンテナンス対象のストリームに加えて、対象外の2つのストリームに対しても行われます (合計5つのストリームが対象です)。例えば 2024年には、InterSystems はセキュリティ修正を、そのときの最新である InterSystems IRIS 2024.1.x に加えて、2023.1.x、2022.1.x、2021.1.x に対しても提供します。また Caché 2018.1.x にも提供します。 インターシステムズは最近、セキュリティ脆弱性の取り扱いに関するポリシーを、より多くのセキュリティ問題 - ほとんどが重要度中または低のもの - を取り扱えるように、より良く変更しました (こちらの記事もごらんください(英語))。現在は、セキュリティに関する更新をすべてのリリースで行っています。重要度高または緊急の問題の情報については、すべてのサポートストリームで修正対応されるまで、詳細は公開されません (情報が悪用されセキュリティ脆弱性をつかれる事態を防ぐためです)。対応された時点で、脆弱性の詳細をそえたセキュリティアラートを公開します。 予測しやすいメンテナンスリリース 多くのお客様から、インターシステムズ製品のソフトウェア更新が定期的に行われ、かつその入手時期を元に計画を立てたいとリクエストをいただきます。そこでインターシステムズは、メンテナンスリリースのスケジュールを以下のように正式に決定しました。 最新の InterSystems IRIS ストリーム: 3ヶ月ごとにメンテナンスリリースを行う 1つ前の InterSystems IRIS ストリーム: 6か月ごとにメンテナンスリリースを行う Caché・Ensemble: 12カ月ごとにメンテナンスリリースを行う InterSystems IRIS 2022.1 ストリームでは、メンテナンスリリースを 1月18日に発表しました (2022.1.2リリースアナウンスはこちら)。InterSystems IRIS 2021.1ストリーム と Caché・Ensemble 2018.1ストリームは 2月28日に発表予定です。 2023年には、1つのEMリリース (2023.1) と 2つのCDリリース (2023.2、2023.3) を予定しています。2023.1.0が 正式版 (GA) としてリリースされると、それが最新 InterSystems IRIS ストリームとなり、2022.1 が1つ前のストリームになります。 WRCから過去リリースの削除 (ICRは例外) リリース頻度が高くなり、多くのキットがリリースされると (Linux OSメジャーバージョンごとに1つ)、WRC 製品ダウンロードページで取得できるキット数が莫大になり、お客様を混乱させることになります。そこでダウンロードページから、ストリームごとに古いキットを定期的に削除する運用をはじめています。 最新のCDバージョンのみ入手できます。例えば、2022.3が正式リリースされたため、2022.2イメージは2月末に削除されます。 各ストリームの最新メンテナンスバージョンのみ入手できます。例えば、2022.1.2がリリースされたので、2022.1.1は削除されました。これにより、お客様が既存のセキュリティ問題を含んだバージョンを誤ってインストールする事態を防ぐことができます。​ ご依頼があれば過去バージョンを入手いただけます。ただ、1つの共通バージョンを多くのサイトで運用されているお客様は、そのバージョンをお手元に保管いただくことをお勧めします。ファイル完全性を保証するため、全てのキットとコンテナは署名されており、チェックサムやPGP署名ファイルをWRC製品ダウンロードページから入手いただけます。 ただし、InterSystemsコンテナレポジトリ (ICR) については状況が異なります。それは、CI/CDパイプラインでは、お客様が特定のバージョンを使うケースが多いからです。ICR では、2年以上経過するまでは古いイメージを削除しません。インターシステムズは、お客様が現在のCI/CDパイプラインをお使いいただくことをお勧めします。またお客様からも、そのように運用するとフィードバックをいただいています。 お客様の成功に全力を尽くします 上記でお伝えした変更は全て、お客様の成功をお手伝いさしあげるために行ったものです。インターシステムズは、お客様からいただいたセキュリティ、プラットフォームへの適応、メンテナンス更新、リリース頻度に関するご心配をお聞きし、いただいたフィードバックをもとに運用ルールを変更しています。ご意見やご提案がございましたら、遠慮なくインターシステムズにお寄せくださいませ。
記事
Toshihiko Minamoto · 2023年6月27日

REST の設計と開発

## はじめに 今日の相互運用性分野に従事する多くの人にとって、REST は最高峰にあります。 REST API 開発用のツールとアプローチが溢れかえる中、コードを書き始める前に、どのツールを選び、何を計画する必要があるでしょうか? この記事では、堅牢性、適応性、および一貫性に優れた REST API を構築できるようにする設計パターンと考慮事項を焦点としています。 CORS サポートと認証管理の課題に他する実行可能なアプローチについて、REST API 開発の全段階に適用できる様々なヒントとテクニック、最適なツールを織り交ぜながら説明します。 InterSystems IRIS Data Platform で利用できるオープンソース REST API と複雑化し続ける API の課題にどのように取り組むかについてお読みください。 これは、[同じトピックに関する最近のウェビナー](https://community.intersystems.com/post/webinar-mar-14-rest-api-design-and-development)を記事にしたものです。 ## 2020 年のメモ この記事を書いてから 1 年半が過ぎました。 現在でも関連性があると思いますが、REST API の開発をこれまでになく簡単にする画期的な新機能を紹介したいと思います。 - [API 管理](https://community.intersystems.com/post/introducing-intersystems-api-manager) - API のライフサイクルを管理します。 - [%JSON.Adaptor](https://irisdocs.intersystems.com/iris20221/csp/docbookj/DocBook.UI.Page.cls?KEY=GJSON_adaptor) - JSONオブジェクトの変換を単純化します。 - [仕様優先型 REST API 開発](https://jp.community.intersystems.com/node/476556) - REST API の効果的な開発手法です。 ## この記事の内容 - REST API アーキテクチャ - ブローカー - ブローカーの分離 - ブローカーのパラメーター - コードの一般化 - CORS - 認証 - 開発ツール - 例 - JSON - まとめ - リンク ## REST API アーキテクチャ この記事の読者が REST API と InterSystems テクノロジーを使った REST API の実装の基本についてよく理解していることを希望します。 このトピックに特化した記事、ウェビナー、トレーニングコースがたくさんあります。 いずれにせよ、まず初めに、REST API を含む、アプリケーションの共通高レベルアーキテクチャから始めたいと思います。 以下のようなアーキテクチャです。 ![REST API アーキテクチャ](https://habrastorage.org/webt/mn/xs/vs/mnxsvsezrsne7tjtrnrfeqjkpu4.png) アプリケーションの主なレイヤーを見てみましょう。 ### データ クラスなどの永続データ。 ### ターミナル API これは、データを管理するレイヤーです。 データとのすべてのやり取りは、この API を通じて行われます。 この API のメソッドはデバイスへの書き込みを行わず、次のいずれかのみを返します。 - オブジェクト - ステータスまたは例外 ### Web API 受信リクエストを、ターミナル API が理解する形式に変換して呼び出します。 ターミナル API が返す結果は、クライアントが読み取れる形式(通常は JSON)に変換されて、クライアントに返されます。 Web API は直接データを操作しません。 私は、「REST API」ではなく「Web API」という用語を使用しています。これは、Web API は InterSystems プラットフォームでもサポートされている [WebSocket](https://docs.intersystems.com/iris20221/csp/docbookj/DocBook.UI.Page.cls?KEY=GCGI_op_serv) などに基づく別のアーキテクチャを使って実装することが可能であるためです。 ### クライアント 通常は JavaScript で書かれますが必ずしもそうとは限りません。これが、エンドユーザーが使用できるアプリケーションです。 このレベルは、直接データベースを操作したり、ビジネスロジックを実装したリ、アプリケーションの状態を保管してはいけません。 このレベルでは通常、インターフェース、事前入力検証、単純なデータ操作(並べ替え、グループ化、集計)など、最も単純なビジネスロジックのみが使用可能です。 この分離によって、アプリケーションから複雑さが取り除かれ、デバッグが容易になります。 これは、[多層アーキテクチャ](https://ja.wikipedia.org/wiki/%E5%A4%9A%E5%B1%A4%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3)と呼ばれるアプローチです。 ## ブローカー ブローカーは、REST API ロジックを含むクラスです。 以下の特徴があります。 - `%CSP.REST` のサブクラスである - URL とコード内のメソッドを一致させるルートが含まれる たとえば、以下のルートがあります。 `` クライアントが `/path/10/20` に GET リクエストを送信すると、`Package.Class` の `ClassMethod` が `10` と `20` の引数で呼び出されます。 ## ブローカーの分離 ### 「物理的」な分離 REST API には多くのルートが存在することがあるため、1 つのブローカーがすぐにメソッドでオーバーロードしてしまいます。 これを防止するには、以下のようにブローカを複数のクラスに分割します。 ![「物理的」な分離](https://habrastorage.org/webt/6u/rg/dt/6urgdt3zvhgxvk-_x-mptussne0.png) 説明: - Abstract broker(抽象ブローカー)はリクエストを変換し、CORS リクエストを確認して、REST API ロジックに関係のない他の技術的タスクを実行します。 - Broker 1..N には、リクエストに対し、ターミナル API メソッドを呼び出してターミナル API のレスポンスをクライアントに返す処理を行うメソッドが含まれます。 ### 「論理的」な分離とバージョン管理 通常、ブローカーには呼び出されたメソッドに URL を一致させるルートが含まれていますが、ブローカー間でリクエストを渡すマップも含まれています。 その仕組みは以下のとおりです。 `` この例では、`/form` から開始するすべてのリクエストが `Destination.Broker` に渡されます。 これにより、ブローカーの分離が可能になります。 ブローカーは次のように分離する必要があります。 - バージョン - ドメイン ![「物理的」な分離](https://habrastorage.org/webt/iz/86/gj/iz86gjogk53ahxw8qoq6fktzhhg.png) ## ブローカーのパラメーター REST ブローカーのパラメーターには、以下が推奨されます。 Parameter CONTENTTYPE = {..#CONTENTTYPEJSON}; Parameter CHARSET = "UTF-8"; Parameter UseSession As BOOLEAN = 1; 説明 - CONTENTTYPE — レスポンスが JSON であることに関する情報を追加します。 - CHARSET — レスポンスを UTF8 に変換します。 - UseSession — セッションを使用してユーザーを追跡します。詳細は「認証」をご覧ください。 すべてのブローカーは 1 つの抽象ブローカーから継承されるため、これらのパラメーターをその抽象ブローカーに 1 回指定するだけで十分です(プライマリスーパークラスのパラメーターのみが継承されることに注意してください)。 ## コードの一般化 REST API の開発時によく発生する問題の 1 つは、ブローカー間でのコードのコピーアンドペーストです。多数のルートとコードのコピーが発生してしまうため、これは不適切な実践です。 これを回避するには、メソッドジェネレーターに必要となる可能性のあるすべてのメタ情報が含まれた [%Dictionary](http://docs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25Dictionary.ClassDefinition) パッケージで[コード生成](https://docs.intersystems.com/iris20221/csp/docbookj/DocBook.UI.Page.cls?KEY=GOBJ_generators)を使用することをお勧めします。 コード生成の大規模な使用例には、RESTForms ライブラリがあります。 最後に、コード生成を使用すると、REST API の一貫性を高めることができます。 ## CORS クロスオリジンリソース共有(CORS)は Web ページ上の制限付きリソース(フォントなど)を、最初にリソースが提供されたドメイン外の別のドメインからリクエストできるようにする仕組みです。 CORS を使用して REST API にアクセスできるようにするには、次のパラメーターをブローカーに追加します。 Parameter HandleCorsRequest = 1; これにより、他のドメインのページが REST API にアクセスできるようになります。 これは安全な方法ではないため、`OnHandleCorsRequest` メソッド、そのシグネチャーもオーバーライドする必要があります。 ClassMethod OnHandleCorsRequest(pUrl As %String) As %Status {} このメソッドはリクエストのオリジンをチェックし、ホワイトリストに登録されたオリジンからのみのアクセスを許可します。 次は、オリジンを取得するメソッドです。 ClassMethod GetOrigins() As %String { set url = %request.GetCgiEnv("HTTP_REFERER") return $p(url,"/",1,3) // get http(s)://origin.com:port } ## 認証 1 人のユーザーが 1 つのライセンスを使用して 1 つのセッション内で作業するには、次の条件が満たされるように、システム管理ポータルで REST と CSP アプリケーションを構成する必要があります。 1. すべてのブローカーに実質的に `Parameter UseSession = 1;` が設定されている。 2. すべての Web アプリケーションで認証済み(パスワード)アクセスのみを許可する。 3. すべての Web アプリケーションに適切な `Session` タイムアウト(900、3600)が設定されている。 4. すべての Web アプリケーションに同じ `GroupById` 値が設定されている。 5. すべての Web アプリケーションに同じ `cookie path` が設定されている。 ## 開発ツール デバッグには、以下のような外部ツールを使用できます。 - REST クライアント(Postman)- REST API 開発者向けの主要デバッグツールです。 リクエストの保存とドキュメント化、JSON レスポンスの「Pretty」表示、複数の環境へのリクエストの送信が可能で、開発者向けにその他多数のツールが提供されます。 - プロキシサーバーのインターセプト(Fiddler)- 開発者は、リクエストのインターセプト、表示、編集、および複製が可能です。 - パケットアナライザー(Wireshark)- パケットの破損、エンコードの問題、リモートヘッドレスシステムの分析、および上記のツールでは不十分なその他の状況に役立ちます。 curl や wget などのコマンドラインツールを使用しないことを強くお勧めします。 また、REST API(REST API 以外)の様々なデバッグアプローチに関する連載記事([パート 1 - 外部ツール](https://jp.community.intersystems.com/node/501166)、[パート 2 - 内部ツール](https://jp.community.intersystems.com/node/501171))も用意しました。 ## 例 動作する REST API の例をいくつか紹介します。 InterSystems IRIS は、%API パッケージでいくつかの REST API を提供しています。 - Atelier - API 管理 - InterSystems: DocDB - InterSystems: BI - InterSystems: Text Analytics - InterSystems: UIMA さらに、ドキュメントには [REST に関するチュートリアル](https://docs.intersystems.com/iris20191/csp/docbookj/DocBook.UI.Page.cls?KEY=AFL_REST)も含まれています。 [Learning.InterSystems.com](http://Learning.InterSystems.com) には、REST に関するコースがいくつか用意されています。 また、GitHub には、オープンソースの REST API もあります。 ### InterSystems IRIS: BI - MDX2JSON MDX2JSON — MDX2JSON 変換用の REST API です。 キューブ、ダッシュボード、ウィジェット、およびその他の要素に関するメタ情報も提供されています。 2014.1+ で利用可能です。 クライアントは、AngularJS とハイチャートで構築される InterSystems IRIS: BI ダッシュボード用の Web ベースのレンダラーです。 以下のように表示されます。 ![DeepSeeWeb](https://habrastorage.org/web/815/5ab/c73/8155abc739b64bb1a4a90978f2ad2a18.png) ### InterSystems IRIS: Interoperability Workflow [Workflow](https://docs.intersystems.com/iris20221/csp/docbookj/DocBook.UI.Page.cls?KEY=EGWF_preface) は、自動ビジネスプロセスの実行にユーザーが参加できるようにするモジュールです。 [Workflow REST API](https://github.com/intersystems-ru/EnsembleWorkflow) はユーザーのタスクを公開します。 2014.1+ で利用可能です。 [Web クライアント](https://github.com/intersystems-ru/EnsembleWorkflowUI)で可視化を確認できます。 ![EnsembleWorkflowUI](https://habrastorage.org/files/1b1/5ea/25c/1b15ea25ccbb41c89e3a4be6f3b35cfb.png) ![EnsembleWorkflowUI](https://habrastorage.org/files/f70/355/030/f703550305be4c3d85ed2202019f196c.png) ### RESTForms [RESTForms](https://github.com/intersystems-ru/RESTForms) には、自己検出型の堅牢な汎用 REST API ソリューションが提供されているため、新しい REST API の作成が簡単に行えるようになります。 2016.1+ で利用可能です。 RESTForms については、 [パート 1](https://community.intersystems.com/post/restforms-rest-api-your-classes) と[パート 2](https://community.intersystems.com/post/restforms-rest-api-your-classes-part-2-queries) に分けて詳しく説明した記事を書きました。 RESTForms では以下のようないくつかのルートを利用できます。 | メソッド | URL | 説明 | | ------ | -------------------------------- | ------------------------------------ | | GET | form/info | RESTForms 対応のクラスをすべてリストします。 | | GET | form/info/all | 利用可能なすべてのクラスに関するメタ情報を取得します。 | | GET | form/info/:class | 利用可能な 1 つのクラスに関するメタ情報を取得します。 | | GET | form/object/:class/:id | ID とクラスでオブジェクトを取得します。 | | GET | form/object/:class/:id/:property | ID、クラス、およびプロパティ名でオブジェクトのプロパティを取得します。 | | POST | form/object/:class | オブジェクトを作成します。 | | PUT | form/object/:class/:id | 動的オブジェクトを介してオブジェクトを更新します。 | | PUT | form/object/:class | 標準オブジェクトを介してオブジェクトを更新します。 | | DELETE | form/object/:class/:id | オブジェクトを削除します。 | | GET | form/objects/:class/:query | SQL クエリを実行します。 | このプロジェクトでは、コードの一般化(コード生成と %Dictionary パッケージを使用)が積極的に使用されています。 クライアントは Angular と React で利用でき、以下のように表示されます。 ![RESTForms](https://habrastorage.org/web/402/b4b/e02/402b4be02e8e48779c7a925aa706e5fd.png) ## JSON JavaScript Object Notation の略で、REST API でよく使用されるテキストシリアル化形式です。 InterSystems 製品の JSON サポートはバージョン 2009.2 以降で提供されていましたが、バージョン 2016.2 において大幅に改善されました。 [ドキュメント](https://docs.intersystems.com/iris20221/csp/docbookj/DocBook.UI.Page.cls?KEY=GJSON)には JSON だけに関するものがあります。 ## まとめ - REST は最も一般的で広く採用されている API テクノロジーの 1 つです。 - REST API を提供する場合は、以下に限定されず、複数のクライアントテクノロジーの中から選択できます。 - JavaScript(AngularJS、React、ExtJS など) - モバイルアプリ(Cordova などのテクノロジー、またはネイティブアプリ) - InterSystems テクノロジーを使えば、簡単に REST API を作成できます。 ## リンク - [ドキュメント](https://docs.intersystems.com/iris20221/csp/docbookj/Doc.View.cls?KEY=GREST_intro) - [REST 関連ウェビナー](https://learning.intersystems.com/course/view.php?id=791) - Web をデバッグする: [パート 1](https://jp.community.intersystems.com/node/501166)、[パート 2](https://jp.community.intersystems.com/node/501171) - RESTForms: [パート 1](https://jp.community.intersystems.com/node/479226)、[パート 2](https://jp.community.intersystems.com/node/479236) - [コミュニティのチュートリアル](https://community.intersystems.com/post/lets-write-angular-1x-app-cach%C3%A9-rest-backend-start-here)