RubyとNode.jsでIFTTTみたいなものをつくる

今、個人で[mups](http://mups.xyz)というIFTTTみたいなサービスを作っています。


http://mups.xyz


IFTTTは便利なんだけど、あまり国内のサービスには対応しておらず、その点が個人的には不満だった。
その課題を解決すべく、RubyとNode.jsでIFTTTみたいなものをつくってみることにした。
あと、ここ最近ずっとAndroidアプリ開発ばかりだったので、最近のWeb周辺技術を勉強したかったという目的もあった（Rubyをちゃんと触るのは初めてだった）。

##システム構成
![mups_system.png](https://qiita-image-store.s3.amazonaws.com/0/47437/037f61a8-8c89-7961-bdd4-ed0ea8130360.png)



↑は理想図です。実際のところアプリなんてできてないし、サーバもさくらVPS一台のみ。


##mups-web
Nginx + Unicorn + Sinatraで動く普通のRuby製Webアプリケーション。
最初はRailsを使おうかと思ったけど、今までWeb開発はPHPばかりでRuby自体ちゃんと触るのは初めてだったし、それに加えて学習コストが高いと噂のRailsを1から覚えるのは大変そうだったので、軽いSinatraを採用した。
あと今回[Mashup Awards](http://mashupaward.jp/works/878)にも応募したかったということもあり、ちゃんと作り始めた時点で期限まで残り1ヶ月ほどしかなく、時間が無かったというのも大きい。
実際使ってみてSinatraは非常に取っ付き易く、足りない部分は自由に足していく感じで、柔軟に使えて良かった。

以下サイトが参考になった。
[Sinatra: README](http://www.sinatrarb.com/intro-ja.html)

あと以下本も役に立った。
[Webアプリエンジニア養成読本](http://www.amazon.co.jp/Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E9%A4%8A%E6%88%90%E8%AA%AD%E6%9C%AC-%E3%81%97%E3%81%8F%E3%81%BF%E3%80%81%E9%96%8B%E7%99%BA%E3%80%81%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%83%BB%E9%81%8B%E7%94%A8%E2%80%A6%E5%85%A8%E4%BD%93%E5%83%8F%E3%82%92%E6%9C%80%E6%96%B0%E7%9F%A5%E8%AD%98%E3%81%A7%E6%9C%80%E5%88%9D%E3%81%8B%E3%82%89-Software-Design-plus/dp/4774163678/ref=sr_1_3?ie=UTF8&qid=1414335123&sr=8-3&keywords=web%E9%A4%8A%E6%88%90)
↑の本は前にサクッとRuby勉強しようと思って買ったやつで放置してたんだけど、改めてRubyの章を読んでみると丁度Sinatraを使って学習する形になっていたので、かなり参考になった。
以下が本で使うサンプルコードのリポジトリ。Sinatra勉強するだけなら以下リポジトリのコードを見るだけで十分な気がする。
https://github.com/sugamasao/Shiori 


##mups-api
Nginx + Unicorn + Sinatraで動く普通のRuby製Web API。 
mupの保存や削除ができる。


##mups-exec
foreverでdaemon化されて動くNode.js製mup（mupはIFTTTのレシピ相当）実行モジュール。
Node.jsを採用したのは、今までに触った経験があったのと非同期処理が書きやすいから。
保存されたmupをMySQLから取得し、そのmupに定義されたデータに則って処理を非同期で実行し続ける。
mup実行処理を早く終わらせるため余分な処理はさせない方針。
mupにはランダムなグループIDが振ってあり、mups-execが複数台構成になっても、分散して処理を実行できるようになっている。



##mupsを支える技術

###Ruby関連

**[rbenv](https://github.com/sstephenson/rbenv)**
Rubyバージョン管理。

**[bundler](http://bundler.io/)**
gem管理。

**[Unicorn](https://github.com/defunkt/unicorn)**
        Rackアプリケーションサーバ。

**[Sinatra](http://www.sinatrarb.com/)**
        ミニマムなWebアプリケーションフレームワーク。 
    
**[omniauth](https://github.com/intridea/omniauth)**
        OAuthライブラリ。
    
**[ActiveRecord](ActiveRecord)**
        ORマッパー。

###Node.js関連

**[nodebrew](https://github.com/hokaccha/nodebrew)**
        Node.jsバージョン管理。

**[forever](https://github.com/nodejitsu/forever)**
        Node.js daemon化。

**[async](https://github.com/caolan/async)**
        コールバック地獄回避ライブラリ。

**[SuperAgent](http://visionmedia.github.io/superagent/)**
        HTTPクライアント。 
    

###フロントエンド関連

**[Vue.js](http://vuejs.org/)**
        今回、AngularJS等のJSフレームワークを勉強するという目的もあったけど、AngularJSもRailsと同じく学習コストが高そうだったので、Sinatraと同じく学習コスト低いと評判のVue.jsを採用した。
        Vue.jsもSinatraと同じく足りない部分は自由に足していく感じで、フレームワークというより、データバインディングするためのライブラリみたいな感じ。実際jQueryと併用して使っている。
        まだあまり良い書き方とかわかっていない。


あまりドキュメントは無かったけど以下記事が参考になった。
    https://gist.github.com/koba04/9776792
       http://qiita.com/setzz 

**[Bower](http://bower.io/)**
        ライブラリ管理。

**[gulp](http://gulpjs.com/)**
        タスク自動化。Gruntとどっちにするか迷ったけど、最近はgulpのが勢いがあるみたいだし、設定をJavaScriptでかけるので見通しが良く、拡張しやすそうだったから採用した。
    
**[Sass](http://sass-lang.com/)**
        CSS拡張言語。LESSと迷ったけど、最近はこっちのが勢いがあるようなので採用。ネストできたり変数使えて便利。コンパイルはgulpでする。

**[Pure](http://purecss.io/)**
        アメリカのYahoo!が出しているCSSフレームワーク。採用理由はBootstrapみたくJavaScriptが含まれたりせずCSSのみでシンプルだったのと、デザインが好みだったから。       


##最後に

今回、Ruby（Sinatra）やVue.jsなど色々なものに初めて触ったけど、RailsやAngularJS、Bootstrapみたく全部盛りより、Sinatra、Vue.js、Pureのようなミニマムなものが自分には合ってる気がする（重いのは学習するのがめんどい）。 
あと現状、[mups](http://mups.xyz)はまだメールで通知するくらいしかできないので、早く自分が使えるレベルくらいには機能を充実させたい（このタイミングでリリースしたのは[Mashup Awards](http://mashupaward.jp/works/878)に応募するため）。個人的には壮大な構想があるので頑張りたい。


####※以下今の[mups](http://mups.xyz)で出来ることとか
* ATNDβで指定したキーワードが含まれる新しいイベントが見つかったときメールで通知
* 電力使用率が指定した値を超えたらメール通知
* ニコニコ動画で指定したキーワードが含まれる新しい動画が見つかったときメールで通知 


追記（2015-05-08）
mupsはMA10で株式会社ドワンゴ賞とTINAMI株式会社賞を受賞することができましたが、現在リニューアル準備中のため、サービスを利用することはできません、、
[mups](http://mups.xyz)