Ruby のHTTP関連ライブラリ と ストリーミングダウンロード2010/03/01

うーむ。 表題の件で少し悩み中

Net::HTTP / Net::HTTPS

Net::HTTP#request は、ブロックを渡すとストリーミング受信はできるものの、レスポンスは全部メモリに貯まる。

微妙な片手落ち感が……。

Mechanize

Mechanize#get 等はブロックを受け取るものの、ストリーミング受信等はしてくれない。

Mechanize::Page オブジェクトの生成が全て完了してからブロックがyeildされる。 というか、このブロック引数って、何か良いことあるのかな? eachが一つ省略できるぐらい?

HTTPClient

HTTPClient#request は、ブロックを渡すとストリーミング受信をしてくれて、この場合は、responseオブジェクトにはbodyが貯まらない。

この点については一番理想的な実装だけど、信頼できない証明書を使用しているhttpsサイトに接続させてくれないという問題が……。

HTTPClient にモンキーパッチを当てるのが正着なのかなあ……。

と思ったら、 HTTPClient::SSLConfig#verify_mode に OpenSSL::SSL::VERIFY_NONE を設定してやれば証明書の問題はスルーしてくれることが判明。

httpclient = HTTPClient.new
httpclient.get('https://localhost/').status
# OpenSSL::SSL::SSLError が発生
httpclient.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE
# => 0
httpclient.get('https://localhost/').status
# => 200

調べてみたら、HTTPClient 2.1.3 からの新機能か。1年前には実装されてたとは……。時の流れは速すぎるぜ。

余談

ちなみに、request bodyをストリーミングできるのは Net::HTTPだけ。

余談の余談

ここで言うストリーミングとは、rewindできないようなIO(要するに$stdin)の状態で取り扱いたいという話で、既にFileオブジェクトになっているようなものを少しずつ送るだけなら、MechanizeやHTTPClientでも問題なく対処できます。

Passenger とか RVM とか2010/03/10

色々サボっていた分のキャッチアップをしたので忘備録

インストール順に RVMから

RVM

RVM は、複数バージョンのruby処理系を同時にインストールして、 それらをスイッチしながら利用することを可能にしてくれるライブラリ。

gemで配布されているけど、実体は殆どシェルスクリプト。

ちょっと考えれば何をやっているのかはすぐに判ると思う。でも、これらのスクリプトが既製品で用意されたというのは大きい。

複数のバージョンの ruby に順番に同じコマンドを流して、結果を比較できる機能は結構楽しい。

$ rvm ruby -v
jruby-1.4.0: jruby 1.4.0 (ruby 1.8.7 patchlevel 174) (2009-11-02 69fbfa3) (OpenJDK Client VM 1.6.0) [i386-java]
jruby 1.4.0 (ruby 1.8.7 patchlevel 174) (2009-11-02 69fbfa3) (OpenJDK Client VM 1.6.0) [i386-java]

ruby-1.8.6-p399: ruby 1.8.6 (2010-02-05 patchlevel 399) [i686-linux]
ruby 1.8.6 (2010-02-05 patchlevel 399) [i686-linux]

ruby-1.8.7-p249: ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-linux]
ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-linux]

ruby-1.9.1-p378: ruby 1.9.1p378 (2010-01-10 revision 26273) [i686-linux]
ruby 1.9.1p378 (2010-01-10 revision 26273) [i686-linux]

あと、0.18 ぐらいでいくつかのオプションの記法が変更されている。 例えば、インストールされたruby処理系の一覧の取得には 'rubies' の引数が必要になった。

$ rvm list rubies
rvm Rubies
   jruby-1.4.0 [ [i386-java] ]
   ruby-1.8.6-p399 [ i386 ]
=> ruby-1.8.7-p249 [ i386 ]
   ruby-1.9.1-p378 [ i386 ]

Default Ruby (for new shells)
   ruby-1.8.7-p249 [ i386 ]

System Ruby
  system [ i386 ]

Passenger

Phusion Passnger は通称mod_rails(ドメイン名もそうだ)。 Apacheの拡張モジュールとして動作し、rubyのプロセスをキャッシュしてくれる素敵なやつ。

噂には聞いていたけど、実際動作させてみるとお手軽さが凄い。 確かに mogrelのプロセスを自前でspinさせていた時代には戻れない気がする。

RVM経由でビルドした場合(かつ RVMサイトのインテグレーションガイドに従った場合) 共有モジュールの.soが、

