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でも上記でちゃんと動いた。

nginx + PHP(FastCGI)で特定のホストだけphpの設定を変更する

Apacheだと.htaccessやhttpd.confで設定していたホストごとのphpの設定。nginx と FastCGIではnginx.confの中で設定を行う。
※ もちろんnginx.conf本体でなくとも、そこからインクルードするファイルで行ってもOK。

server ブロックの中のphpの設定をしているブロックで下記のようにPHP_VALUEを指定する。

server {
  ...
  location ~ \.php$ {
    include fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME /path/to/web/$fastcgi_script_name;
    fastcgi_param PHP_VALUE "include_path=/path/to/include_path
                           display_errors=on";
  }
  ...
}

上の例のように複数(include_pathとdisplay_errors)設定したい場合は ; で区切っても改行で区切っても動いた。

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をしたところうまくいった。このエラーで検索しても全然ヒットしなかったのでよっぽど特殊な状況だったのだろう。でも解決してよかった。

XCode 4.3.2のインストールにkextcacheのエラーで失敗した問題の解消

XCode 4.3.2をインストールしようとしたところ、エラーがでて止まった。ログをみろ、というので確認すると、最下部で下記のようなエラーで止まっていた。

Mar 27 08:12:45 macbook installd[14462]: kextcache: sony_prs.kext does not declare a kernel dependency; using com.apple.kernel.6.0.
Mar 27 08:12:45 macbook installd[14462]: kextcache: JMicronATA.kext does not declare a kernel dependency; using com.apple.kernel.6.0.
Mar 27 08:12:45 macbook installd[14462]: kextcache: com.apple.iokit.IONetworkingFamily.kext is invalid; can't resolve dependencies.
Mar 27 08:12:45 macbook installd[14462]: kextcache: //System/Library/Extensions/com.apple.iokit.IONetworkingFamily.kext - missing load info or dependencies array in applier function.
Mar 27 08:12:45 macbook installd[14462]: kextcache: Can't resolve dependencies amongst kexts for prelinked kernel.
Mar 27 08:12:45 macbook installd[14462]: kextcache: Failed to generate prelinked kernel.
Mar 27 08:12:45 macbook installd[14462]: kextcache: Child process /usr/sbin/kextcache[18455] exited with status 71.
Mar 27 08:12:45 macbook installd[14462]: kextcache: Error 71 rebuilding /System/Library/Caches/com.apple.kext.caches/Startup/kernelcache.
Mar 27 08:12:45 macbook installd[14462]: PackageKit: Install Failed: Error Domain=PKInstallErrorDomain Code=121 "An error occurred while updating system extension information." UserInfo=0x109f4e940 {NSLocalizedDescription=An error occurred while updating system extension information., arguments=(
	    "-update-volume",
	    "/",
	    "-Installer"
	), NSUnderlyingError=0x109f90120 "The operation couldn’t be completed. (kextcache error 71.)"} {
	    NSLocalizedDescription = "An error occurred while updating system extension information.";
	    NSUnderlyingError = "Error Domain=kextcache Code=71 \"The operation couldn\U2019t be completed. (kextcache error 71.)\"";
	    arguments =     (
	        "-update-volume",
	        "/",
	        "-Installer"
	    );
	}

最下部をみると kextcache error 71 でとまっている。kextcacheのログの最後の方をみると

Mar 27 08:12:45 macbook installd[14462]: kextcache: com.apple.iokit.IONetworkingFamily.kext is invalid; can't resolve dependencies.

となっている。どうやら com.apple.iokit.IONetworkingFamily.kext がおかしいらしい。ちょっと検索してみたけど、これがなんなのかよく分からなかった。/System/Library/Extensionsの中を確認すると、これは同ディレクトリ内の IONetworkingFamily.kext へのシンボリックリンクだった。

cd /System/Library/Extensions
ls -la com.apple.iokit.IONetworkingFamily.kext
lrwxr-xr-x 1 root wheel 50 4 17 2009 com.apple.iokit.IONetworkingFamily.kext -> /System/Library/Extensions/IONetworkingFamily.kext

そこで、思い切ってcom.apple.iokit.IONetworkingFamily.kext を削除。

sudo rm com.apple.iokit.IONetworkingFamily.kext

これでもう一度試してみると無事インストールできた。

とりあえず、これで問題は起きていないから、余計なゴミが残っていただけ、と勝手に思ってる。まあ、無事インストールできて、その後も問題は起きていないからそれでいいや。

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コンパイル時に使っていないようで何もしなくて大丈夫だった。