記事
· 2022年7月26日 5m read

Jupyter Notebooks に ObjectScript を追加する方法

ObjectScript カーネルのロゴ Jupyter Notebook は、多数の異なるマークアップ言語とプログラミング言語でコードを実行できるセルで構成された対話型環境です。

Jupyter はこれを実現するために適切なカーネルに接続しなければなりませんが、 ObjectScript カーネルがなかったため、それを作成することにしました。

こちらから試すことができます。

結果を少し覗いてみましょう。

代替テキスト

Jupyter カーネルの基礎

Jupyter カーネルはいくつかの方法で作成できます。 ここでは、Python ラッパーカーネルを作成することにしましょう。

ipykernel.kernelbase.Kernel のサブクラスを作成して、特定の言語で実行されるコードを受け取る do_execute メソッドを実装する必要があります。

つまり、ある ObjectScript コードを取得して、何らかの方法で実行し、ノートブックにその結果を返すという概念です。

でも、実際にはどうすればよいのでしょうか。 では、その方法をさらに噛み砕いて説明しましょう。

ObjectScript コードを IRIS に送る

まず初めに、コードを IRIS に送る必要があります。 ここで使用するのが、Python 用の IRIS Native API です。

ここでは、irisnative パッケージをインポートして、接続を確立するだけです。

def get_iris_object():
  # InterSystems IRIS への接続を作成する
  connection = irisnative.createConnection('iris', 51773, 'IRISAPP', '_SYSTEM', 'SYS')

  # iris オブジェクトを作成する
  return irisnative.createIris(connection)

その後で、この接続を使用して、IRIS データベースに格納されているクラスを呼び出すことができます。

def execute_code(self, code):
        class_name = "JupyterKernel.CodeExecutor"
        return self.iris.classMethodValue(class_name, "CodeResult", code)

CodeExecutor クラスと CodeResult メソッドは何に使用されているのでしょうか。

ではそれを見てみましょう。

ObjectScript コードを実行する

このクラスの目的は、1 行の ObjectScript コードを実行して、実行の結果を含む JSON オブジェクトを返すことです。 コードを CodeResultvstrCommand 変数に渡します。

まず、IO を現在のルーチンにリダイレクトします。その後、渡されたコードを XECUTE コマンドで実行し、IO を元の場所にリダイレクトして、結果を返します。

Include %sySystem

Class JupyterKernel.CodeExecutor
{

ClassMethod CodeResult(vstrCommand As %String) As %String [ ProcedureBlock = 0 ]
{
        set tOldIORedirected = ##class(%Device).ReDirectIO()
        set tOldMnemonic = ##class(%Device).GetMnemonicRoutine()
        set tOldIO = $io
        try {
            set str=""
            set status = 1
            //IO を現在のルーチンにリダイレクトする。以下に定義するラベルを利用します
            use $io::("^"_$ZNAME)

            //リダイレクトを有効にする
            do ##class(%Device).ReDirectIO(1)

            XECUTE (vstrCommand)

        } catch ex {
            set str = ex.DisplayString()
            set status = 0
        }

        //元のリダイレクト/ニーモニックルーチン設定に戻す
        if (tOldMnemonic '= "") {
            use tOldIO::("^"_tOldMnemonic)
        } else {
            use tOldIO
        }
        do ##class(%Device).ReDirectIO(tOldIORedirected)

        quit {"status":(status), "out":(str)}.%ToJSON()

rchr(c)
    quit
rstr(sz,to)
    quit
wchr(s)
    do output($char(s))
    quit
wff()
    do output($char(12))
    quit
wnl()
    do output($char(13,10))
    quit
wstr(s)
    do output(s)
    quit
wtab(s)
    do output($char(9))
    quit
output(s)
    set str = str _ s
    quit
}

}

結果を表示する

ObjectScript コードを実行しましたが、次はどうすればよいでしょうか。 その結果を表示する必要があります。

例外がなければ、行単位で結果を表示するだけで済みます。

が、渡されたコードで例外が発生したのであれば、実行を停止し、失敗した行番号、行そのもの、そして発生した例外を表示しなければなりません。

代替テキスト

アプリを起動する

このカーネルを自分で試してみましょう。以下のようにして試すことができます。

前提条件

gitDocker がインストール済みであることを確認してください。

リポジトリを、以下のようにローカルディレクトリに Clone/git pull します。

$ git clone https://github.com/Vekkby/objectsriptkernel.git

このディレクトリでターミナルを開き、以下を実行します。

$ docker-compose up -d --build

操作方法

ブラウザから以下を使用してノートブックサーバーにアクセスできます。

localhost:8888

'work' ディレクトリ内に 'hello.ipynb' というサンプルノートブックがあります。 代替テキスト

投票をお願いします

このアプリは、IRIS Native API コンテストに参加しています。 こちら からこのアプリに投票してください。

ディスカッション (0)2
続けるにはログインするか新規登録を行ってください