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


2019年もあとわずかですね。
ラクス Advent Calendar 2019 の23日目を担当します noriharu3 です。

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

そもそも育休とは

子供が1歳になるまで、育児のために休業できる の制度です。

厚生労働省HPより引用)

育休中の給料は?

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

しかし、全く収入がなくなるというわけではなく、雇用保険から給付金という形でお金が支給されます。

厚生労働省HPより引用)

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

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

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

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

シンプルに嫁1人での育児が心配でした。書店で見つけた 産後うつ の本を読んでからその気持ちがより強くなりました。

Amazonより引用)

育休中に困ったこと

寝返りでの窒息

育休開始直後が、ちょうど寝返りを始めたくらいだったので、自分たちが就寝中に窒息しないか心配でした。

(消費者庁 「第2回子供の事故防止 関係府省庁連絡会議」 資料より引用)

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

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

泣き止まない

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

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

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

ベビーモニタ(見守りカメラ)

就寝中に子供が寝返りをすると、携帯に着信がくるようにしました。
動きの検出には motionEye、電話発信は Twilio を活用しました。

  1. motionEye のインストール

    • 公式
    • 前提
      • 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 へアクセス
  2. Twilio のインストール

    • 公式
    • 前提
      • Rasbperry Pi 3 へ Raspbian をインストール済み
      • docker をインストール済み
    • twilio-python インストール

      • 公式のDokcerイメージが動かず、shebang がないのが原因ぽい

        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作成

        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 # レスポンス受け取り次第、電話に着信がある
        
  3. 動きを検知してから電話へ発信する

    • ホストの docker.sock (/var/run/docker.sock) をマウントし、motioneye コンテナを起動

      • 参考:コンテナからコンテナを操作する

        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 に実行コマンドを設定
    • 動作確認

POISON

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

  • Google Assistant SDK のインストール

    • 公式
    • 前提
      • 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}