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

KinoppyがiPad(3rd)のRetina Displayに対応がとても嬉しい・・・Amazonに負けないために

KinoppyがついにiPad(3rd)のRetina Displayに対応した!個人的にRetina Display対応の中で一番嬉しい。
試しに呼んでみたけどめちゃめちゃ読みやすい。

国内の電子書籍ではKinoppyに一番期待している。理由は
・どの端末でも読める(Mac版だけ制作中・もちろんKindleでは読めないけど)
・再ダウンロードが簡単にできる
・バックが大手書店だから安心
というもの。

本当はアメリカの一部出版社(O’ReillyやThe Pragmatic Bookshelf、Apress)のようにDRMフリーでPDFとePubとmobi(Kinlde用)で提供してもらえるのが一番ありがたいけど、まぁ現状ではそれは夢のような話。
※ ちなみにフッターに購入時のメールアドレスが入っているものもある。

読める端末を限定されてしまうのなら、やっぱり対応端末の種類は多い方がいいし、販売元がなくなるなんていうリスクはとりたくない。

ついでにいくつもの販売元から電子書籍を買うと、買った本によって読めるアプリが違うなどということになり、非常に面倒なことになる。

というわけで現在はまずDRMフリーを探してなければ(小説などはほぼ無い)できるだけKinoppyで購入して、Kinoppyにもなくてどうしても欲しいときだけ他で購入している。あるいはもう紙を買っちゃって裁断してスキャンか。

ただ、Amazonが入ってきたら迷っちゃうな。そうなったら後は価格と品揃えの勝負になると思う。そういう意味でKinoppyは無理してでもできるだけ多くの書籍を電子対応して、ほぼ全ての書籍が電子書籍として購入できる、という状態にできる限り早く持って行き、Amazonが大量の本を抱えて参入してくる前に、少しでも「ヘビー読者層」に、もう他に移るの面倒だな、と思わせるくらい買ってもらうのがいいと思う。

そのためにも、ぜひ期間限定で全商品50%OFFをときどきやってください!(と、ようはこれがいいたかったのです。)

※ ちなみに佐々木俊尚さんのように紙は普通に出版社からだし、電子版は自分でDRMフリーで売っちゃうというのはありだと思う。というか大歓迎。

※ あとはAmazonのように簡単にきれいに各本へのアフィリエイトリンクをはれる仕組みも必要だと思う。

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

新しいiPad(第3世代)、メモリは1G

先日新しいiPadが発表されて、発売も明後日に迫ってますが、メモリが1GBであることが確定しました。だいぶ前から1Gという噂はありましたが、ベトナムで既に開封されてベンチマークが取られています。

こちらが開封の動画

そしてベンチマークがこちら

その他のベンチマークもこちらにあります。

iPadについてはスペックなどはほとんど意識したことがなく、アプリ開発者が快適に動くよう努力してくれるので(そうでないとダウンロードしてもらえない)あまり気にしてはいなかったけど、メモリが増えれば開発者としてもできることも増えるし、Safariのキャッシュも増えるだろうしバックグラウンドアプリの寿命も伸びるだろうからやっぱり嬉しい。

phpのセッションにmemcachedを利用するとphpMyAdminのsession_write_close()でエラーがでるようになる

phpMyAdminは非常に便利なMySQLの管理ツールなのですが、phpのセッションにmemcachedを使うように設定すると下記のようなエラーがでるようになりました。

Warning: session_write_close() [function.session-write-close]: open(tcp://localhost:11211?persistent=1&weight=1&timeout=1&retry_interval=15/sess_miMkjjQnUA6IcXKPGeAbcUtB010, O_RDWR) failed: No such file or directory (2) in *****/***/***/index.php on line 44

※ ***は実際にはファイルのパスです。

このエラーはphpMyAdminがsession.save_handlerにfileを指定しているためにおきるようです。そこで、phpMyAdminの中のlibraries/session.inc.phpにある

ini_set('session.save_handler', 'files');

をコメントアウトします。これでこれまで通り正常に利用できるようになりました。

※ ちなみに今回利用していたphpMyAdminのバージョンは2.9.0.2でした。その他のバージョンでも同様の症状が起きる場合は同様の問題と思われます。

ついに日本でもiTunes in the Cloudが

ついに日本でもiTunes in the Cloudが始まりました。

これで購入した曲が自動的に全部のデバイスにダウンロードさせることができます。前に買った曲も全部再ダウンロードも。前にiPhoneで曲を購入してMacにうつさずにリストアしたときは泣きそうだったけど(しかもその曲がマルマルモリモリ)、今後はそんなときでも救済されます。

自分でCDから取り込んだ曲もiTunesの曲と結びつけてiTunesで購入したのと同じような状態にしてくれるiTunes Matchという年間25ドルの有料サービスは日本ではまだのよう。日本では権利関係が面倒そうなので相当時間がかかると思っていましたが、iTunes in the Cloudは意外にすんなり始まったのでちょっと期待してしまいます。

iTunesのiTunes Storeの一番右にある「購入済み」のところでこれまでの購入履歴を確認&再ダウンロードできます。(マルマルモリモリも無事再ダウンロードできた)

ちなみに、iOS側での設定は「設定アプリ」から「Store」で「自動的ダウンロード」のところに「ミュージック」というのが追加されているのでこれをオンにします。
それにしてもiTunesではほとんど曲は買っていないと思い込んでいたのに374曲もかっていたとは…。

WordPressをアップデートした

このブログはずっとほっぽりっぱなしだったので、Wordpressのバージョンも上げていませんでした。今度書こうと思いますが、O’Reillyの本やビデオのレビューを書くことでただで電子書籍(英語版ですが)を入手することができるということで、このブログを利用して書くことにしました。

というわけでさすがに2.2.3(だったかな?)はまずいだろう、ということでアップデート。というか古すぎてアップデートするのも怖かったので、いったん別ドメインで新規インストール後、旧サイトでエクスポートしたものをインポートしました。

ちなみにインポート時に

"This does not appear to be a WXR file, missing/invalid WXR version number"

というエラーがでました。
Importing from very old WP (2.2.3) to newest version をみるとどうやらエクスポートファイルにバージョン名の指定がないのが問題の様子。

<channel>タグの下に

<wp:wxr_version>1.1</wp:wxr_version>

を追加することで解決しました。

テーマはデフォルトのが意外にもいい感じだったので、それを使うことにしました。