LINE Beaconを持ったアイドルを探し回るイベント

#概要
地図と「通知」だけを頼りに、アイドルを探す。見事、発見したら一緒に写メが撮れる――そんな宝探しみたいなイベントが元旦の歌舞伎町で行われました。

実施したのは、原宿を拠点に活動するアイドルグループの・・・・・・・・・。
LINE Beaconを持った彼女たちを、オタクがスマホ片手に探し回ります。LINEに「そばにいるよ」と通知がくれば、アイドルが近くにいる証拠。画面と現実世界を交互ににらめっこする姿は、ポケモンGOさながらです。

LINE Beacon。LINEが開発した、10m圏内に信号を発信する装置です。
この信号を捉えることで「Beaconの10m圏内に近づくと、LINEに通知が届く」機能が実現しました。
あとは、Beaconをアイドルに持たせるだけ。
「アイドルがそばにいる」と教えてくれるLINEアカウント、0ズレの完成です。

<img width="1041" alt="スクリーンショット 2017-01-04 16.44.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/133133/9eac3938-2392-ff1a-4f4a-aed7360213ad.png">

#・・・・・・・・・とは
##「個性を剥ぎ取ろうと思っている」
・・・・・・・・・とは、アイドグループです。「どっつ」や「てんきゅー」などと呼ばれますが、正式な呼称はありません。各々が好きな読み方をすればいいというコンセプトです。

