Matzキーノート

まつもとゆきひろさんのセッションを聞くために昨日に引き続き、朝一でRubyKaigiに参加。どうやらライブ配信しているようなので行かなくても見れたんだろうが、たぶん初のMatzセッションだと思うので会場へ。

最近の言語(GoとかDartとか)はみんな静的な型を持っていて悔しいので将来のRubyでもなんかしたい。でも型入れるとRubyらしさが失われるからSoftにコンパイラが型を自動判定するようにしたいという話だった。

言語をつくる方も楽しくあるべきという考えは素敵やん。

RubyKaigi

RubyKaigi 2014に参加してきた。

RubyKaigi 2014

個人でRailsか何かでサービス公開してからRubyKaigi行こうと思っていたがプレッシャー掛けるため先に行く。自腹で18,000円。

公用語に英語を採用していて日→英の同時通訳もあるため、海外の人もちらほら来ているようだった。でも見ているとセッション中に資料作ったりしていてどうやらスピーカー&関係者っぽい人のようだったのでどれくらいのただの参加者で海外の人が居たのかは不明。

GCとか言語のコアな話が聞けて楽しかった。任意のプログラミング言語がどのように動くか知っておくことは重要だ。別にRubyを書かなくても知識は役に立つ。

夜からはパーティに参加せずクラスメソッドさんのiOS8 LT大会を聞きに移動。RubyKaigi終わるまではiOSアップデートしません。

RubyMineでRubyMotion事始め・余談

RubyMotionのAdvent CalendarでRubyMineでRubyMotion事始めを投稿したんだけどその余談。

せっかくなのでRubyMineを使ってRubyMotionの何かiOSプロジェクトを作ってみようとした。目的がAdvent Calendarへの投稿だったのでRubyMotionのAdvent Calendar(RSS)を表示しようと考えた。Twitter APIに認証が必要になってしまった今ではこれくらいがサンプルプロジェクトとして、勉強としてちょうど良いだろう。

RubyMotionは基本的にiOS SDKのwrapperであり、Rubyのgem資産は活用できない。RubyMotion用のgemは存在する。その中でも便利ライブラリである BubbleWrap を使ってみた。

BubbleWrapにRSS Parserクラスがあった。RubyMotion Tutorialを読んでTableViewなどView関連の使い方はだいたい分かったので余裕だと思っていた。この考えは浅はかだった。

RSS ParserクラスでQiitaのRSSをパースしても何も表示されない。何故だ。RSS Parserクラスの中身をを見たらSAXで item 要素を読み込んでいる。つまりAtomFeedに対応していない。ただ /feed/entry/ を読むようにパッチを当てればすれば済む話だった。

僕はiOSでXMLの扱いが面倒だったのを忘れていた。いや、たとえ覚えていてもだからこそRubyMotionでスマートに解決しようとしたかもしれない。xpathなんかでサクッと実装しようとしてしまった。

まず、普通にREXMLを使おうとした。motion-bundler という魔法があったのでそれを使おうとした。結論からいうとmotion-bundlerを使ってxml/documentをrequireしようとしてもできなかった。以下のような問題に遭遇したが解決できなかった。

How do I parse XML data in RubyMotion?
https://groups.google.com/forum/#!topic/rubymotion/b5Wk3HTyVB4

もともとmotion-bundlerは強引なドリブルだと認識していたので諦めた。

次にhpple-motionを使おうとした。hpple-motionはRubyMotion用のgemでxpathを使うことができる。しかし何故か動かなかった。使い方を間違えていたのかもしれない。hpple-motionは実はRubyで実装されているのではなくHppleというCocoaPodのwrapperである。そのため原因を特定しようとするとObjective-Cレイヤー(CocoaPod)のデバッグが必要になりRubyMotionまったく関係ないので特定するのは諦めた。

結局 RSS ParserにモンキーパッチをあててAtomFeedを読めるようにした。

朝からエントリーを書いていて文章は大体出来ていたのでに出社までに投稿できると思っていたが、XMLのパースという本質的じゃないところにハマッたせいでサンプルプロジェクトが完成せず、結局投稿するのは夜になった。

RubyMotionはやはりiOS SDKのWrapperだ。Objective-Cの代わりにRubyが使えるがiOS SDKの機能的な不足部分をRubyで補う魔法のツールではない。Rubyのライブラリが使えないことは認識していたがやはり一度痛い目にあってみないと学ばない。良い勉強になった。

サンプルプロジェクトはこちら
makotokw/MotionAdventCalendar

