新着
記事 Hiroshi Sato · 5月29日 2m read

昨今エージェントAIコーディングの競争が激化しているようで、CODEXも劇的に進化しているという噂です。

Googleも負けじとAntigravityで巻き返し、さらにはXも参戦と市場は盛り上がってきています。

おそらく私の使用程度ではどのエージェントAIを選んでも、それほど大差ない状況になってきていると思いますが、しばらくはClaude Codeで頑張ってみたいと思います。

少し前にもTypseScriptの自動コーディングの話を書きましたが、それは単にCSSライブラリの変更というかなり機械的にできる内容でしたが、今回は、ページのルック&フィールを変更するという内容です。

Reactプログラミングでの一番の悩みは、ユーザーインタフェースの見た目をどうするかという点でした。

美的センスゼロの私が自己流で作ったスクリーンは、やはり何かしっくりとしない感じがしていました。

そこで世の中のウェブのUIを調査したところ、ある程度のパターンが見えてきました。

しかし、それに合うように自分でスタイルシートを駆使して、そのパターンを真似るのは大変だなという印象で躊躇してきたわけですが、Claude Codeならやってくれるだろうという予想の元、トライしてみました。

結果は、見事1時間程度である程度満足のいく結果を得ることができました。

0
0 4
新着
記事 Hiroshi Sato · 5月28日 1m read

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

UNIX系(Linux、macOSなど)とWindowsでは対応が異なります。

UNIX系は、バージョン2021.1以降OpenSSLのライブラリは同梱されなくなり、OSにインストールされたOpenSSLを使用します。

OpenSSLのバージョンは以下のコマンドで確認できます。

>write $SYSTEM.Encryption.OpenSSLVersion()
OpenSSL 3.6.1 27 Jan 2026

UNIX系では、OpenSSLだけをバージョンアップすることも可能です。

Windowsの場合、現時点(2026.1)のバージョンでも、OpenSSLライブラリは、IRISに同梱されており、OpenSSLのバージョンは、IRISのバージョン毎に固定されています。
従って、OpenSSLのみのバージョンアップはできません。

新しいOpenSSLを利用するためには、そのOpenSSLに対応したIRISバージョンにする必要があります。

0
0 4
新着
記事 Hiroshi Sato · 5月28日 7m read

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

これらのファイルを個別にエクスポートする最も簡便で確実な方法は、VSCodeを利用してIRISのソースファイルを管理することです。

VSCodeの利用方法は、以下をご参照ください

VSCodeを使ってみよう

VSCode以外のツールとしての提供はありませんので、是非VSCodeのご利用をご検討ください。


VSCodeをご利用できない場合は、IRISが提供するAPIを使用して、個別にプログラミングする必要があります。

1) クラス定義

%SYSTEM.OBJクラスのExportAllClassesIndividualメソッドを使用してクラス毎にファイル出力できますが、その出力形式がXML形式です。

XML形式での出力は、可読性も低く、クラス数が多量にある場合には、インポートの時間も余計にかかるため、複数クラスを1ファイルにまとめる目的以外では、推奨しておりません。

可読性の高いUDL形式で出力するためには、

該当ネームスペースに存在するクラス名をクエリーで抽出し、クラス定義をUDL形式でエクスポートするメソッドで出力することができます。

以下はClaude Codeで生成したサンプルコードです。

Class Samples.ExportUDLAll
{

/// 指定されたネームスペース内のすべてのクラス定義を
/// 個別のUDL形式ファイルとして指定ディレクトリに出力する
///
/// @param pDirectory 出力先ディレクトリ名
/// @return %Status ステータスコード
ClassMethod Export(pDirectory As %String) As %Status
{
Set tSC = $$$OK
Try {
// %SYSTEM.OBJ の GetClassList メソッドでクラス名一覧を取得
// items はローカル多次元配列として ByRef で返る
// 第一サブスクリプトにクラス名が格納される
Set tSC = $SYSTEM.OBJ.GetClassList(.items, "/application=1")
If $$$ISERR(tSC) Quit

// items 配列をサブスクリプト順に走査してクラス数分繰り返す
Set tClassName = ""
For {
Set tClassName = $Order(items(tClassName))
Quit:tClassName=""

Write "class name = ", tClassName, !
Set tFileName = pDirectory _ "/" _ tClassName _ ".cls"
Write "file name = ", tFileName, !

// ExportUDL の第一パラメータ(itemname)はクラス名に ".cls" を付加
Set tSC = $SYSTEM.OBJ.ExportUDL(tClassName _ ".cls", tFileName)
If $$$ISERR(tSC) Quit

Write "Exported: ", tClassName, " -> ", tFileName, !
}
} Catch ex {
Set tSC = ex.AsStatus()
}
Quit tSC
}

}
0
0 4
新着
記事 Hiroshi Sato · 5月25日 3m read

