JupyterにPython以外のカーネルを導入する 《要Miniconda》

## Minicondaのパッケージ＋αでさらに追加

下記の記事でCloud ShellにMinicondaを導入しているものとして進めます。

https://qiita.com/Q-Lazy/items/ef61ce36b3f47ade91fd

基本的に実行ファイルがホームディレクトリ直下の`miniconda3/bin`に配備されるため、環境変数`PATH`へ追加しておかなければ、カーネル個別にフルパスでの設定が必要となります。それ以外のJupyter Labの起動パターンを例示しておきます。

- **Miniconda環境に移行してからの作業**

```shell
$ source ~/miniconda3/bin/activate

(base) $ jupyter lab &
```

- **一時的にMiniconda環境をPATHに追加して起動**

```shell
$ PATH=${HOME}/miniconda3/bin:${PATH} jupyter lab &
```

- **システム起動時にPATHに自動追加**

```shell:.bash_login
$ export PATH=${HOME}/miniconda3/bin:${PATH}
```

上記のうちのどれか、運用方法に適したものを選択して構いません。

#### まずは手軽で易しいLuaにとりかかる

それほど時間もかからないので、最初は[Lua](https://www.lua.org/)にします。
はじめにMinicondaのパッケージを利用しLua本体のインストール。

```shell
$ ~/miniconda3/bin/conda install -c conda-forge lua
```
JupyterカーネルはPythonで実装されていますので、pipで[iLua](https://github.com/guysv/ilua)（パッケージ名ilua）を導入。

```shell
$ ~/miniconda3/bin/pip install ilua
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/76e2deb7-0963-484c-a174-8139110d211e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/7488cb9d-1d15-8569-81d7-dbccad74a6d3.png)


以上でJupyterへのインストールも完了。特に問題無く出来るはずです。
`kernel.json`が`~/miniconda3/share/jupyter/kernels/lua`に配備されることが今までと違うぐらいです。

#### 次はもう少し手間のかかるErlangとElixirを

[Erlang](https://www.erlang.org/)を使うのであれば、Erlang VM(BEAM)で動作する[Elixir](https://elixir-lang.org/)もインストールしたほうが絶対に良いです。
MinicondaパッケージでElixirをインストールすれば、依存しているErlangも同時に入ります。

```shell
$ ~/miniconda3/bin/conda install -c conda-forge elixir
```

カーネルは[GitHub](https://github.com)からErlang、Elixir両対応のインストーラーをダウンロードします。とりあえずホームディレクトリ直下の`.local/bin`に設置することにします。

```shell
$ curl -L https://github.com/filmor/ierl/releases/download/v0.6.0/ierl --create-dirs -o ~/.local/bin/ierl
```

実行ファイルのパーミッションを変更してインストールを実施。ここでも`--user`オプションがポイント。

```shell
$ chmod +x ~/.local/bin/ierl
$ PATH=${HOME}/miniconda3/bin:${PATH} ~/.local/bin/ierl install erlang --user 
$ PATH=${HOME}/miniconda3/bin:${PATH} ~/.local/bin/ierl install elixir --user 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/82406e43-8400-82f6-4504-edcddaa8add8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/7bf5856b-7135-9a8e-8a4a-7969f760b67c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/f89b3c14-eb4c-d5c3-03b7-5f19686faf15.png)

#### Juliaは処理系を一括ダウンロード

Minicondaのパッケージでも[Julia](https://julialang.org/)は導入できますが、どうもカーネルをインストールして実行したところ、署名に関するエラーとなり、異常終了してしまいます。

ここは公式サイトからオールインワンの圧縮ファイルを入手してランタイムを導入し、[IJulia](https://github.com/JuliaLang/IJulia.jl)パッケージをインストールします。

ひとまずホームディレクトリ直下に圧縮ファイルを展開すれば、Julia自体はすぐに利用可能となります。

```shell
$ curl -L https://julialang-s3.julialang.org/bin/linux/x64/1.7/julia-1.7.1-linux-x86_64.tar.gz | tar xzv

$ ~/julia-1.7.1/bin/julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.7.1 (2021-12-22)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

julia> 
```

JuliaのREPLのプロンプトが表示されている状態で単に`]`キーを押下すればパッケージモードのプロンプトに変わります。

その状態で`add`コマンドでIJuliaパッケージを追加して`status`コマンドで追加されていることが確認できます。後はバックスペース押下でREPLに戻りますが、単に`ctrl + D`押下で終了してよいでしょう。

```shell
(@v1.7) pkg> add IJulia

(@v1.7) pkg> status
      Status `~/.julia/environments/v1.7/Project.toml`
  [7073ff75] IJulia v1.23.2
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/b698871b-2955-774c-c048-e8c2a70bfb21.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/a719d9e0-d351-c662-59e2-ed8d27aa4297.png)

#### 専用インストーラーによりScalaを導入

[Scala](https://www.scala-lang.org/)もMinicondaのパッケージで導入できますが、カーネル[almond](https://almond.sh/)のインストールには、[coursier](https://get-coursier.io/)というパッケージマネージャを使用します。

coursierをセットアップする段階でScalaもインストールされますし、またMinicondaと違いScala3も導入できる（カーネルは不可）ので、こちらだけで済ませます。

今回はcoursierを`~/.local/bin`にダウンロードします。

```shell
$ curl -L https://git.io/coursier-cli --create-dirs -o ~/.local/bin/coursier
```
次にパーミッションを変更してからセットアップします。どうもalmondにはバージョンを指定しないと失敗するようでした。

```shell
$ chmod +x ~/.local/bin/coursier

$ ~/.local/bin/coursier launch --fork almond:0.10.9 -- --install
```

注意点としては、パッケージ本体は`~/.cache/coursier`ディレクトリに配備されるらしく、一時ファイルだと思って削除してしまうと動作しません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/dcb713b4-c42b-6ea4-d0f8-5aecf7702d4e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/4ec787e3-a84f-f7fe-7016-da903e192540.png)

#### 最後は時間がかかるRustにチャレンジ

```shell
$ curl https://static.rust-lang.org/rustup/dist/x86_64-unknown-linux-gnu/rustup-init --create-dirs -o ~/.local/bin/rustup-init

$ chmod +x ~/.local/bin/rustup-init
```

とりあえずは最小構成でRustをインストールして、[EvCxR Jupyter Kernel](https://github.com/google/evcxr/blob/main/evcxr_jupyter/README.md)カーネル(
`cargo`パッケージ名`evcxr_jupyter`)をインストールしました。

```shell
$ ~/.local/bin/rustup-init -y --no-modify-path --profile minimal

$ ~/.cargo/bin/cargo install evcxr_jupyter

$ ~/.cargo/bin/evcxr_jupyter --install
```

パッケージのインスト―ル進行中は、コンパイルにかなり時間がかかるので、いったんその場を離れてもよいかもしれません。

Jupyterへのインストール完了後、RustのランタイムをPATHを通していない場合は`kernel.json`ファイルに修正が必要になります。

```json:kernel.json
{
  "argv": [
    "~/.cargo/bin/evcxr_jupyter",
    "--control_file",
    "{connection_file}"
  ],
  "env": {
    "PATH": "${HOME}/.cargo/bin:${PATH}"
  },
  "display_name": "Rust",
  "language": "rust",
  "interrupt_mode": "message"
}
```

`env`プロパティを追加しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/f8870cd3-7489-ea9a-c6e3-f21a765acc7c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/efdba100-2e26-5413-b49d-f2ef57e06536.png)

#### まとめ

Minicondaのパッケージは導入、管理が容易に出来る反面、構成が完全ではなく、限定的な利用で妥協することになりがちのようです。

また、一つの言語に対して、カーネルが複数の種類が提供されているものもあり、今後は目的によって使い分けするのが一般的になるのかもしれないと思います。