RailsでRDSを利用する時のタイムゾーンの設定など

RDSについてはMySQLのタイムゾーンの指定ができないようだ。

残念ながらRDSのシステム設定上のタイムゾーン (default_time_zone)はUTC固定となり、変更する事はできません。
クライアントからアクセスする際に適宜

mysql> SET SESSION time_zone="Asia/Tokyo"; 

などとして設定してお使い下さい。

https://forums.aws.amazon.com/thread.jspa?threadID=63355

2011年3月の情報ではあるけど、現在でもAWS Management Consoleで変更できなかった。

というわけでセッションの度に

SET SESSION time_zone="Asia/Tokyo";

をやりたいのだけど、それをRuby on Railsでやる方法を探した。

タイムゾーンではないけど、セッションパラメータを変えたいという人がいたようで、対応してくれていた。

Add ‘set_session:’ param to database.yml for mysql and mysql2 adapters

紆余曲折があった後、結局 variables という名前で落ち着いた様子。そこで、database.ymlは下記のようになる。

weatherdb:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: ****
  pool: 5
  username: *****
  password: *****
  host: ******.******.ap-northeast-1.rds.amazonaws.com
  variables:
    time_zone: Asia/Tokyo

これで接続時に

SET @@SESSION.time_zone = "Asia/Tokyo";

をやってくれるようになる。

あとは、application.rbで

config.time_zone = 'Tokyo'
config.active_record.default_timezone = :local

としておけば、正しい時間を返してくれるようになった。

ちなみにRails 4.0 beta1でも上記でちゃんと動いた。

OS Xで bundle install したときに openssl.bundle Symbol not found: _SSL_SESSION_free のエラー

OS X (Lion)へのrvmでのrubyインストール時にopenssl_missing.cでconflictingがでて失敗する問題の解消 でちょっと無理矢理rubyをインストールしたのだけど、Ruby on Railsでbundle installをした際に影響がでてきた。下記のようなエラーがでた。

Fetching gem metadata from https://rubygems.org/.Unfortunately, a fatal error has occurred. Please report this error to the Bundler issue tracker at https://github.com/carlhuda/bundler/issues so that we can fix it. Please include the full output of the command, your Gemfile and Gemfile.lock. Thanks!
/Users/.../.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': dlopen(/Users/.../.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/x86_64-darwin11.3.0/openssl.bundle, 9): Symbol not found: _SSL_SESSION_free (LoadError)
 Referenced from: /Users/.../.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/x86_64-darwin11.3.0/openssl.bundle
 Expected in: flat namespace
 in /Users/.../.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/x86_64-darwin11.3.0/openssl.bundle - /Users/.../.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/x86_64-darwin11.3.0/openssl.bundle

よくみるとruby/1.9.1と入ってる。やっぱり何か前にいれたものが余計なことをしていそうだ。もしや、と思いportでインストールしたものを確認すると

port installed
The following ports are currently installed:
 bzip2 @1.0.5_2 (active)
 ...
 openssl @0.9.8k_0 (active) 
 ...

とopensslが入っていた。前にインストールしたOpenVPNが影響しているのかとずっと思っていたけど、そうじゃなかったようだ。というわけで

port uninstall openssl

としてみると他にpython25とwgetがこれに依存していたのであわせて削除。必要になったらまた何らかの方法でインストールしよう。

次にrubyをインストールしなおし、

rvm reinstall 1.9.3

bundle installをしたところうまくいった。このエラーで検索しても全然ヒットしなかったのでよっぽど特殊な状況だったのだろう。でも解決してよかった。

OS X (Lion)へのrvmでのrubyインストール時にopenssl_missing.cでconflictingがでて失敗する問題の解消

OS X でrvmを利用してrubyの様々なバージョンをいれるのがとても簡単で便利。

基本的には

bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)

とやるだけで勝手にrvmをインストールしてくれる。

その後、

rvm install 1.9.3

などとしてrubyの好きなバージョンをインストールするのだけど、このときにエラーがでた。

Error running 'make ', please read /Users/---/.rvm/log/ruby-1.9.3-p125/make.log
There has been an error while running make. Halting the installation.

このmake.logファイルをみてみるとこんな感じのエラーがでていた。

openssl_missing.h:123: error: conflicting types for 'BN_rand_range'
/opt/local/include/openssl/bn.h:411: error: previous declaration of
'BN_rand_range' was here
openssl_missing.h:124: error: conflicting types for
'BN_pseudo_rand_range'
/opt/local/include/openssl/bn.h:412: error: previous declaration of
'BN_pseudo_rand_range' was here
make[1]: *** [openssl_missing.o] Error 1

別途OpenVPNなどを入れたりしているのだけど、そのタイミングか何かで既にこれらのファイルがあったのかもしれない。

とりあえず、といことでこの/opt/local/include/openssl/bn.hを

sudo vim /opt/local/include/openssl/bn.h

として開き、411行目と412行目をコメントアウト

/*
int BN_rand_range(BIGNUM *rnd, const BIGNUM *range);
int BN_pseudo_rand_range(BIGNUM *rnd, const BIGNUM *range);
*/

これでもう一度

rvm install 1.9.3

としたら無事インストールできた。

念のため、 /opt/local/include/openssl/bn.h のコメントアウトした箇所も元に戻しておいた。

ちなみに /usr/include/openssl/bn.h にも同じファイルがあったが、こっちはrvm での rubyコンパイル時に使っていないようで何もしなくて大丈夫だった。