fswebcamで撮影した画像をtwythonを使ってツイートする (環境構築)

# 動機
元々は、文ちゃん（文鳥）の住んでるケージ周辺の日中の環境（温度・湿度）をモニターしたかったのが始まり。
その為、ラズパイでLチカから勉強し始めたんだけど、色々自理由をつけていつの間にかフェードアウト。。。
しばらくして、ラズパイとUSBカメラが接続できて、写真をキャプチャ出きる事を知り、
何かできそうなのでやってみようと方向転換。

よって今回の最終目標を、
写真で文ちゃんの日中の挙動をカメラで定期的に撮影し、Twitterに投稿する。そして仕事場から見て楽しむ:heart:
とした。

# 目次
1. 使った機材
2. 環境構築（ラズパイ＆開発環境）　
3. アプリ開発
4. コードの置き場所とbotの紹介

※記事を書いていて長くなってきたので、今回は２．環境構築までに留める。

# 使用機材
1. [Raspberry Pi3 Model B](https://www.amazon.co.jp/gp/product/B01CSFZ4JG/)
2. [エレコム WEBカメラ 200万画素 マイク内蔵](https://www.amazon.co.jp/gp/product/B00UZNLIBW)
3. 文ちゃん ![d17fJOxh_400x400.jpg](https://qiita-image-store.s3.amazonaws.com/0/9479/ff8d4894-3ae5-c2a4-4115-66a352cb693a.jpeg)

# ラズパイ側の環境構築
ログなどを取り忘れていたので、主に参考にしたサイトのリンクのみ・・・

## ラズパイのバージョン
```
raspberrypi% uname -a
Linux raspberrypi 4.9.50-v7+ #1035 SMP Wed Sep 13 23:16:24 BST 2017 armv7l GNU/Linux
```

## 外から接続することを考えて公開鍵認証のみのログインに変更
[Raspberry Piに公開鍵認証を使ってssh接続する](https://tool-lab.com/2013/11/raspi-key-authentication-over-ssh/)

## crontabがエラーを吐いて実行されていなかったので、postfixをインストールし解決
[Cronの使い方](http://www.raspberrypirulo.net/entry/2016/10/27/Cron%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)

## 時刻同期を修正

* crontabの実行時間にズレがあったので、ntp.confのサーバの設定を近くのサーバに修正＆サービスを再起動し確認。

    ``` ntp.conf
    # pool.ntp.org maps to about 1000 low-stratum NTP servers.  Your server will
    # pick a different set every time it starts up.  Please consider joining the
    # pool: <http://www.pool.ntp.org/join.html>
    server ntp1.eonet.ne.jp
    server ntp2.eonet.ne.jp
    ```

* 動作確認

    ```
    raspberrypi% ntpq -p
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
    *ntp1.eonet.ne.j 133.243.238.164  2 u  887 1024  377   10.998   -0.098   0.973
    +ntp2.eonet.ne.j 133.243.238.244  2 u  211 1024  377   11.798    0.015  50.588

    ```

## fswebcamをインストール

USBカメラでキャプチャを行うためのアプリをインストール＆キャプチャできる事を確認。

* インストール

    ```
    raspberrypi% sudo apt-get install fswebcam
    ```

* USBカメラが接続されているか確認。 Device 004で認識されている。

    ```
    raspberrypi% lsusb
    Bus 001 Device 004: ID 056e:7016 Elecom Co., Ltd
    Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 
    Fast Ethernet Adapter
    Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    ```

* キャプチャできる事を確認。

    ```
    raspberrypi% fswebcam hoge.jpg
    --- Opening /dev/video0...
    Trying source module v4l2...
    /dev/video0 opened.
    No input was specified, using the first.
    Adjusting resolution from 384x288 to 352x288.
    --- Capturing frame...
    Captured frame in 0.00 seconds.
    --- Processing captured image...
    Writing JPEG image to 'hoge.jpg'.
    ```


## auth.logをみると案の定アタックを受けているので、fail2banを導入 (2017.10.13追記)

* インストール

    ```
    raspberrypi% sudo apt-get install fail2ban
    raspberrypi% cd fail2ban
    raspberrypi% pwd
    /etc/fail2ban
    ```

* jail.confをjail.localをコピーし設定

    ````
    raspberrypi% sudo cp jail.conf jail.local
    ````

* DEFAULTのbantimeを10分(600秒) -> 一日(86400秒)に変更

    ```
    raspberrypi% diff jail.conf jail.local
    30c30
    < bantime  = 600
    ---
    > bantime  = 86400
    ````

* 再起動

    ```
    raspberrypi% sudo systemctl restart fail2ban
    ```

* 起動確認

    ````
    aspberrypi% systemctl status fail2ban
    ● fail2ban.service - LSB: Start/stop fail2ban
       Loaded: loaded (/etc/init.d/fail2ban)
       Active: active (running) since 金 2017-10-13 21:38:56 JST; 13min ago
      Process: 11001 ExecStop=/etc/init.d/fail2ban stop (code=exited, status=0/SUCCESS)
      Process: 11017 ExecStart=/etc/init.d/fail2ban start (code=exited, status=0/SUCCESS)
      CGroup: /system.slice/fail2ban.service
           └─11029 /usr/bin/python /usr/bin/fail2ban-server -b -s /var/run/fail2ban/fail2ban.sock -p /var/run/fail2ban/fail2ban.pid
    ````

* 参考リンク
[DoS攻撃/DDoS攻撃からサーバーを守る方法（fail2banのススメ）](https://colo-ri.jp/develop/2016/02/fail2ban.html)


-----

システム関連の設定はここまで。開発言語はライブラリの豊富さと触ってみたいという興味からpython3を選択。
そして、環境構築も知りたかったので下記の内容で構築。

* 使用言語 : python ver.3.6.1
* バージョン管理 : pyenv
* ライブラリ管理 : virtualenv

## pyenvのインストール

* pythonのバージョンを動的に切り替えるようにpyenvを導入
    [Raspberry PiでのPython 3.5環境構築](http://make-muda.weblike.jp/2016/03/3631/)

* インストール後にコマンドが実行できるか確認。

    ```
    raspberrypi% pyenv --version
    pyenv 1.0.10-22-g3292200
    ```

* pythonインストール完了後に、ver.3.6.1をGlobalに設定

    ```
    raspberrypi% pyenv install 3.6.1
    pyenv: /home/pi/.pyenv/versions/3.6.1 already exists
    continue with installation? (y/N) y
    Downloading Python-3.6.1.tar.xz...
    -> https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz
    Installing Python-3.6.1...
    Installed Python-3.6.1 to /home/pi/.pyenv/versions/3.6.1

    raspberrypi% pyenv global 3.6.1
    raspberrypi% pyenv versions
      system
      2.7.9
      3.5.1
    * 3.6.1 (set by /home/pi/.pyenv/version)
    ```

## virtualenvをpipでインストール

    ```
    raspberrypi% pip install virtualenv
    Collecting virtualenv
      Downloading virtualenv-15.1.0-py2.py3-none-any.whl (1.8MB)
        100% |████████████████████████████████| 1.8MB 143kB/s
    Installing collected packages: virtualenv
    Successfully installed virtualenv-15.1.0
    raspberrypi% pip list
    ---- 省略 ----
    virtualenv (15.1.0)
    ```