2009-10-27
■[Ruby][Rails]アップグレードダウン
RubyMineの2.0βを試したくて、暫くぶりでRailsで書いたアプリケーション(scaffold)を起動したら、何故かエラーが出て動かない。どうやらRailsを2.3に上げたのが原因なのだが、そんな違いがあったっけか。
・セッションキーの設定
`ensure_session_key': A key is required to write a cookie containing the session data. Use config.action_controller.session = { :key => "_myapp_session", :secret => "some secret phrase" } in config/environment.rb (ArgumentError)
と起動時に怒られる。
親切なことに、どのスクリプトに設定を追加すれば良いかメッセージが表示されているので、その通りに修正する。
・application.rb ファイル名変更問題
起動はしたが、コントローラを呼び出す際に例外発生
NameError (uninitialized constant ApplicationController): app/controllers/people_controller.rb:1
ApplicationControllerが見つからない。
どうやらapplication.rbはapplication_controller.rbに名前が変わったらしい。
ファイル名を変更。
これで完了。generateで吐かれたコードだし、やはり違いがあるんだな。
2009-08-27
■[Ruby][Rails][PaaS]Heroku
Heroku
Webブラウザを使ってRailsの開発ができる、ということで話題になったHeroku Gardenだが、本家のHerokuはRuby on Railsをホスティングする、いわば"Rails-PaaS"(といってもいいだろう)マルチテナントサービス。
バックエンドにはAmazon EC2を使っているらしいが、個人的にはGoogleなんかよりもこちらを使って何かしたいな。
2009-05-27
■[RubyMine][Ruby]RubyとRubyMine(Build 993)でテストの結果が変わる
DRbのテストをしていたのだが、RubyとRubyMineで同じテストの結果が変わる現象が発生している。
- drbtest.rb(%RUBY_IMAGE%test/drb/drbtest/rb)
- RubyMine Build 993(tunit_in_folder_runner.rb)
<#<Unknown2:0x4f4de50 @foo="unknown2">>
expected to be kind_of?
<DRb::DRbUnknown> but was
<Unknown2>.
./drbtest.rb:119:in `test_02_unknown'
D:\Program Files\JetBrains\RubyMine 1.1\rb\testing\patch/test/unit/ui/testrunnermediator.rb:41:in `run_suite'
D:\Program Files\JetBrains\RubyMine 1.1\rb\testing\patch/test/unit/ui/teamcity/testrunner.rb:69:in `start_mediator'
D:\Program Files\JetBrains\RubyMine 1.1\rb\testing\patch/test/unit/ui/teamcity/testrunner.rb:57:in `start'
しかし、コマンドからIRBを起動して同じテストを実行すると
- Ruby(IRB)
Test::Unit::AutoRunner.run(true, "E:/ruby-1.8.7-p160/test/drb/") Loaded suite . Started ...................................................................................... Finished in 39.927027 seconds.
86 tests, 428 assertions, 0 failures, 0 errors
と全て通るのである。
JetBrainsにはフィードバック済みだが、既知のバグであり1.1の正式版ではFixされるそうだ。
2009-05-26
■[Ruby]Ruby-1.8.7_p160 test_system編
現在の状況
- test_gdbm(test_s_open_create_new)
Windowsでは対応していないファイルモードがあるので放置中
- test_ssl(test_client_auth)
特定の環境によってECONNRESETが出たりでなかったりなので放置中
上記を除くと通っていないテストは現状1つとなった。
Setting environment for using Microsoft Visual Studio 2005 x86 tools. E:\ruby-1.8.7-p160\test\ruby>ruby test_system.rb Loaded suite test_system Started .F Finished in 3.173 seconds.
1) Failure: test_system(TestSystem) [test_system.rb:15]: <"foobar\n"> expected but was <"Setting environment for using Microsoft Visual Studio 2005 x86 tools.\nfoobar\n">.
2 tests, 2 assertions, 1 failures, 0 errors
見ただけだととんでもない結果になっている。
"Setting environment〜は、以前のエントリで紹介したが、コマンドプロンプトにスタートアップとして登録しているバッチファイルのエコー出力だ。
コマンドプロンプト開始時に実行するコマンドを設定する
どうしてコマンドプロンプトのエコーがパラメタに入り込むのか? 最初はメモリのある領域を壊していると思ったのだが(笑 そうでは無い。
このときのテストコードを見てみよう。
- test_system.rb
13 def test_system 14 ruby = EnvUtil.rubybin 15 assert_equal("foobar\n", `echo foobar`)
`echo foobar`を囲んでいる文字はシングルクォートではなくバッククォートである。
コマンド出力
例:
`date`
%x{ date }
バッククォート(`)で囲まれた文字列は、ダブルクォートで囲まれた文字列と同様にバックスラッシュ記法 の解釈と式展開 が行なわれた後、コマンドとして実行され、その標準出力が文字列として与えられます。コマンドは評価されるたびに実行されます。コマンドの終了ステータスを得るには、$? を参照します。
リテラル - Rubyリファレンスマニュアル
という訳で、Rubyでは`echo foobar`はコマンドとして評価されるのだ。
Windowsの場合コマンドはcmd.exeになるのでバッククォートで囲まれた文字列が登場する度にcmd.exeが動いて私が登録したvsvars32.batが実行されてコマンドが評価される前に標準出力に出力されたエコーが付加されてしまう。
予想される結果が
"foobar\n"
に対して
"Setting environment for using Microsoft Visual Studio 2005 x86 tools.\nfoobar\n"
となるのも当たり前という訳だ。
当然このままじゃまずいので修正しなくてはならない。いろいろ方法はあると思うが、面倒なので"Setting environment〜をコメントアウトすることにする(コメントでは無いので@echo offでは止められない)
E:\ruby-1.8.7-p160\test\ruby>ruby test_system.rb Loaded suite test_system Started .. Finished in 1.063106 seconds.
2 tests, 13 assertions, 0 failures, 0 errors
おっしゃー。これで最低限必要な拡張ライブラリィを組み込んだ状態で通せる全てのテストが通ったことになるーーと思い最初からテストをやり直したが...
1) Error:
test_02_collect(TestDRbSSLAry):
DRb::DRbConnError: drbssl://kazzz-pc:52747 - #<Errno::EACCES: Permission denied - D:/temp/out.csv20090526-4432-1jp9ral-0>
e:/ruby/lib/ruby/1.8/drb/drb.rb:736:in `open'
e:/ruby/lib/ruby/1.8/drb/drb.rb:729:in `each'
e:/ruby/lib/ruby/1.8/drb/drb.rb:729:in `open'
e:/ruby/lib/ruby/1.8/drb/drb.rb:1196:in `initialize'
e:/ruby/lib/ruby/1.8/drb/drb.rb:1176:in `new'
e:/ruby/lib/ruby/1.8/drb/drb.rb:1176:in `open'
e:/ruby/lib/ruby/1.8/drb/drb.rb:1092:in `method_missing'
e:/ruby/lib/ruby/1.8/drb/drb.rb:1110:in `with_friend'
e:/ruby/lib/ruby/1.8/drb/drb.rb:1091:in `method_missing'
e:/ruby/lib/ruby/1.8/drb/extservm.rb:40:in `service'
e:/ruby/lib/ruby/1.8/monitor.rb:242:in `synchronize'
e:/ruby/lib/ruby/1.8/drb/extservm.rb:37:in `service'
E:/ruby-1.8.7-p160/test/drb/drbtest.rb:35:in `ext_service'
E:/ruby-1.8.7-p160/test/drb/drbtest.rb:34:in `ext_service'
./drb/test_drbssl.rb:56:in `setup'
OpenSSLを入れ直したことにより、新たにエラーが発生したらしい。
2009-05-25
■[Ruby][C]Ruby-1.8.7_p160 openssl編 その4
前回すったもんだしたopensslだが、気を取り直して本家から最新のソースコードをダウンロードしてビルドするとあっさりと何もなかったように終わった。
openssl-0.9.8k.tar.gz/ openssl Source, Tarballs
ビルドが成功した理由はちゃんとあった。以下のようにConfigure時におまじないを一つ追加することである。
$ perl Configure VC-WIN32 --prefix=e:/openssl -D_WIN32_WINNT=0x0600 -DWIN32_LEAN_AND_MEAN
WIN32_LEAN_AND_MEANオプションは通常は不要な関数ヘッダを取り除くために使用するが、opensslの場合この指定が無いとコンパイルエラーが発生し、以前のエントリのようにソースコードを修正するはめになる。
なお、拡張ライブラリィのビルドでextconf.rbにより生成するMakefileにも同様にWIN32_LEAN_AND_MEANの指定が必要だ。(指定が無いと、やはりコンパイル時にエラーが発生する)
2009-05-23
■[Ruby][C]Ruby-1.8.7_p160 openssl編 その3
test_ssl.rb中のtest_client_authが失敗する件だが、自宅環境で拡張ライブラリィを作り直してテストして見るとエラーが消えてしまった。
仕事場の環境でエラーが出た時のログを見ると
3) Failure:
test_client_auth(OpenSSL::TestSSL)
[./openssl/test_ssl.rb:216:in `test_client_auth'
./openssl/test_ssl.rb:129:in `call'
./openssl/test_ssl.rb:129:in `start_server'
./openssl/test_ssl.rb:215:in `test_client_auth']:
<OpenSSL::SSL::SSLError> exception expected but was
Class: <Errno::ECONNRESET>
これは以下のコードで発生している。
- test_ssl.rb test_client_auth
216 assert_raises(OpenSSL::SSL::SSLError){
217 sock = TCPSocket.new("127.0.0.1", port)
218 ssl = OpenSSL::SSL::SSLSocket.new(sock)
219 ssl.connect
220 }
assert_raisesはパラメタに指定した例外がブロック中で発生した場合、その例外を飲み込んで処理を継続するものだが、このとき実際に発生していたのはECONNRESET。自宅ではECONNRESETは発生しなかったということだ。
ではどんな自宅ではどんな例外が発生しているのだろう。SSLErrorだけでは解らないのでコード中で例外を補足してその内容をダンプしてみた。assert_raises中では例外は捨てられるのでスタックトレースからは読めないのだ。
SSL_connect returned=1 errno=0 state=SSLv3 read finished A: sslv3 alert handshake failure
SSL3.0のハンドシェイクに失敗しているらしい。しかしこれは接続が上手くいかないことを証明するテストなので、失敗しているのは構わないのだが、仕事場の環境だけがアサーションに引っかからないのが気になる所だ。
SSLはいろいろな外部要因(ネットワーク、他のソフトウェア、証明書、etc.)が絡むんで、後でHTTPSとか使った時に慌てないように、今のうちに問題は潰しておきたいところ。
2009-05-22
■[Ruby][C]Ruby-1.8.7_p160 openssl編 その2
前回すったもんだしたopensslだが、気を取り直して本家から最新のソースコードをダウンロードしてビルドするとあっさりと何もなかったように終わった。
openssl-0.9.8k.tar.gz/ openssl Source, Tarballs
なのでこれを使って拡張ライブラリィを作る。
E:\ruby-1.8.7-p160\ext\openssl>ruby extconf.rb --with-winsock2 --with-openssl-lib=win32\lib --with-openssl-include=win32\include
=== OpenSSL for Ruby configurator === === Checking for system dependent stuff... === checking for t_open() in nsl.lib... no checking for socket() in socket.lib... no checking for assert.h... yes : : creating extconf.h creating Makefile Done.
E:\ruby-1.8.7-p160\ext\openssl>nmake
cl -nologo -LD -Feopenssl.so openssl_missing.obj ossl.obj ossl_asn1.obj ossl_bio.obj ossl_bn.obj ossl_cipher.obj ossl_config.obj ossl_digest.obj ossl_engine.obj ossl_hmac.obj : : ws2_32.lib -link -incremental:no -debug -opt:ref -opt:icf -dll -libpath:"." -libpath:"e:/ruby/lib" -libpath:"win32\lib" -implib:openssl-i386-mswin32_80.lib -pdb:openssl-i386-mswin32_80.pdb -def:openssl-i386-mswin32_80.def ライブラリ openssl-i386-mswin32_80.lib とオブジェクト openssl-i386-mswin32_80.exp を作成中 mt -nologo -manifest openssl.so.manifest -outputresource:openssl.so;2 E:\ruby-1.8.7-p160\ext\openssl>nmake install
Microsoft(R) Program Maintenance Utility Version 8.00.50727.762 Copyright (C) Microsoft Corporation. All rights reserved.
install -c -p -m 0755 openssl.so e:\ruby\lib\ruby\site_ruby\1.8\i386-msvcr80 install -c -p -m 0644 .\lib\net\ftptls.rb e:\ruby\lib\ruby\site_ruby\1.8\net : : install -c -p -m 0644 .\lib\openssl\ssl.rb e:\ruby\lib\ruby\site_ruby\1.8\openssl install -c -p -m 0644 .\lib\openssl\x509.rb e:\ruby\lib\ruby\site_ruby\1.8\openssl install -c -p -m 0644 .\lib\openssl.rb e:\ruby\lib\ruby\site_ruby\1.8
E:\ruby-1.8.7-p160\ext\openss
快調、快調。前回が嘘のようだ。
残念ながらtest_ssl.rbは同じように失敗したが、必要であればデバッグ情報を出力してコードを追うことにしよう。
それにしても、MakeFileの事を殆ど気にせずに済むRubyのextconfを使う仕組みは素晴らしいよな。