(自分用) jupyterlabで色々な言語とC#も実行できるようにする

## 追記(2021/01/03)
.Net Interactiveが.Net Core3までしか対応していないと思い込んでいたのですが[.Net5にも対応](https://github.com/dotnet/interactive/blob/main/docs/NotebooksLocalExperience.md#installing-net-interactive-as-a-jupyter-kernel)している事を教えていただきました。
試してみたところいけてそうです。

### 変更点(Dockerfile)

```diff:
~略~

+++ # Install .NET5
+++ RUN wget -O dotnet.tar.gz https://download.visualstudio.microsoft.com/download/pr/a0487784-534a-4912-a4dd-017382083865/be16057043a8f7b6f08c902dc48dd677/dotnet-sdk-5.0.101-linux-x64.tar.gz \
+++ && wget -O dotnet_runtime.tar.gz https://download.visualstudio.microsoft.com/download/pr/6bea1cea-89e8-4bf7-9fc1-f77380443db1/0fb741b7d587cce798ebee80732196ef/aspnetcore-runtime-5.0.1-linux-x64.tar.gz \
+++ && dotnet_sha512='398d88099d765b8f5b920a3a2607c2d2d8a946786c1a3e51e73af1e663f0ee770b2b624a630b1bec1ceed43628ea8bc97963ba6c870d42bec064bde1cd1c9edb' \
    && echo "$dotnet_sha512  dotnet.tar.gz" | sha512sum -c - \
+++ && dotnet_runtime_sha512='fec655aed2e73288e84d940fd356b596e266a3e74c37d9006674c4f923fb7cde5eafe30b7dcb43251528166c02724df5856e7174f1a46fc33036b0f8db92688a' \
    && echo "$dotnet_runtime_sha512  dotnet_runtime.tar.gz" | sha512sum -c - \
    && mkdir -p "/usr/share/dotnet" \
    && mkdir -p "/usr/bin/dotnet" \
    && mkdir -p "/root/.dotnet/tools" \
    && tar zxf dotnet.tar.gz -C "/usr/share/dotnet" \
    && rm dotnet.tar.gz \
    && tar zxf dotnet_runtime.tar.gz -C "/usr/share/dotnet" \
    && rm dotnet_runtime.tar.gz \
    && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet \
    && dotnet help


+++ RUN dotnet tool install -g --add-source "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json" Microsoft.dotnet-interactive \
&&  dotnet interactive jupyter install

~略~
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168779/a3d0de79-9639-c4dc-af90-9dd7f7629d04.png)
Record型が使えました。

知りませんでしたが`#r "nuget:XXXXX"`でnugetも使えるみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168779/2dad390e-9b00-3892-1e87-20e8be37573c.png)
他にも色々できる見たいです。
詳しくは[interactiveのsamples](https://github.com/dotnet/interactive/tree/main/samples)を参照下さい。


## はじめに
ちょっと前からpythonを使うことが増えてきて、jupyterlabが使えないかなぁと思いちょくちょく調べるようになりました。
[こちらの記事](https://qiita.com/HeRo/items/61e7f45a5dbb5fd0e4a7)で他言語も動く事を知り、環境1つ用意しておけば様々な言語ををすぐに試せる事に感動して自PCに一つ作っておこうと思いました。

私はC#を使うことも多く、簡易コードを実行する度にConsoleApp1とか2...が増えていくのが嫌だったのでjupyterlabでC#が実行出来るようになると嬉しのでC#動かしたいなぁと。
ただ[14言語](https://qiita.com/HeRo/items/61e7f45a5dbb5fd0e4a7)の中にC#は入っていなかったので追加で入れてみました。

# リポジトリのクローン
まずは@HeRoさんのgithubページからリポジトリをクローンします。

```
git clone https://github.com/HeRoMo/jupyter-langs.git
```

# docker-composeの変更
docker imageはymlの中で呼ばずにDockerfileから呼ぶようにします。

```diff:  
version: "3"
services:
  jupyter:
---   image: ghcr.io/heromo/jupyter-langs:latest
+++   build:
+++     context: .
+++     dockerfile: Dockerfile
    volumes:
      - ./notebooks:/jupyter/notebooks
    ports:
      - 8050:8050 # for Dash
      - 8888:8888 # for Jupyterlab
```

# Dockerfile
Dockerfileはcloneしたものを直接書き換えるか別名で下のようなものを用意します。
`FROM ghcr.io/heromo/jupyter-langs:latest`でimageを読み込み、C#部分を追加していきます。
(ついでにjupyterlabのextensionも追加してます)

```dockerfile:
# jupyter-langs:latest
FROM ghcr.io/heromo/jupyter-langs:latest

# add jupyter extension
RUN jupyter labextension install \
            @lckr/jupyterlab_variableinspector \
            @jupyterlab/toc \
            @jupyterlab/debugger

ENV DOTNET_ROOT=/usr/share/dotnet
ENV PATH=/usr/share/dotnet:/root/.dotnet/tools:$PATH

# Install .NET Core SDK
RUN wget -O dotnet.tar.gz https://download.visualstudio.microsoft.com/download/pr/ec187f12-929e-4aa7-8abc-2f52e147af1d/56b0dbb5da1c191bff2c271fcd6e6394/dotnet-sdk-3.1.404-linux-x64.tar.gz \
    && wget -O dotnet_runtime.tar.gz https://download.visualstudio.microsoft.com/download/pr/eca743d3-030f-4b1b-bd15-3573091f1c02/f3e464abc31deb7bc2747ed6cc1a8f5c/aspnetcore-runtime-3.1.10-linux-x64.tar.gz \
    && dotnet_sha512='94d8eca3b4e2e6c36135794330ab196c621aee8392c2545a19a991222e804027f300d8efd152e9e4893c4c610d6be8eef195e30e6f6675285755df1ea49d3605' \
    && echo "$dotnet_sha512  dotnet.tar.gz" | sha512sum -c - \
    && dotnet_runtime_sha512='884ec943eefc8397537a193d48d481eae8869eb82a8149f11b8a8bbca0cd75307e82e4db04a2329f03f8a50519afa27c0caa79193fb35a9c776efe1aff2d07a0' \
    && echo "$dotnet_runtime_sha512  dotnet_runtime.tar.gz" | sha512sum -c - \
    && mkdir -p "/usr/share/dotnet" \
    && mkdir -p "/usr/bin/dotnet" \
    && mkdir -p "/root/.dotnet/tools" \
    && tar zxf dotnet.tar.gz -C "/usr/share/dotnet" \
    && rm dotnet.tar.gz \
    && tar zxf dotnet_runtime.tar.gz -C "/usr/share/dotnet" \
    && rm dotnet_runtime.tar.gz \
    && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet \
    && dotnet help

RUN dotnet tool install -g Microsoft.dotnet-interactive \
&&  dotnet interactive jupyter install

CMD ["jupyter", "lab", "--no-browser", "--ip=0.0.0.0", "--allow-root", "--notebook-dir=/jupyter/notebooks", "--config=$JUPYTER_DIR/jupyter_notebook_config.py"]
```

# 起動
ビルドして起動します。

```sh:
docker-compose up -d --build
```

# 確認
問題なく起動できていれば`http://XXX.XXX.XXX.XXX:8888/lab?`にブラウザからアクセスするとjupyterlabのページが見えます。
.net(C#)等が増えていればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168779/3e8d3ad5-9f09-8a64-2fb8-ff81096c8b4e.png)

コードが実行できるかも試してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168779/7f48211a-db01-ae9a-cbcb-ca521b64766e.png)

やりました。問題なく実行できました！
※こっちのversionですと.Net Core3.1.10になりますのでご注意下さい。
  .Net5を利用したい場合は[追記](#追記20210103)を参照ください。

# 参考URL
https://qiita.com/HeRo/items/61e7f45a5dbb5fd0e4a7
https://github.com/HeRoMo/jupyter-langs
https://github.com/JDelemar/dockerfiles/tree/master/jupyterlab-dotnet
https://edi.wang/post/2019/9/29/setup-net-core-30-runtime-and-sdk-on-raspberry-pi-4
https://aquasoftware.net/blog/?p=1379

上記URLに感謝です。