Raspberry Piに温度センサーを繋いでRubyで取得してみた

なぜかRaspberry Piが3台ある。1台は電子工作用、1台は自鯖置き換え用、もう1台はちょっとしたWebサービス動かす用。どれも並行して進めていてなんかブログ書くタイミング逃している。

そんな中、温度センサーを使ってみる編が進んだの書くことにした。

購入したのは HIH-6130 デジタル温度センサスイッチサイエンスさんで購入した。USBで取る方が簡単かもしれないけど、電子工作してみたかったのでこれにした。

基本的に HIH-6130 湿度センサー を使う の記事を大変参考にさせていただいた。

プロトタイプは同じくスイッチサイエンスさんで購入したAdafruit Raspberryにブレッドボードを乗せてやっていた。

Raspberry Pi

i2c関連のセットアップ

OSはRaspbian。

sudo apt-get install i2c-tools
sudo adduser pi i2c
sudo shutdown -r now
sudo modprobe i2c-bcm2708
sudo modprobe i2c-dev
sudo vi /etc/modules

で以下を追加する

i2c-bcm2708
i2c-dev
sudo vi /etc/modprobe.d/raspi-blacklist.conf 

で i2c-bcm2708 の行をコメントアウト

# blacklist spi and i2c by default (many users don't need them)

blacklist spi-bcm2708
# blacklist i2c-bcm2708
sudo i2cdetect -y 1
sudo i2cdump -y 1 0x27

でデータが取れればok。

Rubyでi2c

参考: Raspberry Pi View topic – Use I2C with Ruby

この i2c ライブラリを使うことにした。

$ sudo apt-get install ruby1.9.1 ruby1.9.1-dev
$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [arm-linux-eabihf]

ややこしいがruby1.9は1.9系のインストールだけど、たしかこのパッケージに問題があってruby1.9.1が作られたのでAPTのruby1.9.1でインストールされるのは1.9系の現行バージョン1.9.3になる(1.9.1が入るわけではない)。この時点では2.0系のパッケージはなかった。

ちなみにrbenvなどでやるとビルドにすごい時間がかかるそうなのでAPTのパッケージで我慢する。

sudo gem install i2c
#!/usr/bin/env ruby

require 'rubygems'
require 'i2c'

class HIH6130

  def initialize(path, address = 0x27)
    @device = I2C.create(path)
    @address = address
  end

  def fetch_humidity_temperature
    s = @device.read(@address, 0x04)
    hum_h, hum_l, temp_h, temp_l = s.bytes.to_a

    status = (hum_h >> 6) & 0x03
    hum_h = hum_h & 0x3f
    hum = (hum_h << 8) | hum_l
    temp = ((temp_h << 8) | temp_l) / 4

    return status, hum * 6.10e-3, temp * 1.007e-2 - 40.0
  end

end

sensor = HIH6130.new('/dev/i2c-1')

10.times do
  p sensor.fetch_humidity_temperature
  sleep(1)
end

このプログラムはスイッチサイエンスさんのリンクにあったサンプルスケッチをそのまま移植した。

最初、Adafruitの上に置いたブレッドボードで動かしたら33度と出力されて計算間違っているのかな?と思ったら普通にRaspberry Piの熱が伝わっている感じだったので離してみたら5度下がった。部屋の温度計と大体同じになったのでちゃんと動いているっぽい。部屋の温度が高いのはいろんなデバイスが熱風を発しているため。

センサーを離さないといけないと分かったので最終的にどのような形態にするのかも考えなきゃいけないなぁ。

とりあえず次はこれをmuninのプラグインに書きなおして、グラフ化する予定。最終目標は赤外線信号を発信して、自動でエアコンつけたり消したりすること。

rbenvとunicornでRedmineのRuby環境を分けて動かす

超絶シンプルなブログを作ろうとして逆算していくとRedmineが障壁になったのでRedmineを単独で動かすことにしました。

今までRedmineはPassengerを使ってApacheやNginxで動かして来ましたが、今回はunicornで動かすことにしました。unicornで動かすと言ってもポート80はウェブサーバで使うのでリバースプロキシで接続することになります。多くの場合Redmineはチーム内であったりして使う人が限られていると思うのでそれで多少パフォーマンスが落ちても問題ないと思っています。それよりも環境を独立して動かすことを優先するという形です。

  • rbenvでrubyは入れる
  • nginxからproxyでunicornに接続する
  • Redmineはgitでいれる
  • Redmineに必要なgemはvendor/bundleに入れる
  • Redmineのデータベースはmysqlを使う
  • RedmineはSubURI/redmineで公開する