/home/user/.rvm/gems/ruby-1.8.7-p249/gems/passenger-2.2.10/ext/apache2/mod_passenger.so

とか言う結構素敵な場所にできます。 素のrubyからインストールしても、/lib/ruby/gems/1.8/gems/~ とかApacheのモジュールとしては結構ナニな場所だけどね。

このせいで、うちの環境だと、SELinux のチェックにひっかかってしまった。

Apache の起動時に mod_passenger.so を読み込もうとしたところで Permision Denied のエラーで落ちる。

この場合、SELinux を Enfoced か Disabled に設定すること。

Capistorano

deploy時にシンボリックリンクを張り代えるので、Passenger との相性が気になったけど、 今のところは問題なさそう。

Passenger は シンボリックリンクが張り代わった直後のアクセスで($RAILS_ROOT/tmp/restart.txt が無くても) 再読み込みされているっぽい。

念のため Capfile で deploy:restart タスクに restart.txt に touch するようにしておく。 (もはや、script/process/reaper なんて存在しないしね)

namespace :deploy do
  desc "Restarting mod_rails with restart.txt"
  task :restart, :roles => :app, :except => { :no_release => true } do
    run "touch #{current_path}/tmp/restart.txt"
  end

  [:start, :stop].each do |t|
    desc "#{t} task is a no-op with mod_rails"
    task t, :roles => :app do ; end
  end
end
http://tomcopeland.blogs.com/juniordeveloper/2008/05/mod_rails-and-c.html

今日もPassenger2010/03/11

完全に自分用メモです。

Shibboleth SPを Passengerで配置したアプリと協働させるようにするには

RAILS_ROOT/public/Shibboleth.sso/SAML/POST
RAILS_ROOT/public/Shibboleth.sso/SAML2/POST

に内容は何でも良いので、何かファイルを置く。 参考:Shib-Users-ML

ファイルが実在すれば、mod_passenger は仕事をしないので、mod_shibが割り込む余地ができるというところで、 mod_rewrite の時に

ProxyPass        /Shibboleth.sso !

などと書いていたのと概念的には同じことだろう。

BAUMその後2010/03/12

BAUMに機種変して、2回目の料金締め日を目前にした感想とか。

電話機能

文句なし。いやま、Adesが比較対象なので点数が甘過ぎるのだろうけど……。

今までアンテナが2~3本で不安定だった事務所の奥などでも常に5本立つようになった。

電話帳も普通に十字キーだけで操作ができるし、中ボタンクリックで、発信とかメール作成とか、常識的に起動して欲しい機能が起動する。 (それが普通なんだろうけど……)

メール機能

フルキーボードは無くなったけど、メールの読み書きの頻度は上った。 多分、Adesの二年半分は既に使ったと思う。

インターフェイス重要。

ブラウザ

論外。

初月は色々試すためにパケット上限まで使ったけど、今月は500パケットもいってない。(あともう一回ぐらい、Edyチャージをすると思うので、500は越えるか)

おさいふケータイ

実質的にEdyとヨドバシのポイントカードぐらいしか使ってないけど、 これは便利だ。

特にEdy(ヨドは比較的どうでも良い)は快感。少額決済での小銭のやりとりが、 個人的には嫌いでないというか、むしろ好きだと思っていたけど、それは錯覚だったようだ。

という訳で、無事に2年戦えそうな感じだけど、Willcom自体は大丈夫なんかな?

おまけ:データカード

W-Value Select(一括)で機種変したAX530INがあと1月で満2年らしく、丁度良かったので、AX530Sのバーゲン品を買った。

で、AX530INは解約。消費者として、理論的に正しい判断だとは思うけど、100ヶ月近い契約(Air-H"開始当初の契約。最初はMC-P300だった)を終らせるのは感慨深くもあり、こういう焼畑っぽい商売はどうなのよと思ったり思わなかったり。

ところで、解約した端末の情報が(過去の実績も)一切参照できなくなるMyWillcomの仕様はいかがなものかと小一時間……。

シャーロック・ホームズ2010/03/13

期待していた以上に面白かった。

役づくりが、ドラマやアニメで良くあるホームズ像ではなく、原作のイメージに近いつくりなのも目新しいし、ミステリーの文法に従ったシナリオも素晴らしい。

で、それらを抜きにしてもアクションも魅せるものがある。

まあ、ホームズが厨性能で、最近のキャラ設定としてそりゃねーよ、という話もある訳だけど、そこは原作どおりというやつで。