LoginSignup
174

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-10-26

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
174