Thursday, April 24, 2008

a ruby to javascript bridge, Johnson

こんなものがあった。

http://github.com/jbarnette/johnson/tree/master
http://tenderlovemaking.com/2008/04/23/take-it-to-the-limit-one-more-time

Firefox が使っている javascript エンジン
http://www.mozilla.org/js/spidermonkey/
の ruby bridge のようだ。

README.txt に書いてあるとおりに gem install jhonson できなかったので、

git clone git://github.com/jbarnette/johnson.git
cd johnson
rake

irb で試すとこんな感じ
irb -I./lib -rjohnson
>> Johnson.evaluate("var foo = {x: 1}; foo").x
=> 1

これで、 rails アプリケーションで使っている .js のテストができるといいな。

Friday, April 11, 2008

My Spotlight in Leopard goes mad

数日前から Spotlight が index を何度も作成しようと試みるようになった。



コンソールにはこんなログが


08/04/11 4/11(金)16:18:04 mds[2477] /SourceCache/Spotlight/Spotlight-398.7/index/ContentIndex/FlatStore.c:706: failed assertion 'pageSize > 0' /.Spotlight-V100/Store-V1/Stores/E67A0F96-8AFF-43AF-B2AD-6665DE9CAD94/2.indexArrays flat store
08/04/11 4/11(金)16:18:04 mds[2477] (/)(Error) IndexCI in mergeIndexDataTrampoline:Caught mach exception. Fun Fun Fun.
08/04/11 4/11(金)16:18:04 mds[2477] /SourceCache/Spotlight/Spotlight-398.7/index/ContentIndex/CIMerging.c:216: failed assertion '!buffers->badIndex' /.Spotlight-V100/Store-V1/Stores/E67A0F96-8AFF-43AF-B2AD-6665DE9CAD94/0.indexHead corrupt ro index need to rebuild 0.
08/04/11 4/11(金)16:18:07 ReportCrash[2635] Formulating crash report for process mds[2477]


残念ながら、いろいろ調べてみたけど解決しないので、Leopard を再インストールすることに決めました。

Thursday, March 6, 2008

public.generic-pc.icns

Leopard の Finder には Windowsファイル共有のホストが見つかると PC を表すアイコンが表示されます。
通常は Finder のサイドバーに小さく表示されているだけなのであまり気にしてなかったのですが、ある日じっくり見てみると...。



Tiger までのアイコンの最大サイズは 128x128 だったんですが、Leopard から 512x512 になって (たぶん)640x480で表示されるあの画面の文字が辛うじて読み取れます。

アイコンファイルはココにあります。
/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/public.generic-pc.icns

Wednesday, February 20, 2008

VirtualBox beta3

MacWindows.com に VirtualBox beta3 がリリースされ、ホストOSとして Leopard もサポートされたと書いてあったので早速試してみた。



GUI はヤバイくらいダサく(OS9時代に作ったのか?)、メニュー項目に "About" が無く、Windows版と同じリソースを使っているのかショートカットのアルファベットが書いてあったり、かなりダメだが、



Parallels 2.0 のように Linux ゲストの時計を同期させる機能が欠如していたり(3.0 では対応したらしい)、VMWare のように VMWare tools を入れるという面倒なことをしなくても時計はホストと同期がとれているようだ。

Ubuntu の iso で起動させてみただけで、まだ分からないけど、Parallels も VMWare もMac 版は無料ではないので VirtualBox でもよいかもしれない。

Sunday, February 17, 2008

rescue_from() and Proc#bind()

Rails 2.0 の新機能に rescue_from(exception_class) という地味なやつがあります。いままでは、 ApplicationController などで rescue_action などをオーバライドして引数に与えられる exception を case ... when で処理するというわかりやすいけど、ダサイ方法で対応してきました。rescue_from を使うとこんな感じに書けます。


class UnauthorizedError < RuntimeError; end

class ApplicationController < ActionController::Base
...
before_fiter :login_required
def login_required
raise UnauthorizedError
end

rescue_from UnauthorizedError do
redirect_to login_path(:return_to => request.request_uri)
end
end


before_filter などにブロックを与える場合、そのブロックの self はそのコントローラのクラスなので、ブロックパラメータ controller を使うか、上記のようにインスタンスメソッドのシンボルを与える方法を使います。 ApplicationController で login_required のようなフィルタを追加した場合、かならず skip_filter したいケースがあるのでこの場合はいいんですけど、 before_fiter :foo; def :foo; ... end と冗長な書き方がウザイときもあります。

それと比べて、 rescue_from のブロックの中身はなぜかインスタンスメソッドと同じように書けます。Ruby 標準にはそんな機能はない思ってたのにと調べたら、秘密は ActiveSupport の Proc#bind() でした。

以上。

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 以外のエンコーディングのことをまじめに考えていない)には残念に思います。

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 をインストールしていれば自動的に入っているはず。