ちょっと興味があったので GmailFS の実装をのぞいてみた。
ファイルシステムとしての実装のベースは FUSE というフレームワークを使用している。これを Linux カーネルに組み込むことにより、その後カーネルをコンパイルしなおすことなく、プログラムなどでファイルシステムを実装することができる。具体的には、
mount -t fuse /path/to/script/or/program /path/of/mount/point [options]
みたいにスクリプトを指定してマウントできるようなイメージ。このスクリプトは標準入出力か何かを利用して、ファイルの読み書きを実装すればいいのかな。GmailFS は、Python のライブラリ fuse を継承してこのフレームワークを実装している。実装の中身はというと、
#@+node:getinodeMsg def getinodeMsg(self,inodeNumber): """ Get Gmail message handle for the message containing inodeNumber """ folder = _getMessagesByQuery(self.ga,'subject:inodeid=__'+inodeNumber+'__') if len(folder)!=1: log.error("could not find inode msg with inodenumber:"+inodeNumber) return None; if len(folder._threads[0])!=1: return None; thread = folder._threads[0] if not thread._messages: thread._messages = thread._getMessages(thread) return thread._messages[0] #@-node:getinodeMsg
のような感じで、メールの Subject: フィールドに inode などのメタ情報を書き込み、ボディに本体をいれて自分の Gmail アカウントにメールを送信する、ってな感じなんですね。取得は普通に getMessage でよい、と。面白いけど自分で実装したくないなぁ(実装しなくていいよ)。
ちなみになんでこんなん調べてたかというと、iTunes がらみの Hack で調べてたら、作者の Richard Clamp 氏が変態的なモジュールつくってるのいろいろ発見して、その中に Filesys::Virtual::DAAP なんての発見したのがきっかけ。これ、Filesys::Virtual というフレームワークで、仮想的なファイルシステムを実装しています。これを利用したサーバアプリとして、Net::DAV::Server とか PoCo::Server::FTP なんてのがある。
つまりまあ、DAAP (iTunes の共有) にある音楽ファイルを、DAV やら FTP でマウントしちゃえ、ってなワケなんですね。で、それぞれが抽象化されていて、プロトコル変換されてつながる、と。こういう遠〜い実装は MODULE.JP の人なんかと IM でよくしゃべってるネタなんですが、ホントにやっちゃうのが気持ちいいな〜と。
んで、Filesys::Virtual::Winny とか Filesys::Virtual::Gmail あたりをキボンヌです。