ちょっと興味があったので 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 あたりをキボンヌです。