この記事の前提条件
誰でも無料で利用できる、カスタマイズ可能なJupyterであれば、自分が推している言語でカーネルを導入しない手は無いと思い、色々チャレンジしてみました。
ここでは以前投稿した下記の環境で話を進めていきます。
すでに利用可能な処理系のカーネルを導入
まずは、言語本体はすでに利用可能な状態で、カーネルさえインストールすればよいパターンから着手してみたいと思います。
【Bashカーネル編】
手始めに容易に導入出来るBashから行います。こちらカーネルはPython3で実装されているので、pipコマンドでモジュールをインストール出来ます。
Jupyterへのカーネルのインストールも、Pythonモジュールの関数を実行するだけです。
$ pip3 install --user bash_kernel
$ python3 -m bash_kernel.install
後はページをリロードすればBashカーネルがLauncherに追加されます。
【JavaScriptカーネル編】
こちらはnode.jsのパッケージで提供されているIJavascriptをyarnコマンドでインストールします。
専用のフォルダにインストールすることもできますが、ホームディレクトリにインストールする方法が簡単です。
カレントディレクトリがホームディレクトリであることとして、下記のコマンドを実行します。
$ yarn add ijavascript
少し時間がかかりますが、ホームディレクトリ直下のnode_modules
ディレクトリにインストールが完了します。
次はJupyterへのインストールは専用のコマンドが設けられています。仮に~/node_modules/.bin
が環境変数PATH
に追加されていなければ、フルパスか、npx
コマンドで実行しなければなりません。
$ npx ijsinstall
$ ~/node_modules/.bin/ijsinstall
同じく、インストール後の設定ファイルも、PATH
の設定によっては修正が必要です。
ホームディレクトリ直下の~/.local/share/jupyter/kernels/javascript
というフォルダにkernel.json
という設定ファイルが作成されています。
もし実行ファイルijskernel
にPATH
が通っていないのであればこれをフルパスに書き直さなければなりません。
ホームディレクトリにインストールした場合はnpx
を挿入することでも解決します。
npx
コマンドを追記する例を下記に示します。なお読みやすいようにコードを整形しています。
{
"argv":[
"npx",
"ijskernel",
"--hide-undefined",
"{connection_file}",
"--protocol=5.1"
],
"display_name": "Javascript (Node.js)",
"language": "javascript",
"interrupt_mode": "message"
}
ここまででページをリロードするとJavaScriptカーネルが起動可能となっています。
【Typescriptカーネル編】
今やWeb開発において最もスタンダードな言語であるTypescriptにもカーネルが提供されています。node.jsで開発するなら、Typescriptは確実に必要になるはずなので、ぜひ導入しましょう。
こちらもnode.jsのパッケージなので、ほぼ同じ手順です。
$ yarn add itypescript
$ PATH=${HOME}/.local/bin:${PATH} npx its --install=local
【Goカーネル編】
GoもCloudShellには組み込み済みなので、少ないステップでカーネルを利用開始できます。Goで実装されており、Goのパッケージ管理機能でインストールします。
今回は専用のディレクトリを作成してからインストール作業を進めた後、不要になったディレクトリのクリーンアップも実施しておきます。
まず下記のコードでパッケージのインストールを行います。
$ GOPATH=~/gophernotes GOBIN=~/go/bin GO111MODULE=on go install -x github.com/gopherdata/gophernotes@latest
インストール時に大量のログが出力されるのが煩わしければ-x
オプションは省略できます。ビルドした実行ファイルgophernotes
はホームディレクトリ直下のgo/bin
ディレクトリに配備されるので、残しておきます。
引き続きJupyterへのインストールですが、特にインストーラーは提供されていないので、手作業です。
$ mkdir -v ~/.local/share/jupyter/kernels/gophernotes
$ cp ~/go/pkg/mod/github.com/gopherdata/gophernotes@v0.7.4/kernel/* ~/.local/share/jupyter/kernels/gophernotes/
$ chmod u+w ~/.local/share/jupyter/kernels/gophernotes/kernel.json
$ GOPATH=~/gophernotes go clean -x -modcache -cache; rm -rfv ~/gophernotes
後は~/go/bin
がPATH
に含まれていなければ、やはりkernel.json
の修正が必要です。~/.local/share/jupyter/kernels/gophernotes
ディレクトリに配備されます。
{
"argv": [
"gophernotes",
"{connection_file}"
],
"env": {
"PATH": "${PATH}:${HOME}/go/bin"
},
"display_name": "Go",
"language": "go",
"name": "go"
}
env
プロパティで環境変数を設定しています。ページをリロードしましょう。
【Javaカーネル編】
おなじみのJavaです。Jupyterでカーネルを利用するにはバージョン9以降が必要ですが、Cloud Shellではバージョン8と11が利用可能なので、大丈夫です。
カーネル本体はJavaで実装されたjarファイルになっています。
$ /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-8u252-b09-1~deb9u1-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
$ /usr/lib/jvm/java-11-openjdk-amd64/bin/java -version
openjdk version "11.0.13" 2021-10-19
OpenJDK Runtime Environment (build 11.0.13+8-post-Debian-1deb10u1)
OpenJDK 64-Bit Server VM (build 11.0.13+8-post-Debian-1deb10u1, mixed mode, sharing)
では作業用にディレクトリを作成してダウンロードから実施します。
$ mkdir -pv ~/IJava; cd ~/IJava
$ curl -L https://github.com/SpencerPark/IJava/releases/download/v1.3.0/ijava-1.3.0.zip | jar xv
インストーラーはPythonスクリプトです。いくつかオプションがありますが、カーネルの応答待ち時間の上限が、既定で3秒なのがちょっと短すぎると感じたので、ここでは10秒に延長しました。
$ python ./install.py --user --timeout 10000
$ rm -rfv ~/IJava
インストールが終わったら、不要になった作業用ディレクトリは、一括削除で構いません。
これで自動的に生成されるkenel.json
をそのまま使う場合はバージョン11のほうを既定のJavaに設定しなければなりません。次のコマンドを実行しておきます。
$ sudo update-java-alternatives --set java-1.11.0-openjdk-amd64
update-alternatives: エラー: mozilla-javaplugin.so の alternatives がありません
エラーが出ますが問題ありません。必要であれば、これを.bash_login
などに追記しておきます。
自分でkernel.json
を作成して対処することもできます。別のアカウントでも共用できるよう自作したものを掲載しておきます。
{
"argv": [
"/usr/lib/jvm/java-11-openjdk-amd64/bin/java",
"-jar",
"~/.local/share/jupyter/kernels/java/ijava-1.3.0.jar",
"{connection_file}"
],
"env": {
"IJAVA_TIMEOUT": "10000"
},
"display_name": "Java",
"language": "java",
"interrupt_mode": "message"
}
終わりに
今回は比較的導入作業が容易なものを解説してみました。今後、もう少しハードルが高い言語もやってみたいと思っています。