これによりRedmine(Railsアプリ)の実行環境を完全に独立できます。OSに依存する部分は少ないですがDebian/Ubuntu向けの内容になります。基本的に最後の仕上げらへんのsudoコマンドを使っている部分を除いて一般ユーザでセットアップします。

rbenvをセットアップ

OS XならHomebrewでbrew install rbenvで入れると楽です。aptはパッケージが古かったので直接入れることにします。

git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.profile
echo 'eval "$(rbenv init -)"' >> ~/.profile

Debian/Ubuntuなので.profileに書いています。rbenvのセットアップ詳細はrbenvを参照。

Redmineのruby環境をセットアップ

Redmineで使うrubyをインストールします。とりあえず1.9.xのこの時点の最新を使いました。

rbenv install 1.9.3-p392
...

Bundlerのインストール

rbenv shell 1.9.3-p392
gem install bundler
rbenv rehash

Redmineのインストール

どこにインストールしても問題ないです。~/redmineでも可。この時点の最新2.3を使いました。

git clone https://github.com/redmine/redmine redmine
cd redmine
git checkout -b release/2.3.0 2.3.0

Redmineの依存解決

データベースはmysqlを使うのでsqlite, postgresqlを除外します。--path vendoer/bundleを設定しているのでRedmineで使うgemはそこにインストールされ他のRubyアプリケーションに影響させないようにします。

rbenv local 1.9.3-p392
bundle install --without development test rmagick sqlite postgresql --path vendor/bundle

データベースのセットアップ

例です。データベースユーザやパスワードはちゃんとしたものを使ってください。

mysql -u root -p
create database redmine character set utf8;
create user 'redmine'@'localhost' identified by 'redmine';
grant all privileges on redmine.* to 'redmine'@'localhost';
exit;
cp -p config/database.yml.example config/database.yml

config/database.ymlを編集します。

# mysql
production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: redmine
  encoding: utf8

Redmineのセットアップ

cd /path/to/redmine
bundle exec rake generate_secret_token
RAILS_ENV=production bundle exec rake db:migrate
RAILS_ENV=production bundle exec rake redmine:load_default_data
mkdir tmp tmp/pdf public/plugin_assets

Sub URIで動作させるためにconfig.ruを修正します。Root(/)で動かすならこの作業は不要です。

# This file is used by Rack-based servers to start the application.

require ::File.expand_path('../config/environment',  __FILE__)
#run RedmineApp::Application
if ENV['RAILS_RELATIVE_URL_ROOT']
  map ENV['RAILS_RELATIVE_URL_ROOT'] do
    run RedmineApp::Application
  end
else
  run RedmineApp::Application
end

unicorn追加でインストール

cd /path/to/redmine
echo 'gem "unicorn"' >> Gemfile.local
bundle

unicorn設定ファイル

cd /path/to/redmine
curl -o config/unicorn.rb https://raw.github.com/defunkt/unicorn/master/examples/unicorn.conf.rb

パスのみ変更してあとはデフォルトのままです。必要に応じて調整してください。

# See http://unicorn.bogomips.org/Unicorn/Configurator.html for complete
# documentation.

APP_PATH = File.expand_path('../../', __FILE__)

worker_processes 4

working_directory APP_PATH # available in 0.94.0+

listen "#{APP_PATH}/tmp/unicorn.sock", :backlog => 64

timeout 30

pid "#{APP_PATH}/tmp/unicorn.pid"

stderr_path "#{APP_PATH}/log/unicorn.stderr.log"
stdout_path "#{APP_PATH}/log/unicorn.stderr.log"

preload_app true
GC.respond_to?(:copy_on_write_friendly=) and
  GC.copy_on_write_friendly = true

check_client_connection false

before_fork do |server, worker|
  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

unicorn実行

テスト実行。Root(/)で動かすなら--path /redmineは不要です。

cd /path/to/redmine
bundle exec unicorn_rails -c config/unicorn.rb -E production --path /redmine

nginx設定

config/unicorn.rbでリスニングしているunix socketに接続させます。

upstream redmine {
    server unix:/path/to/redmine/tmp/unicorn.sock;
}
server {
...
    location /redmine {
        root /path/to/redmine/public;
        if (-f $request_filename) { break; }
        proxy_set_header    X-Real-IP           $remote_addr;
        proxy_set_header    X-Forwarded-Host    $host;
        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_pass http://redmine;
    }
...
}

