最近まわりでRailsが流行っているんだけど、なんだか2ケタ以上の人が「webサービスと何か(?)をするにはRuby on Railsを使えば全部できる」という盛大な勘違いを起こしているので説明用資料を書いておく。Railsはそんなに万能ではないです。

Railsはwebアプリケーションを簡単に作れるMVCフレームワークで、HTTPを通してwebブラウザから使う事を前提にしている。マイコンとProcessingを接続してガジェットを作るのとは別の常識があります。



■Railsが向いていること
Railsは、おおざっぱに列挙するとこんなアプリケーションに向いています(無理すれば変な事も可能だけど後述)

  • アクセスしたURLに応じて異なるHTMLやXMLが表示される
  • 後ろにSQLなどのデータベースがあって、データを溜めたり取り出したりする
  • ユーザ登録してログイン/ログアウトできて、同じURLでもユーザ毎に違うHTML表示が出る
  • Formがあって、テキストを打ち込んで「投稿」すると保存される

普通のwebサービスを作るのに向いています。例えば
  • mixiとかFacebookのようなSNS
  • WordPressやMovableTypeのように記事をFormに打ち込んでデータベースに保存して、週毎/記事毎の様々な表示で同じデータを使い回す
  • twitterや掲示板みたいなもの
を作るのに向いている。
ようするに、あるURLにHTTP GETでアクセスすると何か表示される。そしてHTTP POSTするとデータを溜めるという機能がある。




■Railsが向いていないこと
  • あるwebサービスを定期的に監視して、更新があったらデータを取ってきて、別のサービスやデバイスに転送する
    • 定期的な処理はcronを回すかdaemonを作るべき。どうしてもRailsを表示に使いたければ、定期的な処理をするプログラムがRailsのデータベースに書き込む。それをRailsが読み出す。
  • デバイスからシリアル通信でデータを送り続けて、Railsの表示を変化させる
    • 無理。基本的に「あるURLにHTTPでアクセスしたら、そのURLに応じたHTMLやXMLがダウンロードできる」ものだと思うべき。webページの表示をサーバー側からpushして更新する事はComet等を使わなければできないので(難しいからやめておいたほうがいい)、簡単にsetIntervalで30秒毎にXmlHttpRequestしてRailsにデータを取りに行くべき。
  • FlashのXMLSocketや、XPortのシリアル-TCPSocket変換で接続してデータをやりとりしたい
    • 生のTCP/IPではなく、HTTPでやるべき。FlashならLoadVarsやURLLoaderを使う。XPortならMaking Things Talkという本にHTTPリクエストを作る方法が書いてある。もしくは、Socketサーバープログラムを自作してRailsのデータベースに書き込む。
とにかく、HTTP以外でRailsとやりとりするのは無理です。間に何か別のプログラムを挟んで、そいつとデータベースを共有するとかする。



■Railsが必要ない場合
話を聞いているとそもそもRailsで作る必要が無くて、RubyやPythonで小さなプログラムを作ってcronで定期的に実行するだけで済む事がよくある
  • 安全にユーザ認証する必要がない
  • 何人も同時にアクセスしない
  • そもそもデータベースにデータを蓄積しなくて、webサービスとデバイス、webサービスとwebサービスのトンネルを作りたいだけ
  • データベースに溜めるけど、トンネルするデータを一時的に保存しておきたいだけ
例:橋本商会 Twitterアカウント「DNPハウス」として発言できる okTwitter を作った
例:橋本商会 スーパーボット大戦



■まずクローラを作る
多くのwebサービスはデータ取得APIに制限をつけている。サービスにとってデータとユーザこそが財産だからという事と、ユーザデータ全てにアクセス可能だとプライバシーの問題があるからだと思う。
  • Twitterはユーザ毎に最新3200postしか取得できない
  • del.icio.usは他人のブックマークは最新100件しか取得できない
  • Flickrは位置情報付き写真のみ最新4000件しか検索結果が出ない
  • WebAPIは1日あたりの呼び出し回数に制限がかかっている事が多い
いちどクローラでDBに保存して、それをRailsでXMLなどのフォーマットに直して出力して、Flash等で読み込んで表示するのはアリだと思う。
例:橋本商会 GoogleEarth上でFlickrの位置情報付き写真を見れるサービスを作った



■危険ワード
以下のような曖昧な単語を使っている時は、設計ができていないか、そもそもコンピュータで実現不可能な問題を扱っている場合が多い。
  • 通信して〜〜
    • HTTPか、TCP/IPそのままか、XMLSocketか、とにかく何で通信するか明確にする。webの世界はセキュリティを考慮した仕組みになっているので、通信の手順に制限がかかっている事が多い。クロスドメインとか。
  • 似た人や物を検索して〜〜
    • 「似ている」ではなくて「数値的に+-50以内」や「完全に値が一致する」であれば簡単にできる。「似ている」という事をコンピュータで計算するのはとても難しくて、一つの研究分野なのでまず集合知プログラミング等を読むべき。また、前述の通りWebAPIからのデータ取得は制限されているのも注意。
  • タグを付けて〜〜
    • YouTube、delicious、ニコニコ動画などはそれぞれ「タグ」と呼んでいる機能へのユーザ毎のアクセス権限が異なり、webサービス内のコミュニティのあり方のデザインに直結している。安易に「タグ付けて分類」とか言わない方がいい。



■もっと調べるべき
webアプリはスイッチとマイコンとFlashとProcessingとは違う常識で動いているので、もっと勉強するべき。
  • HTTP
  • セッション
  • Cookie
  • GETとPOST
  • クロスドメイン
  • について調べると理解が深まる。


    また、Ruby on Railsでwebアプリケーションを作る事と、Rubyそのものでプログラムを書く事は完全に別の物として見た方が良いと思う。
    Railsはscaffoldやmigrateの仕組み、ファイルの配置が良くできていて、それを使うためにターミナルで叩くコマンドを覚えて管理する部分が便利でもあり、またそのノウハウに学習コストもかかる。
    Rubyはgemが便利でオブジェクト指向機能が綺麗な、普通のプログラミング言語。

    ひととおりscaffoldやmigrateやプラグインの仕組みを理解したら、Railsで使っているActiveRecordやActiveResource等の部品の仕組みを見ていくと良いと思う。