Raspberry Pi アプリのリモート開発(準備編)

Raspberry Pi の「Lチカ」記事では当たり前のようにPython言語のプログラムが紹介されていますが、残念ながら新しい言語をすぐに覚えられるほど若くもなければ時間もありません（笑）
そのため、慣れ親しんだ C/C++、ついでに C# で「Lチカ」プログラムを作成できる環境を構築してみます。

### 機器構成
|種類|名称|
|:----|:----------------|
|モデル|Raspberry Pi 3 Model B (日本製)|
|SDカード|Transcend 32GB microSDHC Class10 UHS-I|
|電源|公式 Raspberry Pi3 アダプタ 5.1V/2.5A|
|OS|Raspbian Debian Linux 9.4|

### インストールパッケージ
|種類|名称|
|:----|:----------------|
|ファイルサーバ|Samba Version 4.5.12-Debian|
|SSH|OpenSSH Version 7.4|
|管理ツール|Webmin Version 1.881|
|.Net Core|.NET Core Runtime 2.0.8|

### 目的
* Visual Studio を利用したクロス開発環境を構築する。<BR/>（Visual Studio 自体のインストール手順は本稿では割愛する）
* ソースファイルやビルド後の実行イメージ、各種ファイルの転送を簡便にするため、Raspberry Pi をファイルサーバ化する。
* 各種設定ファイルを手動で変更するのは面倒なので、管理ツール Webmin も併せて導入する。
* .NET アプリケーションのプラットフォームとして、.NET Core を導入する。

## 各種パッケージのインストール
### ■ Samba のインストール
Windows ネットワークをサポートし、ファイルサーバ機能を提供する Samba を導入します。

***1. Samba パッケージのインストール***

```bash
$ sudo apt-get update
$ sudo apt-get install samba
```
***2. インストールしたパッケージのバージョンを確認***

```bash
$ samba -V
Version 4.5.12-Debian
```

***3. Sambaユーザーアカウントの作成***
pdbedit コマンドで新しいSambaユーザーアカウントを作成します。
作成するユーザアカウントと同じ名前のLinuxアカウントは、事前に作成しておいてください。
２回パスワードの入力を求められますが、ここで入力する値は「Linuxユーザアカウントのパスワードと異なるパスワード」でも構いません。

```bash
$ sudo pdbedit -a pi
new password:
retype new password:
```

作成が完了すると、アカウント情報が表示されます。

```bash
Unix username:        pi
NT username:          
Account Flags:        [U          ]
User SID:             *********************************************
Primary Group SID:    *********************************************
Full Name:            
Home Directory:       \\raspberrypi\pi
HomeDir Drive:        
Logon Script:         
Profile Path:         \\raspberrypi\pi\profile
Domain:               RASPBERRYPI
Account desc:         
Workstations:         
Munged dial:          
Logon time:           0
Logoff time:          never
Kickoff time:         never
Password last set:    金, 18  5月 2018 02:11:34 JST
Password can change:  金, 18  5月 2018 02:11:34 JST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
```

### ■ SSH のインストール
パッケージは既定でインストール済みです。
「Raspberry Pi の設定」画面上で [SSH] を「有効」に設定します。
　<メニュー（ラズベリーアイコン)> - [設定] - [Raspberry Pi の設定] - [インタフェース]

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90456/3f6ec70d-d306-0d03-91a4-ea5aeb3a441b.png)
<br/>

他PCから pi ユーザで SSH ログインし、接続可能であることを確認します。
　注） 下記は Mac OSXのコンソールからの接続例。

```
$ ssh pi@raspberrypi.local
pi@raspberrypi.local's password: 
Linux raspberrypi 4.14.34-v7+ #1110 SMP Mon Apr 16 15:18:51 BST 2018 armv7l

　： （中略）

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

pi@raspberrypi:~ $ 
```