仕上げ

問題なければ起動スクリプトを/etc/init.d/redmineに置いて実行。USER, APPPATH, URIPATHあたりを修正してください。

#! /bin/sh

### BEGIN INIT INFO
# Provides:          redmine
# Required-Start:    $all
# Required-Stop:     $network $local_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the redmine web server
# Description:       starts redmine
### END INIT INFO

USER=username
APP_PATH=/path/to/redmine
RAILS_ENV=production
URI_PATH=/redmine

SET_PATH="cd $APP_PATH"
DAEMON="bundle exec unicorn_rails"
DAEMON_OPTS="-c $APP_PATH/config/unicorn.rb -E $RAILS_ENV -D --path $URI_PATH"
CMD="$SET_PATH; $DAEMON $DAEMON_OPTS"
NAME=redmine
DESC="Unicorn app for redmine"
PID="$APP_PATH/tmp/unicorn.pid"
OLD_PID="$PID.oldbin"

cd $APP_PATH || exit 1

sig () {
        test -s "$PID" && kill -$1 `cat $PID`
}

oldsig () {
        test -s $OLD_PID && kill -$1 `cat $OLD_PID`
}

case ${1-help} in
start)
        sig 0 && echo >&2 "Already running" && exit 0
        su - $USER -c "$CMD"
        ;;
stop)
        sig QUIT && exit 0
        echo >&2 "Not running"
        ;;
force-stop)
        sig TERM && exit 0
        echo >&2 "Not running"
        ;;
restart|reload)
        sig HUP && echo reloaded OK && exit 0
        echo >&2 "Couldn't reload, starting '$CMD' instead"
        su - $USER -c "$CMD"
        ;;
upgrade)
        sig USR2 && exit 0
        echo >&2 "Couldn't upgrade, starting '$CMD' instead"
        su - $USER -c "$CMD"
        ;;
rotate)
        sig USR1 && echo rotated logs OK && exit 0
        echo >&2 "Couldn't rotate logs" && exit 1
        ;;
*)
        echo >&2 "Usage: $0 <start|stop|restart|upgrade|rotate|force-stop>"
        exit 1
        ;;
esac

exit 0
sudo service redmine start
sudo update-rc.d redmine defaults

起動時に動かすようにもしておきます。

その他

Redmineを初期セットアップ風に書いているけど実際は2.2->2.3のアップグレード。

Ruby 1.9にあげたらgem install activerecord-mysql-adapterというエラーになった。bundlerで依存関係解決しているのに・・・調べたらconfig/database.ymlのadapter: mysqlをadapter: mysql2にすると直った。

実は最初はpassenger-standaloneで進めていたがSubURIで動かせないという問題に遭遇した。proxy redirectで無理やり変換できそうだが面倒なのとunicornつかってみたかったので諦めた。ルートディレクトリで公開できるなら行けた。

参考


This markdown is rendered by wp-gfm

WordPressでGitHub Flavored Markdown使えるようにしてみた

makotokw/wp-gfm
GitHub Flavored Markdown for WordPress

なんかブログでMarkdown使いたくなったのでやっつけでWordPressプラグイン書いてみた。Markdown系のプラグインはすでにいくつもあるようだけど、使いたいのはQiitaの記法やGitHub Flavored Markdown(GFM)など、具体的に言えばインデントするコードブロックを使いたくないのと、テーブルを使いたい。

変換はPHPで頑張らずに別でRESTAPIをredcarpetを使って簡単につくれると思っていたんだけど、GithubにMarkdown Rendering APIなる変換APIがあったのでまずはこれを使ってみた。しかし1時間5000リクエストということでページをキャッシュすれば十分間に合うかと実装してみたら5000リクエストはOAuth認証のときの制限で、認証していないときは60リクエストまでの制限と判明。結局、WordPressプラグインでOAuth認証するのはだるいし、consumerのtoken埋め込んだら公開し辛いってことで、元に戻ってredcarpetを使った変換APIをherokuに立ててプラグインからリクエストを投げるようにしてみた。

code

require 'redcarpet'
markdown = Redcarpet.new("Hello World!")
puts markdown.to_html

table

First Header Second Header
Content Cell Content Cell
Content Cell Content Cell

良い感じ。

