動作する Jupyter カーネルの一覧

自分用。
各言語の安定して動作する Jupyter カーネルの一覧。安定性は時々刻々と変化するので、その都度更新する。
色々な言語のメモ書きやプレイグラウンドの環境として役に立つ。
ここに載っていないものはカーネルとして動作しないものや、単に自分が興味のない言語だったりする。

| 言語 | カーネル |
|:--:|:--|
| Python | [IPyKernel](https://github.com/ipython/ipykernel) |
| Julia | [IJulia](https://github.com/JuliaLang/IJulia.jl) |
| R | [IRKernel](https://github.com/IRkernel/IRkernel) |
| Ruby | [IRuby](https://github.com/SciRuby/iruby) |
| PHP | [Jupyter-PHP](https://github.com/Litipk/Jupyter-PHP) |
| JavaScript | [tslab](https://github.com/yunabe/tslab)<br>[IJavaScript](https://github.com/n-riesco/ijavascript) |
| TypeScript | [tslab](https://github.com/yunabe/tslab) |
| Go | [Gophernotes](https://github.com/gopherdata/gophernotes) |
| Rust | [EvCxR Kernel](https://github.com/google/evcxr/tree/master/evcxr_jupyter) |
| Java | [BeakerX](http://beakerx.com/) <br> [IJava](https://github.com/SpencerPark/IJava) |
| Kotlin | [jupyter-kotlin](https://github.com/Kotlin/kotlin-jupyter) |
| Scala | [almond](https://github.com/almond-sh/almond) <br> [BeakerX](http://beakerx.com/) |
| Groovy | [BeakerX](http://beakerx.com/) |
| C++ | [ROOT](https://github.com/root-project/root/tree/master/bindings/jupyroot) |
| C# | [.NET Interactive](https://github.com/dotnet/interactive/) |
| F# | [.NET Interactive](https://github.com/dotnet/interactive/) |
| Raku | [Jupyter-Perl6](https://github.com/bduggan/p6-jupyter-kernel) |
| Perl | [IPerl](https://metacpan.org/release/Devel-IPerl) |
| Bash | [Bash](https://github.com/takluyver/bash_kernel) |
| Zsh | [Z shell](https://github.com/danylo-dubinin/zsh-jupyter-kernel) |
| PowerShell | [.NET Interactive](https://github.com/dotnet/interactive/)<br>[PowerShell](https://github.com/vors/jupyter-powershell) |
| Wolfram Language | [Wolfram Language for Jupyter](https://github.com/WolframResearch/WolframLanguageForJupyter) |
| Gnuplot | [Gnuplot](https://github.com/has2k1/gnuplot_kernel) |
| Lua | [ILua](https://github.com/guysv/ilua) |

* C++ のカーネルとしては cling と xeus-cling もあるが、前者に対しては cling のバージョンアップで突然消えた (あった頃から不安定だった) し、後者のセットアップには miniconda が事実上必須。 miniconda の代わりに Anaconda を使うとうまく動作しない。 (余計なパッケージが多いから?) ROOT の方が間違えなく使えそう。
* BeakerX は JVM 言語に対応したカーネルであるが、 Scala, Groovy はあまり動作が安定してない。 Kotlin はエラーで動作しなかったので非掲載。

<br>

## インストール手順
それぞれのカーネルのリポジトリの説明通りにやれば大抵はセットアップができるのだが、一部のカーネルはうまくいかないので自分がうまくいった方法をまとめた。  
ここで記述しているのは macOS の場合である。 Homebrew がインストールされ、 Jupyter もインストールされている前提で説明する。
基本的に pip を使用し、 Anaconda を使う方法はここでは紹介しない。

<br>

### IPyKernel

* カーネルのインストール

```sh
python3 -m pip install -q ipykernel
```

* カーネルの追加

```sh
python3 -m ipykernel install --user --name=python
```

<br>

### IJulia

* 環境のインストール

```sh
brew install julia
# cask 版より formula 版の方が個人的には使いやすかった
```

* カーネルのインストール

```sh
julia -E '''
	import Pkg
	Pkg.add("IJulia")
'''
```

* カーネルの追加

```sh
julia -E '''
	import Pkg
	ENV["JUPYTER"]="/usr/local/bin/jupyter"
	Pkg.build("IJulia")
'''
```

<br>

### IRKernel

* 環境のインストール

```sh
brew install r
```

* カーネルのインストール

```sh
R -q -e """
	install.packages('IRkernel',repos='https://cran.ism.ac.jp/')
"""
```

* カーネルの追加

```sh
R -q -e """
	IRkernel::installspec()
"""
```

<br>

### IRuby

* 環境のインストール

```sh
brew install ruby

# gem のパスは通しておく
source PATH="$PATH:/usr/local/lib/ruby/gems/3.0.0/bin"
```

* カーネルのインストール

```sh
gem install ffi-rzmq
gem install iruby --pre
```

* カーネルの追加

```sh
iruby register --force
```

<br>

### Jupyter-PHP

* 環境のインストール

```sh
brew install php
```

* `php-zmq` のインストール (既にインストールしていればこの手順は不要)

```sh
phpIni=`php --ini | grep -oE "\/.+\/php.ini"`
(
	git clone https://github.com/mkoppanen/php-zmq.git && \
	cd php-zmq && \
	phpize && \
	./configure && \
	make && \
	make install && \
	echo "extension=zmq.so" >> $phpIni
)
rm -rf php-zmq
```

* カーネルの追加
	- composer 2.x 以降を使うとエラーになるので (Jupyter-PHP自体の構成の不備で) composer 1.x をダウンロードしてきて使用する
	- `$PATH` に色々な場所が含まれているとうまくいかなかったので、一時的に `$PATH` を必要最小限にする
	- カーネルの構成後、 `pkgs` ディレクトリの挙動が謎なので適当に直す

```sh
(
	PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin" && \
	mkdir Jupyter-PHP && \
	cd Jupyter-PHP && \
	nscurl -L -o installer.phar "https://litipk.github.io/Jupyter-PHP-Installer/dist/jupyter-php-installer.phar" && \
	nscurl -L -o composer.phar "https://getcomposer.org/composer-1.phar" && \
	php installer.phar install -vvv ~/Library/Jupyter/kernels composer.phar && \
	cd ~/Library && \
	rm -rf jupyter-php/pkgs && \
	mv Jupyter/kernels/jupyter-php/pkgs jupyter-php/pkgs && \
	rm -rf Jupyter-PHP
)
```

<br>

### tslab

* 環境のインストール

```sh
brew install node
npm install -g typescript ts-node
```

* カーネルのインストール

```sh
npm install -g tslab
```

* カーネルの追加

```sh
tslab install --python=/usr/local/bin/python3
```

<br>

### Ijavascript

* 環境のインストール

```sh
brew install node
```

* カーネルのインストール

```sh
npm install -g ijavascript
```

* カーネルの追加

```sh
ijsinstall
```

<br>

### Gophernotes

* 環境のインストール

```sh
brew install go
```

* カーネルのインストール

```sh
# インストール場所
gopath=`go env GOPATH`
gopherdata="$gopath/pkg/mod/github.com/gopherdata"

# 既存のインストールを削除
if [ -d "$gopherdata" ]; then
	find "$gopherdata" -name "gophernotes*" -depth 1 -exec sudo rm -rf "{}" \;
fi

GO11MODULE=on go get github.com/gopherdata/gophernotes
```

* カーネルの追加

```sh
gopath=`go env GOPATH`
gopherdata="$gopath/pkg/mod/github.com/gopherdata"

gophernotes=`find "$gopherdata" -name "gophernotes*" -depth 1` && \
mkdir ~/Library/Jupyter/kernels/go && \
cd ~/Library/Jupyter/kernels/go && \
cp "$gophernotes/kernel/kernel.json.in" kernel.json && \
chmod +w kernel.json && \
cat kernel.json | sed -e "s|gophernotes|$gopath/bin/gophernotes|g" > kernel.json
```

<br>

### BeakerX

* 環境のインストール

```sh
# 既に別の JDK をインストールしているのであればこの手順は不要
brew install openjdk
sudo ln -s /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/brew-openjdk.jdk
```

* カーネルのインストール

```sh
# 公式には Anaconda を使う方法が提示されているが、 pip でも構成できる。

python3 -m pip install beakerx-kernel-java beakerx-kernel-scala beakerx-kernel-groovy
```

* カーネルの追加

```sh
sp=`python -c """
	import site
	print (site.getsitepackages()[0],end='')
"""`

ll=(java scala groovy)
for [ $lang in "${ll[@]}" ]; do
	jupyter kernelspec install "$sp/beakerx_$lang/kernel" --user --name=$lang
	k="$HOME/Library/Jupyter/kernels/$lang"
	cat "$k/kernel.json" | sed "s/\$PATH/\"$k\"/" > "$k/kernel.json"
done
```

<br>

### IJava

* 環境のインストール

```sh
# 既に別の JDK をインストールしているのであればこの手順は不要
brew install openjdk
sudo ln -s /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/brew-openjdk.jdk
```

* カーネルの追加

```sh
# 最新バージョンを取得
version=`curl -Ls -o /dev/null -w %{url_effective} "https://github.com/SpencerPark/IJava/releases/latest" | grep -oE "[0-9\.]+$"`

mkdir IJava && \
cd IJava && \
nscurl -L "https://github.com/SpencerPark/IJava/releases/download/v#{version}/ijava-$version.zip" | tar xf - && \
python3 installer.py --user
cd ../ && rm -rf IJava
```

<br>

### jupyter-kotlin

* 環境のインストール

```sh
# 既に別の JDK をインストールしているのであればこの手順は不要
brew install openjdk kotlin
sudo ln -s /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/brew-openjdk.jdk
```

* カーネルのインストール

```sh
python3 -m pip install kotlin-jupyter-kernel
```

* カーネルの追加

```sh
# カーネルをインストールした時点で自動的に追加されるっぽいが、不安定で手動で追加するのが難しそうなので、ここでは手動でカーネルを作るコマンドを説明する

mkdir ~/Library/Jupyter/kernels/kotlin
printf '''
	{
		"display_name":"Kotlin",
		"language":"kotlin",
		"interrupt_mode":"message",
		"argv":["python3","-m","run_kotlin_kernel","{connection_file}"],
		"metadata":{
			"jar_path_detect_command":["python3","-m","kotlin_kernel","detect-jars-location"]
		}
	}
''' > ~/Library/Jupyter/kernels/kotlin/kernel.json
```

<br>

### almond

* 環境のインストール

```sh
# 既に別の JDK をインストールしているのであればこの手順は不要
brew install openjdk scala
sudo ln -s /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/brew-openjdk.jdk
```

* カーネルの追加

```sh
nscurl -L -o coursier "https://git.io/coursier-cli"
chmod +x coursier
./coursier launch -M almond.ScalaKernel --fork almond -- --install
rm -f coursier
```

<br>

### ExCvR Kernel

* 環境のインストール

```sh
# 単体の rust ではなく、 rustup を使用する。混乱を引き起こす可能性があるので rust をインストールしているのであればアンインストールしておくべき。

brew install rustup-init

# rustup のパスを通しておく
source PATH="$PATH:$HOME/.cargo/bin"
```

* カーネルのインストール

```sh
cargo install evcxr_jupyter
```

* カーネルの追加

```sh
evcxr_jupyter --install
```

<br>

### ROOT

* 環境のインストール

```sh
brew install root
```

* カーネルの追加

```sh
kernel="/usr/local/opt/root/etc/root/notebook/kernels/root"

jupyter kernelspec install --user "$kernel"
```

<br>

### .Net Interactive

* 環境のインストール

```sh
brew install dotnet
```

* カーネルのインストール

```sh
dotnet tool install -g --add-source "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json" Microsoft.dotnet-interactive
```

* カーネルの追加

```sh
dotnet interactive jupyter install
```

<br>

### IPerl6

* 環境のインストール

```sh
brew install rakudo-star
```

* カーネルのインストール

```sh
zef install Jupyter::Kernel
```

* カーネルの追加

```sh
jkr="/usr/local/opt/rakudo-star/share/perl6/site/bin/jupyter-kernel.raku"

"$jkr" --generate-config --location="$HOME/Library/Jupyter/kernels/raku"
```

<br>

### IPerl

* 環境のインストール

```sh
brew install perl cpanm
```

* カーネルのインストール

```sh
cpanm --build-args OTHERLDFLAGS= ZMQ::LibZMQ3 && \
cpanm Markdown::Pod --force && \
cpanm Devel::IPerl && \
rm -rf ~/.cpanm
# Markdown::Pod はインストール後の自動テストのステップが常に失敗する。失敗してもインストールを続けるために --force オプションを付加する。
```

* カーネルの追加

```sh
/usr/local/opt/perl/bin/iperl --version
# iperl コマンドを実行したときにカーネルがないことを検知してインストールしてくれる。だからバージョン確認とかが穏当だろう。
```

<br>

### Bash

* 環境のインストール

```sh
brew install bash
```

* カーネルのインストール

```sh
python3 -m pip install -q bash_kernel
```

* カーネルの追加

```sh
python3 -m bash_kernel.install --user
```

<br>

### Z shell

* 環境のインストール

```sh
brew install zsh
```

* カーネルのインストール

```sh
python3 -m pip install -q zsh_jupyter_kernel
```

* カーネルの追加

```sh
python3 -m zsh_jupyter_kernel.install --user
```

<br>

### Wolfram Language for Jupyter

* 環境のインストール <br>
コマンド wolframscript が使えるように設定。例えば [Wolfram Engine for Developers](https://www.wolfram.com/engine/) とかをインストールすれば使える。
macOS であれば `/Applications/Wolfram Engine.app/Contents/Resources/Wolfram Player.app/Contents/MacOS` にパスを通しておく。 <br>
何故か Visual Studio Code でこのカーネルのノートブックを開くと Wolfram Engine のアクティベーションに失敗するようになる。
* カーネルのインストール

```sh
cd ~/Library
git clone "https://github.com/WolframResearch/WolframLanguageForJupyter.git"
```

* カーネルの追加

```sh
cd ~/Library/WolframLanguageForJupyter
./configure-jupyter.wls add
```

<br>

### Gnuplot

* 環境のインストール

```sh
brew install gnuplot
```

* カーネルのインストール

```sh
python3 -m pip install -q gnuplot_kernel
```

* カーネルの追加

```sh
python3 -m gnuplot_kernel install --user
```

<br>

### ILua

* 環境のインストール

```sh
brew install lua
```

* カーネルのインストール

```sh
python3 -m pip install -q --user ilua
```