### ■ Webmin のインストール
[参考サイト]
[http://www.webmin.com/deb.html](http://www.webmin.com/deb.html)

***1. sources.list の変更***
Webmin APTリポジトリから最新の Webmin パッケージをインストールできるよう、sources.list ファイルへリポジトリアドレスを追記します。

```bash
$ cd /etc/apt
$ sudo vi sources.list
```
次の１行を追記します。

```bash
deb https://download.webmin.com/download/repository sarge contrib
```

***2. GPGキーの取得と登録***
リポジトリに署名されたGPGキーの取得と登録を実施します。
なお、以後の操作は root ユーザにて実施してください。

```
$ sudo su -
# cd /root
# wget http://www.webmin.com/jcameron-key.asc
# apt-key add jcameron-key.asc
```

***3. Webmin　パッケージのインストール***
次のコマンドを実行し、パッケージをインストールします。

```
# apt-get install apt-transport-https
# apt-get update
# apt-get install webmin
```

インストール終了時、既定のアクセス先のURL 「https://raspberrypi:10000/」 が表示されます。

```
 :
webmin (1.881) を設定しています ...
Webmin install complete. You can now login to https://raspberrypi:10000/
as root with your root password, or as any user who can use sudo
to run commands as root.
systemd (232-25+deb9u2) のトリガを処理しています ...
#
```

他PCから Webmin サイトへアクセスしてみます。
　　Windows の場合：https://raspberrypi:10000/
　　Mac OSX の場合：https://raspberrypi.local:10000/
　
![image.png](https://qiita-image-store.s3.amazonaws.com/0/90456/1433a552-8e4e-c4af-f0d0-2ca83db838f1.png)

pi アカウントのユーザ名とパスワードを入力して [Sign in]ボタンをクリックすると、Webmin のメイン画面が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/90456/9fe9d8af-fbb2-39fe-e99f-0739fda38efe.png)

日本語表示へ切り替えため、[Webmin] - [Change Language and Theme] をクリック後、Webmin UI language にて「Japanese (JA_JP.UTF-8)」を選択しておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/90456/e2a46010-87fb-6140-b1b6-639e9b0c326d.png)

###■ .NET Core Runtime のインストール
<font color="red">2018年5月現在、.NET Coreは ARMv6 をサポートしていません。<br/>したがって、Raspberry Pi Zero 上で .NET Core は動作しません。</font>

【参考サイト】
　Setting up Raspian and .NET Core 2.0 on a Raspberry Pi
　https://blogs.msdn.microsoft.com/david/2017/07/20/setting_up_raspian_and_dotnet_core_2_0_on_a_raspberry_pi/

　.NET Core on Raspberry Pi
　https://github.com/dotnet/core/blob/master/samples/RaspberryPiInstructions.md

　.NET Coreランタイムとライブラリのインストーラパッケージ
　https://github.com/dotnet/core-setup
　

***1. システムコンポーネントのインストール***

```bash
$ sudo apt-get update
$ sudo apt-get install curl libunwind8 gettext apt-transport-https
```

***2. ARMアーキテクチャ向け .NET Core Runtime のダウンロード***

- 2018/5/9 現在、2.0.x 系の Runtime の最新バージョンは「2.0.8」です。
- コマンドに指定するURLに「2.1」を指定すると、2.1.x系の Runtime をダウンロード可能です。<br/>(2018/5/8 現在は RTM版です)

```bash
$ 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
```

***3. .NET Core Runtime のインストール***

```bash
$ sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet
$ sudo ln -s /opt/dotnet/dotnet /usr/local/bin
```
　dotnet コマンドを実行して Runtime がインストールされたことを確認します。

```bash
$ dotnet --info

Microsoft .NET Core Shared Framework Host

  Version  : 2.0.8-servicing-26407-02
  Build    : a97df59f3ca468ba157f2e70fdd2f3c112cfb5d8
```

## 共有フォルダの作成
Samba の Windows ファイル共有機能を利用し、下記のフォルダを共有します。

|必須|名称|共有名|パス|
|:-:|:--|:--|:--|
|○|インクルードファイル フォルダ|usr_include|/usr/include/|
| |ユーザープロジェクトフォルダ|pi_projects|/home/pi/projects|
| |ライブラリ フォルダ|usr_lib|/usr/lib/|

