【C#】RaspberryPi 3に.NET Coreを入れてHello World！

# 【C#】RasperryPi 3に.NET Coreを入れてHello World！

## ゴール
__Raspberry Pi 3 Model B (Raspbean OS)に__
__.NET Core 2.0 Preview 2を入れ、HelloWorldを表示させる__

現在（2017/7/23）時点では、ラズパイが乗っているarm32cpuで.NET Coreのビルドができないので、他マシンでビルドしたものをラズパイで動作させることが出来れば目的達成とする。

## 試したきっかけ
dotnet core roadmap
https://github.com/dotnet/core/blob/master/roadmap.md
今年のQ3(10月 - 1月くらい？)に.NET Core2.0リリースとなるらしく、
それまでに一回くらい先行して触っておきたいなぁって思ったから。

## 用意したもの
* Raspberry Pi 3 Model B
* ラズパイ接続用のキーボード・マウス・モニタ
* SDカード（16GB）
* dotnet core 2.0.0 preview2 インストール済・ビルド可能なPC  
  https://www.microsoft.com/net/core/preview
  ここからダウンロードし、インストールしておきましょう。  
  Windows, Macなら簡単です。

## 手順
### 1. Raspberry Pi 3 にRaspbianを入れる
まず、ラズパイ上にOSをインストールします。手順はGoogle検索等で調べると詳細なページ等たくさん出てくると思いますので、大まかな流れと注意点のみを記述します。

