検索

クリアフィルター
お知らせ
Rie Tokue · 2025年5月28日

インターシステムズ 第3回 ソリューションウェビナー「サイロ化されたデータを有効活用するには? InterSystems Data Fabric Studioのご紹介 」のご案内

ご好評をいただいておりますソリューションウェビナー、3回目は以下のテーマで開催します。是非ご参加ください! 日時:6月17日(火)13時半~14時半 タイトル:サイロ化されたデータを有効活用するには? InterSystems Data Fabric Studioのご紹介 参加費無料・事前登録制 ご登録はこちらから 【概要】 あらゆるステークホルダーが必要な時に必要なデータにアクセスするには、まずアプリケーション毎に異なる種類のデータを使いやすい、統一されたデータ形式の変換が不可欠です。データアクセスに関わる課題を弊社の新製品、InterSystems Dat Fabric Studioはどのように解決できるのか、ユースケースとデモを交えてお話します。 【こんな方にお勧め】 データの利活用方法を検討されている方 データサイロにお悩みの方 【前提知識】 リレーショナルデータベースの基礎知識があれば望ましいです。Data Fabric Studioはローコードツールです。
記事
Tomoko Furuzono · 2021年6月15日

マシン名(ホスト名)を変更後OSを再起動すると、InterSystems IRIS が開始しなくなる

これは、InterSystems FAQサイトの記事です。マシン名の変更後に InterSystems IRIS(以降IRIS) を停止せずにOSを再起動すると、IRISが開始できないという問題が発生します。 開始するためには、<インストールディレクトリ>\mgr\iris.ids ファイルを削除してください。 iris.ids には、起動したノード名や共有メモリの情報(共有メモリID)が格納されていて、IRIS 開始時に作成され、停止時(iris stop または iris force を実施した場合)に削除されます。 IRIS を停止せずにOSを停止(再起動)した場合、IRISの開始情報が含まれる iris.ids が残ったままとなることがあります。IRIS は次の開始作業で iris.ids を確認します。マシン名が変更されていると起動しているノード名の情報が iris.ids の内容と異なる為、IRIS は正常に起動しません。 マシン名を変更後にOSを停止(再起動)する際には、必ず事前に IRIS を停止するようにしてください。 ※予期せぬ問題を防ぐためにも、OS停止時には事前に IRIS を停止することが理想的です。※InterSystemsの他製品についても同様です。詳しくは関連トピックをご参照ください。
記事
Tomohiro Iwamoto · 2020年11月23日

InterSystemsIRIS 用 ODataAPI アダプタの作成