ソースコードはGithubに置いてあります(今回Githubにプラグインを置いたのはこんなのプログラマにしか需要ないだろ・・・と思ったりしているから。)。WordPressプラグインはhttps://github.com/makotokw/wp-gfm。変換APIはhttps://github.com/makotokw/ruby-markdown-render-api。プラグインのwp-gfm/config.phpをconfig.php.sampleからコピーしてherokuにでもデプロイしたURLを設定すると良いです。デフォルトはGithubのRender APIになっているので1時間に60リクエストしか使えないのでご注意を。

GFMやQiita/KobitoのMarkdownに近づけるには変換APIはまだ調整の余地があるかなと思っています。個人的には見出しと箇条書きとコードブロックとテーブルが使えれば大体OKなので今は満足している。

FastCGI でRedmineが実用レベルになった

Debian(lenny)での情報。

自分アプリのバグをtracで管理していて、その後redmineに移行しようと思ったもののredmineが重くてやる気にならず、オープンソースならgithubでチケットを管理するという方針にしたものの、オープンソースじゃないアプリやタスクをプライベートにしたい場合にやっぱりredmineが使いたくなった。

最新版のredmineなら速くなってるんじゃないかというのも期待して最新版にしてみることに。インストール済みなのは0.8でこの時点では1.0がリリースされている。1.0なら速いはずだ。

1. バックアップ

プログラムは別ディレクトリにいれるのでデータベースだけバックアップ。
http://www.redmine.org/wiki/redmine/RedmineUpgradeには
/usr/bin/mysqldump -u <username> -p<password> <redmine_database> | gzip > /path/to/backup/db/redmine_`date +%y_%m_%d`.gz
とあるが、普通にdumpする。

mysqldump -u root -p redmine > /tmp/redmine.dump.sql

2. Rubyモジュールの更新

redmine 0.8->1.0においてrubyは1.8.xのままでいいので、rails, rackを更新。apacheで動かすのでmod_railsことpassengerも更新しておく。一応rakeも。

rails (2.1.2) -> 2.3.5
rake (0.8.5) -> 0.8.7
passenger (2.2.2) -> 3.0.2

gem install rails -v=2.3.5
gem install rack -v=1.0.1
gem update rake passenger

2.1 passengerの設定

最終的にfastcgiを使ったのでpassengerはなくてもよい

passengerをapacheに組み込む。
/var/lib/gems/1.8/bin/passenger-install-apache2-module

The Apache 2 module was successfully installed.

Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /var/lib/gems/1.8/gems/passenger-3.0.2/ext/apache2/mod_passenger.so
   PassengerRoot /var/lib/gems/1.8/gems/passenger-3.0.2
   PassengerRuby /usr/bin/ruby1.8

After you restart Apache, you are ready to deploy any number of Ruby on Rails
applications on Apache, without any further Ruby on Rails-specific
configuration!

Deploying a Ruby on Rails application: an example

Suppose you have a Rails application in /somewhere. Add a virtual host to your
Apache configuration file and set its DocumentRoot to /somewhere/public:

   <VirtualHost *:80>
      ServerName www.yourhost.com
      DocumentRoot /somewhere/public    # <-- be sure to point to 'public'!
      <Directory /somewhere/public>
         AllowOverride all              # <-- relax Apache security settings
         Options -MultiViews            # <-- MultiViews must be turned off
      </Directory>
   </VirtualHost>

And that's it! You may also want to check the Users Guide for security and
optimization tips, troubleshooting and other useful information:

  /var/lib/gems/1.8/gems/passenger-3.0.2/doc/Users guide Apache.html

Enjoy Phusion Passenger, a product of Phusion (www.phusion.nl) 🙂
http://www.modrails.com/

という感じ。debianのapacheの管理方法に基づき、passengerモジュールの設定を入れる。

vi /etc/apache2/mods-available/passenger.load
LoadModule passenger_module /var/lib/gems/1.8/gems/passenger-3.0.2/ext/apache2/mod_passenger.so

vi /etc/apache2/mods-available/passenger.conf

<IfModule passenger_module>
   PassengerRoot /var/lib/gems/1.8/gems/passenger-3.0.2
   PassengerRuby /usr/bin/ruby1.8
</IfModule>

をそれぞれ入力。

以下のコマンドでこの作った設定ファイルを有効にする。

a2enmod passenger
/etc/init.d/apache2 restart

3. remine-1.0を入れる

常に最新版を入れたいのでsubvresionで入れる。

cd /path/to/ror-apps/
svn co http://redmine.rubyforge.org/svn/branches/1.0-stable redmine-1.0

0.8の設定をコピー。新規の場合は.sampleをコピーしてつくる。

