記事へ Toshihiko Minamoto · 2023年1月10日 Ohataさん、こんにちは。監視機能の中でMirroringの起動時に実行されるメソッドはないかと思います。ただ、GetSensors()メソッドはデフォルトで30秒ごとに呼ばれますので、$SYSTEM.Mirror.IsPrimary()メソッドの戻り値が0から1になった時点でメソッドを実行することは可能です。メソッドが呼ばれるタイミングは切り替わった時点よりも遅くなりますが。。。 /// 起動処理サンプル Class MonTest.Test Extends %SYS.Monitor.AbstractSensor { Property Primary As %Boolean; Method Start() As %Status { // todo: ここに処理内容を記述します do ##class(%SYS.System).WriteToConsoleLog("startup test sensor in "_$namespace) // ミラーの状態を保存 set ..Primary=$SYSTEM.Mirror.IsPrimary() Q $$$OK } Method GetSensors() As %Status { set ret=$$$OK set status=$SYSTEM.Mirror.IsPrimary() // 状態が変更されたとき if ..Primary'=status { set ..Primary=status if status { // Primaryに変更されたとき set ret=..BecomePrimary() } } Quit ret } Method BecomePrimary() As %Status { Quit $$$OK } }
記事へ Toshihiko Minamoto · 2023年1月4日 Ohataさんあけましておめでとうございます。本年もよろしくお願いします。 インスタンス起動時に実行されるメソッドですが、モニタークラスを作成し、Startメソッドに必要な処理を記載するのはいかがでしょうか? 1.プロダクションを設定されているネームスペースにて、以下のような%SYS.Monitor.AbstractSensorを継承したクラスを作成し、Start()メソッドに起動時の処理を記述します。 /// 起動処理サンプルClass MonTest.Test Extends %SYS.Monitor.AbstractSensor{ Method Start() As %Status { // todo: ここに処理内容を記述します do ##class(%SYS.System).WriteToConsoleLog("startup test sensor in "_$namespace) Q $$$OK } Method GetSensors() As %Status { Quit $$$OK }} 2.ターミナルを起動し、プロダクションを設定しているネームスペースに移動、システムモニター管理(^%SYSMONMGR)を起動します。 USER> zn "PROD" PROD> do ^%SYSMONMGR メニューにて 3 (Configure System Monitor Classes) を選択します。 さらに、1 (Configure System Monitor Components) を選択します。 2 (Add Class)を選択し、「Class?」に対してモニタークラス(この例ではMonTest.Test)を入力します。 Enterキーを何度か押し、システムモニター管理を終了します。 3.ターミナルにて%SYSネームスペースに移動し、システムモニター管理を再度起動します。 PROD> zn "%SYS" %SYS> do ^%SYSMONMGR メニューにて 3 (Configure System Monitor Classes) を選択します。 さらに、2 (Configure Startup Namespaces) を選択します。 2 (Add Namespace)を選択し、「Namespace?」に対してプロダクションを設定しているネームスペースを入力します。 Namespace? PROD 何度かEnterキーを押して、システムモニター管理を終了します。 4.IRISを再起動します。 以上で、起動時にMonTest.TestクラスのStart()メソッドが実行されるかと思います。 注意点としましてはプロダクションを起動するプロセスとは別のプロセスで実行されますので、プロダクションの自動起動は設定せずに、Startメソッドからプロダクションを起動(Ens.DirectorクラスのStartProductionメソッド)したほうが良いかと思います。
記事へ Toshihiko Minamoto · 2022年12月15日 Ohataさん、こんにちは。Ubuntu環境のPythonバージョンですが、以下のマニュアルを見ますと、パッケージマネージャーによりOSで推奨されるバージョンで良いようです。https://docs.intersystems.com/irisforhealth20221/csp/docbookj/DocBook.UI.Page.cls?KEY=AEPYTHON#AEPYTHON_prereqs インストール後、%Service_CallInサービスを有効にする必要があります。忘れると、IRIS_ACCESSDENIED(-15)というエラーが発生します。これはシステム管理ポータルの「システム管理」「セキュリティ」「サービス」をクリックし「%Service_CallIn」をクリック、「サービス有効」をチェックし「保存」ボタンをクリックします。 また、pythonを起動する前(irisライブラリをインポートする前)に以下のように環境変数を登録する必要があります。 export IRISUSERNAME = IRISにログインするユーザ名 export IRISPASSWORD = IRISユーザのパスワード export IRISNAMESPACE = 接続するネームスペース
記事へ Toshihiko Minamoto · 2022年10月26日 Ohataさん、こんにちは。②について、カラム値がNULLかどうかを判定するには、IS NULL、IS NOT NULL を使用いただく必要があります。https://zenn.dev/indigo13love/articles/b3604502149b2fただ、記載いただいた結果ですと逆になっているようですが、こちらのIRIS 2022.1で試すとIS NULL では指定したカラム値がNULLのレコードがヒットしますが、= NULLではヒットしませんでした。
記事へ Toshihiko Minamoto · 2022年8月16日 Kobataさん、こんにちは。すみません、知見があるわけではないのですが、Ubuntu 22.04はIRIS 2022.2からサポートされる予定ですので、2022.2 プレビュー版をdocker上で動作させるか、2022.2の製品版が出てからUbuntu上にインストールいただいた方が無難かと思います。ただ、2022.2はCDリリースですのでadhocを出すことができませんので、adhocが必要なケースが想定されるのであれば、Ubuntu 20.04 LTSを利用された方が良いかと思います。 よろしくお願いします。
記事へ Toshihiko Minamoto · 2022年6月17日 Ohataさんこんにちは。残念ながら、ミラーリングですと、%NOJOURNキーワードは無視されるようです。その他の方法を探してみたところ、ObjectScriptから実行することになりますが、$SYSTEM.Process.TransactionsSuspended()でトランザクションを一時停止すると、その間の更新はバックアップサーバに値は転送されますし、ロールバックしても戻らなくなりました。例 まず、JRNTEST.Testテーブルに2行追加します。 USER>s r=##class(%SQL.Statement).%ExecDirect(,"insert jrntest.test set p1=1") USER>s r=##class(%SQL.Statement).%ExecDirect(,"insert jrntest.test set p1=1") トランザクションを開始します USER>s r=##class(%SQL.Statement).%ExecDirect(,"start transaction") トランザクションを一時停止します。 TL1:USER>d $SYSTEM.Process.TransactionSuspended(1) ID=1のレコードのカラムP1の値をインクリメントします。 TL1:USER>s r=##class(%SQL.Statement).%ExecDirect(,"update jrntest.test set p1=p1+1 where id=1") トランザクションを再開します TL1:USER>d $SYSTEM.Process.TransactionSuspended(0) ID=2のレコードのカラムP1の値をインクリメントします。 TL1:USER>s r=##class(%SQL.Statement).%ExecDirect(,"update jrntest.test set p1=p1+1 where id=2") 現在値を確認します。 TL1:USER>do ##class(%SQL.Statement).%ExecDirect(,"select * from jrntest.test").%Display() ID p1 1 2 2 2 2 Row(2) Affected ロールバックします TL1:USER>s r=##class(%SQL.Statement).%ExecDirect(,"rollback") 現在値を確認します。 USER>do ##class(%SQL.Statement).%ExecDirect(,"select * from jrntest.test").%Display() ID p1 1 2 2 1 2 Row(s) Affected よろしくお願いします。
記事へ Toshihiko Minamoto · 2022年5月29日 Ohataさん、こんにちは。 既に解決されているかもしれませんが、記述されていた通り、スタンドアロン環境ではパッケージをインストールできませんので、以下の手順でインストールする必要があるかと思います。 1. インターネット環境にて必要なパッケージ(.gzファイル)をダウンロードする irispip download -d c:\intersystems\iris\mgr\python --no-binary :all: <パッケージ名> c:\InterSystems\IRIS\mgr\pyhtonフォルダにパッケージ(tar.gz形式)のファイルが作成されます。 2. スタンドアロン環境にパッケージをコピー 3. スタンドアロン環境にてパッケージをインストール irispip install c:\intersystems\iris\mgr\python\<パッケージファイル名> 以下のサイトを参考にしました。 https://qiita.com/analytics-hiro/items/2565adbb2c900e6738cd
記事へ Toshihiko Minamoto · 2022年3月8日 Ohataさんこんにちは。もしかすると、自己解決されているかもしれませんが、ビジネスサービスの「設定」タブの「追加の設定」にあるスケジュールに、作成されたスケジュール仕様を選択すれば、その時間帯だけ稼働するかと思います。
記事へ Toshihiko Minamoto · 2022年3月2日 Hiroseさん こんにちは。 Ohataさんが紹介されている記事にあるDjango-irisを使ってDjangoからIRISのDBを使うことができました。(Pythonコンテスト1位でしたね!) 手順はこんな感じです。 1. IRISインストール 記事の中にあるように、IRIS 2022.1のプレビュー版が必要ですので、ダウンロードし、インストールします。 2. Pythonインストール Python 3.10.2 amd64をインストールしました。インストール時に add Python 3.10 to Pathをチェックしてインストールしています。 3. Djangoインストール コマンドプロンプトより、python -m pip install Django 4. Django-irisのダウンロード https://openexchange.intersystems.com/package/django-iris よりdjango-iris-0.1.x.zipをダウンロードし、c:\に展開 5. Python DB-APIのインストール コマンドプロンプトで4で展開されたディレクトリに移動し、whlファイルをインストールします。 pip3 install intersystems_irispython-3.2.0-py3-none-any.whl 6. Django-irisのインストール コマンドプロンプトより、以下のコマンドでインストールします。 pip install django-iris 7. Djangoアプリの作成 Djangoの公式ページにあるチュートリアルに従ってアプリを作ってみました。 https://docs.djangoproject.com/ja/4.0/intro/tutorial01/ ただし、Databaseの設定部分で設定ファイル(settings.py)のDATABASESの部分を以下のように修正しています。 DATABASES = { 'default': { 'ENGINE': 'django_iris', 'NAME': 'USER', 'HOST': 'localhost', 'PORT': 1972, 'USER': '_SYSTEM', 'PASSWORD': 'password', } }
記事へ Toshihiko Minamoto · 2022年2月15日 Hashimotoさんこんにちは。IRISスタジオだと「他の表示」で表示されたINTコード上で、エラーの行にカーソルを持っていき、再度「他の表示」をクリックすると対応するソースコードに移るのでなんらかの方法はあるかと思い、調べてみました。(%SYS.MONLBLで... )Internalクラスなので、インターシステムズのサポートは無く、将来的に変わる可能性はありますが、以下の方法で求められそうです。 まず以下のメソッドでエラーのロケーション形式( label+offset^routine )から、INTルーチンの先頭からのoffsetを求めます。 set sc=##class(%Studio.Debugger).INTLine("ClassName.1.INT","zNewMethod",32,.intname,.intline) で、sc=1の場合、intnameにはINTルーチン名、intlineには先頭からのオフセットが入ります。 次に、以下のメソッドでソースコードのロケーションを求めます。 set sc=##class(%Studio.Debugger).SourceLine(intname,intline,1,99999,1,"USER",.map) sc=1の場合、変数mapは以下の形式で返ります。 map("CLS",1)=$lb(クラス名,メソッド名,メソッドからの行数,1,ネームスペース) ちなみに、SourceLine()メソッドの第2~5引数は startLine, startPos, endLine, endPos となっており、どうもエディタ上で選択した範囲を入力すると、それに対応するソースコードの範囲を計算してくれるようです。 その場合、変数mapはこんな感じになります。 map("CLS",1)=$lb(クラス名,StartLineのメソッド名,StartLineのメソッドからの行数,startPos,ネームスペース) map("CLS",2)=$lb(クラス名,EndLineのメソッド名,EndLineのメソッドからの行数,endPos,ネームスペース)