Toshihiko Minamoto · 12月 6, 2021 記事へ

Ohataさん
こんにちは。

例えば、$listを使用して、10パラメータずつまとめてExecuteメソッドのパラメータに渡すというのはいかがでしょうか。プログラム例は以下のとおりです。(長くなりますので、途中「...」で省略しています)

    set rs=##class(%ScrollableResultSet).%New()
    
    // Prepare で 60個のパラメータから$listget関数を使って各カラムに分けたものをINSERTします。
    set ret=rs.Prepare("INSERT coltest.test (P0000, ... ,P0599) "
        _" SELECT $listget(  P0,1), ... ,$listget( P0,10) "
            _",$listget( P1,1), ... ,$listget( P1,10)"
                :
            _",$listget(P59,1), ... ,$listget(P59,10) "
            _" FROM (SELECT ? as P0,? as P1,? as P2, ... ,? as P58,? as P59)")
    quit:$$$ISERR(ret) ret

    set ret=rs.Execute($lb("PPP0", ... ,"PPP9")
        ,$lb("PPP10", ... ,"PPP19"), ... 
        ,$lb("PPP590",...,"PPP599"))
    quit ret

Prepare()メソッドでは、60個のパラメータにP0~P59の名前を付けるサブクエリを作り、それをFROM句に指定して$listget関数で分解したデータをcoltest.testテーブルのP0001~P599のカラムにINSERTするSQL文を指定しています。

Execute()メソッドではデータ10個を$listbuild()関数で$list形式に変換し、パラメータとして指定しています。

Toshihiko Minamoto · 8月 17, 2021 記事へ

Ohataさん
こんにちは。
実際にSourceControlを使っているわけではないのでよくわかっていない部分はありますが、
スタジオやVSCodeで保存した際には、スタジオやVSCodeのフック処理にてSourceControlの処理が実行されるかと思います。しかしImportDirなどObjectScriptのメソッドにはこのような機能がないため、SourceControlの処理は実行されません。
ImportDirメソッドを実行されるということは、その前に特定のディレクトリに.CLSなどのファイルを保存されるかと思います。
その際にSourceControlで使用する作業ディレクトリに保存すれば、SourceControlの処理が実行されるかと思うのですが、いかがでしょうか?
抽象的な内容ですみません。
何らかのヒントになれば幸いです。

Toshihiko Minamoto · 6月 7, 2021 記事へ

Ohataさん、
こんにちは。
cls形式(UDLフォーマット)での出力ですが、ExportUDLメソッドで出力できます。
https://docs.intersystems.com/irislatest/csp/documatic/%25CSP.Documatic…
実際、こんな感じです。
set ret=$SYSTEM.OBJ.ExportUDL("Sample.Person.cls","c:\temp\Sample\Person.cls")
よろしくお願いします。
Create tableで作成されたタイミングでExportということに関しては、
現状、タスクで定期的にクラスをサーチするというベタな方法しか思いつきません。。。
ジェネレータメソッドを持つクラスを作成し、そのクラスを継承できれば良いのですが。。。

Toshihiko Minamoto · 6月 6, 2021 記事へ

Furuzonoさん、情報ありがとうございます。
Windowsマシンで試したのですが、OS認証をONにするのを忘れてハマってしまったので、念のため情報共有しておきます。
OS認証をONにする方法

  1. システム管理ポータルの「システム管理」「セキュリティ」「システムセキュリティ」「認証/ウェブセッションオプション」メニューをクリックします。
  2. 以下のページが表示されますので、「OS認証を許可」をチェックし、「保存」ボタンをクリックします。

     
  3. システム管理ポータルの「システム管理」「セキュリティ」「サービス」メニューをクリックします。
  4. 「%Service_Console」をクリックし、表示されるダイアログにて「オペレーティングシステム」をチェック、「保存」ボタンをクリックします。

あとはWindowsユーザと同じ名前のユーザを作成すれば(インストール時のWindowsユーザであれば自動的に作成されています)、バッチファイルからirisコマンドでルーチンやクラスが起動できました。

Toshihiko Minamoto · 4月 20, 2021 記事へ

Ohataさん

ご連絡ありがとうございます。
ちなみに私の手元のIRIS 2020.3で試してみましたところ、アラートメッセージが送られました。
お手数ですが、サポートセンターに問い合わせて頂ければと思います。

Toshihiko Minamoto · 4月 13, 2021 記事へ

Ohataさん
こんにちは。
頂いたエラーが出力されているTestAsou2というビジネスサービスはEnsLib.RecordMap.Service.FileServiceクラスを利用されているのではないかと思います。
であれば、アラート出力を利用する方が良いかと思います。
まず、以下のようにEns.AlertRequestメッセージを受信するビジネスオペレーションクラスを作成します。

