Thursday, December 27, 2007

A small pitfall on Mac with Capistrano's deploy:web:disable task

To test a deployment process of a rails application at my local machine, a Mac OS X Leopard, I set up virtual host with Apache + reverse proxy + mongrel. When I tried to do "cap deploy:web:disable", I fell in to a pitfall, a Mac OS X local issue. The apache constantly respond "403 forbidden" for every URL under the virtual host.

The things is...

  1. Capistrano uses "/system/maintenance.html" for the path to the maintenance page (by the default)

  2. And if you use Apache mod_rewrite, the setting about maintenance.html may look like this:

    RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
    RewriteCond %{SCRIPT_FILENAME} !maintenance.html
    RewriteRule ^.*$ /system/maintenance.html [L]

  3. But, "RewriteRule" searchs the root of the file-system for "/system/maintenance.html" first (See description about "URL-path" of RewriteRule)

  4. Yes, there is the directory "/System" on Mac OS X, and HFS+ doesn't matter case of filename

  5. "/System" aren't accessible with httpd except you are mad

  6. So, you get "403 Forbidden"


A alternative of the rewrite rule is:

RewriteRule ^.*$ %{DOCUMENT_ROOT}/system/maintenance.html [L]

It works on Mac OS X (and other systems as well I think).

Sunday, December 9, 2007

What I'v just discovered in Advanced Rails Recipes

Advanced Rails Recipes のβブック(pdf) がリリースされたので早速購入して、ザクっと目を通してみました。

一年以上 Rails のアプリケーションを仕事で作っているので、前作(といっても著者は違うけど) Rails Recipes を読んだときほどの発見はなかったけれど、細かい発見がいくつか。ほんのメモ程度なので詳細を知りたい人は本を買ってやってください。

Recipe 17 - Accessin’ Helpers



$ script/console
Loading development environment.
>> helper.human_size 333232323
=> "317.8 MB"


From Recipe 32 - Running Multi-Stage Deployments



set(:deploy_to) { "/path/to/#{application}/#{stage}" }

deploy_to が評価されるときにブロックが実行される。

Recipe 12 - Simplifying Controllers With a Presenter


1つのフォームとアクションで複数のモデルを扱うときのパターン。
普通の ruby のクラスを使って user_name のようなメソッドを method_missing で send("user").send("name") のようにデリゲーションする この method_missing の使い方だけでもいろいろ使えそうだ。
Jay Fields Thoughts : Rails : Presenter Patternが元ネタですね。

Recipe 25 - Enabling Remote Testing


ssh -R オプションによるポートフォワーディングで、開発マシンで実行しているアプリケーションをプロダクションサーバーから参照できるようにする。なるほど。

Friday, December 7, 2007

A low cost server



ファイルのバックアップ、Railsアプリケーションのホスティング(tagnote)などに使っているサーバーです。

半年前までは、イーレッツ Be Silent M6000のコンデンサのアタマが開いて壊れるまで使っていて、その余ったケースに VIA EPIA-LN10000EG と Mini-Box の電源 picoPSU-120 を付けて使ってます。

このサーバー、僕の用途を満たす十分な性能があり、低消費電力でファンレスなので、24時間稼働させてもほとんど気になりません。(廃熱は水筒や乾き損ねたくつ下の乾燥に利用)

ワットチェッカーで測ってみると、消費電力はアイドル時には 20W くらいで、一ヶ月あたりの電力量は、

1.42kwh/71:13(71.21h) => 19.94w/h => 478.58w/24h => 12.34kwh/30d
12.34kwh/30d * 21円/kwh => 259円/30d (11月は192kwhだったので、21円/1kwh)

多く見積もっても 300円/月くらいですね。

Friday, November 23, 2007

Testing ANY helper in a functional test

Recipe #44 - "Write Tests for Your Helpers" in the book "Rails recipes" instructs us doing this by including helper modules in subclasses of Test::Unit::TestCase. However it wouldn't work if a helper you want to test is implemented with _erbout for example. I have just faced this issue last week, then my colleague suggested me like that "Don't you render it in a view?" (in Japanese). Yes, in a view biding, every helpers must be work correctly.

The solution is like following code:

test/units/foo_helper_test.rb:
...

class FooTestController < ActionController::Base
...
def index
render :inline => <<-INLINE
<% foo do %>
<%= ... %>
<% end %>
INLINE
end

end

class FooHelperTest < Test::Unit::TestCase
def setup
@controller = FooTestController.new
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
end

def test_foo
get :index
# do assert_select or whatever you like, to check rendering result of the helper.
end
end

Subversion Precomposed UTF-8 patch

(2013-02-18: 現在のおすすめは `brew install subversion --unicode-path` (OS X10.8.2, svn 1.7.8 で動作確認))
(2009-08-17: 気がついたら MacPorts にパッチが取り込まれてます。)

