#wedding-sに向けてTwilioでお祝いのメッセージを集めた

 #wedding-sは、@kei-s と @yuca の結婚パーティ。夏に二人と食事をしたときに「二次会とかやんないんすかー、人生で人呼びつけられるのそんなにないっすよ」ってくだ巻いたら結婚式翌週のパーティの幹事のようなものになっていた。僕も葬式くらいは灰になるときに人を呼びつけたい。

 幹事をワンマン不安になってすぐに @june29 と @darashi に泣きついて何をやるかとか話して、そこからいっぱい助けられて先週末無事に会が終了した。

 コンテンツとしては

  • 新婦の思っていること*1を書いたテストコード(Expectedが見えないRSpec)に全部グリーンになるまで新郎が実装を書く新郎新婦初めてのTDDによるペアプログラミング

というのを一番やりたかったけれど、成功のイメージが一切思い描けなくてちゃんと没にした。

 ちょうどその頃WebPayのサポート周りの改善で、「電話での問い合わせ」を録音してスタッフ全員で共有していて、メールで投げつつ電話してきたり、電話したけど後でメールしますねみたいなユーザが結構居て、僕たちとユーザの間で無駄なやり取りが発生してユーザに余計な迷惑をかけるのを防ぐような対策をしていて、その電話の録音や通知の仕組みのところに @keikubo がTwilioを使っていたというのが着想で、Twilioを使って、結婚した二人へのお祝いのメッセージを電話で集めることにした。

wedding-s-messenger

 Twilioは電話がかかってくると指定したURLにXMLを見にきてくれて、Twimlで定義されているフォーマットでレスポンスすると言う事を聞いてくれる。

 シーケンス制御を組み立てる感じで分岐を作って

  • (1) 電話を受け付けてウェルカムなメッセージを流す
  • (2) メッセージ入力方法の説明を流す(終わったら#押してねみたいな)
  • (3) 発信音を鳴らして録音を実施する(#で終了する)
  • (4) 録音したメッセージを流すよと宣言して流す
  • (5) このメッセージで良かったら"1"を押せ、もう一度録るなら"3"を押せと促しつつ入力を待つ
  • (6) 入力された数字が、"1"なら(7)へ、"3"なら(2)へ、それ以外なら(5)へリダイレクト
  • (7) お礼を流して電話を切る

 Twilioがtwimlを見に来てくれるときは、GET/POSTでよしなにパラメータ付きでやってくるので、やってくる先をSinatraによるウェブアプリにしておいて、やってくるメッセージの情報をよしなにデータベースに保存するようにした。この仕組みを会の名称に合わせてwedding-s-messengerと名付けた。

上のシーケンスまわりのソースは概ねこんな感じ

そして、アプリ側では管理画面を作っておいて、メッセージの削除とかダウンロードとかを行えるようにしておいた。

 ちなみに、これの電話番号は結婚式やインターネットで新郎新婦に分からないように撒いておいて、新郎新婦の電話番号から万が一かかってきたら別ルートに分岐するという対策もとっていた。

 一番大事だったのは受話器に流すメッセージで、テスト用には僕が自分で喋った声を入れて流していたのだけれど、ちゃんと喋る力を持った @mamipeko の声に差し替えた途端に栄えたし、これは本当に価値があるのかと不安なプロダクトに対して自信を持てて、コードよりも価値があった。Retinaディスプレイかと思った。
 特に自分の声だと、なんだろ、ホテルのユニットバス系のトイレで用を足してて自分の股間が鏡越しに見えるような虚しさに近かった。

 僕のブログでその声を聞けるというのはどうしようものかと思っていたらご本人が公開してくれたので良かった。MacbookPro 13 inch Retinaも薄く軽くなったことだし。


 新郎新婦の日頃の行いもあって(メッセージを入れることを快く引き受けてくださった皆さんありがとうございました)、200件近い録音が行われたけどこれで負担額は$5そこそこ(もちろんかける側も電話代を負担しているが)
当日集まったメッセージの「けいさん」「ゆかさん」「おめでとう」を切り抜きまくって重ねまくった音声を流しつつ、刻印を入れたiPod Shuffle(シルバーだと結婚感ある)に全ての音声を入れてお渡しできた。

 @darashi が「これはもう祝電2.0ですよ〜」と事前準備で会った時か僕の夢かで言っていたのがとても印象的だった。

 この仕組みで、少なくとも幸せになれるユーザが世に居るのが分かるので、いい感じにASPとかにしたりするのはどうだろう。今回はサプライズなやつだったけど、電報感覚でまー会場に届いてますっていうのに声が追加されるのは素敵なことだと思う。もうあるのか結婚したことがないからよくわからない。

あまり関係ないけどgit-subtreeが便利

にもあるように本会の準備の進行に主婦と一緒にGithubを使っていたのだけど、このwedding-s-messengerがリポジトリの中に/messenger というディレクトリをルートとするアプリとしてpushしていて、これではHerokuにデプロイするのが不便なのではという時にgit-subtreeが最適だった。

git subtree push --prefix messenger heroku master
で、messengerディレクトリがルートなアプリをHerokuにデプロイできる。

 あと、HerokuだとRack appがお休みなさるので、ずっと監視用のリクエストを叩き続けていた。

*1:ありそうなのは子どもが何人だとか