DC4

お腹が痛い人を集計するPonpetterをリリースした。

通勤中に腹痛に襲われる事はよくあると思うのですが、
世の中には一体どれくらいお腹が痛い人が存在するのか気になり集計するWebアプリを作成しました。

Ponpetter

f:id:Yasun:20150315123956p:plain

http://ponpetter.herokuapp.com/

構成

  • Heroku
  • Redis (Redis To Go)
  • Sinatra
  • Thin
  • Eventmachine
  • WebSocket
  • React.js
  • newrelic
  • Travis-ci
    ...

ソース https://github.com/yassun/ponpetter

開発中のトピック

Redis To Go

Heroku上でRedisを使用するためのアドオンです。
無料プラン(nano)を使用する場合でもクレッジカードの登録が必須でした。   nanoはサイズが5MB、コネクション数が最大10となってます。

今回はスケジューラ用のコネクションを必ず確保したかったので、 Webアプリ起動時にスレッドを起動して常駐させる作戦をとりました。

Tweet集計スケジューラ

通常Heroku上でスケジューラを使用する場合はHeroku Schedulerを使用します。 ですが、スケジューラ利用時間もDynoの利用時間に加算されるため750時間の無料時間を超える可能性がありました。

その回避策として、Webアプリ起動時に別スレッドで動き続けるループをEventmachineEM::deferで作成し、 そこから集計スケジューラを呼び出しました。

HerokuのSinatraにバックグラウンドワーカーを詰め込んで節約

NewRelicを使用してHerokuのアイドル状態を回避

NewRelicのAvailability monitoringにサイトURLを指定することにより定期的にリクエストが来るためアイドル状態になる事を回避できます。

NewRelicの導入方法については公式を参照 https://devcenter.heroku.com/articles/newrelic#ruby-installation-and-configuration

Websocket

Heroku上でWebsocketに対応したアプリを作成する方法については公式にfaye/websocketを用いた詳細な解説とサンプルアプリがあったのでそちらを参考にしました。

https://devcenter.heroku.com/articles/ruby-websockets
https://github.com/heroku-examples/ruby-websockets-chat-demo

React.js

最初はjQueryで実装していたのですが、せっかくなので最近話題のReact.jsに変更しました。 ページ構成要素も少ないので簡単に対応できました。 グラフ描画やwebsocketの接続等のsetStateで変更させない部分について等、 まだまだセオリーが掴めてないです。

Travice CI

phantomjsのバージョン問題でReact.jsのテストが失敗する事象にとてもハマりました。

後日、解決策をQiitaに書きました。
Travis Ci上でReact.jsのプロジェクトをPhantomJSでテストした場合にFailする現象

まとめ

こんなにお腹が痛い人がいるとは思いませんでした。
かぐや姫の御門登場時にすごい勢いで増えてウケました。
よろしければトイレでツイートしてみてください!