Google Colaboratoryで.NET6.0を使う

# はじめに

[Google Colaboratory](https://colab.research.google.com/) はローカルインストールが不要で、無料ですぐに試せる Python の実行環境です。
.NET には [.NET Interactive](https://github.com/dotnet/interactive) という VSCode 用の拡張機能があるのですが、今回はこの子を Google Colaboratory にインストールして .NET 6.0 を実行してみます。

# ディストリビューションとインストール済みのカーネルの確認

2022/04/18現在では`Ubuntu 18.04.5 LTS`で実行されているようです。

```
! lsb_release -a
```

```txt:実行結果
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.5 LTS
Release:	18.04
Codename:	bionic
```

カーネルは `ir` と `python3`の 2 つがインストールされていますね。

```
!jupyter-kernelspec list
```

```txt:実行結果
Available kernels:
  ir         /usr/local/share/jupyter/kernels/ir
  python3    /usr/local/share/jupyter/kernels/python3
```

# .NET 6.0 と .NET Intaractive のインストール

[Ubuntu に .NET SDK または .NET ランタイムをインストールする のUbuntu 18.04](https://docs.microsoft.com/ja-jp/dotnet/core/install/linux-ubuntu#1804-)を確認しながら、.NET 6.0 をインストールします。

```sh
%%bash
wget https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get update \
  && sudo apt-get install -y apt-transport-https \
  && sudo apt-get update \
  && sudo apt-get install -y dotnet-sdk-6.0
```

[.NET Intaractive](https://github.com/dotnet/interactive)の最新版をインストールし、設定ファイルを変更して標準のカーネルを C# に変更します。

```sh
%%bash

dotnet tool install -g --add-source "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json" Microsoft.dotnet-interactive --version 1.0.317502 \
  && export PATH=$PATH:$HOME/.dotnet/tools \
  && dotnet interactive jupyter install
  
cat <<-EOF > /root/.local/share/jupyter/kernels/.net-csharp/kernel.json
{
	"argv": [
		"$HOME/.dotnet/tools/dotnet-interactive",
		"jupyter",
		"--default-kernel",
		"csharp",
		"--http-port-range",
		"1000-3000",
		"{connection_file}"
	],
	"display_name": ".NET",
	"language": "C#",
	"metadata": {
		"vscode": {
			"extension_id": "ms-dotnettools.dotnet-interactive-vscode",
			"kernel_id": "dotnet-interactive"
		}
	}
}
EOF
```

改めてカーネルの一覧を表示すると、C#やF#、Powershellの3つがインストールされたことが確認できます。

```
!jupyter-kernelspec list
```

```txt:実行結果
Available kernels:
  .net-csharp        /root/.local/share/jupyter/kernels/.net-csharp
  .net-fsharp        /root/.local/share/jupyter/kernels/.net-fsharp
  .net-powershell    /root/.local/share/jupyter/kernels/.net-powershell
  ir                 /usr/local/share/jupyter/kernels/ir
  python3            /usr/local/share/jupyter/kernels/python3
```

# カーネルの適用

ノートブック上では新しいカーネルを認識させることができないので、一度 Google Drive などに ipynb ファイルを保存し、テキストエディターなどでじかに開き `kernelspec` を次のように変更します。

```diff_json
{
    "nbformat": 4,
    "nbformat_minor": 0,
    "metadata": {
        "colab": {
            "name": "Untitled4.ipynb",
            "provenance": [],
            "toc_visible": true,
            "authorship_tag": "ABX9TyOaLLjzVNL1u6jO8CZrRrZV"
        },
        "kernelspec": {
-            "name": "python3",
-            "display_name": "Python 3"
+            "name": ".net-csharp",
+            "display_name": "C#"
        },
        "language_info": {
            "name": "python"
        }
    },
    // 略 //
```

# C# のコードを実行してみる
Colab を上記のファイルから開きなおすと、C# 10 のコードを Google Colab 上で実行できるようになります。

```csharp
// C# 10(.NET6.0) から利用可能な Record 構造体
record struct Value(int X, int Y);
new Value(3, 4).Display();

System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription.Display();
```

```txt:実行結果
X	Y
3
4
.NET 6.0.4
```

# おわりに

新しいインスタンスを立ち上げるたびに毎回セットアップからやるのはめんどくさいですが、.NET をインストールすることなくお手軽（？）に試せるのは良いかもしれません。