cp redmine-0.8/config/database.yml redmine-1.0/config/database.yml
cp -p redmine-0.8/public/dispatch.cgi redmine-1.0/public/dispatch.cgi

あとはhttp://www.redmine.org/wiki/redmine/RedmineInstallにしたがってすすめる。

rake generate_session_storeはi18nモジュールがなくて怒られたので

cd redmine-1.0
gem install -v=0.4.2 i18n
rake generate_session_store

RAILS_ENV=production rake db:migrateはmysqlモジュールがないといって怒られたので

gem install mysql
RAILS_ENV=production rake db:migrate

デフォルトデータ

RAILS_ENV=production rake redmine:load_default_data

でjaを選択。

apacheから書き込めるようにしておく

mkdir tmp public/plugin_assets
chown -R www-data:www-data files log tmp public/plugin_assets
chmod -R 755 files log tmp public/plugin_assets

vhostの設定で

Alias /redmine "/path/to/ror-apps/redmine-0.8/public"
Alias /redmine "/path/to/ror-apps/redmine-1.0/public"に更新。

passengerをいれたときにMultiViewsを無効にしとけと言われたので

public/.htaccess
#Options +FollowSymLinks +ExecCGI
Options +FollowSymLinks +ExecCGI -MultiViews

とする。

さらにRewriteBase /redmineを入れる。

config/environment.rb
ENV['RAILS_ENV'] ||= 'production'

のコメントを外しておく。

config/additional_environment.rb
config.action_controller.relative_url_root='/redmine'

を書く。

4. cgiで動かない件

apache以前にスクリプトが動かない。

public/dispatch.cgi
/var/lib/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/cgi_process.rb:22:in `__send__': undefined method `env_table' for nil:NilClass (NoMethodError)
        from /var/lib/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/cgi_process.rb:22:in `dispatch_cgi'
        from /var/lib/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/dispatcher.rb:101:in `dispatch_cgi'
        from /var/lib/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/dispatcher.rb:27:in `dispatch'
        from public/dispatch.cgi:10

Rails 2.3.2, Apache2 and CGI not working
http://www.ruby-forum.com/topic/182327

undefined method `env_table’ for nil:NilClass (NoMethodError) with rev 3335
http://www.redmine.org/issues/4610

あたりに報告があるけど解決されてない模様。回避策としてFastCGI使えば?という感じなので仕方なく従うことに。

5. FastCGIでrubyを動かす

これもhttp://www.redmine.org/wiki/1/HowTo_configure_Apache_to_run_Redmineに情報がある。

aptitude search fastcgilibapache2-mod-fastcgiを確認。

aptitude install libapache2-mod-fastcgi 
/etc/init.d/apache2 restart

特に依存モジュールでfcgiが入らなかったのでおとなしくソースから入れる。

cd /usr/local/src/
wget http://www.fastcgi.com/dist/fcgi-2.4.0.tar.gz
tar -zxvf fcgi-2.4.0.tar.gz
cd fcgi-2.4.0
./configure
make
make install

最後に以下を実行。

gem install fcgi

dispatch.fcgiはそのままサンプルのを使う。
cp -p public/dispatch.fcgi.example public/dispatch.fcgi

dispatch.fcgiを確実に参照させるように。

public/.htaccess
#<IfModule mod_fastcgi.c>
#       RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
#</IfModule>
#<IfModule mod_fcgid.c>
#       RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
#</IfModule>
#<IfModule mod_cgi.c>
#       RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
#</IfModule>
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]

これでtrac並のレスポンスが得られるようになった。www.redmine.org 自体もFastCGIを使ってるらしいし、おとなしくFastCGIを使うのがよさげ。

Ruby on Railsはじめました

ずっと気になっていたRuby on Railsをはじめてみました。まだ環境をつくっただけですが・・・
VistaなのでInstantRailsとEclipse(RadRails)で環境をつくりました。

仕事時間中に自転車で渋谷のBookFirstまで行って本を買ってきました。

あんまりRubyで良い本がなかった気がしたのですが、立ち読みした中で一番でよさそうだった下記の本を買いました。

よさそうだと感じたのは、
– Rubyの説明 とRailsの説明がちゃんとあること
– コンソールアプリ、Webアプリの説明があること
– 付録に環境構築が一応載っていること
– ちょっとしたリファレンスがある
– QandAがあったりする

などです。

と深すぎず、広く満遍なく情報がつめられているので最初の一冊として選んでみました。