/// アラートデータの保存
Class Util.Alert.StoreAlert Extends Ens.BusinessOperation [ Language = objectscript ]
{
 Parameter INVOCATION = "Queue";
 Parameter SETTINGS = "-AlertOnError";
 Method StoreError(pRequest As Ens.AlertRequest, Output pResponse As Ens.Response) As %Status
 { 
    set ^Log($I(^Log))=$lb(pRequest.AlertText,pRequest.AlertTime
                            ,pRequest.SourceConfigName,pRequest.SessionId)
    return $$$OK
 } 
 XData MessageMap
 {
 <MapItems>
    <MapItem MessageType="Ens.AlertRequest"> 
        <Method>StoreError</Method>
    </MapItem>
 </MapItems>
 } 
}

作成したビジネスオペレーションを追加します。この時、オペレーションクラスには先ほど作成したクラス名、
オペレーション名には「Ens.Alert」を指定します。

最後にエラーを受信したいビジネスホストの設定タブにある「エラー時に警告」にチェックを入れます。
こうすると、各ビジネスホストでエラーが発生すると、Ens.AlertにEns.AlertRequestメッセージが流れ、
^Logグローバルにエラーメッセージ(AlertTextプロパティ)や発生元のビジネスホスト(SourceConfigNameプロパティ)が格納されます。
ラフな説明ですみません。
ご不明な点等ありましたら、ご連絡ください。
 

Toshihiko Minamoto · 3月 29, 2021 記事へ

Ohataさん

すみません、instanceof と同等のメソッドとして、%IsA()メソッドがあります。これは、インスタンスがパラメータに指定されたクラスまたはそのサブクラスかどうかをチェックするものです。
USER>write a.%IsA("Sample.Person")
1
よろしくお願いします。

Toshihiko Minamoto · 3月 29, 2021 記事へ

Ohataさん
こんにちは。
型(クラス名)を取得するには$classname()関数を使用したり、%ClassName()メソッドを使用します。
例えば、
USER> set a=##class(Sample.Person).%OpenId(1)
でaというインスタンスを作成した場合、
USER>write $classname(a)
Sample.Person
USER>write a.%ClassName(1)
Sample.Person
とクラス名が文字列で返ります。
 

Toshihiko Minamoto · 3月 14, 2021 記事へ

Amanoさん、こんにちは。
非同期動作の場合、Serverメソッドを正常終了(quit $$$OK)すると、その後メッセージを受信するとOnClientMessage()が呼ばれます。

Method OnClientMessage(data As %String = "", close As %Integer) As %Status
{
    // メッセージ受信処理
    Quit 1
}

ここで、dataはクライアントから送信されたメッセージが入り、クライアントがWebSocketをcloseすると、closeパラメータに1が入ります。

OnClientMessageの戻り値が1の場合、正常終了とみなされます。
 

Toshihiko Minamoto · 2月 25, 2021 記事へ

Amanoさん

投稿ありがとうございます。

ターミナルからの起動ではないので、エスケープシーケンス等正しく表示されない可能性はありますが、
Vscodeでの簡単な設定で、ルーチンやシステム関数の戻り値などをちょっと試すのに便利ですね。
 

Toshihiko Minamoto · 2月 25, 2021 記事へ

Hiroseさん
投稿ありがとうございます。
現状、修正は依頼しているのですが、まだ最新のバージョンには反映されていないようです。
将来的には修正されるかと思います。
よろしくお願いいたします。

Toshihiko Minamoto · 2月 23, 2021 記事へ

データプラットフォームと同じかもしれませんが、個人的には
データベースと言語が一体となったシステム
だと思います。(MUMPSやCachéも同じですが。。。)

データベースと言語が一体となっているので、言語からデータベースの内容を簡単かつ安全、高速に参照、更新できるところが利点だと思います。
また、以前はデータベース=RDBとなっていたので、拒絶反応を示されることが多かったのですが、最近ではドキュメントDBやグラフDBなどリレーショナルでないものもいろいろと出てきているので、少しご理解いただけるようになってきているのでは。と思います。

Toshihiko Minamoto · 2月 22, 2021 記事へ

Hiroseさん、コメントありがとうございます。

お作法的にはこちらの記事が正統ではあるのですが、ベースとしていくつかのクラスを作成する必要があり、ちょっとした連携をするには敷居が高いのかなと思いまして、この記事を書いてみました。

また機会がありましたら、試してみてくださいsmiley

Toshihiko Minamoto · 1月 29, 2021 記事へ

Henriqueさん、ありがとうございます!
早速インストールさせていただきました
1画面でワクチン接種状況が見えて良いですねsmiley

Toshihiko Minamoto · 1月 28, 2021 記事へ

Yamadaさん、こんにちは。
日付を変換されている

set array(key)=$zdh(data,3)

に以下のようにtry-catch文を入れてはいかがでしょうか。

try 
   set array(key)=$zdh(data,3)
catch {
   set array(key)=""
}

こうすれば、$zdh()関数にてエラーが発生すると、catch文のブロックが実行されarray変数に空文字が入り、処理が継続されます。もし、arrayにエラーメッセージを入れるのでしたら、catchの後ろに例外変数を入れ、そのNameプロパティを代入してください。

 try 
   set array(key)=$zdh(data,3)
