As Sloth As Possible

可能な限りナマケモノでありたい

タグ:MacFUSE

表題通り。MacRubyとMacFUSEでファイルシステムを作ってみようとしたんだけど、なんかいまいち上手く行かない。

まずHotCocoaがちゃんと機能してない。hotcocoaコマンドでアプリの雛形を作ってくれて、macrakeすればビルドが走って.appの形にパッケージされるんだけど、できたアプリを起動しても起動するだけで落ちる。これだけだとあまりにも分からなすぎるので、アプリの形にしないでスクリプトのまま起動してみる。

$ hotcocoa sample
$ cd sample
$ macruby -d lib/application.rb
core:in `dump': nil is not a symbol (TypeError)
	from /Library/Frameworks/MacRuby.framework/Versions/0.5/usr/lib/ruby/1.9.0/hotcocoa/mappings/menu.rb:12:in `submenu:'
	from core:in `menu:'
	from /Users/taro/Projects/sample/lib/menu.rb:3:in `application_menu'
	from /Library/Frameworks/MacRuby.framework/Versions/0.5/usr/lib/ruby/1.9.0/hotcocoa/mappings/application.rb:17:in `load_application_menu'
	from /Library/Frameworks/MacRuby.framework/Versions/0.5/usr/lib/ruby/1.9.0/hotcocoa/mappings/application.rb:8:in `handle_block:'
	from core:in `application:'
	from lib/application.rb:in `start'
	from lib/application.rb:1:in `
'

一応hotcocoaのソースを読んでったんだけど、どうやらメニューバーを生成してるところでコケてるっぽい。そしたらってんでlib/manu.rbに書いてあるHotCocoa#application_menuの中身を丸ごとコメントアウトしたところ、一応動いた。

まぁ作ろうとしてるのはFUSEのファイルシステムをマウントするアプリなので、別にメニューも要らないしViewも出さないしいっか、と思って、気持ち悪いけどそれは特に原因追わずそのままにして、前回のコードをアプリケーションとして起動できるように直してやる。んで再びmacrubyで起動させてみると、どうやらちゃんとマウントできるようだ。よしよし、と気を良くしてmacrakeを走らせたらNamakeFS.appはできたものの、こいつをダブルクリックしても起動して直後に落ちる。スクリプトのままだと行けるんだけどアプリにするとダメ。くそっ。

そもそもHotCocoaでアプリを作るのが今回の主目的じゃないので、もういいや調べるのは別な機会に、と放置することにして、今度は素直にデーモンとして動くように作り直す。これは概ね上手くいって、namakefsコマンドを叩けばNamakeFSが/Volumesの下にマウントされて、FinderからNamakeFSをアンマウントしてやればnamakefsのプロセス自体も終了してくれるようにできた。よしよし。

じゃあ次は早速AtomPubで取得した情報を出してみよう、と思ってatomutilをインストールしてみたが、どうにもこれが動かない。そもそもatomutilは1.9系でちゃんと動くのかって言われると正規表現回りでコケたりして結構微妙なんだけど、まぁ中身読んだのでごまかす手段は知っている。でも、MacRubyから使おうとしたらどうもその問題の箇所にまで到達していない。しゃいせ。

落ち着け、こういうときは慌てず騒がず冷静に、「おかしも(おさない、かけない、しゃべらない、もどらない)」の精神が大切だ、と自分に言い聞かせて、とりあえず素のnet/httpとrexml/documentでサービス文書を取得してみる。そしたら何てことだ、もうその時点でダメだよ。REXML::Document.new(res.body)とかしてみたら、そこでもうコケる。ちょ。ドキュメントオブジェクトすら作れん。ここでatomutil版の方のスクリプトを動かしてみたら、出てるエラー一緒でやんの。ちなみにCRubyの1.9.1ではもちろん何の問題もなく動くコード。ちゃんと期待通りの動作をするのは確認済み。ふぁっきん。

ええい、もうあれだ、REXMLが使えないとかちょっと正直どうかと思うが、MacRubyにはまだあれがある!そうさ、NSXMLDocument(※Cocoaのクラス)!察しの良い方はお気付きかと思いますが、わざわざMacRubyで書いてるのにも関わらずMacFUSEやらNSXMLDocumentやらを使ってるせいで、段々中身はRubyっぽい文法のObjective-Cのコードと化して来ている。もうなんかそろそろ本末転倒な感は否めないけども、とりあえずnet/httpでWSSE認証かましてGETしてきたatomのデータをNSXMLDocumentに食わせればなんとか必要な情報は取れるところまでできた。よし、これをさっきのコマンドに組み込めば…!

segmentation fault …だと?!

なんだか良くわかりません。動いてるコード + 動いてるコード = セグフォ。もう疲れたよパトラッシュ…。

結論から言うとMacRubyはぶっちゃけバグとか地雷とかが多すぎて涙が出てくるので、まだこれでどうこうしようとかは無理です。流石、RubyKaigiのセッションで開発者自ら”Crazy"と言わしめただけあるぜ、MacRuby0.5。これみたいにすごいナチュラルにObjCとRubyの融合ができちゃうっていう「可能性」には期待しているのだけども、まだ早いみたいね…。

さてどうしよう。MacRubyに深入りするのはそれはそれで楽しそうではあるんだけど、そんなことしてる内にFUSEのこと忘れちゃいそうだしなぁ。とりあえずObjCで書くかなぁ。

こないだAtomPubとWebDAVの話をしてて、あーそうかAPIをWebDAVとして実装してたらファイルシステムとしてマウントできて面白かったかもなぁ、でも実装面倒なんじゃないのかなどうだろやったことないし、でもvimで記事書いて:wで投稿されてmvしたらカテゴリ変わってrmで記事削除されてとか何それ胸膨らむ、じゃなかった夢膨らむし胸踊るね、なんて考えたところでふと気付いた。あるじゃん、ファイルシステムじゃないものをクライアント側でファイルシステムにしちゃう仕組み。

そうだ、FUSEだ。Filesystem in Userspace。前々からそのうち遊んでみようとは思ってたものの特にネタも思い付かなかったので手をつけてなかったのだけど、BlogFSに丁度良さそうだし、ちょっとやってみることにした。

Rubyでいじる

FUSEってファイルシステム作るくらいだからやっぱCとかC++とかで書くもんなんだろう、とぼんやり思ってたんだけど、そう言えば前にハチロクの卒研発表会でRubyで実装したとか言ってたよなぁ、あとhatenafsはそう言えばPerlだったっけなぁ、と思い出した。なんだ普段使ってるので書けるな。軽くググったらRubyでもFUSEのライブラリがあるらしい。よし。

…makeでコケた。んー。Rubyのfusefsに問題があるのかもしれないしMacFUSEだからそのせいかも知れないしなんかfusefsの情報古いのしかでてこないなーあー面倒くさいや。どうしたもんかね。

僕らのMacRubyさんがいるじゃないか

RubyからFUSEを使う方法をもう少し調べるとか、Perlから使う方法を調べるとか、そっちに進んでも良かったんだけど、もっとお手軽な方法に気が付いた。MacFUSEをインストールするとMacFUSE.frameworkが入る。てことは、とりあえずObjCからは簡単に使える。ObjCで書くのはまぁいいけど、正直AtomPubの扱いとか文字列の処理とか面倒くさすぎる。あれ、ちょっと待て。ObjCのフレームワークがあるってことは…MacRubyから使えるじゃないか。

$ ls /Library/Frameworks
. .. MacFUSE.framework MacRuby.framework UIM.framework
$ macruby -v
MacRuby version 0.5 (ruby 1.9.0) [universal-darwin10.0, x86_64]
$ macirb
irb(main):001:1 > framework 'MacFUSE'
=> true

素敵!愛してる!

とりあえずHelloFS

MacFUSEのサンプルとか、「雑草ブログ Luaでファイルシステムを実装しよう(MacFUSEで)」あたりを参考にとりあえず実装してみた。

これをmacrubyコマンドで実行する。ちなみにSnow Leopard+MacRuby 0.5beta1+MacFUSE 2.0.3でやってるけど、Leopard+MacRuby 0.4でも動くとは思う(未確認)。

$ macruby namakefs.rb &
$ ls /Volumes/NamakeFS
honne.txt
$ cat /Volumes/NamakeFS/honne.txt
寒いので冬眠したい

OK、OK。上出来。ちなみにこれだけでFinder上にもNamakeFSディスクがマウントされて、ちゃんとCocoaアプリとかからでも開ける。思ったより簡単だった。HotCocoaでアプリ化しちゃえば配布できる形にするのも楽だし、ファイルシステムを作るの自体はObjCの作法に則る必要があるけど、中のロジックはRubyで書けるから、RubyのAtomPubのライブラリも使えるしObjCだと本当に面倒な文字列の処理もさくさく実装できる。

MacRubyでやるってのがまぁ難点と言えば難点だけど。正直開発環境としてはまだアレげだし。RubyCocoaでやりゃいいって話ではあるんだけど、ねぇ…まぁ、いっか。

あんまり関係ないけど、Luaが意外とすんなり読めた件。まぁ中でやってることはまんまObjCだからってのもあるけど。ちょっとLuaもいじってみようかしら。

↑このページのトップヘ