Raspberry Piで室内カメラを作る②

# 概要

[前回の記事](https://qiita.com/henjiganai/items/b491e498d7d367306cd5)ではRaspberry Pi上でWebカメラを起動してストリーム配信が行えることを確認しました。
今回はPython上でストリーム配信や画像取得を操作するために開発環境を構築します。
現状のままでもRaspberry PiでVimなどを操作して直接開発もできるのですが、やはり統合開発環境を構築した方が開発がやりやすいです。
普段は別のPCで編集もできるよう、Raspberry Piとリモート接続での開発環境を両方作成したいと思います。

# 調査

リモート接続が可能な開発環境を少し調べたところ、Visual Studio Code（以後VSCode）とPyCharmがあるようでした。
双方比較したところ、PyCharmでリモート接続を使用したい場合は年間ライセンスを購入する必要がありました。（30日の試用期間ではリモート接続が可能です）
ライセンスを購入する余裕がないので、今回はVSCodeを採用します。

# インストール

リモート端末とRaspberry Pi両方にVSCodeをインストールします。

## 1.Windowsにインストール

下記URLからVSCodeをダウンロードしてインストール。
Windows、Macなどの端末用のインストール手順は色々なところに記載されているので今回は省略します。
https://code.visualstudio.com/

## 2.Raspberry Piにインストール

インストールする場合OSによってコマンドを変更する必要がある。下記URLの「Linux」項目内の「APT instructions」か「YUM instructions」に記載されているコマンドを実行。
今回はRaspbeanを使用しているので、「APT instructions」の項目に記載されているコマンドを実行。

```shell:APT_instructions
# 実行前に必ず管理者権限に切り替える
sudo -s

. <( wget -O - https://code.headmelted.com/installers/apt.sh )
```

上記のコマンドを実行したところ、こちらの環境では`E: 認証されていないパッケージがあり、-y オプションが --allow-unauthenticated なしで使用されました Visual Studio Code install failed.`と表示されてインストールに失敗してしまいました。
いくつかのサイトを確認したところ、上記のコマンド実行後に下記コマンドを実行すればインストールに成功したとの記載がありました。
もしインストールに失敗する場合は下記コマンドを追加で実行します。

```shell:
sudo apt install code-oss -y --allow-unauthenticated
```

**追記（2019年4月）**
現在、最新のパッケージをインストールすると黒いウィンドウしか表示されないという問題が発生しているようです。
インストール後にVSCodeを実行した際に同様の問題が発生した場合はバージョンを下げたパッケージをインストールするしかないようです。
こちらの環境でも同様の問題が発生したので一旦バージョンをさげてインストールを行いました。
https://github.com/headmelted/codebuilds/issues/64

```shell:
sudo apt install code-oss=1.29.0-1539702286 -y --allow-unauthenticated
```

# インストール後の設定

インストール直後のままではPythonのデバッグができないので各種拡張機能を入れていきます。
左枠の一番下のアイコンをクリックして拡張機能を開きます。
リモート用とRaspberry Pi共通です。

![extension_icon.png](https://qiita-image-store.s3.amazonaws.com/0/340824/ead3b37d-8669-b546-f44c-bb0a73b6c2e1.png)

拡張機能を検索する場合は左上のテキスト欄に任意の検索文字列を入れることで当てはまるものの一覧が表示されます。

![ectension_search.png](https://qiita-image-store.s3.amazonaws.com/0/340824/ef545739-3749-12ac-8768-02fef181a02c.png)

## 1. 必須の拡張機能

こちらを入れないとVSCodeでデバッグなどができないので必ずインストール。
インストール後に「再読み込み」をクリック。
[Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python)

## 2. 日本語化

個人的に日本語化していた方がやりやすいのでこちらもインストール。
[Japanese Language Pack for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja)


## 3. その他の設定（任意）
入れておいた方が使いやすい機能も記載しておきます。
拡張機能を増やすと容量を圧迫してしまいますが、フォーマット自動化などコーディングがやりやすくなるのである程度は入れた方が良いと思っています。

### 1. テーマの変更

VNC Viewer経由だと画質設定をHighに上げていても黒背景だと文字が潰れる事が結構あるのでテーマを変更する。
「ファイル」、「基本設定」、「配色テーマ」をクリック。
Dark以外の好みのテーマを選択する。（これはLight(Visual Studio)を選択した場合）
他のテーマにしたい場合は拡張機能で好きなテーマをインストールして選択する。

![theme.png](https://qiita-image-store.s3.amazonaws.com/0/340824/e299d883-eec4-20c4-71f6-1db174545461.png)

### 2. [vscode-icons](https://marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons)

開いているワークスペース内のファイル・フォルダ等の種類に応じてアイコンが追加される。
視認性が良くなる。

### 3. [Path Autocomplete](https://marketplace.visualstudio.com/items?itemName=ionutvmi.path-autocomplete)

パス入力時に候補を表示してくれる。

### 4. [Trailing Spaces](https://marketplace.visualstudio.com/items?itemName=shardulm94.trailing-spaces)

行末尾の不要な空白を強調表示。
こちらをインストール後に「ファイル」、「基本設定」、「設定」をクリックして表示されるSettingsの上部テキストランに`files.trimTrailingWhitespace`を入力。
Files: Trim Traillng Whitespaceにチェックを入れると保存時に自動で不要な空白を削除してくれる。
![file_TrimWhitespace.png](https://qiita-image-store.s3.amazonaws.com/0/340824/b28d9daf-d5e2-d0cd-66ac-759c56535dbd.png)

### 5. Settingsの変更

既存の設定から変更した方が視認性が良くなると思われる項目の一覧を記載。
「ファイル」、「基本設定」、「設定」をクリックしてSettingsを表示する。

**5.1 空白文字の表示**
「テキストエディター」をクリックして`Render Whitespace`の部分を`None`から`all`に変更
![render_whitespace.png](https://qiita-image-store.s3.amazonaws.com/0/340824/9f98f20e-9c6a-c7da-e909-1cc2554aca8d.png)

**5.2 ファイルの末尾に改行を追加&不要な改行と空白を削除**
「ファイル」をクリックして`Insert Final Newline`、`Trim Final Newline`、`Trim Trailing Whitespace`にチェックを追加
![WS000073_01.png](https://qiita-image-store.s3.amazonaws.com/0/340824/076f248f-b2b8-6a72-43f8-9b9595824362.png)

**5.3 関数名補間時に自動で括弧も補間する(Python)**

「拡張機能」、「Python」をクリック。
`Auto Complete: Add Brackets`にチェックを追加。
![addBrackets.png](https://qiita-image-store.s3.amazonaws.com/0/340824/6acf9a63-b4b6-c28e-fd93-7853732f15a9.png)

**5.4 Python3.6のインストール(Raspberry Piのみ)**
Raspberry PiにはPython2.7とPython3.5がインストールされているが、Python3系を3.6へアップデートする。
VSCodeの設定ではないが、Python3.6系列で5.5以降を実行するためにここに記載している。

ターミナルを起動して下記コマンドを実行。

```shell:
# ビルドのためのパッケージをインストール
sudo apt install build-essential tk-dev libncurses5-dev libncursesw5-dev libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev

cd /opt
# 3.6の最新版3.6.8をダウンロード(opt配下なので要sudo、他のフォルダの場合はsudo不要)
sudo wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz
sudo tar xf Python-3.6.8.tar.xz # (opt配下なので要sudo)
cd Python-3.6.8
sudo ./configure                # (opt配下なので要sudo)
sudo make                       # (opt配下なので要sudo)
sudo make install
```

インストールが完了したら`python3.6 --version`と`pip3.6 -V`をそれぞれ実行してバージョンの確認を行う。

そのままだと使いにくいのでエイリアスの登録を行う。
`vim ~/.bashrc`をターミナルで実行後、テキストの末尾に下記を追加後、再起動を行う。
追加後、`python --version`と`pip -V`をそれぞれ実行して先程確認したバージョンと同一になっていることを確認する。

```
alias python='python3.6'
alias python3='python3.6'
alias pip='python3.6 -m pip'
alias pip3='python3.6 -m pip'
```

**5.5 自動整形の設定(Python)**
Pythonはコーディング規約が存在します。コーディング後に手動で整形をするより自動整形をしてくれた方が便利なのでパッケージをインストール後、VSCodeの設定を行います。

ターミナルを起動して下記コマンドを実行。

```shell:
# Raspberry Pi側で許可がありませんとエラーが出た場合はsudoを付ける
pip install flake8
pip install autopep8
```

VSCodeを起動して「ファイル」、「基本設定」、「設定」をクリックしてSettingsを表示する。

`python.linting.pylintEnabled`を検索してチェックを外しpylintを無効化する。
![Pylint_Enabled.png](https://qiita-image-store.s3.amazonaws.com/0/340824/99d9f5c7-d4df-7986-9dd6-efd83051f382.png)

`python.linting.enabled`を検索してチェックがついていることを確認する。ついていない場合はチェックをつける。
![linting_Enabled.png](https://qiita-image-store.s3.amazonaws.com/0/340824/30790c0b-391e-c003-90d6-2b1b6d79245f.png)

`python.linting.flake8Enabled`を検索してチェックを付け、flake8を有効化する。
![flake8_Enabled.png](https://qiita-image-store.s3.amazonaws.com/0/340824/3e60b76a-10fc-0603-e094-5131451887f7.png)

`python.linting.flake8Args`を検索してsettings.jsonを開き、下記を追加する。

```json:
    "python.linting.flake8Args": [
        "--ignore=W293, W504"
    ]
```

`python.formatting.provider`を検索して`autopep8`が選択されていることを確認する。
![formatting_provider.png](https://qiita-image-store.s3.amazonaws.com/0/340824/014b55e8-5d90-66f9-1b84-3a344f30a506.png)


# リモート接続用の設定

こちらはリモート接続用のPCのみ設定します。
下記設定だけではリモートでのデバッグまでは実行不可です。リモートでのファイル編集のみ可能となっています。
リモートでのデバッグ方法についてはいずれ追記します。

拡張機能の検索欄に[SSH FS](https://marketplace.visualstudio.com/items?itemName=Kelvin.vscode-sshfs)を入力して検索し、インストール。
エクスプローラーを表示した際に左下に`SSH FILE SYSTEMS`という項目が追加されているので右クリックを押し、「Create a SSH FS Configration」をクリック。

Nameに付けたい設定ファイル名を入れ、Locationを「Global settings.json」か「Workspace settings.json」どちらかを設定して「Save」をクリック。
![SSH_FS_Create.png](https://qiita-image-store.s3.amazonaws.com/0/340824/ce62c561-b78f-b4bb-09a0-c2f340dcc70d.png)

「Save」をクリック後にsettings.jsonが表示されるので下記の項目を入力した後、一番下に表示されている「Save」をクリックして保存する。
<dl>
  <dt>Host</dt>
  <dd>接続先のRaspberry PiのIPアドレス</dd>
  <dt>Port</dt>
  <dd>ポート番号を入力。デフォルトでは22が設定されている</dd>
  <dt>Root</dt>
  <dd>接続先のルートパス</dd>
  <dt>Username</dt>
  <dd>ログイン時のユーザ名</dd>
  <dt>Username</dt>
  <dd>ログイン時のパスワード。<Prompt>に設定した場合、毎回接続時にパスワード入力を要求される</dd>
</dl>
![SSH_FS_settings.png](https://qiita-image-store.s3.amazonaws.com/0/340824/e19976c7-c8d8-0eda-4e64-57739b3d5cd1.png)

作成した設定ファイルを右クリックし、「Connect as Workspace folder」をクリック。
設定ファイルの横のアイコンが緑色に変化すれば正常に接続が出来たことを示す。
![SSH_FS_connect.png](https://qiita-image-store.s3.amazonaws.com/0/340824/146f0fbd-da51-ea2f-35e1-5a2ea4746376.png)

# 実行確認

これらの設定が完了したらデバッグの実行確認をします。
Raspberry Pi側のVSCodeを起動して、下記Pythonファイルを作成してデバッグが実行できるかを確認します。
正常に実行できた場合、`/tmp/test.jpg`が作成されています。
また、作成後にリモート端末でSSH FS経由で接続して作成したファイルが閲覧・編集できるかも確認します。

```python:test.py
import subprocess

cmd = ['fswebcam', '/tmp/test.jpg']
result = subprocess.run(cmd, stdout=subprocess.PIPE)
print(result)
```

# 総括

前回と合わせて、これでストリーム配信の準備とPythonによるアプリケーション作成の準備ができました。
次回はPythonからストリーム配信や画像の撮影を実行するプログラムを作成したいと思います。

# 参考

この記事を書くにあたって、以下のサイトを参考にさせて頂きました。

[改訂【 インストール編 】Raspberry PiでのプログラミングもエディターはVisual Studio Code！](https://www.fabshop.jp/%E6%94%B9%E8%A8%82%E3%80%90-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E7%B7%A8-%E3%80%91raspberry-pi%E3%81%A7%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/)
[VSCodeのオススメ拡張機能 24 選 (とTipsをいくつか)](https://qiita.com/sensuikan1973/items/74cf5383c02dbcd82234)
[Raspberry piにPython3.6を入れてみた](https://qiita.com/K_M95/items/6980f27e7424c890c89e)
[Raspberry Pi 3 Model B, 設定について自分用メモ(パスワード変更や、Python3導入, カメラ利用など)](https://prismoid.hatenablog.com/entry/2018/08/13/223019)
[VS Code コーディング規約を快適に守る](https://qiita.com/firedfly/items/00c34018581c6cec9b84)
[VSCodeのPython開発環境でpylintの代わりにflake8を導入し自動整形を設定する](https://qiita.com/psychoroid/items/2c2acc06c900d2c0c8cb)
[パソコンのVS CodeからラズパイのPythonファイルを直接編集しよう！](https://from-age35.com/495.html)