前回 Rails on Leopard で紹介したノートの一部でもパッチをあてた Subversion のビルド方法を書いたけど、もう少し詳しく解説します。

簡単に言うと、 Windows を使っている人と Mac を使っている人が Subversion のリポジトリを共有している場合に、 Windows からリポジトリに追加した日本語ファイル名のファイルを Mac で checkout すると svn status などを実行したときにファイルがダブっているように見えて正常に扱えないことがあります。(Mac -> Win の場合でも同様の問題が発生する)

Mac OS X ではファイル名を UTF-8 で保存するときに濁点、半濁点などを decompose (分解) してから保存してしまうために、リポジトリ内のファイル名の文字列と一致しなくなってしまうのが原因。

例えば、「ステージングテスト.xls」という Windows からリポジトリに追加されたファイルを Mac で checkout すると、「ジ」と「グ」は濁点が別の文字として切り離されてファイルシステムに保存されてしまい、リポジトリとワーキングコピーを比較するようなコマンドを実行すると、別々のファイルとして扱われてしまう。

ちょっと話は変わりますが、
僕は仕事で rails のアプリケーションを開発していまして、Tiger のときは VMWare に CentOS(Linux) を入れて、ターミナルから全ての作業をやってましたけど、 Leopard には最初から Rails がインストールされていたりするので、 Mac をネイティブに rails の開発環境として使おうと決心しました。
この Subversion の問題は致命的でした。

Subversion のバグトラッキングシステムには、すでにこの問題(issue - 2464)が2005年12月の段階で指摘されているのにまだ修正(改善?)されていないので、他力本願ではダメだと思い、解決方法を調べてみました。

なんとか到達した僕の解決方法は、svn コマンドが Mac 上でファイル名を扱う時には、ファイルシステムから得られたファイル名の分解された濁点を合成してから行うという方法です。

Apple が配布するバージョンの Subversion へのパッチを当てたバイナリのビルド方法は ココ に書いあります。

手前味噌ですが、Mac から日本語ファイル名を含む Subversion リポジトリにアクセスする必要のある人にとっては必須だと思うので使ってください。

Sunday, November 11, 2007

Rails on Leopard

I had little trouble when I got Leopard ready for my daily task, coding rails applications. I share my notes with hope you think them useful.

Leopard で rails の開発作業ができるまでに多少トラブったので、そのメモを公開します。

Sunday, July 15, 2007

膠と漆



漆器の汁椀や塗箸などは現在でも一般的に使われているので、漆(うるし)の塗料としての価値は認められていると思う。しかし、接着剤としての用途はあまり知られていないようだし、もうひとつの接着剤、膠(にかわ)に関しては名前だけしか知らないという人は少なくないと思う。

僕は伝統工芸の職人ではないけれど、その膠と漆の以外と知られていない接着剤としての性能について少し知って欲しいと思います。

プログラマという職業柄、僕はモノをつくるのが好きなので、気が向いた時にはパンを作ったり日曜大工をします。また、最近は石油化合品は生物にとって毒だと思っているので、以前は疑いも無く使っていた「木工用ボンド」もなるべくなら使いたくないので、合成接着剤が登場する以前から使われている膠と漆を試してみようと思い、実際に使ってみてその性能に驚いた。

安物の木製家具の組み立てには、合成接着剤と共に木ネジが使用されていることがよくある。そういう家具は、しばらく使っていると接着剤が剥がれたり、木ネジが木をえぐってしまいグラグラしてくる。僕が使っている、ポールハンガーの接合部も木ネジでが使用されていたので長年使っているとグラグラしてきてもうダメかと思った。けれども、膠で木ネジがえぐった穴を固定するようにしてやったら、グラグラせずに使えるようになった。

漆も塗料だけではなく、接着剤としても使えます。 愛用している急須の口が欠けてしまったときに、最初は「アロンアルファ」で接着したけど、臭いし、お湯を使うためか、すぐにとれてしまった。いろいろと調べた結果、「金継ぎ」という方法で陶器の修復ができることを知り試してみたら、ちゃんとくっついてくれました。金継ぎとは、漆に砥の粉(砥石の粉末らしい)をまぜてできたペースト状のもので接着して、それだけだと黒く汚らしいので、金粉で覆う修復方法。漆は食器の塗料にも使うぐらいなので、お湯くらいの温度ではビクともしない。すばらしい。

Saturday, July 7, 2007

パン


いつもはホームベーカリーでパンを作っているけど、丸いパンが食べたかったので、粉も手で捏ねて、オーブンで焼いてみた。

「フライパンで作る世界のパン」のパン生地の作り方を見ながら適当に作った割にはうまくできた。見た目だけでなく味も悪くない。