LC4RIの時間だ
いろいろあって、こーゆーの作って、使ってます。
ansibleカーネルは、JANOG44ハッカソンで、ビッグローブさんのチームが使ってて、個人的にansibleは、playbookで隠蔽されるのが嫌だったので、良いなーと思ったので入れてみました。まだ、使ってませんが……
sshカーネルは、ぼくの前職のNIIと富士通研究所さんの共同研究の成果物で、興味持つ人が多いので入れてみました。演習とかで使ってます。NIIで作ったwrapperカーネルと繋げれてないので、セル単位の実行ログ保存とかは出来ないのですが、python3を持ち出すと面倒な状況でターミナルっぽく使えるのは良いですね。ただ、僕が踏み抜いてバグ見つけたりしてるので、環境によっては問題あるかも知れません。誰が直すか勝負だ!
PowerShellカーネル
さて、今日は、PowerShellカーネルの話をしましょう。
NIIクラウド運用チームでは、LC4RIと呼ぶ、Jupyterを使った情報システムの構築・運用手法を実践・提唱しています。手法のコンセプトに基づき、Jupyterのプラグインも多数開発しています。
その中に、セルの実行結果に応じて、失敗なら赤に色付けするといった機能があります。Jupyterの内部では、セルの実行結果を「ok」か「error」で返せるようになっているので、それに応じて色を付け、ひと目で状況が理解できるようにしています。
で、PowerShellカーネルなんですが、セルの実行が、成功しても、失敗しても、成功しましたって色になるんですね……
コードを見てみましょう。
def do_execute(self, code, silent, store_history=True,
user_expressions=None, allow_stdin=False):
try:
if not code.strip():
return {'status': 'ok', 'execution_count': self.execution_count,
'payload': [], 'user_expressions': {}}
if not self.proxy:
self.__createProxy()
output = self.proxy.run_command(code)
message = {'name': 'stdout', 'text': output}
self.send_response(self.iopub_socket, 'stream', message)
return {'status': 'ok', 'execution_count': self.execution_count,
'payload': [], 'user_expressions': {}}
except Exception:
excInfo = sys.exc_info()
message = {
'ename': str(excInfo[0].__name__),
'evalue': str(excInfo[1]),
'traceback': [traceback.format_exc()]
}
self.send_response(self.iopub_socket, 'error', message)
message['status'] = 'error'
return message
例外発生時は「error」を返すんですが、そうでなければ無条件に「ok」を返しています。
そもそも、PowerShellでは、終了コードが環境変数渡しになっているようで、「PowerShell での終了ステータス($?、$LastExitCode) について確認してみた」を参考に試してみた結果、「\$ErrorActionPreference = “Stop”」を設定すると、コマンド実行後に「$?」を確認することで、成功失敗が判別できることを確認しました。
とゆーわけで、「\$ErrorActionPreference = “Stop”」はデフォルトじゃないので、ユーザに明示的に設定させるとして、コマンド実行後に「$?」を取ってきて、その内容に応じて「ok」「error」を返しましょうよってことで、
プルリク上げました。
まだ終わらんよ
でもね、今、リリースされてる0.1.2だと、ここのコードが違ってるし、取り敢えず、プルリク取り込まれた新しい版が出るまでは、0.1.2にパッチ当てて凌ぐ必要があるわけです。
なので、
Dockerfile内でパッチ当ててます。
さいごに
LC4RIやるにしても、小規模なJupyterHubが欲しい時も、
が超カンタンなので、みんなも使おうね。