こないだ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もいじってみようかしら。