少なくともインクルードファイル フォルダは共有フォルダ化してください。
また、開発作業を行うログインユーザのホームディレクトリ下に「プロジェクトフォルダ」を作成し、共有フォルダ化して外部からアクセスできるようにしておいた方が便利に使うことができるでしょう。
なお、Visual Studio のクロスプラットフォーム環境では、ビルド時のルートフォルダが既定で「~/projects」と設定されています。

1.　Webmin へログインします。
2.　[サーバ]-[Samba Windows ファイル共有] をクリックします。
3.　[新規のファイル共有を作成] をクリックします。
4.　下記の内容で新しい共有を作成します。

|項目|値|
|:--|:--|
|共有名|usr_include|
|共有するディレクトリ|/usr/include|
|自動的にディレクトリを作成しますか?|いいえ|
|Create with owner|root|
|Create with permissions|755|
|Create with group|root|
|有効にしますか？|はい|
|ブラウズ可能にしますか？|はい|
|共有コメント|（空欄）|

|項目|値|
|:--|:--|
|共有名|pi_projects|
|共有するディレクトリ|/home/pi/projects|
|自動的にディレクトリを作成しますか?|はい|
|Create with owner|pi|
|Create with permissions|755|
|Create with group|pi|
|有効にしますか？|はい|
|ブラウズ可能にしますか？|はい|
|共有コメント|（空欄）|

|項目|値|
|:--|:--|
|共有名|usr_lib|
|共有するディレクトリ|/usr/lib|
|自動的にディレクトリを作成しますか?|いいえ|
|Create with owner|root|
|Create with permissions|755|
|Create with group|root|
|有効にしますか？|はい|
|ブラウズ可能にしますか？|はい|
|共有コメント|（空欄）|

5.　共有リストに追加された [pi_projects] をダブルクリックします。
6.　[その他の共有オプション] の [セキュリティとアクセス制御] をクリックします。
7.　下記の内容に変更してから [保存] をクリックします。

|項目|値|
|:--|:--|
|書き込み可能にしますか？|はい|

8.　共有リストに追加された [usr_inlcude] をダブルクリックします。
9.　[その他の共有オプション] の [セキュリティとアクセス制御] をクリックします。
10.　下記の内容に変更してから [保存] をクリックします。

|項目|値|
|:--|:--|
|ゲストのアクセスを可能にしますか？|はい|

11.　共有リスト一覧画面へ戻り、[Samba サーバを再起動] をクリックします。<br/><font color="red">設定変更後は Sambaサーバの再起動が必要です。</font>

### ■ 共有フォルダへのアクセス確認
他PCから 作成した共有フォルダへアクセスしてみます。
（ユーザーアカウントとパスワードは、Samba用アカウントのものを使用してください）
　　Windows の場合：¥¥raspberrypi¥
　　Mac OSX の場合：smb://raspberrypi.local/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90456/566a43c5-5aef-6b26-5b24-cffd2989196e.png)

## Visual Studio へのコンポーネント追加
本稿では、（条件付きですが）無償で利用可能な Visual Studio Community 2017 を使用します。
Visual Studio 用のツールセットとして用意されている、次の二つのコンポーネントをインストールします。

* C++ による Linux 開発
* .NET Core クロスプラットフォームの開発

リモート開発用の Windows PC には、事前に Visual Studio をインストールしておいてください。
　　
1. Visual Studio を起動します。
2. メニューバーから [ツール]-[ツールと機能を取得] をクリックします。
3. Visual Studio Installer 起動後、 「ワークロード」画面下方へスクロールします。
4. 次の二つのコンポーネントにチェックを付け、右下の[変更]ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/90456/b089974e-b678-46df-a9a5-44ca36276137.png)

これで、クロス開発の準備は整いました。
次回、「Lチカ」編では Visual Studio で作成した C/C++ プログラムによる リモートビルド/デバッグ を試してみます。