Windows で Rails + Comet (Juggernaut)

Comet を使ったアプリケーションを作りたくて Juggernaut を使ってみた。

Juggernaut 0.5.1 のインストール

Juggernaut はいろいろな gems に依存するためそれらもインストール。
Rails は 2.0.2 以降、EventMachine も 0.10 以降、json も 1.1.2 以降を要求するなど
Juggernaut はかなりグルメなので gems 本体もアップデートすることになった。

$ gem update --system
$ gem install rails --include-dependencies
$ gem install json
$ gem install eventmachine --version 0.10
$ gem install juggernaut


この EventMachine が曲者で、コンパイルするタイプだったのでハマった。
EventMachine は今注目の Thin なんかでも使うようなので解決策を記しておく。


ポイントは以下の二つ

  1. 環境変数 PATH/LIB/INCLUDE などを正確に指定する
  2. C:\usr\ruby\lib\ruby\1.8\i386-mswin32\config.h の修正
環境変数 PATH/LIB/INCLUDE などを正確に指定する

コンパイルVisual Studio .NET 2003 (cl.exe)を使うため
環境変数を正しく指定する必要がある。
でも面倒くさいので以下の bat ファイルを使うと簡単。

C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\vsvars32.bat

環境変数を指定した状態でプロンプトが立ち上がるので
コマンドを打ち込むだけでコンパイルが始まる。

C:\usr\ruby\lib\ruby\1.8\i386-mswin32\config.h の修正
C:\usr\ruby\lib\ruby\1.8\i386-mswin32\config.h

の冒頭で cl.exe のバージョンをチェックしている。

#if _MSC_VER != 1200
#error MSC version unmatch
#endif

しかし、Visual Studio .NET 2003 の _MSC_VER は 1310 のため
コンパイルに失敗する。適当に以下のように修正。

#if _MSC_VER < 1200
#error MSC version unmatch
#endif

参考:Thin – A fast and simple web server | Marc-André Cournoyer's blog

サンプルアプリケーション

普通はチャットアプリなんかを作ってみるところだけど
インストールでハマってしまったので動作確認をするだけにする。

$ rails comet
$ cd comet
$ ruby script/plugin install http://juggernaut.rubyforge.org/svn/trunk/juggernaut
$ ruby script/generate controller chat


app/controllers/chat_controller.rb

class ChatController < ApplicationController
  def index
  end
  def say
    Juggernaut.send_to_all("alert('hi from juggernaut')")
  end
end


app/views/chat/index.rhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>Chat</title>
  <%= stylesheet_link_tag 'default' %>
  <%= javascript_include_tag :defaults %>
  <%= javascript_include_tag 'prototype', :juggernaut %>
</head>
<body>
  <%= juggernaut %>
</body>
</html>


Comet サーバの設定と起動

$ juggernaut -g config\juggernaut.yml
$ juggernaut -c config\juggernaut.yml


Rail アプリ用サーバの起動

$ ruby script/server


二種類のブラウザで以下の URL にアクセス。
http://localhost:3000/chat/
どちらかのブラウザで新しくタブを開き以下のアクセス。
http://localhost:3000/chat/say
すると上の URL を開いてブラウザすべてでアラートが表示される。