自分で作成したサンプルを公開する際にコンテナで提供することが一般的になっています。


私も基本はその方針でサンプル類を公開しています。


そして簡単なデモアプリケーションを公開する場合、IRISがリリースされる以前はCSPベースでしたが、ご承知のようにCSPはIRISで利用することは推奨されていません。


ということで、私は代わりにReactを使うことが多いです。


このReactベースのサンプルをコンテナで公開する際にちょっとした不便があるので、情報共有したいと思います。


こういったサンプルを提供する際に様々な人に試してもらいたいという思いからIRISのコミュニティ版でDockerを構築します。


コミュニティ版のIRISには引き続き管理ポータルを動作させるための簡易Apacheサーバが同梱されており、これを使えば、CSPアプリケーションは、サンプル程度のものであれば、何の問題もなく動作します。


しかし、Reactのサンプルを動かす場合には、支障が出るケースがあります。


Reactに限らず、最近のJavaScriptフレームワークは、SPA(Single Page Architecture)というページを遷移せずに、ブラウザ上のDOMを直接書き換えることでページ内容を書き換えるという手法が一般的です。

0
0 5
新着
記事 Hiroshi Sato · 5月25日 1m read

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

CPU使用率が高いプロセスの優先度を下げて、他のプロセスへの影響を軽減する方法が用意されています。

該当プロセスの優先度を下げるには、%SYSTEM.Util.SetPrio()メソッドを使用します。

詳細は、ドキュメントをご参照ください。

SetPrio()メソッド
 

使用例: PID=24096 のプロセスの優先度を通常(8)から低(4) に変える

※OSにより優先度の番号は異なります。

USER>write $system.Util.GetPrio(24096)

8

USER>write $SYSTEM.Util.SetPrio(-4,24096)  // 8から4下げる(-4)

4

USER>write $system.Util.GetPrio(24096)

4

負荷が高すぎて、サーバーに接続できないような状況の場合には、この方法で優先度を下げることができない可能性があります。
また、このAPIによって、該当プロセスの優先度を逆に上げたい場合には、予期せぬ結果を招くリスクがあるため、慎重に行ってください。

0
0 7
新着
記事 Hiroshi Sato · 5月25日 2m read

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

IRISの%Net.HttpRequestクラスを利用して、外部のREST APIを呼び出し、情報の取得やデータの登録などの処理を実行することができます。

処理を実装する前準備としてSSL構成情報の設定が必要です。

この設定は、管理ポータル>システム管理>セキュリティ>SSL/TLS構成>新規構成の作成で行ってください。

構成名は任意の名前を指定します。

ここではSSLという名前で作成します。

その他の項目は、デフォルト値のままでOKです。

