Sunday, January 27, 2008

NSPreferredMailCharset on Leopard

Apple の Mail.app にはユーザーがデフォルトで使用する送信メールのエンコーディングを選択できないという欠陥があります。新規にメールを作成する毎にはメニューから選択することにより変更できますが、環境設定の項目にはありません。

Tiger では defaults コマンドで NSPreferredMailCharset を設定することにより送信メールのデフォルトエンコーディングを設定することができたのですが(Apple のサポート情報)、Leopard ではその機能が縮退してしまっているようで動作しません。

日本語環境で利用している場合にメールを新規作成すると初期のエンコーディングは「自動」となっていて、たいていの場合はよろしくやってくれる(たぶんutf-8になる)のですが、たまに "簡体字中国語(Big 5)" で送ってくれたりしやがるので、「ヒロシさんまたメールが文字化けしてるんですけど」というクレームに Mac ユーザーとして恥ずかしくなり、デフォルトのエンコーディングを設定するプラグインを作りました。

自分だけが利用する分には ISO-2022-JP 固定で問題ないので、現状のバージョン (0.1) ではソースコードにハードコーディングしてしまっていますが、他のエンコーディングにしたい人はリクエストください。

Apple の日本やヨーロッパの法人がその問題に気がついていないのか、力が弱いのかわかりませんが、Mac の svn で濁点などが含まれるファイル名を扱うときの問題といい、 Apple のアメリカ人的考え(ascii, latin-1 以外のエンコーディングのことをまじめに考えていない)には残念に思います。

2009-09-12: Snow Leopard ではこのプラグインが動かないという報告を受けましたが、僕の mac は core duo の 初期型 MacBook でメリットを感じられなかったのでアップグレードしてません。ごめんなさい。
誰かプログラム書いたり出来る人で Snow Leopard 持ってる人がいたら プラグインの READMEの情報をヒントになんとかしてくれませんか。

Saturday, January 12, 2008

Resolving IP address for Mac, Linux and Windows each other by names

(ルーターを介さない)同一セグメント内ならば、 Mac 同士は DNS や hosts に登録しなくても "hiroshi-macbook.local" のような名前で IPアドレスを解決できます。 Mac を使っている人にとっては当たり前なので、Linux や Windows のホストにアクセスするときに環境によってはコロコロと変わる IP アドレスを指定しなければならないとストレスが溜まります。

Debian Etch, CentOS 5, Windows でその問題を解決する方法を紹介します。

Debian Etch



Avahi Daemon をインストール

$ sudo apt-get install avahi-daemon
$ uname -a
Linux hiroshi-etch 2.6.18-5-686 #1 SMP Mon Dec 24 16:41:07 UTC 2007 i686 GNU/Linux


これで、同じネットワークセグメント内の Mac などから、hiroshi-etch.local という名前でアクセスできるようになります。

$ ssh hiroshi-etch.local


逆に Linux から他のホストの名前解決ができるようにするには、

$ sudo apt-get install libnss-mdns


CentOS 5



$ sudo yum install avahi


nss-mdns のパッケージは無いようなので、(nss-mdns)

$ curl -O http://0pointer.de/lennart/projects/nss-mdns/nss-mdns-0.10.tar.gz
$ tar xzf nss-mdns-0.10.tar.gz
$ ./configure
$ make
$ sudo make install


/etc/nsswitch.conf の "hosts:" の行を以下のように書き換える (詳細は README を参照)

hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4

これで、他の .local ホスト名を解決できるようになる。

Windows


Apple から Bonjour for Windows をダウンロードしてインストールすればOK。
iTunes をインストールしていれば自動的に入っているはず。

Saturday, January 5, 2008

"Advanced Rails Recipes" beta book updated with 25 more recipes!

Advanced Rails Recipesにひと月足らずで25の新しいレシピが追加された。
先日の記事What I'v just discovered in Advanced Rails Recipesでは、あんまり面白くなかったと書いたけれど、今回追加されたレシピには興味を惹く引くものが多かった。
追加されたレシピのタイトルは、著者の Mike Clark のブログで参照してください。

また、前回と同様に簡単なメモを...

Skinny Controller, Fat Model


モデルが汚くなるのを犠牲にしてもコントローラをシンブルにすることを自分と同僚で推奨していたが、そのことが "skinny controller, fat model" (もとネタは Jamis Back のブログらしい) という言葉で、いくつかのレシピで言及されているのを見て、「やっぱりそれでよかったんだ」と思った。

caching up with big guys


cache_fu は ActiveRecord::Base.find の結果をキャッシュする。
acts_as_cached には :include => :tags や :ttl => 5.minutes がある。

returning true do
...
end

というコードがあり、 active support に returning というメソッドがあることを知った。

returning [] do |value|
value << "foo"
value << "bar"
end

という使い方もできる。
activesupport/lib/active_support/core_ext/object/misc.rb を見たら with_options もあったことを思い出した。
しかし、こういうよく知られていない、または自前のメソッドを使うとコードがわかりにくくなる。

Creating meaningful relationships through proxies



group.rb:
has_many :users

user.rb:
class User < ActiveRecord::Base
def self.find_men
self.find(:all, :conditions => "sex = 'male'")
end
end

で、 association proxy からも group.users.find_men として利用できることを知った。考えてみれば当然かもしれないが気づかなかった。

Decouple your javascript with Low Pro


lowpro.jsのEvent.createBehavior, Event.addBehavior を使えば javascript をスッキリ書けるかも

Dynamically Updating Cached pages


動的要素のあるページを page cache にしたときにそのダイナミックな部分を ajax で更新するようにはしたことがあるが、部分だけタイムラグが出てしまうが、この方法だと session とは別の cookie に javascript だけでダイナミック部分を補完できる情報を(i.e:ユーザー名)入れておけば javascript で cookie の中身を使って static page の補完ができるというアイデア。

Handling Multiple Models In One Form


Project has_many :tasks などのときに、Project#new_tasks= でコントローラを小さくする手法。この手法も良く使う。

Responding To Remote Capistrano Prompts


Capistrano でリモートサーバーの script/console セッションを操作する方法が書いてある。試してみよう。

Taking Advantage of Master/Slave Databases


リプリケーションしたDBへのクエリを master/slave で自動で振り分ける
masochism plugin の紹介。使えるかもしれない。

Testing HTML Validity


HTML test plugin の紹介。
たぶん常に有効になっているとウザイので、 rake html_validity test のようにして実行したときだけ有効になるようにすると良いかもしれない。