メンバーは・と称されます。・に個人名はありません。[公式Twitter](https://twitter.com/dotstokyo)におけるメンバーのツイートにも個々人の署名はなく、「文章からにじみ出る個性で見分けろ」というスタンス。衣装はサングラスのようなもので顔が隠れたもの。

その意図について、運営はこう説明しています。

>個性を剥ぎ取ろうと思っているんですよ

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">For Tracy Hyde『Film Bleu』リリースパーティお呼びいただきありがとうございました🙇‍♀️<br><br>応援に来てくれた人も、観てくれた人も、鼓動を感じてくれた人も、みんなみんなありがとう😊💭<br><br>もっともっと頑張るので、これからも・ちゃん達をよろしくお願いします🙏💗 <a href="https://t.co/A0BlNKSVWX">pic.twitter.com/A0BlNKSVWX</a></p>&mdash; ・・・・・・・・・ (@dotstokyo) <a href="https://twitter.com/dotstokyo/status/818446326576750593">2017年1月9日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

##常に纏えるアイドル
HeartSyncというアプリを使うと・の今の心拍数がわかります。また、androidから[公式サイト](http://dots.tokyo)にアクセスし・をクリックすると、リアルタイムの心拍に合わせてスマホが振動します。

運営のインタビューからの引用
>このスマホは見るものではなく触るためのガジェットです。触覚的に、直で推しの実体が、編集の入らない生そのものがやってくる。

>僕たちはモニター抜きでアイドルと遠隔でつながることができるんじゃないかと考えていて。メディア環境の変化に応じてアイドルも変化してきた歴史があって、僕たちも動画サイトとSNS以降の対応すべき情報環境、つまりIoT時代や「ポケモンGO!」=都市の風景を拡張するAR時代の先に行きたいと思っています。言い方が難しいんですけど「今会えるアイドル」じゃなくて「常に纏える(まとえる)アイドル」を作りたいんです。

・・・・・・・・・のコンセプトが気になった方は引用元の[インタビュー](http://ototoy.jp/feature/2016082303/3)や[過去のオーディションHP](http://tsukurou.tokyo/audition/)を読んでみてください。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【定期ツイート】<br>①1ツイートで分かる😺<br>「型破りな王道アイドル」<br>・・・・・・・・・<br><br>▶ライブはいつどこである？各現場の見どころは？<br>▶そもそもどんな現場？特権って？<br>▶物販は？五感チェキって？<br>▶HPはどうなってるの？推し登録？メンバーの鼓動？HeartSyncって？ <a href="https://t.co/zpmwRFqmhl">pic.twitter.com/zpmwRFqmhl</a></p>&mdash; ・・・・・・・・・運営 (@tokyo_tsukurou) <a href="https://twitter.com/tokyo_tsukurou/status/816545761991147520">2017年1月4日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
#イベントのレポート
**1/1 13:00**
閑散とした歌舞伎町。お正月の昼ということもあり、あまり怖い雰囲気はありませんでした。

![IMG_2347.JPG](https://qiita-image-store.s3.amazonaws.com/0/133133/d0f261cd-6450-273f-5457-cf4585564e45.jpeg)

**13:20**
イベント開始。参加人数は・が5名、オタクが7名。・は2名と3名の2グループに別れる。前者はBeaconを1個、後者は2個所有。
この地図のエリア外には出ないというルールがあるため、見つけるのはそれほど難しくはないはず。

![IMG_2337.JPG](https://qiita-image-store.s3.amazonaws.com/0/133133/1035f593-1b71-ae19-5316-58aed502113c.jpeg)

**13:30**
ずっと「通知こないかなー」とiPhoneとにらめっこしながら、ウロウロ歩き回る。
なかなか届かない通知。
そんなとき、もっとも恐れていた事態が！

<img width="500" alt="スクリーンショット 2017-01-04 16.50.25.png" src="http://i.imgur.com/mjjWcyE.png">

**通知がくるまえに見つけちゃった……(´・ω・｀)**

「そういうことじゃないんだよ！」と嘆くオタクのAさん。
この後も、2人グループのBeacon信号は「僕のiPhoneには」届きませんでした(まとめの項にて詳述)。

**13:41**
企画倒れになるのではと戦々恐々していた、そのとき！

<img width="495" alt="スクリーンショット 2017-01-04 17.00.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/133133/e8328587-d733-b45a-7fee-bf58dc406cf8.png">

ｷﾀ━━━━━m9( ﾟ∀ﾟ)━━━━━ｯ!!!!! 

<img width="500" alt="スクリーンショット 2017-01-04 17.17.46.png" src="http://i.imgur.com/k1qw3Zg.jpg">

ぞくぞくと・を発見するオタたち

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">街を歩いていたら・ちゃんたちに会いました。 <a href="https://t.co/u0ye6PFeN0">pic.twitter.com/u0ye6PFeN0</a></p>&mdash; しんちゃーーーーーーーーん (@ocraliocralen) <a href="https://twitter.com/ocraliocralen/status/815435103589441536">2017年1月1日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ドン引き / 🐕に夢中 <a href="https://t.co/lIVzwDZxEO">pic.twitter.com/lIVzwDZxEO</a></p>&mdash; ペ・ドロ™ (@zYg2_PEDRO) <a href="https://twitter.com/zYg2_PEDRO/status/815496873490288641">2017年1月1日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

**14:30**
終了

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">『・ちゃんを見つけて年始の初写メを撮ろう！』イベント、終了しました！ありがとうございました🐔🌸<br>みんな探してくれましたか〜??<br><br>このあとはライブです 楽しみにしてて下さい(^-^) <a href="https://t.co/YyZ1TCtvUC">pic.twitter.com/YyZ1TCtvUC</a></p>&mdash; ・・・・・・・・・ (@dotstokyo) <a href="https://twitter.com/dotstokyo/status/815445252022538240">2017年1月1日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

#実装
コールバックRubyプログラムを叩いて、あらかじめデータベースに登録しておいたBeacon機種ID(hwid)別の返信メッセージを返します。

```ruby:callback.rb
require 'sinatra'
require 'line/bot'
require 'pg'

def client
  @client ||= Line::Bot::Client.new { |config|
    config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
    config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
  }
end

post '/callback' do
  connection = PG::connect(:host => ENV["POSTGRESQL_HOST"], :user => ENV["POSTGRESQL_USER"], :password => ENV["POSTGRESQL_PASSWORD"], :dbname => ENV["POSTGRESQL_DBNAME"], :port => "5432")

  begin
    body = request.body.read
    timestamp = Time.at(JSON.parse(body)["events"][0]["timestamp"]/1000.0)
    user_id = JSON.parse(body)["events"][0]["source"]["userId"]
    event_type = JSON.parse(body)["events"][0]["type"]

    signature = request.env['HTTP_X_LINE_SIGNATURE']
    unless client.validate_signature(body, signature)
      error 400 do 'Bad Request' end
    end

    events = client.parse_events_from(body)
    events.each { |event|
      case event
      when Line::Bot::Event::Beacon
        hwid = JSON.parse(body)["events"][0]["beacon"]["hwid"]
        result = connection.exec("select idol_name,idolgroup_name,reply_message from beacon where hwid=$1",[hwid])
        idolgroup_name = result[0]["idolgroup_name"]
        message = {type:'text',text:"0ズレ！#{idolgroup_name}が30m以内にいるよ！「#{result[0]["reply_message"]}」"}

        result_insert = connection.exec("insert into event (user_id,timestamp,event_type,idolgroup_name,hwid,reply_message) values ($1,$2,$3,$4,$5,$6)",[user_id,timestamp,event_type,idolgroup_name,hwid,message[:text]])
        client.reply_message(event['replyToken'], message)
      end
    }
  ensure
    connection.finish
  end
    "OK"
end
```
#まとめ
##課題
今回Beaconを3つ使ったのですが、僕のiPhoneはそのうちの1つ(3名グループのBeacon)からしか、信号を受け取りませんでした。
いっぽう、すべてのBeaconから信号を受信した方もいました。
事前のテストでは僕もすべてのBeaconから受信できていたので、何が原因で阻害されてしまったのかを、特定していきたいです。

##今後
プライバシーや信号の受信、ユーザーが使うまでの設定が多いなど課題の多いLINE Beaconですが、今回のように1.短時間で 2.場所を限定し 3.参加者に利用する動機づけがされた イベントでは有用だと思います。

今後もBeaconのワクワクする使いみち探っていきます。