RailsはUploadProgressの夢を見るか? with Mongrel

Mongrel界隈が熱い。

Mongrelとは、Rubyで書かれた*1HTTPサーバーで、Ruby on Railsとの親和性から最近話題になっている。その導入から運用までの簡単さというと、環境が整っていて、ターミナルでRailsのトップディレクトリで作業をしている状態であれば、

$ gem install mongrel
$ mongrel_rails start

の2行ですんでしまう。そんなMongrelは、はてなのバックエンドで使われたりしている。速度的にも、Lighttpdに引けを取らないらしい(くまのひと調べ)

とりあえずMongrelを使ってみたいひとは、Nowhere Near » Mongrelを使ってみるが参考になる。

ちなみに、つい先日リリースしたうちの会社のサービスフォーサーフ・バズもバックではMongrelが走っている*2

Mongrelには、プラグイン機構が存在し、様々な機能を組み込むことができる、、、が、正直使い方がわからない(´・ω・`)

そんなわけで、テストも近いからやることリストに突っ込んでしばらく放置していたのだけど、英語の勉強が一区切りしたところで最近気になっていたmongrel_upload_progressプラグインについて調べてみたら、思わぬ収穫があった。

mongrel_upload_progressプラグインは、その名のとおりファイルのアップロード中に、何バイト中何バイトがアップロードされたか、という情報を得ることが出来る。これとAjax技術を組み合わせれば、アップロードの進行を表示するメーター*3を作ることが出来る。コードを書く側にとってはなかなか面倒な作業が予想されるけど、うまく実装できれば「アップロードにどれだけかかるかわからない」というユーザーのストレスを低減することが出来る。

さて、mongre_upload_progressプラグインだが、Mongrel-usersメーリングリストに"how to use upload progress?"という投稿があり、そこにMongrel開発者のZed Shaw氏がレスをつけている。一連の流れを紹介。

Mike Garey:

I'm a bit confused about how to get upload progress to work with mongrel.. I've installed the mongrel_upload_progress (0.1) gem, but have no idea what to do with it.

Zed Shaw:

Hey Mike, it's sort of a work in progress*4 right now. I'll try to write up some documentation shortly. We're doing a pre-release of 0.4 very soon which will make upload progress work much better.

The gist of it, if you're feeling adventurous, is to install the mongrel_upload_progress gem:

gem install mongrel_upload_progress

Then create a mongrel config script with called mongrel.conf with:

uri "/", :handler => Upload.new("/upload"), :in_front => true

And then make sure you have a Rails handler which can handle requests for /upload and which can answer requests for /progress with status. The status comes from the Mongrel::Uploads singleton which keeps track of what's going on.

But don't waste too much time on this, it's still pretty rough.

Rick should have a Rails plugin for this out soon once we get it working better.

why the lucky stiff:

If you're running 0.3.13.3, you'll also need to supply the PATH_INFO to the exact URL using the upload meter.

uri "/", :handler => Upload.new(:path_info => "/upload"), :in_front => true

つまり、Rick Olsonって人がRails用のプラグインをもうすぐ書いてくれるから、それを待てってことだね!
とまあ、他力本願寺なわけですが、mongrel_upload_progressの基本的な動作は、URLのハンドラを追加して、/progressというアドレスにアクセスすれば、アップロード中のファイルの情報がゲットできるようになっているらしい、、、が、/uploadハンドラは何のためにあるのかとか、Zed氏は詳しいことをあまり語らぬまま、「今ちょっちそこらへん作って、もうすぐもっとスマートなのがアップできるから待っててねん。」「RickがRailsプラグイン書くから」みたいなことを言っているので、ブラッシュアップされるのを待ちましょう。wktkしながら。

とりあえず、Mongrel関係のサイトのRSSを登録して、リリースが出るのを待ち構えておくことにする。

追記:

前のMLの流れを追っていたら、5月の中旬くらいにwhy氏が「upload progressを実現するパッチうpしたよ」というメールをポストして、それにRick氏が「こうしたほうがいいんじゃね?」とか言ってるところで、Zed氏が「みんなが使いやすいように、GemPluginを使って書いたほうがいいから、mongrel_upload_progressにまとめてちょ」というポストをして、mongrel_upload_progressが始まったっぽい。
つい最近のMongrelのニュースでは、「Mongrel 0.3.13.2 -- Includes Upload Progress」と銘打ってあるけど、mongrel自体はupload progressとかを使えるようにするフックを持たせただけみたいで、一緒にmongrel_upload_progressをうpしたってことらしいっす。

なんか読み間違いとかありそうで怖い(・∀・;

*1:といってもコアはCで書かれているらしい

*2:正確には、Mongrel Cluster。まだ負荷分散とかしてないけど。

*3:いわゆるプログレスバー

*4:upload progressとかけたダジャレか?

画期的な冷凍食品の解凍方法

正統派な方法「沸騰したお湯に凍った袋のまま入れ、ふたをせずに7分間加熱してください。」

外付けハードディスクの上に載せて解凍しました。ハードディスクも冷えて一石二鳥です。本当にありがとうございました。

結局お湯を沸かさないといけないけどorz