レコチョク ハッ歌祭で入賞しました。「カオチョク！」

チームメンバーの１人がイベント終わってすぐに振り返りの投稿をしていて偉いなーと思ったので、振り返りのポエム

## 「レコチョク ハッ歌祭」とは？
`レコチョクハッ歌祭は、人と音楽の新しい関係をデザインする、開発者のためのお祭りです。`
その名前の通りレコチョク主催のハッカソンイベントです。音楽を主題にアプリとかプロダクトをつくろう！なコンセプト
スケジュールは、火曜日夜のアイデアソン・チームビルドと、日曜日を全日使ったハッカソンの２日構成でした。
詳しくは → https://form.pasonatech.co.jp/m/recochoku/


## 作ったもの「カオチョク」
![logo.png](https://qiita-image-store.s3.amazonaws.com/0/7132/7e8793c2-21cd-e3bd-3e5f-f47ff696708b.png)
https://kaochoku.ozonicsky.com/ （←そのうち消します）

`その人の顔で聴いてる音楽の傾向がわかるんじゃないか`という発案者のアイデアを下敷きに、
「**顔認証でその人の好きそうな曲をレコメンドしてくれるプロダクト**」を作りました。

アプリでは１度っただけで飽きられてしまう、インパクトが薄いといった理由で
サイネージ広告にしたいと言い少し方向を変えさせてもらいました。
とは言ってもディスプレイは用意できないので、サイネージ感を生み出すために物理ボタンを作っただけ。


## 「カオチョク」の仕組み
![Artboard 1.png](https://qiita-image-store.s3.amazonaws.com/0/7132/bd2615b8-dd03-31ba-1592-fa3de2ef15e5.png)

基本的にはこんな感じの構成でした。
[FACE++ API](http://www.faceplusplus.com/)で画像を送ると、登録されているユーザー画像との一致度が取得できるので、DBでひも付けているユーザーの楽曲情報を返すだけ。


自分が担当した部分は

- 物理ボタン
- フロントエンド、マークアップ
- Rails

の部分でした。

### 物理ボタンについて
最初はゲームセンターにあるポップンミュージックのような、大きめで*無駄に触りたくなる*ボタンをイメージしていましたが、結構高い・・・。
[http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4JZS](http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4JZS)
買いに行く時間も足りなかったため自作することにしました。

![Artboard 2.png](https://qiita-image-store.s3.amazonaws.com/0/7132/10ea7f81-76d0-c74b-95a4-b04b5c62d293.png)
Arudinoをキーボードとして認識させブラウザにキーボードイベントを送ります。


#### ボタンが押されたらArduinoでキーボードイベントを送る
```cpp:arduino
#include <Keyboard.h>

int pin = 8;
int key_enable = 1;

void setup() {
  pinMode(pin, INPUT_PULLUP);
  Keyboard.begin();
}
 
void loop() {          
  if (digitalRead(pin) == LOW) {
      key_enable = 0;
  } else {
    if (key_enable == 0) {
      Keyboard.press(32); // space key
      delay(50);
      Keyboard.releaseAll();
      key_enable = 1;
    }
  }
}
```

コード的に難しいことは何もない。

#### 電子工作
前日にボタンっぽいものを百均で買ってきました。

![IMG_0092.JPG](https://qiita-image-store.s3.amazonaws.com/0/7132/9e1b78fa-fbb7-6c91-fbf0-9ff708586b94.jpeg)

##### ***『ザ・スポンジ！』***


![IMG_0095.JPG](https://qiita-image-store.s3.amazonaws.com/0/7132/1a776735-6b09-6de8-bf21-66a92633a62f.jpeg)

ブレッドボードに組んだものをホットメルトで動かないようにして、
両面テープとセロハンテープで固定するという荒業

光らせたかったけど材料と時間が足りないので諦めた

タクトスイッチが３つあるのは、バランスと触感のためで使ってない

#### 工作

![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/7132/613013c1-55f5-685a-8413-6394a71c5983.png)

たまたま箱ごと持ってきていたスピーカーの箱の中にArduinoを隠して、外れないようにテープで固定する

裏にケーブルを通す用の穴をあけたら

![名称未設定2.png](https://qiita-image-store.s3.amazonaws.com/0/7132/04995f6a-07a1-8935-ccde-2a83574ee2fd.png)

**まあ、なんということでしょう！**

### フロントエンド

HTML5の`getUserMedia`でカメラから映像を取得して、
[https://github.com/auduno/clmtrackr](https://github.com/auduno/clmtrackr) を使い人の顔があるかどうか、を判定しています。
顔を検出するとボタンがEnableになり、
ボタンを押したらその映像のフレームをbase64形式の画像で取得してFetch APIでRailsに投げて保存という流れ。

予定外だったのがHTML5の`getUserMedia`がhttps環境じゃないと使えなくなっていたこと、
あってよかった`Let's Encrypt`、半年前だったら積むところでした。検証大事。


## UXまわりについて

### ハードまわり

プレゼン時のセッティングはこんな感じでした。
![12800140_984748141617924_3761564463422305247_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/7132/4204e4d2-8cf2-4c91-a30b-7cb42df6212f.jpeg)

今回、MacBookでChromeを開けば使えるものでしか作っていないのですが、
コンセプトを伝えるためにスピーカーなどいろいろ配置しています。

つまり、

![スライド1.jpg](https://qiita-image-store.s3.amazonaws.com/0/7132/3b9dedb1-e267-5a9b-dd0f-17da1849ad0c.jpeg)

アフォーダンスや視線の誘導など、少し大げさにするために無駄に配置しました。

### ソフトまわり

実際にやってみたらAPIのレスポンスが早すぎたため、解析してる感を出すために、あえて表示を待たせるようにしています。５秒間くらい解析中のアニメーションを表示させ続けました。

![Bitmap.png](https://qiita-image-store.s3.amazonaws.com/0/7132/75fb429e-0487-866b-782a-fb6bd6eac9b4.png)

それに加えてボタンを押したときやシャッター音のタイミングなど色々な場所に
遅延させる処理を散りばめ、できるだけ自然に見せられるようにがんばった

```js:javascript
setTimeout(function(){...}, 3000);
```

もしくは

```rb:ruby
sleep 4
```

アニメーションとかもう少しつけたかったけど、まったく間に合わなかった・・・


## プレゼン
プレゼンターではありませんでしたが、

- トップバッターで、発表が始まる前にセッティングできた
- 直前に、作ったボタンでパワポが操作できることがわかった
- デモで２回同じ曲が表示された（その前フリと、フォローが良かった）

色々な偶然が重なった結果、思った以上になって良かったです。


## おわり
実のところ、バックエンド側のつなぎ込みが終わっていなくて３曲しか準備がありませんでした。（３分の１で同じ曲）
自分もUIをマークアップしきれなかったりで、作りきれなかったのは、まあハッカソンなので仕方がないね・・・
ですが、スケジュール感がなかったのと、集中したときにまわりが見れなくなっちゃうのは考えどころ。

サイネージっぽくしたいっていうのが伝わったり、
広告の人に受け入れてもらえたりで、自分が取りたいと思っていたポイントで取れたのでその点は良かったです。

個人的には、インターンやフィジ部で教わったことを絞り出せて次に繋げられるイベントになりました。やっぱりたまには本気で遊ばないと死んでしまう。
ハッカソン制作最中に、別のサービスに派生できそうなものを思いついたので、作りたいなーと思っているところ



ということで、
チームメンバーのみなさん、運営のみなさん楽しませて頂きました！ありがとうございました！