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

  • 188
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

今、個人でmupsというIFTTTみたいなサービスを作っています。

http://mups.xyz

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

システム構成

mups_system.png

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

mups-web

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

以下サイトが参考になった。
Sinatra: README

あと以下本も役に立った。
Webアプリエンジニア養成読本
↑の本は前にサクッと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
Rubyバージョン管理。

bundler
gem管理。

Unicorn
Rackアプリケーションサーバ。

Sinatra
ミニマムなWebアプリケーションフレームワーク。

omniauth
OAuthライブラリ。

ActiveRecord
ORマッパー。

Node.js関連

nodebrew
Node.jsバージョン管理。

forever
Node.js daemon化。

async
コールバック地獄回避ライブラリ。

SuperAgent
HTTPクライアント。

フロントエンド関連

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

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

Bower
ライブラリ管理。

gulp
タスク自動化。Gruntとどっちにするか迷ったけど、最近はgulpのが勢いがあるみたいだし、設定をJavaScriptでかけるので見通しが良く、拡張しやすそうだったから採用した。

Sass
CSS拡張言語。LESSと迷ったけど、最近はこっちのが勢いがあるようなので採用。ネストできたり変数使えて便利。コンパイルはgulpでする。

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

最後に

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

※以下今のmupsで出来ることとか

  • ATNDβで指定したキーワードが含まれる新しいイベントが見つかったときメールで通知
  • 電力使用率が指定した値を超えたらメール通知
  • ニコニコ動画で指定したキーワードが含まれる新しい動画が見つかったときメールで通知

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