エンジニアの育休　POISON～言いたい事も言えないこんな世の中は～

2019年もあとわずかですね。
[ラクス Advent Calendar 2019](https://qiita.com/advent-calendar/2019/rakus) の23日目を担当します [noriharu3](https://qiita.com/noriharu3) です。

さて今回は、今年の6月から8月に取得した育休のお話をしたい思います。

## そもそも育休とは

子供が1歳になるまで、育児のために休業できる `国` の制度です。
![スクリーンショット 2019-12-22 22.42.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539285/c8f48084-7f8c-531e-e790-ab6ce446049b.png)
（[厚生労働省HP](https://ikumen-project.mhlw.go.jp/employee/system/)より引用）

## 育休中の給料は？

所属会社の人事に問い合わせいただくのが確実かと思います。弊社を含め、`0` 円になる会社がほとんどだと思いますが。。。

しかし、全く収入がなくなるというわけではなく、雇用保険から給付金という形でお金が支給されます。
![スクリーンショット 2019-12-22 22.49.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539285/e015c767-83c3-30ed-1fa3-69fd6fbd96e5.png)
（[厚生労働省HP](https://ikumen-project.mhlw.go.jp/employee/system/)より引用）

`ただ1つ注意点が`！
給付金が受け取れるのは、初回申請から早くても3ヶ月経ってからになります。

また、私個人の話にはなりますが、管轄のハローワークが手続きを忘れていたため、12月23日現在まだ給付金を受け取れていません。

なので、お金には余裕を持った計画を。

## 育休をとろうと思ったきっかけ

シンプルに嫁1人での育児が心配でした。書店で見つけた `産後うつ` の本を読んでからその気持ちがより強くなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539285/86f9cc31-cd7b-12b7-2ad6-95c2a0b81303.png)
（[Amazon](https://www.amazon.co.jp/%E8%84%B1-%E7%94%A3%E5%BE%8C%E3%81%86%E3%81%A4-%E7%A7%81%E3%81%AF%E3%81%93%E3%81%86%E3%81%97%E3%81%A6%E5%85%8B%E6%9C%8D%E3%81%97%E3%81%9F-%E3%83%9F%E3%82%A3-ebook/dp/B07JVF3DP4)より引用）

## 育休中に困ったこと

### 寝返りでの窒息
育休開始直後が、ちょうど寝返りを始めたくらいだったので、自分たちが就寝中に窒息しないか心配でした。
![スクリーンショット 2019-12-22 23.13.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539285/9c086a37-09f0-8014-c1fc-3ff81bb23d66.png)
(消費者庁 [「第2回子供の事故防止 関係府省庁連絡会議」 資料](https://www.caa.go.jp/policies/policy/consumer_safety/child/children_accident_prevention/pdf/children_accident_prevention_161102_0002.pdf)より引用)

市販のベビーモニター購入も考えたのですが、次の理由から子供が寝返った時に電話をかけてくれるベビーモニターを作ることにしました

1. 開発難易度が低そう
1. 必要な時期が限られる
1. 子供が寝返った時に電話をかけてくれるベビーモニターは販売されてなさそう

### 泣き止まない
長時間の泣きに対して物凄くストレスを感じました。理系なので「何が原因？」と考えたりするんですが、理屈じゃないんでしょうね。

そんな中、奥さんがPOISONをかけると泣き止むという動画([ポイズンで泣きやむ赤ちゃん](https://www.youtube.com/watch?v=KcIoMsMeLPA))を見つけてきたので、うちの子供にも試してみたところ効果覿面！ただ、泣いた子供を抱っこし、手が塞がった状態で曲をかけるのは辛かった為、Google Homeみたいに `ポイズンをかけて` と声をかけると曲が流れる機能を作りました。

PS：世代なのか、アキラより反町隆史の方が好きですね。

## ベビーモニタ（見守りカメラ）
就寝中に子供が寝返りをすると、携帯に着信がくるようにしました。
動きの検出には `motionEye`、電話発信は `Twilio` を活用しました。

1. motionEye のインストール
    * 公式
        * [GitHub](https://github.com/ccrisan/motioneye/wiki/Install-In-Docker)
    * 前提
        * Rasbperry Pi 3 へ Raspbian をインストール済み
        * docker をインストール済み
        * カメラが /dev/video0 で認識できていること
    * インストール&起動
        * 公式通り下記コマンドを実行
        
            ```
            docker pull ccrisan/motioneye:master-armhf
            docker run --name="motioneye" \
            -p 8765:8765 \
            --hostname="motioneye" \
            -v /etc/localtime:/etc/localtime:ro \
            -v /etc/motioneye:/etc/motioneye \
            -v /var/lib/motioneye:/var/lib/motioneye \
            --restart="always" \
            --detach=true \
            --device=/dev/video0  　# 忘れないように注意
            ccrisan/motioneye:master-armhf
            ```
    * 起動確認
        * `http://{ラズパイのIP}:8765` へアクセス
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539285/54f52ad3-3740-9954-1efe-4edd78d192a8.png)

1. Twilio のインストール
    * 公式
        * [GitHub](https://github.com/twilio/twilio-python)
        * [DockerHub](https://hub.docker.com/r/twilio/twilio-python)
    * 前提
        * Rasbperry Pi 3 へ Raspbian をインストール済み
        * docker をインストール済み
    * twilio-python インストール
        * 公式のDokcerイメージが動かず、`shebang` がないのが原因ぽい
            * [コンテナが起動した瞬間に死ぬ](https://blog.sky-net.pw/article/94) 
            
            ```
            pi@raspberry:~ $ docker pull twilio/twilio-python
            pi@raspberry:~ $ docker run -it --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp twilio/twilio-python python test.py
            standard_init_linux.go:178: exec user process caused "exec format error"
            ```
        
        * 公式のDockerfileをcloneしてきて、`shebang` を追加し、ビルド
         
            ```
            pi@raspberry:~ $ mkdir twilio
            pi@raspberry:~ $ cd twilio
            pi@raspberry:~/twilio $ git clone https://github.com/twilio/twilio-python
            pi@raspberry:~/twilio $ cd twilio-python
            pi@raspberry:~/twilio/twilio-python $ cp -ap Dockerfile Dockerfile.org
            pi@raspberry:~/twilio/twilio-python $ vi Dockerfile
            pi@raspberry:~/twilio/twilio-python $ diff Dockerfile Dockerfile.org 
            1,2d0
            < #!/usr/bin/python
            < 
            pi@raspberry:~/twilio/twilio-python $ docker build -t noriharu3/twilio-python .
            ```
        
        * 発信API作成
            * 参考：[通話やSMSが送れる無料API「Twilio」](https://qiita.com/mosin_nozomi/items/d30811022f1a19e620e0)
        
            ```
            from twilio.rest import Client
            
            account = "ACXXXXXXXXXXXXXXXXX"
            token = "YYYYYYYYYYYYYYYYYY"
            client = Client(account, token)
            
            call = client.calls.create(to="9991231234",
                                       from_="9991231234",
                                       url="http://twimlets.com/holdmusic?Bucket=com.twilio.music.ambient")
            print(call.sid)
            ```
        * 動作確認
        
            ```
            pi@raspberry:~/twilio/twilio-python $docker run -it --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp noriharu3/twilio-python python call.py
            jfeogrehgerjgewamfeomfe # レスポンス受け取り次第、電話に着信がある
            ```
    
1. 動きを検知してから電話へ発信する
    * ホストの docker.sock (/var/run/docker.sock) をマウントし、motioneye コンテナを起動
        * 参考：[コンテナからコンテナを操作する](https://blog.nijohando.jp/post/docker-in-docker-docker-outside-of-docker/)
        
            ```
            pi@raspberry:~ docker run --name="motioneye" \
                -p 8765:8765 \
                --hostname="motioneye" \
                -v /etc/localtime:/etc/localtime:ro \
                -v /etc/motioneye:/etc/motioneye \
                -v /var/lib/motioneye:/var/lib/motioneye \
                -v /home/pi/twilio:/home/pi/twilio \    # 発信APIをマウント
                -v /var/run/docker.sock:/var/run/docker.sock \    # ソケットをマウント
                --restart="always" \
                --detach=true \
                --device=/dev/video0
                ccrisan/motioneye:master-armhf
            pi@raspberry:~ $ docker exec -it motioneye /bin/bash
            root@motioneye:/# curl -sSL https://get.docker.com | sh # dockerインストール

            # commit して image 化しておくと、あとで便利
            ```
    * motioneye コンテナから、twilio-python コンテナを起動

        ```
        root@motioneye:/# docker run -it --rm -v /home/pi/twilio:/usr/src/myapp -w /usr/src/myapp noriharu3/twilio-python python call.py
        eewljgriogreqo    # レスポンス受け取り次第、電話に着信がある
        ```
    * motioneyeで動作検出時に、発信APIを実行するように設定
        * 設定画面で「Motion Notification > Run A Command」をオンにし、Command に実行コマンドを設定
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539285/bf15147a-e120-ea39-41ab-8516d6f59564.png)
    * 動作確認
    <blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/AOT1JpKAZF">pic.twitter.com/AOT1JpKAZF</a></p>&mdash; noriharu3 (@noriharu31) <a href="https://twitter.com/noriharu31/status/1208768630566973442?ref_src=twsrc%5Etfw">December 22, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## POISON
`ポイズンをかけて` と話すと、曲が流れるようにしました。

* Google Assistant SDK のインストール
    * 公式
        * [Google Assistant SDK](https://developers.google.com/assistant/sdk/guides/library/python/embed/setup?hardware=rpi)
    * 前提
        * Rasbperry Pi 3 へ Raspbian をインストール済み
        * 高性能なマイクが設定できていること
            * 筆者は今回 `ReSpeaker 2-Mics Pi HAT` を使用しました
    * インストール
        * 公式の手順通りやれば問題ありません。長いので割愛します。
    * サンプルの動作確認
    
        ```
        pi@raspberry:~ $ source env/bin/activate
        (env) pi@raspberry:~ $ googlesamples-assistant-hotword --project-id {projectId} --device-model-id {modelId}
        ```

    * `ポイズンをかけて` というと、POISONを流すように `hotword.py` を修正
         
        ```
        def main():
            parser = argparse.ArgumentParser(
                formatter_class=argparse.RawTextHelpFormatter)
                ...（省略）
                for event in events:
                    if event.type == EventType.ON_START_FINISHED and args.query:
                        assistant.send_text_query(args.query)
        
                    ### 追加コード start
                    if event.type == EventType.ON_RECOGNIZING_SPEECH_FINISHED:
                        # 言葉に `ポイズン` が含まれている時
                        if("ポイズン" in event.args['text']):
                            subprocess.call("aplay --device=hw:0,0 POISON.wav", shell=True) # 音楽を流す
                            assistant.stop_conversation() # 会話を終了
        
                    ### 追加コード end
                    
                    process_event(event)
        
        if __name__ == '__main__':
            main()
        ```
    * 動作確認
    
        ```
        (env) pi@raspberry:~ $ googlesamples-assistant-hotword --project-id {projectId} --device-model-id {modelId}
        ```
        * 著作権的に、曲が流れるまでの動画です
    <blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/n3dlbWKQcH">pic.twitter.com/n3dlbWKQcH</a></p>&mdash; noriharu3 (@noriharu31) <a href="https://twitter.com/noriharu31/status/1208769941060481024?ref_src=twsrc%5Etfw">December 22, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>