「あの日止まったままの時計」がまた動き出してしまわないか心配すぎた。

こんちには。

「あの日止まったままの時計」がまた動き出したりしないかが気になって眠れない夜もあるので、
SkyWayでWebRTC的に遠隔監視できるって噂を聞いて試してみました。

注目してほしいポイントは以下ですが、この記事は<b>技術記事です。</b>

* あの日とは
* なぜ止まったままにしてあるか。
* 無事監視できるようになったのか。


# 私を取り巻く環境(開発環境)
* MacBookPro2018
* RaspberryPi3
  * OS:Raspbian
  * SD:32GB
  * RasPiカメラモジュール（非正規品だと思います。）
* あの日止まったままの時計

#実物
主役はこのように、あの日止まったままの時計です。一刻も刻む様子はありません。
まるで、壁に落書きをしたかのような時計です。私のマイフェイバリットお気に入りです。

※iPhoneによる撮影です
[![Image from Gyazo](https://i.gyazo.com/d0243014ef3bb2f7dba9488841e7e661.gif)](https://gyazo.com/d0243014ef3bb2f7dba9488841e7e661)


もちろん心配性な私は、電池を抜いています。
![56269979_422909941799994_3104073598982160384_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/214681/6d9ce19e-ec9c-1e5f-68a5-14af61441072.jpeg)

そして、これもあの日止まったままと言ってもよいレベルのラズパイとカメラモジュールです。この子は動かしたいと思います。
![56165201_2176595309095010_2041617677725728768_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/214681/f01c484c-5302-c7d4-a2bf-e886f56ce6f2.jpeg)

#RasPiにOSインストール
OS入れて遊んだ記憶があるのに、SDカードの中身は空っぽでした。
そんな私に手を差し伸べるかのような記事があったので、参考にさせてもらいました。

 [Raspberry Pi 3にRaspbianをインストール(Mac OS X を使用)](https://qiita.com/onlyindreams/items/acc70807b69b43e176bf)


#SkyWayを使う
SkyWayをはじめる系の記事はたくさんあったので、とてもスムーズに環境構築が進みました。
ハンズオンの資料がそのまま入門書になってくれていました。感謝です。

[SkyWay WebRTC Gatewayハンズオン](https://qiita.com/nakakura/items/faeb4f6df82677139761)


#順調に進む
とても順調です。楽々に遠隔監視できそうです。
安心して眠れる日も近づいてきました。
気がつけばラズパイの扱いにも慣れてきました。
時計が止まっているので、気がついたら外は明るくなっていました。


#SkyWayを試すための環境構築
ハンズオンの資料に基づき、準備は整った。
ラズパイの方でrubyでプログラムをコピペってきたやつをいじって、中身は理解したし、
必要なものは、ホームディレクトリに取り合えず全部置いちゃうぞ！ラズパイだからゼロキロカロリーだ！！
Mac側でサーバ動かす準備も完了だ！監視画面もいけるぞー！


#時は訪れた
１コ目のターミナルでWebRTC Gatewayを起動！

```
$ ./gateway_linux_arm
```

２個目のターミナルでメインプログラムを起動だ！
環境変数にAPIキーを入れて呼び出したほうが安全だから、exportコマンドするよ。

```
$ export API_KEY=私のAPIキーをここに入れた
$ ruby webrtc_control.rb PEER_ID
```

よーし！あとはMac側でサーゔぁっ！？

えっ。400 Bad Request？
えっ。403 Forbidden？


[![Image from Gyazo](https://i.gyazo.com/523c8687b965e11266eff5ed7707fe42.jpg)](https://gyazo.com/523c8687b965e11266eff5ed7707fe42)



#愚かな自分との戦い
まーまー。理解するために色々いじっちゃったから、冷静に調査すれば自分の愚かな凡ミスに気づくさ。
エラーになっている箇所はどうやら、requestの部分っぽいな。仕様をみてみよう。

```
|  /peers: |
|:--|
|     post: |
|       tags: |
|         - 1.peers |
|       summary: Peerオブジェクトを生成し、SkyWayサーバと接続します |
|       description: Peerオブジェクトを生成し、SkyWayサーバと接続します。SkyWayサーバと正常に接続できた場合のみ201を返します。 |
|       operationId: peer |
|       consumes: |
|         - application/json |
|       produces: |
|         - application/json |
|       parameters: |
|         - in: body |
|           name: body |
|           description: SkyWayサーバへアクセスするための情報を指定します |
|           required: true |
|           schema: |
|             $ref: '#/definitions/PeerOptions' |
|       responses: |
|         '201': |
|           description: Created |
|           schema: |
|             $ref: '#/definitions/PeerResponse' |
|         '400': |
|           description: Invalid input |
|           schema: |
|             required: [ "command_type", "params" ] |
|             properties: |
|               command_type: |
|                 type: string |
|                 example: "PEERS_CLEATE" |
|               params: |
|                 type: object |
|                 required: [ "errors" ] |
|                 properties: |
|                   errors: |
|                     type: array |
|                     items: |
|                       type: object |
|                       properties: |
|                         field: |
|                           type: string |
|                           example: key |
|                         message: |
|                           type: string |
|                           example: "key field is not specified" |
|         '403': |
|           description: Forbidden(key, domainが間違っている場合) |
|         '405': |
|           description: Method Not Allowed |
|         '406': |
|           description: Not Acceptable |
|         '408': |
|           description: Request Timeout |
```

なるほど、`400 Bad Request`は、とにかくなんかそもそも違うことになっているんやな。
メインの`webrtc_control.rb`を見返してみよう。

```webrtc_control.rb
if __FILE__ == $0
  if ARGV.length != 1
    p "please input peer id"
    exit(0)
  end
  # 自分のPeer IDは実行時引数で受け取っている
  peer_id = ARGV[0]

  # SkyWayのAPI KEYは盗用を避けるためハードコーディングせず環境変数等から取るのがbetter
  skyway_api_key = ENV['']
  # SkyWay WebRTC GatewayにPeer作成の指示を与える
  # 以降、作成したPeer Objectは他のユーザからの誤使用を避けるためtokenを伴って操作する
  peer_token = create_peer(skyway_api_key, peer_id)
  # WebRTC GatewayがSkyWayサーバへ接続し、Peerとして認められると発火する
  # この時点で初めてSkyWay Serverで承認されて正式なpeer_idとなる
  media_connection_id = ""
  process_id = ""
  th_onopen = listen_open_event(peer_id, peer_token) {|peer_id, peer_token|
    (media_connection_id, process_id) = on_open(peer_id, peer_token)
  }
```

あ、見つけた。skyway_api_keyの変数にAPI_KEYを環境変数から持ってくるのに、`ENV['API_KEY']`になってない！
なんでこんなことに？まぁ直したからOK！

#駄菓子菓子（ダガシカシ）

`403 Forbidden`くん。キミは正直お手上げだ、うん。
`Forbidden(key, domainが間違っている場合)`すごく確認した。絶対間違ってない！（多分）
それに丸コピしてもう一度手順をやり直してもダメだった。
きっと日頃の行いが悪かったんだ。戒めよう。

#どなたか教えてください
ここで時を止めることになるとは。
置き場のない気持ちとラズパイを手に、止まった時計を眺める。
キミを遠隔で監視できたら......

※ラズパイcameraで撮影
[![Image from Gyazo](https://i.gyazo.com/b57b9f2ce858b5e04d5fb8d21e2fbac4.gif)](https://gyazo.com/b57b9f2ce858b5e04d5fb8d21e2fbac4)


#今日もキミは動いていない
"動いていない"からこそ安心できるのである。
時刻を知りたいなら、画面の右上にカーソル合わせるし、本気出せばアレクサが教えてくれる。


#あの日
冬のある日、動いてたキミを信用して何度も布団にくるまった。
午前８時３５分が永遠に続いていることに気がつくその時まで......


SkyWayアドベントカレンダー2018 17日目の記事でした。
こちらもどうやらあの日で止まっていたようです。