正確には Redmine が原因なのかどうかは判明していませんが、OpenSolaris 上に構築した Redmine が起動後何時間かすると500 Internal Errorを返すようになってしまいました。
Redmine は以下のような環境で動かしています。
- Redmine 0.9.3
- OpenSolaris 2009.06
- Ruby 1.8.7-p249
- Rails 2.3.5
- Unicorn 0.97.0
- nginx 0.7.65
Ruby は /opt/sunstudio12.1/bin/cc(Sun Studio Express 12)でビルドしています。
OpenSolaris に付属の /usr/bin/ruby を使っていた時には問題なく動作していたんですが、Redmine 0.9.3 にバージョナップした所、致命的な問題が発生したため、Ruby を自分でビルドするように変更していました。
落ちているの気がついたら手動で再起動をしていたのですが、さすがにメンドウになってきたのでスクリプトを書きました。
Read More
2006年頃に Rails 1.2 で作成したアプリケーションを Rails 2.3 にアップグレードしています。
プログラムの移行自体は1週間ほどで完了したのですが、テストをしていてタイムゾーン関連の問題に遭遇しました。
データベースに有効期限を表すフィールドがあるのですが、1時間前から1時間後まで有効なレコードを作成して、現在が有効期間内かどうかを調べるテストが失敗したので問題に気がつきました。
Rails 2.x ではタイムゾーンが導入されたのは知っていたので、下のように設定を行っていました。
config.time_zone = 'Tokyo'
config.active_record.default_timezone = 'Tokyo'
しかし、ログを見ていると JST と UTC とタイムゾーンが混ざっているようだったので、単純なアプリを作成して調べてみました。すると、以下のような結果に
c = Sample.find(:first)
>> c[:created_at]
=> Mon, 24 Aug 2009 17:09:49 +0000
>> c.created_at
=> Tue, 25 Aug 2009 02:09:49 JST +09:00
>> c[:created_at].class
=> DateTime
>> c.created_at.class
=> ActiveSupport::TimeWithZone
同じフィールドでも [] メソッドでデータを取得するのと、フィールド名を指定して取得するので、クラスもタイムゾーンも異なるんですね。ちょっとビックリしました。
どこかにタイムゾーンを意識しないコードがあって、この2つを混同してしまってるんだろうな。
調べるのはメンドクサイな。
Merbが最近はやっているようなので、インストールして使ってみようと思いました。Merb には Rubygems 1.3.0 以上が必要なのでアップデートしたところ、仕事で開発している Rails 1.2.6 で作られたアプリケーションに gem の deprecated メッセージが出てくるようになってしまいました。
たとえば script/console を実行すると以下のようなメッセージが出てきます。
$ script/console
Gem::SourceIndex#search support for String patterns is deprecated
./script/../config/boot.rb:20 is outdated
Loading development environment.
Gem::SourceIndex#search support for String patterns is deprecated
./script/../config/../config/boot.rb:20 is outdated
>>
Read More