この記事では、OData API 標準に基づいて開発された RESTful API サービスを利用するための IRIS クライアントの開発について説明します。 HTTP リクエストを作成し、JSON ペイロードの読み取りと書き込みを行い、それらを組み合わせて OData 用の汎用クライアントアダプタを構築する方法を確認するため、多数の組み込み IRIS ライブラリを説明します。 また、JSON を永続オブジェクトに逆シリアル化するための新しい JSON アダプタについても説明します。 RESTful API の操作 REST は World Wide Web の標準化に関する作業から作成された一連の設計原則です。 これらの原則はあらゆるクライアントサーバー通信に適用でき、HTTP API が RESTful であることを説明するためによく使用されます。 REST はステートレスなリクエスト、キャッシュ処理、統一した API 設計など、さまざまな原則を網羅しています。 ただし、詳細な実装については網羅していません。また、これらのギャップを埋めるための一般的な API 仕様は存在しません。 この曖昧さは、RESTful API に幾分かの理解、ツール、より厳密なエコシステムを中心によく構築されるライブラリが不足している原因となっています。 特に、開発者は RESTful API の検出と文書化のために独自のソリューションを構築する必要があります。 OData OData は、一貫性のある RESTful API を構築するための OASIS の仕様です。 OASIS コミュニティには、Microsoft / Citrix / IBM / Red Hat / SAP などの有名なソフトウェア会社が参加しています。 2007 年に OData 1.0 が最初に導入され、最新バージョンの 4.1 が今年リリースされました。 OData の仕様は、メタデータ、一貫性のある操作の実装、クエリ、例外処理などを対象としています。 また、アクションや関数などの追加機能も対象としています。 TripPinWS OData API の説明 この記事では、Odata.org が例示している TripPinWS API を使用します。 他の RESTful API と同様に、一般的にはサービスのベース URL が必要です。 OData でこのベース URL にアクセスすると、API エンティティのリストも返されます。 この API には Photos、People、Airlines、Airports、Me のエンティティと、GetNearestAirport という関数が含まれていることがわかります。 応答には、TripPinWS メタデータドキュメントへのリンクも含まれています。 [https://services.odata.org/V4/(S(djd3m5kuh00oyluof2chahw0))/TripPinServiceRW/$metadata](https://services.odata.org/V4/(S(djd3m5kuh00oyluof2chahw0))/TripPinServiceRW/%24metadata) このメタデータは XML ドキュメントとして実装されており、独自の XSD ドキュメントが含まれています。 これにより、IRIS XML スキーマウィザードから生成されるコードを使用してメタデータドキュメントを消費する可能性が広がります。 メタデータドキュメントは一見かなり複雑に見えるかもしれませんが、エンティティのスキーマ定義を構成するために使用されるタイプのプロパティを表しているだけです。 次の URL を使用すると、API から People のリストを取得できます。 この URL は 8 人のリストを返します。この 8 という数値は、厳密な結果ごとのエンティティ数の上限値です。 実際には、これよりもはるかに大きな上限値を使用することになるでしょう。 ただし、OData が @odata.nextLink などの追加のハイパーテキストリンクを含んでいる例も示されています。そのリンクを使用すると、People を検索した結果の次のページを取得できます。 また、次のようにして上位 1 件の結果のみを選択するなど、クエリ文字列値を使用して結果リストを絞り込むこともできます。 [https://services.odata.org/V4/(S(4hkhufsw5kohujphemn45ahu))/TripPinServiceRW/People?$top=1](https://services.odata.org/V4/(S(4hkhufsw5kohujphemn45ahu))/TripPinServiceRW/People?%24top=1) FirstName でリクエストを絞り込むこともできます。 [https://services.odata.org/V4/(S(4hkhufsw5kohujphemn45ahu))/TripPinServiceRW/People?$filter=FirstName eq 'Russell'](https://services.odata.org/V4/(S(4hkhufsw5kohujphemn45ahu))/TripPinServiceRW/People?%24filter=FirstName%20eq%20'Russell') この例では eq 演算子を使用し、「Russell」に等しいすべての FirstName を抽出しました。 ここでは対象の文字列を一重引用符で囲むことが重要です。 OData では、さまざまな演算子を組み合わせて表現力の高い検索クエリを作成することができます。 IRIS %Net パッケージ IRIS には、包括的な標準ライブラリが含まれています。 私たちは FTP / メール / LDAP / HTTP などのプロトコルをサポートする %Net パッケージを使用することになります。 TripPinWS サービスを使用するには、HTTPS を使用する必要があります。そのためには、IRIS 管理ポータルに HTTPS 構成を登録する必要があります。 複雑な証明書をインストールする必要はないため、次のように数ステップで作業を完了することができます。 * IRIS 管理ポータルを開きます。 * [ システム 管理] > [セキュリティ] > [SSL/TLS 構成] をクリックします。 * [新規構成の作成] ボタンをクリックします。 * 「odata_org」という構成名を入力し、[保存] をクリックします。 * ここでは任意の名前を選択できますが、記事の残りの部分では odata_org を使用します。 これで、HttpRequest クラスを使用して全員のリストを取得できるようになりました。 Get() が動作すると、OK の場合に 1 が返ってきます。 その後、次のように応答オブジェクトにアクセスして結果を端末に出力できます。 DC>set req=##class(%Net.HttpRequest).%New()DC>set req.SSLConfiguration="odata_org"DC>set sc=req.Get("https://services.odata.org:443/V4/(S(jndgbgy2tbu1vjtzyoei2w3e))/TripPinServiceRW/People")DC>w sc1DC>do req.HttpResponse.OutputToDevice() 先に進む前に、基本的な HttpRequest を自由に試してみてください。 Airlines や Airports を取得してみたり、不正な URL を入力した場合にどのようなエラーが返ってくるかを調べたりしてください。 汎用 OData クライアントの開発 HttpRequest クラスを抽象化し、さまざまな OData クエリオプションの実装を簡単にする汎用 OData クライアントを作成しましょう。 このクライアントを DcLib.OData.Client と名付け、%RegisteredObject を拡張して作成します。 また、特定の OData サービスの名前を定義するために使用できるいくつかのサブクラスと、HttpRequest オブジェクトなどのランタイムオブジェクトと値をカプセル化するいくつかのプロパティを定義します。 OData クライアントのインスタンス化を簡単にするため、%OnNew() メソッド(クラスのコンストラクタメソッド)もオーバーライドし、それを使用して実行時のプロパティを設定します。 Class DcLib.OData.Client Extends %RegisteredObject{Parameter BaseURL;Parameter SSLConfiguration;Parameter EntityName;Property HttpRequest As %Net.HttpRequest;Property BaseURL As %String;Property EntityName As %String;Property Debug As %Boolean [ InitialExpression = 0 ];Method %OnNew(pBaseURL As %String = "", pSSLConfiguration As %String = "") As %Status [ Private, ServerOnly = 1 ]{   set ..HttpRequest=##class(%Net.HttpRequest).%New()   set ..BaseURL=$select(pBaseURL'="":pBaseURL,1:..#BaseURL)   set ..EntityName=..#EntityName   set sslConfiguration=$select(pSSLConfiguration'="":pSSLConfiguration,1:..#SSLConfiguration)   if sslConfiguration'="" set ..HttpRequest.SSLConfiguration=sslConfiguration   quit $$$OK}} このように DcLib.OData.Client を拡張し、BaseURL と SSL 構成パラメーターを一箇所で設定することにより、TripPinWS サービスに固有のクライアントクラスを定義できるようになります。 Class TripPinWS.Client Extends DcLib.OData.Client{Parameter BaseURL = "https://services.odata.org:443/V4/(S(jndgbgy2tbu1vjtzyoei2w3e))/TripPinServiceRW";Parameter SSLConfiguration = "odata_org";} この基本クライアントを使用すれば、サービスで使用したいエンティティタイプごとにクラスを作成できます。 この新しいクライアントクラスを拡張すれば、EntityName パラメーターでエンティティ名を定義するだけで済みます。 Class TripPinWS.People Extends TripPinWS.Client{Parameter EntityName = "People";} 次に、エンティティのクエリを簡単にするため、基本の DcLib.OData.Client クラスにさらにいくつかのメソッドを追加する必要があります。 Method Select(pSelect As %String) As DcLib.OData.Client{   do ..HttpRequest.SetParam("$select",pSelect)   return $this}Method Filter(pFilter As %String) As DcLib.OData.Client{   do ..HttpRequest.SetParam("$filter",pFilter)   return $this}Method Search(pSearch As %String) As DcLib.OData.Client{   do ..HttpRequest.SetParam("$search",pSearch)   return $this}Method OrderBy(pOrderBy As %String) As DcLib.OData.Client{   do ..HttpRequest.SetParam("$orderby",pOrderBy)   return $this}Method Top(pTop As %String) As DcLib.OData.Client{   do ..HttpRequest.SetParam("$top",pTop)   return $this}Method Skip(pSkip As %String) As DcLib.OData.Client{   do ..HttpRequest.SetParam("$skip",pSkip)   return $this}Method Fetch(pEntityId As %String = "") As DcLib.OData.ClientResponse{   if pEntityId="" return ##class(DcLib.OData.ClientResponse).%New($$$ERROR($$$GeneralError,"Entity ID must be provided"),"")   set pEntityId="('"_pEntityId_"')"   if $extract(..BaseURL,*)'="/" set ..BaseURL=..BaseURL_"/"   set sc=..HttpRequest.Get(..BaseURL_..EntityName_pEntityId,..Debug)   set response=##class(DcLib.OData.ClientResponse).%New(sc,..HttpRequest.HttpResponse,"one")   quit response}Method FetchCount() As DcLib.OData.ClientResponse{   if $extract(..BaseURL,*)'="/" set ..BaseURL=..BaseURL_"/"   set sc=..HttpRequest.Get(..BaseURL_..EntityName_"/$count")   set response=##class(DcLib.OData.ClientResponse).%New(sc,..HttpRequest.HttpResponse,"count")   quit response}Method FetchAll() As DcLib.OData.ClientResponse{   #dim response As DcLib.OData.ClientResponse   if $extract(..BaseURL,*)'="/" set ..BaseURL=..BaseURL_"/"   set sc=..HttpRequest.Get(..BaseURL_..EntityName,..Debug)   set response=##class(DcLib.OData.ClientResponse).%New(sc,..HttpRequest.HttpResponse,"many")   if response.IsError() return response   //応答に nextLink が含まれる場合は、さらにデータを取得し続ける必要があります。   while response.Payload.%IsDefined("@odata.nextLink") {       //前の値を配列に退避し、新しい値をその配列にプッシュしてから       //新しい応答にそれを設定し直し、新しい値のイテレータを作成します。       set previousValueArray=response.Payload.value       set sc=..HttpRequest.Get(response.Payload."@odata.nextLink",..Debug)       set response=##class(DcLib.OData.ClientResponse).%New(sc,..HttpRequest.HttpResponse)       if response.IsError() return response       while response.Value.%GetNext(.key,.value) {           do previousValueArray.%Push(value)           }       set response.Payload.value=previousValueArray       set response.Value=response.Payload.value.%GetIterator()   }   return response} ここでは 9 つの新しいメソッドを追加しました。 最初の 6 つはクエリオプションを定義するためのインスタンスメソッドであり、最後の 3 つは 1 つのエンティティ、すべてのエンティティ、またはすべてのエンティティのカウントを取得するためのメソッドです。 最初の 6 つのメソッドは、基本的に HTTP リクエストオブジェクトにパラメーターを設定するためのラッパーです。 コードを実装しやすくするため、これらの各メソッドはこのオブジェクトのインスタンスを返し、メソッドをチェーン化できるようにしています。 メインの Fetch() メソッドについて説明する前に、Filter() メソッドの動作を見てみましょう。 set people=##class(TripPinWS.People).%New().Filter("UserName eq 'ronaldmundy'").FetchAll()while people.Value.%GetNext(.key,.person) { write !,person.FirstName," ",person.LastName    } このメソッドを使用すると、次のような結果が返ってきます。 Ronald Mundy このサンプルコードでは、TripPinWS Peopleオブジェクトのインスタンスを作成しています。 これにより、ベース URL と基本クラスの証明書の構成が設定されます。 その後、その Filter メソッドを呼び出してフィルタークエリを定義してから FetchAll() を呼び出すと HTTP リクエストを呼び出すことができます。 ここで直接アクセスできるのは生の JSON データではなく、動的オブジェクトとしての People の結果であることに注意してください。 これは、例外処理を簡単にする ClientResponse オブジェクトも実装するためです。 また、返される結果のタイプに応じて動的オブジェクトを生成します。 まず、FetchAll() メソッドについて説明します。 この段階で、実装クラスが基本クラス構成で OData URL を定義しており、ヘルパーメソッドが追加のパラメーターを設定しています。FetchAll() メソッドは URL を組み立てて GET リクエストを発行する必要があります。 元のコマンドラインの例と同様に HttpRequest クラスで Get() メソッドを呼び出し、その結果から ClientResponse を作成します。 API が一度に 8 件しか結果を返さないため、このメソッドは複雑になっています。 コード内でこの制限に対処し、前の結果の nextLink 値を使用して最後のページに到達するまで次の結果ページを取得し続ける必要があります。 追加の各ページを取得する際に前の結果配列を保管してから、新しい結果をそれぞれその配列にプッシュしています。 Fetch() / FetchAll() / FetchCount() メソッドは、DcLib.OData.ClientResponse というクラスのインスタンスを返します。 例外を処理し、有効な JSON 応答を自動的に逆シリアル化するためにこのクラスを作成しましょう。 Class DcLib.OData.ClientResponse Extends %RegisteredObject{Property InternalStatus As %Status [ Private ];Property HttpResponse As %Net.HttpResponse;Property Payload As %Library.DynamicObject;Property Value;Method %OnNew(pRequestStatus As %Status, pHttpResponse As %Net.HttpResponse, pValueMode As %String = "") As %Status [ Private, ServerOnly = 1 ]{   //直接の HTTP エラーをチェック   set ..InternalStatus = pRequestStatus   set ..HttpResponse = pHttpResponse   if $$$ISERR(pRequestStatus) {       if $SYSTEM.Status.GetOneErrorText(pRequestStatus)["" set ..InternalStatus=$$$ERROR($$$GeneralError,"Could not get a response from HTTP server, server could be uncontactable or server details are incorrect")       return $$$OK   }      //モードが count の場合、応答は JSON ではなく単なる数値になります。   //数値であることを確認し、true ならばすべて ok を返しますが、それ以外の場合は   //JSON で表現されるエラーを検出するためにフォールスルーします。   if pValueMode="count" {       set value=pHttpResponse.Data.Read(32000)       if value?1.N {           set ..Value=value           return $$$OK       }   }      //JSON ペイロードをシリアル化し、シリアル化エラーをキャッチします。   try {       set ..Payload={}.%FromJSON(pHttpResponse.Data)       } catch err {       //先に HTTP ステータスコードのエラーをチェックします。       if $e(pHttpResponse.StatusCode,1)'="2" {           set ..InternalStatus = $$$ERROR($$$GeneralError,"Unexpected HTTP Status Code "_pHttpResponse.StatusCode)           if pHttpResponse.Data.Size>0 return $$$OK       }       set ..InternalStatus=err.AsStatus()       return $$$OK   }      //OData エラーのペイロードをチェックします。   if ..Payload.%IsDefined("error") {       do ..HttpResponse.Data.Rewind()       set error=..HttpResponse.Data.Read(32000)       set ..InternalStatus=$$$ERROR($$$GeneralError,..Payload.error.message)           return $$$OK   }      //すべて ok なら、必要なモード(many, one, count)に一致するように応答値を設定します。   if pValueMode="one" {       set ..Value=..Payload   } else {       set iterator=..Payload.value.%GetIterator()       set ..Value=iterator   }      return $$$OK}Method IsOK(){   return $$$ISOK(..InternalStatus)}Method IsError(){   return $$$ISERR(..InternalStatus)}Method GetStatus(){   return ..InternalStatus}Method GetStatusText(){   return $SYSTEM.Status.GetOneStatusText(..InternalStatus)}Method ThrowException(){   Throw ##class(%Exception.General).%New("OData Fetch Exception","999",,$SYSTEM.Status.GetOneStatusText(..InternalStatus))}Method OutputToDevice(){   do ..HttpResponse.OutputToDevice()}} ClientResponse オブジェクトのインスタンスが与えられた場合、最初にテストを実行してエラーがあったかどうかを確認することができます。 エラーは複数のレベルで発生する可能性があるため、単一の使いやすいソリューションでエラーを返すのが望ましいです。 set response=##class(TripPinWS.People).%New().Filter("UserName eq 'ronaldmundy'").FetchAll()if response.IsError() write !,response.GetStatusText() quit IsOK() メソッドと IsError() メソッドはオブジェクトのエラーをチェックします。 エラーが発生した場合は GetStatus() または GetStatusText() を呼び出してエラーにアクセスするか、ThrowException() を使用してエラーを例外ハンドラに渡すことができます。 エラーが発生していない場合、ClientResponse は生のペイロードオブジェクトを応答ペイロードのプロパティに代入します。 set ..Payload={}.%FromJSON(pHttpResponse.Data) 次に、応答の Value プロパティを単一のインスタンスとして、または多数の結果を探索するための配列イテレータとして、ペイロード内のメインデータ配列に設定します。 私はこれらすべてのコードを GitHub  上の単一のプロジェクトに格納しています。そこで全体を見直せば、より深く理解することができるでしょう。 次の例はすべて、ソースの GitHub プロジェクトに含まれています。 OData クライアントの使用 基本 Client クラスに関しては、With() メソッドも理解しておく必要があります。 すべてのエンティティのインスタンスを作成する代わりに、単一のクライアントクラスだけで With() メソッドを使用することができます。 With() メソッドは、指定されたエンティティ名で新しいクライアントを定義します。 ClassMethod With(pEntityName As %String) As DcLib.OData.Client{   set client=..%New()   set client.EntityName=pEntityName   return client} このメソッドを使用すれば、次のように基本 Client クラスですべての People を取得できます。 /// 基本クライアントクラスと .With("People") を使用してすべての "People" を取得しますClassMethod TestGenericFetchAllUsingWithPeople(){   #dim response As DcLib.OData.ClientResponse   set response=##class(TripPinWS.Client).With("People").FetchAll()      if response.IsError() write !,response.GetStatusText() quit      while response.Value.%GetNext(.key,.person) {       write !,person.FirstName," ",person.LastName       }} または、次のようにクラスごとのエンティティを使用します。 /// People クラスを使用してすべての "People" を取得しますClassMethod TestFetchAllPeople(){   #dim people As DcLib.OData.ClientResponse   set people=##class(TripPinWS.People).%New().FetchAll()      if people.IsError() write !,people.GetStatusText() quit      while people.Value.%GetNext(.key,.person) {       write !,person.FirstName," ",person.LastName       }} ご覧のとおり、これらの方法は非常に似通っています。 どちらの方法を選択すべきかは、具体的なエンティティについて自動補完がどれほど重要であるか、および具体的なエンティティクラスにエンティティ固有のメソッドを追加するかどうかによって異なります。 DC>do ##class(TripPinWS.Tests).TestFetchAllPeople()Russell WhyteScott KetchumRonald Mundy… およびその他の人 次に、Airlines についても同じ処理を実装しましょう。 /// すべての "Airlines" を取得しますClassMethod TestFetchAllAirlines(){   #dim airlines As DcLib.OData.ClientResponse   set airlines=##class(TripPinWS.Airlines).%New().FetchAll()      if airlines.IsError() write !,airlines.GetStatusText() quit      while airlines.Value.%GetNext(.key,.airline) {       write !,airline.AirlineCode," ",airline.Name       }} そして、コマンドラインから次の結果を得ることができます。 DC>do ##class(TripPinWS.Tests).TestFetchAllAirlines()AA American AirlinesFM Shanghai Airline… およびその他の航空会社 次は Airports の実装です。 /// すべての "Airports" を取得しますClassMethod TestFetchAllAirports(){   #dim airports As DcLib.OData.ClientResponse   set airports=##class(TripPinWS.Airports).%New().FetchAll()      if airports.IsError() write !,airports.GetStatusText() quit      while airports.Value.%GetNext(.key,.airport) {       write !,airport.IataCode," ",airport.Name       }} そして、コマンドラインから次の結果を得ることができます。 DC>do ##class(TripPinWS.Tests).TestFetchAllAirports()SFO San Francisco International AirportLAX Los Angeles International AirportSHA Shanghai Hongqiao International Airport… およびその他の空港 これまでは FetchAll() メソッドを使用してきました。 次のように Fetch() メソッドを使用し、エンティティの主キーを使用して単一のエンティティを取得することもできます。 /// 人の識別子を使用して単一の "People" エンティティを取得しますClassMethod TestFetchPersonWithID(){   #dim response As DcLib.OData.ClientResponse   set response=##class(TripPinWS.People).%New().Fetch("russellwhyte")      if response.IsError() write !,response.GetStatusText() quit      //新しいフォーマッターを使用して出力を美しく整形してみましょう(最新バージョンの IRIS のみ)   set jsonFormatter = ##class(%JSON.Formatter).%New()   do jsonFormatter.Format(response.Value)} この例では動的配列またはオブジェクトを取得し、整形したJSONに出力できる新しい JSON フォーマッタークラスを使用しています。 DC>do ##class(TripPinWS.Tests).TestFetchPersonWithID(){ "@odata.context":"http://services.odata.org/V4/(S(jndgbgy2tbu1vjtzyoei2w3e))/TripPinServiceRW/$metadata#People/$entity", "@odata.id":"http://services.odata.org/V4/(S(jndgbgy2tbu1vjtzyoei2w3e))/TripPinServiceRW/People('russellwhyte')", "@odata.etag":"W/\"08D720E1BB3333CF\"", "@odata.editLink":"http://services.odata.org/V4/(S(jndgbgy2tbu1vjtzyoei2w3e))/TripPinServiceRW/People('russellwhyte')", "UserName":"russellwhyte", "FirstName":"Russell", "LastName":"Whyte", "Emails":[   "Russell@example.com",   "Russell@contoso.com" ], "AddressInfo":[   {     "Address":"187 Suffolk Ln.",     "City":{       "CountryRegion":"United States",       "Name":"Boise",       "Region":"ID"     }   } ], "Gender":"Male", "Concurrency":637014026176639951} OData の永続化 最後のいくつかの例では、新しい JSON アダプタクラスを使用して OData JSON を永続オブジェクトに逆シリアル化する方法を説明します。 ここでは Person、Address、City の 3 つのクラスを作成しますが、いずれも Person のデータ構造を OData メタデータに反映します。 また、@odata.context のような追加の OData プロパティが逆シリアル化エラーをスローしないよう、1 に設定された %JSONIGNOREINVALIDFIELD を使用します。 Class TripPinWS.Model.Person Extends (%Persistent, %JSON.Adaptor){Parameter %JSONIGNOREINVALIDFIELD = 1;Property UserName As %String;Property FirstName As %String;Property LastName As %String;Property Emails As list Of %String;Property Gender As %String;Property Concurrency As %Integer;Relationship AddressInfo As Address [ Cardinality = many, Inverse = Person ];Index UserNameIndex On UserName [ IdKey, PrimaryKey, Unique ];}   Class TripPinWS.Model.Address Extends (%Persistent, %JSON.Adaptor){Property Address As %String;Property City As TripPinWS.Model.City;Relationship Person As Person [ Cardinality = one, Inverse = AddressInfo ];}   Class TripPinWS.Model.City Extends (%Persistent, %JSON.Adaptor){Property CountryRegion As %String;Property Name As %String;Property Region As %String;} 次に、OData サービスから Russel Whyte を取得し、Person モデルの新しいインスタンスを作成した後に応答値を使用して %JSONImport() メソッドを呼び出します。 これにより、Address と City の詳細とともに Person オブジェクトにデータが入力されます。 ClassMethod TestPersonModel(){   #dim response As DcLib.OData.ClientResponse   set response=##class(TripPinWS.People).%New().Fetch("russellwhyte")      if response.IsError() write !,response.GetStatusText() quit      set person=##class(TripPinWS.Model.Person).%New()      set sc=person.%JSONImport(response.Value)   if $$$ISERR(sc) write !!,$SYSTEM.Status.GetOneErrorText(sc) return      set sc=person.%Save()   if $$$ISERR(sc) write !!,$SYSTEM.Status.GetOneErrorText(sc) return} 次に、次のように SQL コマンドを実行してデータが永続化されていることを確認できます。 SELECT ID, Concurrency, Emails, FirstName, Gender, LastName, UserNameFROM TripPinWS_Model.PersonID                          Concurrency                      Emails                                                                                    FirstName    Gender    LastName    UserNamerussellwhyte    637012191599722031    Russell@example.com Russell@contoso.com    Russell            Male         Whyte            russellwhyte 最終的な考え 上記のように、組み込みの %NET クラスを使用して RESTful な OData サービスを利用するのは簡単です。 少しばかりの追加ヘルパーコードを使用すれば、OData クエリの構築を単純化し、エラーレポートを統合し、JSON を動的オブジェクトに自動的に逆シリアル化できます。 そして、必要に応じてベース URL と HTTPS 構成を指定するだけで、新しい OData クライアントを作成できます。 さらに、この単一のクラスと .With('エンティティ') メソッドを使用してサービス上の任意のエンティティを利用するか、関心のあるエンティティの名前付きサブクラスを作成することができます。 また、新しい JSON アダプタを使用して JSON 応答を永続クラスに直接逆シリアル化できることも説明しました。 現実的には最初にこのデータを非正規化することを検討し、JSON アダプタクラスがカスタムマッピングで機能することを確認する必要があります。 最後になりますが、OData の操作は非常に簡単です。 私が特注の実装でよく経験する場合よりもはるかに少ないコード量でサービス実装の一貫性を維持することができました。 私は RESTful 設計の自由さを楽しんでいますが、次のサーバーサイドソリューションでは標準を実装することを検討したいと思います。
お知らせ
Mihoko Iijima · 2023年11月21日

ご参加ありがとうございました!:InterSystems Japan 開発者コミュニティ・ミートアップ in 大阪

開発者のみなさん、こんにちは! 日本の開発者コミュニティでは初となるミートアップ(オフラインイベント)を11月17日(金)に無事に終えることができました。 ご参加いただいたコミュニティメンバーの皆様、パネリストの皆様、ありがとうございました! 第1部でご紹介しました「IRISの最新機能」についてのPDFを公開しております。ぜひご参照ください。 PDF:2023年11月17日開催ミートアップ:IRISの最新機能 以下、写真を添えながら当日の様子を少しだけご紹介します。 第1部では、IRISの最新機能紹介のほかに、6名のパネリストの方にご登壇いただきパネルディスカッションを行いました。 パネリストの皆さんから、初めてIRISに触れたときの印象やIRISの開発者を育成するためにどのような教育を行われているか、ソース管理方法をどのようにされているか、IDEとしてVSCode/スタジオどちらを利用されているか、今後やってみたいこと、使ってみたいIRISの機能について伺いました。 日頃、なかなか他社の開発方法、開発環境などを伺う機会がないため、パネリストの皆さんの回答がどれも興味深く、もっとお話を聞いてみたい!と思うとてもためになる情報満載のパネルディスカッションでした。 (途中、参加者の皆さんも含めアンケートを取っている場面) 第1部最後に、第1回技術文書ライティングコンテストの表彰式を行っています。 優勝・準優勝はたった1点差となる大接戦の結果となりました。ぜひとも2回目を計画できたらと思います。 第2部は、クイズ大会とあなたはどっち派?「究極の選択」のゲームで盛り上がりました。 クイズはもちろん、IRISにちなんだ内容の出題で、早押しや難問などもご用意していました。 クイズ大会チームとしては、難問でしっかり悩んでいただきたかったのですがなかなかそうもいかず(さすがコミュニティメンバー)正解もおおく、最後まで順位がわからないクイズ大会となりました。 1位~3位に入賞された方、おめでとうございました🎊 (スマホを使ってクイズ解答中の様子) そして最後に、あたなはどっち派?「究極の選択」ゲームを開催しました。 選択内容は、システムに使うOSは、Windows?Linux?/システムを運用するなら、クラウド?オンプレ?/ObjectScriptでデータにアクセスするには、オブジェクト&SQL?グローバル? などなど、会場真ん中に貼った養生テープを境に左右に分かれて激論を交わしていただきました🔥 いつもはオンラインですが、こうやってたまにはオフラインで開発者コミュニティメンバー同士で交流するのもいいですね。2回目も企画できたらと思います。 またその時が来ましたらコミュニティのお知らせ記事でご案内いたしますので、次回開催もお楽しみに! 👀ご参加いただいたメンバーの皆様、もしよろしければこの記事の返信欄にコメント書いていただけると嬉しいです! 当日パネルディスカッションの進行役をつとめさせていただきました。 パネラーのみなさんが嬉しそうに IRIS にまつわる技術論をお話される姿と、会場のみなさんがその話を真剣にうんうん頷いて聞かれている姿、両方が良く見えて、司会席でニヤニヤしぱなっしでした。とても楽しい一日でした。 会場にお越しいただいたみなさま、本当にありがとうございました。
お知らせ
Mihoko Iijima · 2024年8月6日

★受賞者発表!★InterSystems Python プログラミングコンテスト 2024(USコミュニティ)

開発者の皆さん、こんにちは。 InterSystems Python コンテストの勝者が発表されました! 今回は、9 applications 🔥 の素晴らしい投稿がありました! Experts Nomination 🥇 1位 - $5,000 は sqlzilla を開発された @henry さん @José.Pereira さん @Henrique さん に贈られました。 🥈 2位 - $3,000 は iris-RAG-Gen を開発された @Muhammad.Waseem さん に贈られました。 🥉 3位 - $1,500 は sheltershare を開発された @Zeljko.Sucic さん @Damir.Miklos3152 さん に贈られました。 🏅 4位 - $750 は irislab を開発された @Dmitry.Maslennikov さん に贈られました。 🏅 5位 - $500 は iris-email-analyzer-app を開発された @Eric.Mariasis さん に贈られました。 🌟 $100 は IRIS RAG App を開発された @Alex.Alcivar さん に贈られました。 🌟 $100 は IRIS-production-chat-robot を開発された @Ste.Sharma さん に贈られました。 🌟 $100 は ServiceInspection を開発された @Wolis.Oliavr さん に贈られました。 🌟 $100 は iris-errors-analysis-graph を開発された @davimassaru.teixeiramuta さん @Lucas.Fernandes2032 さん に贈られました。 Community Nomination 🥇 1位 - $1,000 は sqlzilla を開発された @henry さん @José.Pereira さん @Henrique さん に贈られました。 🥈 2位 - $750 は ServiceInspection を開発された @Wolis.Oliavr さん に贈られました。 🥉 3位 - $500 は iris-RAG-Gen を開発された @Muhammad.Waseem さん に贈られました。 🏅 4位 - $300 は IRIS-production-chat-robot を開発された @Ste.Sharma さん に贈られました。 🏅 5位 - $200 は sheltershare を開発された @Zeljko.Sucic, @Damir.Miklos3152 さん に贈られました。 受賞された皆さん、おめでとうございます!また、コンテストにご興味お持ちいただきありがとうございました! 次のコンテストもご期待ください!
記事
Tomoko Furuzono · 2021年4月13日

クラウド環境でのInterSystems製品の動作保証・ライセンスについて

これは、InterSystems FAQサイトの記事です。 以下ドキュメントは、IRIS 最新バージョンと Caché/Ensemble2018.1 でサポートしているクラウドプラットフォームの一覧です。 ※Amazon EC2 は、2010.2.0以降でサポートしています。 Microsoft Azureは、2014.1.0以降でサポートしています。 Google クラウドプラットフォームは、IRIS2018.1以降でサポートしています。 IRIS 最新バージョンサポートクラウドプラットフォーム Caché/Ensemble2018.1のサポートクラウドプラットフォーム 他バージョンの対応については、弊社サポートページからバージョン毎の説明ページをご参照ください。 クラウド環境を利用するにあたり、別途ライセンスの追加購入は必要はありません。必要なライセンスは、InterSystems製品が稼働する仮想サーバのOSで必要なライセンス(Windows 64/32bit、Linux 64bit、Core数等に依存)となります。 クラウド上に環境構築するにあたり検討・考慮すべき点として、AWS では、2015.1 より前のバージョンをインストールする場合には制限があります。詳細は関連トピックをご覧ください。 構成については、以下の記事をご覧ください。 Amazon EC2 における InterSystems のテクノロジー: リファレンスアーキテクチャ Microsoft Azure Resource Manager(ARM)向けInterSystemsサンプルリファレンスアーキテクチャ また、アプリケーションや選択される構成によりますが、オンプレミスの場合と比べてパフォーマンスに違いが出る場合があります。パフォーマンスにセンシティブなアプリケーションでは、パフォーマンステストを行うことを推奨します。
お知らせ
Makiko Kokubun · 2021年2月18日

【オンデマンド配信のお知らせ】(Webセミナー)InterSystems Japan Virtual Summit 2021

開発者のみなさん、こんにちは! 2/16-2/18に開催しましたインターシステムズの年次カンファレンス「InterSystems Japan Virtual Summit 2021」のオンデマンド配信を開始しました。3/19(金)までご視聴いただけます。 ⚡️ ご視聴はこちらから ⚡️ テーマは「データプラットフォーム最前線 ニューノーマル時代に求められるアジリティとレジリエンス」です。InterSystems IRIS 、IRIS for Health の最新技術情報を多くのセッションを通してお届け致します。ぜひご視聴ください。*本セミナーは日本語での開催となります。 オンデマンド配信プログラム 基調講演:適応力と柔軟性を高めるデータプラットフォームの最新情報について(2月16日ライブ配信) 先進データテクノロジーセッション:既にインターシステムズ製品をお使いの方向けに、IRISへのマイグレーションやパフォーマンスについての技術セッション(2月17日ライブ配信) HL7® FHIR® によるインターオペラビリティセッション: FHIR の概要や最新情報と、IRIS for Healthでの医療データ共有、最新機能について(2月17日ライブ配信) 先進データテクノロジーセッション :Python、Kubernetes など、最新技術を活用した IRIS の運用と開発、IntegratedMLなどIRISの最新機能について(2月18日ライブ配信) 英語技術セッション:昨年開催された「InterSystems Virtual Summit 2020」の技術セッションを字幕付きで配信 開催形式:オンライン配信 オンデマンド配信期間:2月19日(金)~3月19日(金) *初めてご覧頂く方は、ご登録をお願いしております。ご登録後に視聴URLをメールでお送りいたします。 参加費:無料 オンデマンド配信はこちらから 数多くの技術コンテンツをお届けしています。ぜひご視聴ください!
記事
Mihoko Iijima · 2020年4月28日

GitLabを使用したInterSystemsソリューションの継続的デリバリー - パート I:Git

誰もがテスト環境を持っています。 本番環境とは完全に独立した実行環境を持てるほど幸運な人もいます。 -- 作者不明 この連載記事では、InterSystemsの技術とGitLabを使用したソフトウェア開発に向けて実現可能な複数の手法を紹介し、議論したいと思います。 次のようなトピックについて説明します。 Git 101 Gitフロー(開発プロセス) GitLabのインストール GitLabワークフロー GitLab CI/CD CI/CDとコンテナ この最初のパートでは、最新のソフトウェア開発の基礎であるGitバージョン管理システムとさまざまなGitフローを扱います。 Git 101 これから説明する主なトピックでは、後の概念をより良く理解できるようにするため、ソフトウェア開発全般とGitlabがその取り込みにどのように役立っているのか、Git、あるいはもっと厳密に言えば重要なGit設計の基礎となる複数の高度な概念を取り上げます。 そして、Gitは以下のようなアイデア(他にもたくさんありますが、これらが最も重要なアイデアです)に基づいたバージョン管理システムです。 直線的でない開発とは、ソフトウェアが結果的にバージョン1から2、3とリリースされている間に、その裏でバージョン1から2への移行が並行して行われることを指しています。実際、さまざまな開発者が多数の機能/バグ修正を同時に開発しています。 分散開発とは、開発者が単一の中央サーバーや他の開発者から独立している状態を指しており、自分の環境で簡単に開発できます。 マージ - 前の2つのアイデアによって多くの別バージョンが同時に存在することになり、それらを統合して1つの完全な状態に戻す必要性が生じます。 ただ、Gitがこれらの概念を発明したと言っているのではありません。 違います。 むしろGitはこれらの概念を容易化・一般化し、関連する複数のイノベーション(Infrastructure as Code/コンテナ化によるソフトウェア開発の変化など)と結びつけました。 git基本用語集 リポジトリはデータとそのデータに関するメタ情報を保存するプロジェクトです。 物理的にはリポジトリはディスク上のディレクトリです。 リポジトリはファイルとディレクトリを保存します。 リポジトリには各ファイルの変更の完全な履歴も保存されます。 リポジトリは以下の場所に保存できます。 お使いのコンピューター(ローカル) リモートサーバー(リモート) しかし、gitの観点からするとローカルリポジトリとリモートリポジトリには特に違いはありません。 コミットはリポジトリのある決まった状態を表しています。 コミットするたびにリポジトリの完全な状態を保存していては、リポジトリが急速に肥大化してしまうのは明らかです。 そのため、コミットでは現在のコミットとその親コミットとの差分であるdiffを保存しています。 異なるコミットは、次のように異なる数の親を持つことができます。 0 - リポジトリ内の最初のコミットには親がありません。 1 - これは通常の状況です。コミットが親コミットと同じようにリポジトリ内の何かを変更するとこうなります。 2 - 2種類のリポジトリの状態がある場合、それらを1つの新しい状態に統合できます。 また、その状態とそのコミットには2つの親があります。 3以上 - 2種類を超えるリポジトリの状態を1つの新しい状態に統合した場合に発生し得ます。 これは私たちの議論には特に関係ないと思いますが、このような場合もあります。 親の場合、その差分となる各コミットは子コミットと呼ばれます。 各親コミットには、任意の数の子コミットを含めることができます。 ブランチはコミットへの参照(またはポインタ)です。次のようなイメージです。 この画像には2つのコミット(灰色の円)を持つリポジトリがあります。2番目のコミットはmasterブランチのHEADです。 コミットを追加すると、リポジトリは次のようになります。 これは最も単純なケースです。 1人の開発者が同時に1つの変更を手がけます。 しかし、通常は多くの開発者が同時に別々の機能を手がけているため、リポジトリの状況を表示するためのコミットツリーが必要になります。 コミットツリー 同じ出発点から始めましょう。 2つのコミットを含むリポジトリを次に示します。 ただし、今度は2人の開発者が同時に作業しており、互いに干渉しないように別々のブランチで作業しています。 この二人はしばらく経ってからブランチへの変更内容を統合する必要があり、そのためにマージリクエスト(プルリクエストとも呼ばれています)を作成します。これはまさに文字通り2つの異なるリポジトリの状態を1つの新しい状態に統合する(この場合はdevelopブランチをmasterブランチに統合する)ためのリクエストです。 適切なレビューと承認が行われた後、リポジトリは次のようになります。 その後も開発は継続されます。 Git 101 - 概要 主な概念: Gitは直線的でない分散バージョン管理システムです。 リポジトリはデータとそのデータに関するメタ情報を保存します。 コミットはリポジトリのある決まった状態を表しています。 ブランチはコミットへの参照です。 マージリクエスト(プルリクエストとも呼ばれています)は、2つの異なるリポジトリの状態を1つの新しい状態に統合するためのリクエストです。 Gitについてさらに詳しく知りたい場合は、こちらから書籍を入手できます。 Gitフロー Gitの基本的な用語と概念は理解していただけたかと思いますので、今度はGitを使用してソフトウェアライフサイクルの開発部分を管理する方法について説明しましょう。Gitを使用した開発プロセスを説明する多くのプラクティス(フローと呼ばれる)がありますが、ここではそのうち以下の2つについて説明します。 GitHubフロー GitLabフロー GitHubフロー GitHubフローは簡単です。 以下のとおりです。 リポジトリからブランチを作成します。 自分の変更を新しいブランチにコミットします。 自分が提案した変更を含むブランチからプルリクエストを送信して、ディスカッションを開始します。 必要に応じてブランチでさらに変更をコミットします。 プルリクエストは自動的に更新されます。 ブランチをマージする準備ができたら、プルリクエストをマージします。 また、以下のようないくつかのルールに従う必要があります。 masterブランチが常にデプロイ可能であること(また、機能すること!) masterブランチで直接開発が行われていないこと フィーチャーブランチで開発が進行中であること master はプロダクション(Production)* 環境** であること できるだけ頻繁に本番環境にデプロイすること * 「Ensemble Productions」と混同しないでください。ここでは、「Production」とは本番を意味します。 ** 環境とは、コードが実行される構成済みの場所です。サーバー、VM、コンテナなどが考えられます。 以下にそのイメージを掲載します。 GitHubフローの詳細については、こちらで確認できます。 また、図解ガイドもあります。 Gitフローを使い始めるのであれば、GitHubフローを小規模なプロジェクトで試すのが最適です。 GitHubもこれを使用していますが、大規模なプロジェクトでも実行可能です。 GitLabフロー 本番環境にすぐにデプロイする準備ができていない場合、GitLabフローはGitHubフローと環境を提供します。 ここではその動作を説明します。上記と同じフィーチャーブランチで開発し、上記と同じマスターにマージするとしましょう。しかし、その場合はmasterはテスト環境にのみ等しくなるという点が異なります。 また、さまざまな他の環境にリンクされている「環境ブランチ」が存在する場合もあります。 通常、以下の3つの環境が存在します(必要に応じてさらに作成できます)。 テスト環境 == masterブランチ プリプロダクション環境 == preprodブランチ プロダクション環境 == prodブランチ いずれかの環境ブランチに届いたコードは、対応する環境にすぐに移動する必要があります。以下のいずれかで実行できます。 自動(パート2およびパート3で対応します) 半自動(デプロイを許可するボタンを押すこと以外は自動と同じ) 手動 プロセス全体は次のようになります。 機能はフィーチャーブランチで開発されます。 フィーチャーブランチがレビューされ、masterブランチにマージされます。 しばらくすると(いくつかのフィーチャーブランチがマージされた)マスターがpreprodにマージされます。 しばらくすると(ユーザーテストなどの後に)preprodがprodにマージされます。  マージおよびテスト中にいくつかの新機能が開発され、マスターにマージされます。そして3に戻ります。 これは次のようになります。 GitLabフローの詳細については、こちらで確認できます。 まとめ Gitは直線的でない分散バージョン管理システムです。 Gitフローはソフトウェア開発サイクルのガイドラインとして使用できます。また、その中にはいくつかの選択肢があります。 リンク Gitの書籍 GitHubフロー GitLabフロー Driessenフロー(より包括的なフロー、比較用) この記事のコード ディスカッションの質問 gitフローを使用していますか? どのフローですか? 平均的なプロジェクトにはいくつの環境がありますか? 次の内容 次のパートの実施内容: GitLabをインストールします。 いくつかの推奨される調整事項を紹介します。 GitLabワークフローについて議論します(GitLabフローと混同しないこと)。 ご期待ください。
お知らせ
Mihoko Iijima · 2023年4月25日

★受賞者発表!★InterSystems IRIS Cloud SQL and IntegratedML コンテスト 2023

開発者の皆さん、こんにちは! IRIS Cloud SQL and IntegratedML コンテストの勝者が発表されました! この記事では、コンテスト受賞者を発表します。 今回は、8 の応募 🔥 がありました! Experts Nomination 🥇 1位 - $5,000 は、 Sheep’s Galaxy を開発された @Maria.Gladkova さん、@KATSIARYNA.Shaustruk さん、 @Maria.Nesterenko さんに贈られました。 🥈 2位 - $3,000 は、 AI text detection を開発された @Oleh.Dontsov さんに贈られました。 🥉 3位 - $1,500 は、 superset-iris を開発された @Dmitry.Maslennikov さんに贈られました。 🏅 4位 - $750 は、 iris-mlm-explainer を開発された @Muhammad.Waseem さんに贈られました。 🏅 5位 - $500 は、 Customer churn predictor を開発された @Oleh.Dontsov さんに贈られました。 More winners: 🏅 $100 は、 audit-consolidator を開発された @Oliver.Wilms さんに贈られました。 🏅 $100 は、 Tokenizator を開発された @Yuri.Gomes さんに贈られました。 🏅 $100 は、 IntegratedML-IRIS-Cloud-Height-prediction を開発された @珊珊.喻 さんに贈られました。 Community Nomination 🥇 1位 - $1,000 は、superset-iris を開発された @Dmitry.Maslennikov さんに贈られました。 🥈 2位 - $750 は、Sheep’s Galaxy を開発された @Maria.Gladkova さん、@KATSIARYNA.Shaustruk さん、 @Maria.Nesterenko さんに贈られました。 🥉 3位 - $500 は、AI text detection を開発された @Oleh.Dontsov さんに贈られました。 今回も、コンテストにご注目いただきありがとうございました! では、また、次のコンテストをお楽しみに!😎
お知らせ
Toshihiko Minamoto · 2023年3月12日

InterSystems IRIS, IRIS for Health, HealthShare Health Connect 2021.1.3 リリースのご案内

この度、InterSystems IRIS, InterSystems IRIS for Health, HealthShare Health Connect の追加メンテナンスリリース2021.1.3 を公開しました。 このリリースではこれまでの2021.1.xのリリースよりいくつかの機能やバグフィックスを提供しています。 変更点についての詳細な情報はこれらのページでご覧いただけます。 InterSystems IRIS InterSystems IRIS for Health HealthShare Health Connect より良い製品を一緒に作っていくために開発者コミュニティを通じてご意見をお聞かせください。 ソフトウェアの取得方法 このソフトウェアは、通常のインストールパッケージとコンテナイメージの両方が利用可能です。 利用可能なインストーラーとコンテナイメージの全リストについては、Supported Platforms webpage をご参照ください。 各製品のインストール・パッケージは、WRCのSoftware Distribution page より入手可能です。 コンテナ・イメージは、InterSystems Container Registry から入手できます。 このリリースでは、Community Editionのキットやコンテナは利用できません。 このリリースのビルド番号は 2021.1.3.389.0 です。
お知らせ
Mihoko Iijima · 2025年8月5日

★受賞者発表!★InterSystems Developer Tool コンテスト 2025(USコミュニティ)

開発者の皆さん、こんにちは! InterSystems Developer Tool コンテスト の勝者が発表されましたのでお知らせします! 今回のコンテストには、17 の素晴らしいアプリケーション 🔥🔥が投稿されました。 ご応募いただきました参加者の皆さん、素敵な作品をありがとうございました! それでは受賞者を発表します! Experts Nomination 🥇 1位 - $5,000 は、InterSystems Testing Manager for VS Code を開発された @John.Murray さんに贈られました。 🥈 2位 - $2,500 は、typeorm-iris を開発された @Dmitry.Maslennikov さんに贈られました。 🥉 3位 - $1,000 は、IPM Explorer for VSCode を開発された @John.McBrideDev さんに贈られました。 🏅 4位 - $500 は、dc-artisan を開発された @José.Pereira さん @henry さん @Henrique さんに贈られました。 🏅 5位 - $300 は、iris4word を開発された @Yuri.Gomes さんに贈られました。 🌟 $100 - Interoperability REST API Template を開発された @Andrew.Sklyarov さんに贈られました。 🌟 $100 - toolqa を開発された @André.DienesFriedrich さん @Andre.LarsenBarbosa さんに贈られました。 🌟 $100 - iris-message-search を開発された @sara.aplin さんに贈られました。 🌟 $100 - wsgi-to-zpm を開発された @Eric.Fortenberry さんに贈られました。 🌟 $100 - templated_email を開発された @Nikolay.Soloviev さん @Sam.Sennin さんに贈られました。 Community Nomination 🥇 1位 - $1,000 は、InterSystems Testing Manager for VS Code を開発された @John.Murray さんに贈られました。 🥈 2位 - $600 は、iris-message-search を開発された @sara.aplin さんに贈られました。 🥉 3位 と 4位 - $250 は、dc-artisan を開発された @José.Pereira さん @henry さん @Henrique そして addsearchtable を開発された @XININGMA さんに贈られました。 🏅 5位 - $100 は、toolqa を開発された @André.DienesFriedrich さん @Andre.LarsenBarbosa さんに贈られました。 受賞された皆さん、おめでとうございます!また、コンテストにご興味お持ちいただきありがとうございました! 次回のコンテストもご期待ください!
記事
Tomoko Furuzono · 2025年5月13日

各DDLデータ型とInterSystems IRISデータ型のマッピング定義

IRISから他DDLのデータを参照したり取り込んだりする場合、各DDLのデータ型はそれと同等の InterSystems IRIS データ型にマッピングされます。 マッピングの定義は、管理ポータル、および、下記ドキュメントページでご確認いただけます。 管理ポータル:[システム管理] > [構成] > [SQLとオブジェクトの設定] > [システムDDLマッピング] ドキュメント:InterSystems IRIS へのデータ型のマッピングの表示
記事
Mihoko Iijima · 2020年6月28日

【はじめての InterSystems IRIS】セルフラーニングビデオ:アクセス編:Python から PyODBC を使って IRIS に接続してみよう

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 2020年12月7日追記:ODBCドライバ名が古い記述でしたので更新しました。 【修正前】{InterSystems ODBC} 【修正後】{InterSystems IRIS ODBC35} サンプルコード(Git) Thank you so much! It is a great example! It is very useful for me to learn how to use the pyodbc. It's my pleasure I based on your example and made a UI to connect to IRIS forcreate table, upload csv, and make query https://github.com/ecelg/IRIS-SQLCloud-connect-by-pyodbc-with-UI Thanks so much for helping me start my work!
お知らせ
Mihoko Iijima · 2020年11月26日

開発テンプレート(IRIS Analytics Template)の使い方のご紹介(第8回 InterSystems IRIS Analytics コンテスト)

開発者の皆さん、こんにちは! この投稿では、第8回 InterSystems IRIS Analytics コンテスト の 開発テンプレート(IRIS Analytics Template) の使い方をご紹介します。 開発テンプレートは、Gitからソースコードをダウンロードし、コンテナを開始するだけで Johns Hopkins repository で公開されている COVID-19 のデータを使用した InterSystems BI(旧DeepSee)での分析環境が準備できます(サンプルデータが入ったテーブル、モデル定義、ピボットテーブル、ダッシュボードが準備されます)。 コンテストでは、開発テンプレートをベースとし、コードを追加しながらオリジナルアプリケーションを開発いただいたり、新規で作成いただいたり、自由に開発いただけます。 InterSystems BI を使ったアプリケーションでチャンレンジされる場合は、ぜひ、ここで紹介している開発テンプレートをご利用ください! この他、サンプルアプリケーションの例は、コンテスト告知ページをご参照ください! メモ:開発テンプレートはコンテスト以外の目的にもご活用いただけます! 以下、事前準備についてご説明します。 開発テンプレートをご利用いただくために、以下 3 つのソフトウェアのインストールが必要です。 Docker のインストール(コンテナを管理するアプリ Git のインストール(ソースを管理するアプリ) VSCode のインストール(IDE) 事前準備が整いましたら、開発テンプレートの使い方解説ビデオをご参照ください(ビデオは以下の5本に分かれています。お好みの場所からご参照ください)! パート1-開発テンプレートに含まれる内容 パート2-サンプルデータ・キューブの概要説明 パート3-新しいデータのインポート(ZPMパッケージマネージャの使い方) パート4-新しいキューブ・ピボット・ダッシュボードの作成とVSCodeへのエクスポート パート5-ダッシュボード以外のUIを使ってみる(DeepSeeWeb) パート1 - 開発テンプレートに含まれる内容について 開発テンプレートのコードは Git に公開されています。 URLをコピーした後、以下実行します。 git clone [コピーしたURL貼り付け] clone で作成されたディレクトリに移動後 docker-compose.yml を利用して、コンテナをビルド+開始します。 docker-compose up -d コンテナを停止する場合は、以下実行します。 docker-compose stop パート2 - サンプルデータ・キューブの概要説明 サンプルデータは、Johns Hopkins repository で公開されている COVID-19 のデータを使用しています。 パート2のビデオでは、以下の内容をご紹介しています。 InterSystems BI(旧DeepSee)のキューブサンプル ピボットテーブルサンプル ダッシュボードサンプル 目次 00:00~00:13  アーキテクト画面の開き方 00:13~02:05  サンプルデータについて テーブル仕様については、こちらをご参照ください。 02:05~04:02  アーキテクト画面の使い方 04:02~  アナライザ画面の使い方(ピボットテーブル作成画面) パート3 - 新しいデータのインポート(ZPMパッケージマネージャの使い方) パート3では、以下の内容をご説明します。 ZPMについて OpenExchange に公開されている ZPM(IRISのパッケージマネージャ)を利用した OpenExchange の公開アプリケーションインポート方法 ZPM対応アプリケーションのインストール方法(csvgen) CSVデータのインポート方法 注意:OpenExchangeに公開されているアプリケーションは、インターシステムズが正式にサポートしているものではありません。 目次 00:00~00:53  ZPM(パッケージマネージャ)について 00:53~05:27  csvgen のインポートとCSVのインポート 05:27~  データの確認 パート4 - 新しいキューブ・ピボット・ダッシュボードの作成とVSCodeへのエクスポート パート4では、以下の内容をご説明します。 インポートした CSV データを利用して、新規でキューブを作成する方法 ピボットテーブルを新規で作成する方法 ダッシュボードを新規で作成する方法 作成した定義を VSCode にエクスポートする方法 目次 00:00~01:35  キューブの新規作成 01:35~02:55  ピボットテーブルの作成 02:55~04:59  ダッシュボードの新規作成+ウィジェットの追加 04:59~  VSCode へ作成した定義をエクスポートする方法 パート5 - ダッシュボード以外のUIを使ってみる(DeepSeeWeb) パート5では、OpenExchange に公開されている ZPM(IRISのパッケージマネージャ)を利用し、InterSystems BI が提供しているダッシュボード画面以外のUI(DeepSeeWeb)をインポートする方法をご紹介します。 注意:OpenExchangeに公開されているアプリケーションは、インターシステムズが正式にサポートしているものではありません。 目次 00:00~01:41  ZPM対応パッケージ:DeepSeeWeb のインストール方法 01:41~  DeepSeeWeb のUI 確認 以下URLを入力します(ポート番号は環境に合わせて変更してください)http://localhost:ポート番号/dsw/index.html#/IRISAPP/ @Mihoko.Iijima , こんにちは。 素晴らしい記事ですね。とても詳しくてわかりやすいです。 Henriqueさん、ありがとうございます!
記事
Toshihiko Minamoto · 2021年7月26日

InterSystems API Management で OAuth 2.0 を使用して API を保護する - パート 2

この 3 部構成の記事では、IAM を使って、以前に IRIS にデプロイされた認証されていないサービスに OAuth 2.0 標準に従ったセキュリティを追加する方法を説明します。 [パート 1](https://community.intersystems.com/post/securing-your-apis-oauth-20-intersystems-api-management-%E2%80%93-part-1) では、サービスを保護するプロセス全体を理解しやすくするために、IRIS と IAM の基本的な定義と構成を示しながら OAuth 2.0 の背景を説明しました。 このパートでは、着信リクエストに存在するアクセストークンを検証し、検証が成功した場合にはそのリクエストをバックエンドに転送するように IAM を構成する手順について詳しく説明します。 この連載の[最後のパート](https://community.intersystems.com/post/securing-your-apis-oauth-20-intersystems-api-management-%E2%80%93-part-3)では、IAM でアクセストークンを生成し(承認サーバーとして機能します)、それを検証するようにするための構成を説明し、重要な最終考慮事項を示します。 IAM をお試しになりたい方は、InterSystems 営業担当者にお問い合わせください。 シナリオ 1: アクセストークンのバリデーターとして機能する IAM このシナリオでは、JWT(JSON Web トークン)形式でアクセストークンを生成する外部承認サーバーを使用します。 この JWT はアルゴリズム RS256 と秘密鍵を使用して署名されています。 JWT 署名を検証するには、ほかのグループ(この場合 IAM)に承認サーバーが提供する秘密鍵が必要です。 外部承認サーバーが生成するこの JWT には、本体に、このトークンの有効期限を示すタイムスタンプを含む「exp」と呼ばれるクレームと、承認サーバーのアドレスを含む「iss」と呼ばれる別のクレームも含まれます。 したがって、IAM はリクエストを IRIS に転送する前に、承認サーバーの秘密鍵と JWT 内の「exp」クレームに含まれる有効期限のタイムスタンプを使用して、この JWT 署名を検証する必要があります。 これを IAM で構成するために、まず、IAM の「SampleIRISService」に「JWT」というプラグインを追加しましょう。 追加するには、IAM のサービスページに移動して「SampleIRISService」の ID をコピーします。これは後で使用します。 コピーしたら、プラグインに移動して[新規プラグイン]ボタンをクリックし、「JWT」プラグインを見つけて[有効化]をクリックします。 次のページで、[service\_id]フィールドに「SampleIRISService」の ID を貼り付け、[config.claims\_to_verify]パラメーターの「exp」ボックスを選択します。 [config.key\_claim\_name]パラメーターの値が「iss」であることに注意してください。 これは後で使用します。 次に、[作成]ボタンをクリックします。 クリックしたら、左メニューの「コンシューマー」セクションに移動し、前に作成した「ClientApp」をクリックします。 [資格情報]タブに移動し、[新しい JWT 資格情報]ボタンをクリックします。 次のページで、JWT の署名に使用されるアルゴリズム(この場合 RS256)を選択肢、[rsa\_public\_key]フィールドに公開鍵(PEM 形式で承認サーバーから提供された公開鍵)を貼り付けます。 [鍵]フィールドには、JWT プラグインを追加したときに[config.key\_claim\_name]フィールドに入力した JWT クレームのコンテンツを挿入する必要があります。 したがって、この場合は、JWT の iss クレームのコンテンツを挿入する必要があります。私の場合、このコンテンツは承認サーバーのアドレスです。 挿入したら、[作成]ボタンをクリックします。 ヒント: デバッグ用に、JWT をデコードするオンラインツールがあります。それに公開鍵を貼り付けると、クレームとその値を確認して、署名を検証することができます。 このオンラインツールは https://jwt.io/#debugger にあります。 JWT プラグインが追加されたため、認証無しでリクエストを送信することはできなくなりました。 以下に示すように、単純な GET リクエストを認証なしで次の URL に送信する場合、 **http://iamhost:8000/event/1** 「401 Unauthorized」ステータスコードで不正なメッセージが返されます。 IRIS から結果を取得するには、リクエストに JWT を追加する必要があります。 したがって、最初に承認サーバーに JWT をリクエストする必要があります。 ここで使用しているカスタム承認サーバーは、POST リクエストが、ユーザーやクライアント情報を含むキー値ペアとともに次の URL に送信された場合に JWT を返します。 **https://authorizationserver:5001/auth** このリクエストとそのレスポンスは次のようになります。 次に、レスポンスから取得した JWT を承認ヘッダーの下にベアラートークンとして追加し、以前に使用したのと同じ URL に GET リクエストを送信することができます。 **http://iamhost:8000/event/1** または、クエリ文字列パラメーターとして追加することも可能です。クエリ文字列のキーは、JWT プラグインを追加したときに[config.uri\_param\_names]フィールドに指定された値(この場合は「jwt」)です。 最後に、[config.cookie_name]フィールドに名前が入力されている場合は、JWT を cookie としてリクエストに含めるオプションもあります。 IAM でアクセストークンを生成して検証するために必要な構成と重要な最終考慮事項を理解するには、この連載のパート 3 であり最後となる記事をご覧ください。