以下のサンプルは、郵便番号関連情報を取得するAPIサービスを利用しています。(https://zipcloud.ibsnet.co.jp/doc/api

set req = ##class(%Net.HttpRequest).%New()

set req.ContentType="application/json;charset=UTF-8"

do req.SetParam("zipcode","0790177")

set req.SSLConfiguration="SSL"

do req.Post("https://zipcloud.ibsnet.co.jp/api/search")

set res = req.HttpResponse.Data.Read(10000)

set obj={}.%FromJSON(res)

do showItem(obj)

quit



showItem(obj) {

set itr=obj.%GetIterator()

while itr.%GetNext(.key, .value, .type ) {

if type="array" {

write "==================================",!

write "[",key,"]",!

do showItem(value)

write "==================================",!

}

elseif type="object" {

write "---------------------------",!

do showItem(value)

}

else {

write key_" : "_value,!

}

}

quit

}
0
0 6
新着
記事 Hiroshi Sato · 5月24日 1m read

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

HANGコマンドや$ZF実行中の時には、^JOBEXAMや管理ポータルのプロセス詳細画面(システム>プロセス>プロセス詳細)でそのプロセス変数情報を取得することができません。

これらは内部的に以下のシステムクラスメソッドを呼び出しています。

ExamStackByPidメソッド

代わりにVariableByPidクラスクエリを利用することで、そのような状況でもプロセス変数情報を取得できます。

VariableByPidクエリ
以下のように取得することができます。

実行例:  // %SYSネームスペースで実行
set stmt=##class(%SQL.Statement).%New()
write stmt.%PrepareClassQuery("%SYS.ProcessQuery","VariableByPid")
set rs=stmt.%Execute(35552,"")  // 第1引数にPIDを指定、第2引数 “” で全ての変数
                           // PID=35552がハング状態でも実行可能
do rs.%Display()
// Name  Value
// a    123
// b    456
// c    789
// :
0
0 6
新着
記事 Hiroshi Sato · 5月21日 2m read

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

一番簡単な方法は、以下のコミュニティ記事にある ObjectScript Lite Terminalを使用する方法です。

VSCodeだけでIRISターミナル完結

IRISのコマンドをターミナルから実行する場合は、即時実行と複数行のコードを一度にまとめて実行する2つの実行方法があります。
即時実行の場合は、1個または複数のコマンドを1行で入力して、リターンキーを入力することで実行します。
即時実行の場合、複数行にまたがって一度に実行することはできません。

複数行をまとめて実行する場合には、予め複数行のコードをルーチンバッファーと呼ばれるメモリー上に一時的に保存して、一度に実行することができます。

ルーチンバッファーにコードを入力するためには、

ラベルの後ろにスペースまたはタブを入力した後に実行したいコードを入力します。
2行目以降は、スペースまたはタブを入力した後に実行したコードを入力します。

コードを入力し終わったら、以下のように実行することで、複数行まとめて実行できます。

>Do [先頭に指定したラベル名]

ルーチンバッファーの内容を確認するには、zprintコマンドを使用します。
以下はルーチンバッファーに複数行のコードを保存して、実行する例です。

0
0 6
記事 Hiroshi Sato · 4月7日 3m read

Claude CodeはIRISのことかなり理解してくれていますが、それでもやはり想定外が発生します。

まず1つ目は既に何回か発生した問題で、正しく指示しないと今後もよく発生する可能性の高い問題です。

IRISの文字型のデータ(%String)のコレーション(照合)は、デフォルトではSQLUPPERとなっていて、その結果としてデータをSQLで取得すると大文字に変換されて返ってくる場合があります。(GROUP BYなどのソートして集計する場合)

それを意識せずに(通常誰も意識していないと思いますが)、Claude Codeにそのデータの値に依存するような指示を与えると、期待した結果が得られないことが起こります。

例えば、何々のカラムの値がGroup BYで指定したカラムで集計した場合、返ってくるそのカラムの値が大文字となるため実際のデータはSupportだけれども実際に返ってくる値がSUPPORTとなっているためにマッチしないという感じです。

Claude Codeのスキルにこれをちゃんと記載するか、クラス定義のCOLLATEをSQLSTRINGに変更することでこの状況を回避できると思います。

もう一つ最近遭遇した問題は、これはさすがに難しいだろうという感じのものです。

IRISにはご存知の方も多いと思いますが、計算フィールドという非常に便利な機能があります。

0
0 30
記事 Hiroshi Sato · 4月6日 4m read

Claude Codeを使うようになってから、創作意欲が爆上がりです。

今までは、何かを作りたいと思っても実際にコーディングをするのが面倒なので、よっぽどのニーズがないとプログラミングまでは至らなかったのですが、仕様をちょこちょこっと書くと後はClaude Codeが勝手にやってくれるので、生産性が雲泥の差です。

私はObjectScriptネイティブ世代なので、これからはPythonと言われても少し躊躇する部分がありましたが、逆にClaude CodeはPythonが大得意なので、新規に開発する際に、ObjectScriptを選ぶ理由がほとんどなくなりました。

とはいえ、Claude CodeがEmbedded Pythonのくせをどの程度理解しているか少し懸念があったのですが、それはかなり取り越し苦労だとわかってきました。

IRISのドキュメントに書かれていることは大体ちゃんと理解してくれています。

そして、自分でPythonコードを書いたら決して書けないような簡潔で洗練されたコードを書いてくれます。

今まであったらいいなと思いつつ、面倒なので、ほとんどやっていない処理としてテーブルのインポート・エクスポートがあります。

0
0 33
記事 Hiroshi Sato · 3月11日 1m read

今回は、プログラミングというほどのこともないですが

IRISのフロントエンド開発ツールとしてReactを利用しています。

Reactに限らずWeb開発のフレームワークを利用する場合のポイントとしてCSSフレームワークをどうするかというのがあります。

今までは、定番というか一番とっつきやすいBootStrapを使用してきました。

利用が簡単な分、カスタマイズの幅が少ないかなということを感じていました。

とはいえ、他のCSSフレームワークを使うにしても、それをまた学習して、1から書き直すのも大変だなということでそのままにしてきました。

今回、Claude Codeという最強のツールを得たことで、BootStrapをMaterializeに変更するように依頼してみました。

結果は、一発で修正完了

実行確認まで5分もかからないスピード感で終了しました。

もし自分でMaterializeを自習して、実装した場合は、少なくとも2、3日はかかったのではないかと思います。

BootStrapの画面

BootStrap

Materializeの画面

1
0 62
記事 Hiroshi Sato · 3月10日 2m read

すっかりClaude Codeにはまってきてしまいました。

前回はIRISデベロッパーらしくObjectScriptプログラミングの話ですが、今回は、Pythonプログラミングです。

私は、個人会社を持っていまして、経理の細かいことは、当然税理士さんにお任せなのですが、とはいえ日々の経費の管理は自分でやる必要があります。

基本はエクセルに経費情報を入力するというオペレーションなのですが、入力を省力化するためにIRISデータベースを使用したPythonプログラムを作っていました。

その中で本当はやりたいのだけれども、非常に煩雑で面倒臭い処理(決して難しい処理ではないですが)を先延ばしにしてきました。

そこでこれはClaude Codeの格好の題材だと思い、依頼してみることにしました。

結果は、三回のやり取り(実際には、二回目の依頼の際に間違えて送信ボタンを押したので、実質的に二回)で10分もかからずに修正が終わり、期待した通りの結果を得ることができました。

もし自分でコーディングをした場合、おそらく半日仕事、下手をすれば1日仕事だったかもしれません。

この経験を通して感じたのは、既存プログラムの修正には非常に使えるということです。

多少依頼内容に曖昧な点があっても、既存のコードを非常に高速かつ完全、網羅的に理解してくれるので、そういう曖昧性をある意味埋めてくれます。

0
0 99
記事 Hiroshi Sato · 3月4日 13m read

最近話題のClaude Codeを使って、ObjectScriptプログラミングをトライしてみました。

もちろんClaude CodeにObjectScriptのコードを書かせるにはそれなりの指示が必要ですが、適切なプロンプトを与えると想像以上にちゃんとしたObjectScriptコードを書いてくれます。

今回試したのは、少し前に投稿したCSPの#server問題に対応するため、#serverをREST APIに書き換えるというものです。

元のソースは、

https://github.com/wolfman0719/shopdemo

これはCSPのデモアプリケーションですが、しっかりと#server機能を使用しています。


結論をいうと、%sessionがRESTとCSP間で共有できないという根本問題があって、実行成功までには至っていませんが面倒なコーディングをかなりカーバーしてくれることがわかります。

(REST APIをCSPクラスで実装することで%session共有の問題を回避でき、Claude Codeが生成したロジックの正しさは証明されました)

そして、Claude Codeは、 ObjectScriptのことかなり理解してくれています。

ObjectScriptプログラマーが少ない問題を大きく改善してくれる可能性があります。
 

それでは、私がどのようなことを行ったか説明します。

2
0 76
記事 Hiroshi Sato · 2月15日 4m read

IRISではCSPタグベースの開発は、非推奨(Deplicated)になっています。

非推奨とはいえ、いますぐ使えなくなることはないと思います。

が、CSP機能に含まれるHyperEventの#server()#呼び出しは、かなりやばいということがわかってきました。

これはChromeを始めとするメジャーなブラウザーが提供しているSynchronous XMLHttpRequestという関数を呼び出しています。

この関数をGoogleは10年前くらいから非推奨機能としていて、いつか完全に機能をドロップすると宣言しています。

Stackoverflowの該当記事

インターシステムズのドキュメントにもさりげなく記載されています。

HyperEventCallメソッド

とはいえ、10年もそのままなので、希望的観測をすれば、今後も使える可能性は高いかもしれません。

しかし、ある日突然なくなるリスクはゼロではありません。

ですので、#server()#呼び出しをお手元のコードからなるべく早く取り除くのが賢明です。

それでは、どうすれば良いのか?

ということですが、今のご時世で考えれば、REST APIに変えましょうというのが美しい世界ですが、おそらく書き換えのコストは、半端じゃないでしょう。

ということで、現実的な解は、#Call()#に置き換えることだと思います。

4
2 90
記事 Hiroshi Sato · 1月5日 1m read

MacOS(Linux)とWindows両方で動作するObjectScriptプログラムを開発する際に、よくやらかしてしまうミスを共有します。

WindowsとUNIX系のファイルシステムの1つの違いは、ディレクトリのセパレータです。

UNIX系は、/(スラッシュ)

Windows系は、\(バックスラッシュ)

です。

ファイルを読み書きするプログラムでセパレータをOS別に選択するという以下のようなコードをよく書くのですが、

if$system"UNIX"

ここでこのバックスラッシュをキーボードで入力すると、日本語キーボードの場合、バックスラッシュの代わりに¥(円マーク)が入力されてしまいます。

ソースコードがSJISの場合は、これでも問題ないのですが、クロスプラットフォームで開発する場合は、UTF8で通常作成するので、Macで動かすと問題ないのにWindowsで動かすとエラーになるということがちょくちょく起こります。

そして、これは意外に間違いに気づきにくいです。

ちなみにPythonでは、どちらでも/を使っておけば問題ないので、こんな問題は起こることはないと思います。

3
0 59
記事 Hiroshi Sato · 2025年12月8日 6m read

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

WebSocketは、リアルタイム双方向通信を可能にするプロトコルで、Webアプリケーションの動的な操作性を向上させるために広く活用されています。

この技術は、TCP上で動作し、HTTPプロトコルを介して接続を確立します。

一度接続が確立されると、持続的な接続が維持され、サーバーとクライアントが効率的にデータを交換できるのが特徴です。

通常のHTTP通信の場合、クライアントからのリクエストに対してサーバーが応答するというのが基本的な動作になるため、サーバーから非同期にデータを送信することが難しいですが、WebSocketを利用することでそのような機能を簡単に実現できます。

一方で、サーバーからの一方向の非同期通信が実現できれば良いという要件であれば、SSE (Server-Sent Events)を使用することもできます。

一般的にWebSocket通信が最も適していると考えられるのは、クライアント・サーバー間で双方向にデータを交換する必要がある場合になります。

双方向の接続を維持する必要があるため、状況によって、サーバー上のコンピュータ資源の消費(メモリー、CPU、IRISライセンス使用量など)に注意する必要があります。

0
0 80
記事 Hiroshi Sato · 2025年12月8日 2m read

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

PythonからIRISにアクセスするためのNative SDK for Pythonと呼ばれるインタフェースが用意されています。

Javaや.Net用に用意されているNative SDKと同等な機能が提供されています。

(一部異なる機能があります)。

また、Python用にはEmbedded Pythonと呼ばれるIRISと密に連携した機能があります。

IRISから最大限の性能を得るためには、Embedded Pythonが適していますが、以下のような場合、Native SDKが適しているケースもあります。

  1. 異なるサーバーでIRISとPythonプログラムが連携する必要がある。
  2. 同一サーバー上でIRISとPythonが稼働するが、システムが異なる(サブシステム間連携など)
  3. システムを別々の開発ベンダーが構築するなど、明確な境界を設けたい場合

Native SDKを利用することで以下のようなことを実装することができます。

  1. ObjectScriptやEmbedded Pythonで作成したメソッドの実行
  2. IRISオブジェクトの操作
  3. IRISグローバルデータの操作
  4. DBI-APIによるデータベースアクセス


以下からこれらのサンプルプログラムを取得することができます。

0
0 69
記事 Hiroshi Sato · 2025年12月8日 1m read

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

.NETからIRISにアクセスするためのNative SDK for .NETと呼ばれるインタフェースが用意されています。

JavaやPython用に用意されているNative SDKと同等な機能が提供されています。

(一部異なる機能があります)。

Native SDKを利用することで以下のようなことを実装することができます。

  1. ObjectScriptやEmbedded Pythonで作成したメソッドの実行
  2. IRISオブジェクトの操作
  3. IRISグローバルデータの操作
  4. ADO.NETによるデータベースアクセス

以下からこれらのサンプルプログラムを取得することができます。

Native SDK for .NETサンプル1

Native SDK for .NETサンプル2

.NETに様々な手段でアクセスするサンプル


詳細は、以下のドキュメントをご参照ください。

InterSystems Native SDK for .NET

0
0 76
記事 Hiroshi Sato · 2025年12月7日 2m read

CSPでWebアプリケーションを開発する方法は今では推奨されていませんが、既存資産が膨大にあって、他の手法への書き換えには相当の時間がかかりそうな方々はたくさんおられることでしょう。

そういう方々は、しばらくはそれらCSPファイルのメンテナンスの必要性があるかと思います。

IRISではVSCodeが主たるIDEとなっていますが、開発環境がWindowsのみであれば、CSPファイルをSJISでメンテナンスしておけば、問題は起こりません。

ところが、それらのファイルをUNIX環境(LinuxやMac)に持っていって、VSCodeで編集作業を開始すると、文字化けの嵐となってしまいます。

これは以前にポストしましたが、UNIX環境のIRISは何も設定しないとロケールがenuw(英語)となっているためです。

さらにこれを日本語専用ロケールに変えても、unix環境ではロケールがjpuwの場合、ファイルの読み書きのエンコーディングが、utf8となっているので、cspファイルのエンコーディングがSJISのままでは都合が悪いです。

従ってCSPファイルのエンコーディングをUTF8に変更する必要があります。

しかし、プラットフォームの切り替えのたびにエンコーディングを変更するのも面倒です。

そこで推奨の方法は、ファイルのエンコーディングをUTF8のBOM付きに変更することです。

0
0 60
記事 Hiroshi Sato · 2025年10月21日 1m read

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

ルーチンやメソッドを実行した際に以下のような<FRAMESTACK>エラーが発生する場合、DOコマンドの発行の入れ子数が多すぎて、それ以上スタック情報を保持できなくなったことを示しています。

<FRAMESTACK> error is reported when the routine has too many nested calls to DO$STACK

可能性として高いのはプログラミング上のミスで再起的なメソッド/ルーチン呼び出しがループしている場合などです。

以下のようなプログラミングを行い、$STACK変数の値を確認することで、スタックのレベルがどのように変化しているのかを確認できます。

main() {
  
0
0 52
記事 Hiroshi Sato · 2025年10月21日 1m read

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

%String型のプロパティをOrder Byの条件にしてクエリーを発行した際のデータは以下のような順番で並べられます。

SELECTFROMorder
null
-1
-2
-99
0

これは%String型(文字列型)のプロパティの照合順として正しい振る舞いです。

文字列照合の並び順

文字列プロパティに対し、+ をつけることで、数値照合と同じ照合順を得ることができます。

order
0
0 47
記事 Hiroshi Sato · 2025年10月21日 1m read

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

SQLアクセス( ADO含む)を行う場合は、SQLトランザクションを使用して、トランザクションを制御します。

一方オブジェクトアクセス(ObjectScript)ではtstart / tcommit / trollbackコマンド 
(Native SDK for .NETでは IRIS の TStart(), TCommit(), TRollback() メソッド)
によってトランザクションを制御します。

この2種類のトランザクションモードを混在させて使用することはサポートされていません。

詳細は、以下のドキュメントをご参照ください。

トランザクション管理

また関連するメソッドの以下ドキュメントの注意事項にも

「このメソッドは Native SDK トランザクション・モデルを使用し、ADO.NET/SQL トランザクション・メソッドとは互換性がありません。

この 2 つのトランザクション・モデルを混在させないでください。」

と記載をしております。

Native SDK for .NET のクイック・リファレンス

0
0 39
記事 Hiroshi Sato · 2025年9月25日 1m read

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

$System.Encryption.Base64Encodeに指定するデータは、UTF8にエンコードして渡す必要があります。

日本語が含まれるローカル変数をこのメソッドの引数として指定すると<ILLEGAL VALUE>エラーが返ります。

以下のようにUTF8に変換後引数として渡す必要があります。

 set$ZCONVERT

詳しくは以下をご参照ください。

ドキュメント: $System.Encryption.Base64Encodeの説明

0
0 41
記事 Hiroshi Sato · 2025年9月25日 2m read

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

何の設定も行なっていない場合、GROUP BYやDISTINCTで指定したフィールドは大文字小文字を区別せずに全て大文字として処理されます。

これはGROUP BYやDISTINCTのグループ化がフィールドに対して定義された照合タイプに基づいて行われ、その文字列照合の既定値がSQLUPPERになっているためです。

以下のドキュメントに説明がある通り、DISTINCT は、フィールドに対して定義された照合タイプに基づいて、文字列値をグループ化します。

大文字/小文字の区別と DISTINCT の最適化

これを変更する方法は、以下の3種類になっています。

(A) %SQLSTRING または %EXACT照合関数を使用する
(B) フィールドの文字列照合を SQLSTRINGに変更する
 また、フィールドにインデックスが設定されている場合には、インデックスの文字列照合も SQLSTRINGに変更する
(C) 管理ポータルで設定を変更する 

※(B)について補足
・文字列照合をEXACTに設定しても動作しますが、一般的にはSQLSTRINGの使用が推奨されています。
・フィールドの文字列照合とインデックスの文字列照合は、同じ設定にすることが推奨されています。

0
0 90
記事 Hiroshi Sato · 2025年9月3日 2m read

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

ダイナミックオブジェクトの%ToJSONメソッドを利用することで簡単にJSONデータを送信することができます。

但し、標準的な方法では、出力するJSONのデータがIRIS文字列の最大長(約32万文字 正確には$SYSTEM.SYS.MaxLocalLength()が返す値)を超えると<MAXLENGTH>エラーとなります。

これを回避するためには、文字列として返すのではなく、%ToJSONメソッドの出力先としてStreamを指定し、その結果作成されたそのStreamデータを順次読み取って、出力先に書き出すようにする必要があります。

以下のように処理できます。

ClassMethodAs%Status

なお、このような処理はREST APIの実装として用いられることが多いと想定されますが、あまりの大量データを一度にREST経由で送信することは、ネットワーク帯域の逼迫や応答時間の増大等の影響が懸念されるため、その処理の適切性について十分考慮する必要があり、場合によっては、他の方法を検討した方が良いケースもあります。

0
0 116
記事 Hiroshi Sato · 2025年9月3日 3m read

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

JSON利用の普及に伴いインターシステムズは、JSONに関連する様々な機能強化をIRISに対して行なっています。

その一環として、SQLのJSON_OBJECTのサポートがあります。

この機能に関して現時点より(2025年6月)古いバージョンでは残念ながら制限や不具合が存在しています。

今後も機能強化やバグフィックスを継続していく予定となっているため、この機能の利用を検討および既に利用している方は最新バージョンでのご利用をお勧めします。

ここでは、現時点でわかっている制限事項/不具合についてお知らせします。

  • VIEW経由でJSON_OBJECTを利用した場合にエラーとなる場合がある 以下のようなクラスとVIEWを定義します。  
ClassExtends%PersistentAs

この定義に対してデータを登録後、以下のようなSQL文を発行すると、<UNDEFINED>エラーが発生します。

'y'

以下のようなエラーメッセージが表示されます。

0
0 60
記事 Hiroshi Sato · 2025年9月3日 1m read

以前はMac上でDockerを動かす場合は、Docker for Macを使用していましたが、ある時点でマルウェア判定されてしまい、削除されてしまいました。

以下の記事によれば、最新版では解決しているようです。

Docker Desktop for Macがエラーで起動できない件(#7527)についての情報

そこで他の選択肢はないか調べてみるといくつか選択肢がありました。

その中でColimaというのがあり、設定してみました。

Colima で Docker と Docker Compose を使ってみた

設定も非常に簡単であり、実際のdockerやdocker composeの動かし方はほとんど変わりません。

一つColimaの方が良いと感じたのは、Docker for Macの場合、IRISのスクリプトの実行の結果として出力されるメッセージは、スクロールされて、Dockerコンテナの起動が終了すると、痕跡が残らないため途中でエラーが発生してもその場で確認できませんでしたが、Colimaの場合、ターミナル上で垂れ流されるだけなので、そのターミナルのスクリーンをロールバックすることで出力メッセージを確認できる点です。

0
0 87
記事 Hiroshi Sato · 2025年8月4日 2m read

前回、macOS上でLibreOfficeからODBC経由でアクセスするためのセットアップについて記事を書きました。

今回 .Net経由でODBCにアクセスする方法を試したので報告します。

LibreOfficeの場合、iODBCでしたが、.Netの場合は、unixODBCを使用します。

従来のバージョンでは、IRISのunixODBCドライバーはUnicode対応(ワイド)でなかったため、.NetのODBCでは日本語を正しく処理できませんでしたが、2025.2よりワイドドライバーが追加されたため正しく処理できるようになりました。

今回.Net経由のアクセスを試した理由は、ODBC版Cache DirectエミュレータをMacで動かせないかと考えたからです。

ODBC版Cache Directエミュレータ

こちらのリポジトリにも設定方法の詳細を記載していますが、Mac上でunixODBCドライバーを設定する方法を紹介します。

  • IRISバージョン

unixODBCのUnicode(ワイド)版のドライバーが必要なため、IRIS 2025.2以降のバージョンが必要です。

  • unixODBCのインストール

Homebrewを使用してインストールします。

0
0 50
記事 Hiroshi Sato · 2025年7月27日 3m read

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

JDBCクライアントからのアクセスでエラーが発生した場合、返ってきたエラーメッセージやコンソールログ上の情報だけでは原因がよくわからない場合があります。

そのような場合にJDBCドライバのクライアントログを取得することで、エラーについての詳細情報を取得することができます。

JDBCログの取得方法については以下をご参照ください。

JDBCのログ

ログを指定する際に、ディレクトリ名を含まずに直接ファイル名を指定した場合、そのアプリケーションのディレクトリにその指定したファイル名でログが出力されます。

ODBCログの様にPID毎に取得する方法は用意されていません。

JDBCログが正常に取得できている場合、以下の様な内容が書き込まれます。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
	Started At:     2025/03/27 11:52:16
	Driver Name:    com.intersystems.jdbc.IRISDriver
	Jar File Name:  intersystems-jdbc-3.9.0.jar
	Client Version: 3.9.0.0
	Compiled At:    3 June, 2024 at 07:34PM UTC
	JDBC Version:   4.2
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Sent: (03/27/25-11:52:16:156) [ThreadID = 1 ] [JobNumber = -1 ] [DeviceID = 1212899836 ]
Header:
  0000:  02  00  00  00  01  00  00  00  00  00  00  00  48  53      ............HS
Message:
  0000:  43  00                                                      C.


Received: (03/27/25-11:52:16:199) [ThreadID = 1 ] [JobNumber = -1 ] [DeviceID = 1212899836 ]
Header:
  0000:  0D  00  00  00  01  00  00  00  00  00  00  00  00  00      ..............
Message:
  0000:  43  00  01  00  09  01  55  6E  69  63  6F  64  65          C.....Unicode


Sent: (03/27/25-11:52:16:199) [ThreadID = 1 ] [JobNumber = -1 ] [DeviceID = 1212899836 ]
Header:
  0000:  C5  00  00  00  03  00  00  00  00  00  00  00  43  4E      ............CN
Message:
  0000:  06  01  55  53  45  52  09  01  59  78  BA  FA  5C  3B      ..USER..Yx..\;
  000E:  DF  05  01  9E  FF  DE  0A  01  68  73  61  74  6F  63      ........hsatoc
  001C:  74  72  1C  01  6A  70  37  33  32  30  6E  6F  6E  6F      tr..jp7320nono
  002A:  2E  69  73  63  69  6E  74  65  72  6E  61  6C  2E  63      .iscinternal.c
  0038:  6F  6D  05  01  41  70  70  6F  01  06  01  4A  44  42      om..Appo...JDB
  0046:  43  1D  01  69  6E  74  65  72  73  79  73  74  65  6D      C..InterSystems
  0054:  73  2D  6A  64  62  63  2D  33  2E  39  2E  30  2E  6A      s-jdbc-3.9.0.j
  0062:  61  72  09  01  33  2E  39  2E  30  2E  30  11  01  4D      ar..3.9.0.0..M
  0070:  61  63  20  4F  53  20  58  5C  31  35  2E  33  2E  32      ac OS X\15.3.2
  007E:  30  01  4A  61  76  61  20  48  6F  74  53  70  6F  74      0.Java HotSpot
  008C:  28  54  4D  29  20  36  34  2D  42  69  74  20  53  65      (TM) 64-Bit Se
  009A:  72  76  65  72  20  56  4D  5C  32  33  2E  30  2E  31      rver VM\23.0.1
  00A8:  2B  31  31  2D  33  39  0B  01  53  48  4D  7C  7C  7C      +11-39..SHM|||
  00B6:  7C  7C  31  03  01  00  03  04  01  03  04  01  03  04      ||1...........
  00C4:  3B                                                          ;

0
0 140
記事 Hiroshi Sato · 2025年7月27日 4m read

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

ODBCクライアントからのアクセスでエラーが発生した場合、返ってきたエラーメッセージやコンソールログ上の情報だけでは原因がよくわからない場合があります。

そのような場合にODBCドライバのクライアントログを有効にすることで、エラーについての詳細情報を取得することができます。

ODBCログの有効化については以下をご参照ください。

ODBCログの有効化

UNIX系のシステムの場合、上記に記載されている通り、2種類のログが取得できます。 

  • クライアント・ドライバ・ログの取得方法 以下の環境変数でトレースのオンと出力するファイルを指定します。
exportexport
  •  ドライバマネージャのログの取得方法 ドライバマネージャのデータソース設定ファイル(ODBC.ini)に以下の様にトレースをオンにする設定とログファイルの場所と名前を指定します。
[ODBC Data Sources]
IRIS ODBC User = IRIS iODBC Driver

[IRIS ODBC User]
Driver      = /opt/iris/bin/libirisodbc35.so
Description = 
Host        = localhost
Namespace   = USER
UID         = _system
Password	= SYS
Protocol    = TCP
Port        = 1972
Trace		= on
TraceFile   = /Users/user1/work/iodbctrace.log
0
0 117