1. Raspbian Jessie(NOOBS)を入手
https://www.raspberrypi.org/downloads/noobs/
![a.PNG](https://qiita-image-store.s3.amazonaws.com/0/131683/bfd5df53-61a0-91e0-5519-847c8eac66b4.png)
Raspbean Jessieの入れ方としては、イメージファイル（.img）を入手して自分でSDカードにWriteする方法と、NOOBSを利用してインストールする方法がありますが、個人的にはNOOBSを推奨します。
NOOBSとは、New Out Of the Box Softwareの略であり、ネットスラングのnoobとは関係ありません。なので、積極的に使っていきましょう。NOOBSを選択してインストールした場合、OS起動前にBIOSのような感じで立ち上がるので、リカバリ等容易に行えるようになります。

2. SDカードをフォーマット
https://www.sdcard.org/jp/downloads/formatter_4/
このあたりのフォーマット用ソフトウェアを使って初期化します。
__単にファイルを削除するだけではなく、必ずフォーマット（上書きフォーマット）を行い、ディスク領域内を完全に初期化してください。__

3. SDカードに書き込み
1.でダウンロードしたファイルを展開し、SDカードの中に入れてください。

### 2. Raspbianのインストールと設定修正
これも、手順はネット上にかなり詳しく転がってますので、軽く触れるだけとします。

1. Raspberry Pi にSDカードを差し込んで起動
2. NOOBSが立ち上がり、OS選択画面が出るのでRaspbian(Recommended)を選択する。ディスクを上書きしてもよいか警告が出るが、Yesを押して続行。
3. 大体２０分くらいかかってインストールが進行する。インストール終了後、再起動を促す画面が出るので、再起動する。

その後、細かい修正を行います。

* パスワード変更（piのデフォルトは危険なため変更しましょう）
* ロケール変更
* タイムゾーン変更
* キーボード配列変更
* 無線LAN利用場所の変更

詳細手順は検索すれば出ますし、検索しなくても設定画面からすべてGUIによる設定が可能です。
最後に、アクセスポイントに接続 or Ethernetケーブルを接続してネットに繋いで、以下のコマンドを実行します。

    sudo apt-get update
    sudo apt-get upgrade

これで、インストールされているパッケージが最新になり、Raspberry Piの初期設定は完了です。

### 3. .NET Coreのインストール
Raspberry Piに .NET Core 2.0 Preview をインストールします。
下記操作は全て、Raspberry Piの端末上から行います。
<ol><li>下記コマンドを実行し、必要な事前取得パッケージをインストールする

~~~
sudo apt-get install curl libunwind8 gettext
~~~

</li><li>下記コマンドを実行し、.NET Core ランタイムをCurlでダウンロードする

~~~
curl -sSL -o dotnet.tar.gz https://dotnetcli.blob.core.windows.net/dotnet/Runtime/release/2.0.0/dotnet-runtime-latest-linux-arm.tar.gz
~~~

</li><li>下記コマンドを実行し、.NET Coreランタイムをインストールする

~~~
sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet
~~~

</li><li>下記コマンドを実行し、「dotnet」コマンドを実行可能にする

~~~
sudo ln -s /opt/dotnet/dotnet /usr/local/bin
~~~

</li><li>下記コマンドを実行し、結果を確認する

~~~
dotnet --help.
~~~

< 表示結果 >
![z.jpg](https://qiita-image-store.s3.amazonaws.com/0/131683/90ad82fd-a8c7-dc71-a32a-9b31b74d4bd6.jpeg)

現時点ではarm32上で動作するdotnetのSDKは存在しないため、ビルド・作成は出来ず、「実行」のみのランタイム環境となります。この画面が表示されれば、ラズベリーパイ側の設定は終了です。あとは別PCでプロジェクトを作成し、ラズベリーパイ上で実行するだけです。

### 4. テストアプリケーションの作成
https://www.microsoft.com/net/core/preview
上記URLから自分のOS環境に合わせた.NET Core 2.0 Preview 2をダウンロードし、インストールされていることを前提とします。

* 新しくフォルダを作成し、アドレス部分に「dotnet new console」と入力する
![c.PNG](https://qiita-image-store.s3.amazonaws.com/0/131683/3b06ea7c-51a2-e3ef-85e5-345e533b4c73.png)
* ファイルが作成されることを確認する
![d.PNG](https://qiita-image-store.s3.amazonaws.com/0/131683/dde2a23f-7d6e-7546-f1a9-8d43e10bbe17.png)

~~~C:Program.cs
using System;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

~~~

HelloWorldをコンソールに表示するだけのシンプルなコードが書いてある、Program.csファイルとプロジェクトファイルが自動生成されます。

* アドレス部分に「cmd」と入力し、コマンドプロンプトを開く
![e.PNG](https://qiita-image-store.s3.amazonaws.com/0/131683/4319467a-b4c3-89c2-dd32-fd25256baaec.png)
* 下記のコマンドを入力し、実行結果を確認する

~~~
dotnet restore
dotnet publish -r linux-arm
~~~

< 実行結果 >
![f.PNG](https://qiita-image-store.s3.amazonaws.com/0/131683/894cb820-fcf4-82e2-010c-120f245d5dfa.png)

* 生成されたpublishフォルダの中身を、ラズパイに転送する
![h.PNG](https://qiita-image-store.s3.amazonaws.com/0/131683/b10b3915-f52e-1528-0c47-cf693317e2ea.png)

SSHでもSCPでもDropboxでもなんでもよいので、raspberry Pi上に転送します。

### 5. 実行

* 下記コマンドを実行し、転送されたpublishフォルダのパーミッションを実行可能に変更する

~~~
chmod 755 -R publish
~~~

* publishフォルダ内で下記コマンドを実行する

~~~
./helloworld
~~~

< 実行結果 >
![i.PNG](https://qiita-image-store.s3.amazonaws.com/0/131683/1cf90976-4dd4-bc3d-0f0b-724c0285c7c3.png)
お疲れさまでした！

## 結果
ラズパイ上の dotnet core 2.0.0 preview2 で Hello World!が実行できた！

## 感想 
ビルド・生成はまだできないものの、C#一つでなんでも出来る時代、そう遠くないように感じます。また、今回色々ハマりながらでしたが、新しいものに触れていく楽しさを感じました。  

今回、Raspbeanで行う前にUbuntu MATEでも同様の実験を行ったのですが…
大ハマリして挫折しました(apt-get installでMSのリポジトリからdotnetをインストールできなかった）。近いうちにリベンジしたいです。

coreについてはまだpreviewということなので、遊べる範囲は限られてくるかと思いますが、これからもっとラズパイ上でどんなことが出来るか検証してみたいと思います。

## 参考
https://blogs.msdn.microsoft.com/david/2017/07/20/setting_up_raspian_and_dotnet_core_2_0_on_a_raspberry_pi/
7月20日の記事です。とても参考になりました。

https://github.com/dotnet/core/blob/master/Documentation/prereqs.md
Coreに必要な前提条件が書いてあります。

https://github.com/dotnet/core/blob/master/roadmap.md
Coreのロードマップです。