catch err {
   set array(key)=err.Name
}
Toshihiko Minamoto · 12月 16, 2020 記事へ

ありがとうございます。
Prometheousはフリーソフトでシステムの監視を行うソフトウェアで、RESTインターフェースを使ってJson形式で監視データをやり取りしています。アーキテクチャは(https://prometheus.io/docs/introduction/overview/#architecture)を参照ください。

基本的に監視サーバから監視対象サーバのExporterにアクセスし、監視データを取得する仕組みになっており、閾値を超えるとAlert Managerに通知され、メールやSlackなど様々な通知が行えるようになっています。
また、grafanaという視覚化(グラフ表示等)ツールを使って推移を確認することもできます。

監視データの取得については仕様に基づいて様々なハードウェア、OS、ミドルウェアの監視データを提供するExporterが公開されています。(https://prometheus.io/docs/instrumenting/exporters/)
この記事ではCacheやEnsembleのRESTインターフェースでExporterを作成していますが、IRISは標準でPrometheousの監視データを提供する機能が備わっています。
InterSystemsではPrometheousやGrafanaの機能を使用したInterSystems SAMを公開しており、簡単な設定でIRISを監視できるようにしています。
以下の記事もご確認頂ければと思います。
InterSystems System Alerting and Monitoring (SAM)を使ってみました!
よろしくお願いします。

Toshihiko Minamoto · 10月 26, 2020 記事へ

橋本さん、早速プロキシサーバの設定内容や証明書の作成方法など、簡潔にまとめて頂きありがとうございます!

Toshihiko Minamoto · 10月 19, 2020 記事へ

橋本さん
ご質問ありがとうございます。

nginxがプロキシサーバとして、443番ポートで受け付け、受け付けたリクエストをnode.js ( 3014ポート )と IRISコンテナ( 9091 ポート )に転送されているということでしょうか。
スマホやPCから反応がないとのことですが、nginxのアクセスログにはログが表示されてますでしょうか?
エラーログは何か表示されてないでしょうか?

Toshihiko Minamoto · 10月 9, 2020 記事へ

Henriqueさん、ありがとうございます。

シンプルで見やすいですね!
また、ユーザがそれぞれ見やすい画面を選択できるというのも良いと思いましたsmiley

Toshihiko Minamoto · 9月 17, 2020 記事へ

Henriqueさん、情報ありがとうございます。
なるほど、1つのネームスペースを追加すると、コード用のデータベースとデータ用データベースを作成したり、RESTのインタフェースを作れるのですね。
いちいちデーターベースを作成しなくても良さそうです。

Toshihiko Minamoto · 9月 7, 2020 記事へ

SAMではアプリケーションに合わせて監視項目を追加することも可能です。
まず、%SYS.Monitor.SAM.Abstractクラスを継承したクラスを作成し、PRODUCTパラメータにアプリ名、GetSensors()メソッドにてSetSensor()メソッドを使用し、メトリックを登録し、クラスをコンパイルします。試しに先日作成した温湿度計のデータを取得するようにしました。

 Class REST.Monitor Extends %SYS.Monitor.SAM.Abstract
{ 

 Parameter PRODUCT = "temperature"; 
 Method GetSensors() As %Status
 {
    set lastdate=$order(^Temp(""),-1)
    quit:lastdate="" $$$OK
    set lasttime=$order(^Temp(lastdate,""),-1,data)
    quit:lasttime="" $$$OK

    set temp=$lg(data),hum=$lg(data,2)
    set now=$horolog
    do ..SetSensor("temperature",temp)
    do ..SetSensor("humidity",hum) 
    do ..SetSensor("latency",$piece(now,",")-lastdate*86400+$piece(now,",",2)-lasttime) 
    quit $$$OK
 } 
}

ターミナルを起動し%SYSネームスペースに移動、以下のメソッドを実行します。
(第2パラメータのUSERはREST.Monitorが存在するネームスペース)

%SYS>set status = ##class(SYS.Monitor.SAM.Config).AddApplicationClass("REST.Monitor", "USER")

戻り値の変数statusが1でしたら、正常に登録できています。

登録が終わりましたら、以下のURLにアクセスし、先ほどクラスを作成したホストを選択します。
http://localhost:8080/api/sam/app/index.csp
 

画面右手中央の「View Grafana」をクリックします。

画面上部に以下のようなアイコンが表示されますので、「Add Panel」(赤枠部分)をクリックします。

以下のようにパネルが作成されますので、「Add query」をクリックします。

Queryのメトリックスを指定し、Legend欄にデータのコメントを入力します。

グラフが追加されましたら、画面上方の「Save Dashboard」(赤枠部分)をクリックします。

SAM (http://localhost:8080/api/sam/app/index.csp) にアクセスしますと、新たにパネルが追加されています。

以上です。