.NET Jupyter Notebook の実行環境を WinPython 上に構築する


# はじめに

この記事では

- [.NET interactive](https://github.com/dotnet/interactive) を使用可能な Jupyter Notebook 環境を
- Windows で
- WinPython を使用して構築する

手順をご紹介いたします。

docker使う場合は公式にガイドがあるのでそちらを
→ https://github.com/dotnet/interactive/tree/master/samples/docker-image

## .NET interactive とは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328319/4f38be95-fb66-ce19-9051-f2f365210e34.png)

Jupyter Notebook上で、.NET Coreを使用できる機能です。
これを導入することで、Jupyter Notebook上でPythonを使うように、
C#やF#、PowerShellを使用することが可能になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328319/5f762c0e-8cd5-e887-7f26-7f59e9a57edd.png)


## WinPython ？

[WinPython](https://winpython.github.io/)ってあまり馴染みの無い単語かもしれませんが、
私が好きなWindows用のPythonディストリビューションです。

```
The easiest way to run Python, Spyder with SciPy and friends out of the box 
on any Windows PC, without installing anything!
```

とあるように、展開するだけでPython環境が使えるようになる素敵なディストリビューションです。

なお、以前までは展開にあたり謎のシステム管理者権限を要求されていたんですが、
7zipの自己解凍形式に変更になり、そこらへんも要求されない、よりクリアな形態になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328319/dd8eefcc-6ed1-4c71-04c5-b97e3f34ef74.png)

最近では ワンクリックで Jupyter Notebook のサーバーが立ち上がったり、
WinPython にPATHが通った状態で vscode を立ち上げられたりかなり使いやすいです。

消したくなったらフォルダごと削除すればいいだけなので、試行錯誤にはもってこいです。
（コンテナを使え、と思わないこともない）


# 導入手順

ではやっていきます。
実施環境： Windows 10 64bit, WinPython 3.8.1.0

## dotnet SDK の導入

https://dotnet.microsoft.com/download

Microsoftから .NET SDK 3.1 をインストールします。
インストールすることで、`dotnet` コマンドが使用可能になります。

## dotnet interactive の導入

.NET SDKの導入が終わったら、コマンドプロンプトから下記コマンドを実行します。

```cmd
dotnet tool install -g --add-source "https://dotnet.myget.org/F/dotnet-try/api/v3/index.json" Microsoft.dotnet-interactive
```

実行することで、`dotnet interactive` サブコマンドが使用できるようになります。
（`C:\Users\<user_name>\.dotnet\tools`にPATHを通す必要があるかもしれません）

下記のような出力がなされます

```text
次のコマンドを使用してツールを呼び出せます。dotnet-interactive
ツール 'microsoft.dotnet-interactive' (バージョン '1.0.126201') が正常にインストールされました。
```

## kernels の導入

WinPython Command Promptを実行し、
（WinPython Command Prompt とは、WinPythonのPATHが通った状態のコマンドプロンプトです）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328319/35b27d28-0474-1f5a-c03f-85ab860efad8.png)

下記コマンドを実行します。

```cmd
dotnet interactive jupyter install
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328319/2b2c8291-e59b-8949-432f-844aaf3294db.png)

スクリーンショットからもわかるように、`jupyter kernelspec list` や エクスプローラからもカーネルの設定ファイルがあることがわかると思います。

- .net-scharp
- .net-fsharp
- .net-powershell

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328319/44829ef5-199b-495a-2a63-3a2fcf262996.png)

（私はWinPython環境にJuliaも入れてるので余計なカーネルがあります）

# 試してみる

カーネルが追加されたことが確認できたら、
Jupyter Notebook（Jupyter Lab）を起動して試してみます。

## jupyter lab の起動

「.exe」をクリックするだけです。簡単ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328319/83e5c0fb-6da5-b424-71b8-892beb1e383d.png)

起動すると、Launcherに Pythonや Octave以外の Notebook作成メニューが表示されていると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328319/a8dc31f8-a519-5094-9447-9678178a645f.png)

## .NET(C#) をオタメシ

サンプルなどは公式のリポジトリにあるので、最初はこちらを試すのがいいです。

https://github.com/dotnet/interactive/tree/master/samples/notebooks/csharp

### Displayあれこれ

Notebookの威力を知るには「Displaying output.ipynb」を試すのが簡単です。

https://github.com/dotnet/interactive/blob/master/samples/notebooks/csharp/Docs/Displaying%20output.ipynb

#### display

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328319/67e5e567-5cea-d559-db2b-966cb0fea44a.png)

いいぞ。ちなみにPythonで書くとこんな感じでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328319/8ec5dddf-a711-034a-29a2-be24281a4d9a.png)

#### Console.Write

Console.WriteLineとかを使うとPythonの `print` みたいなのができますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328319/d6fd917e-4ddf-a127-1cb0-b64af9c8d5ce.png)

#### display.Update

displayで表示した内容は `Update` で更新かけることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328319/8bcb40d3-caa1-eb65-16b1-5a0bda01cb07.png)

↓　一秒後

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328319/0714b62d-48b0-c332-dbac-8a11cea59c92.png)

これは `Microsoft.DotNet.Interactive.Events.DisplayedValue` 型が返るからみたいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328319/bc37f228-9a23-ad0c-09f7-ef2560c0caf5.png)

ちなみにPythonで書くとこんな感じ？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328319/8b3e84f0-3659-f7e4-20b5-c33b69e1ad44.png)

### NuGet パッケージ

https://github.com/dotnet/interactive/blob/master/samples/notebooks/csharp/Docs/Importing%20packages.ipynb

外部パッケージはnugetからダウンロード・インポートできます。

```text
#r "nuget:MongoDB.Driver,2.10.4"
```

のように、`#r "nuget:<パッケージ名>,<バージョン>"` で指定します。

使うときは普通に `using` で。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328319/8f1ec52b-9da2-8af4-0c24-5ccd2dee68cc.png)


# おわりに

以上、Jupyter Notebookで .NET が使用できる「.NET interactive」という、
変わったOSSのご紹介でした。

[.NET Interactive is here! | .NET Notebooks Preview 2](https://devblogs.microsoft.com/dotnet/net-interactive-is-here-net-notebooks-preview-2/)

Microsoftのブログにあるように、
クラウド管理の手順書を .ipynb でまとめて配布するなど様々な応用が考えられそうですね。
特に、PowerShellが使えるのが強そうです。


# 参考文献

- [.NET interactive](https://github.com/dotnet/interactive) 
- [WinPython](https://winpython.github.io/)