Solaris 用 Twitter ファイルシステム

Twitterファイルシステムとしてマウントする擬似ファイルシステムです。
任意の場所にマウントすると 「home」, 「mention」 といったタイムライン名を持つファイルが現れて cat(1M) や tail(1M) などのコマンドでタイムラインを表示することができます。また vi(1M)、emacs(1M)、もしくはリダイレクトを使って「post」ファイルに書き込めば通常のファイル操作だけでツイートすることもできます。
English Here.

f:id:kaizawa2:20140102225146p:plain

カーネルモードの擬似ファイルシステムがありユーザモードデーモンと協調して動作することで実現しています。簡単に言うと FUSE みたいなものです。

前提条件

1. IUMFS ファイルシステムモジュール

カーネルモードのファイルシステムモジュールが必要になります。
以下のリンクからダウンロードしてビルド、インストールしてください。
kaizawa-iumfs.tar.gz

IUMFS について詳しくはこちらをご覧ください。

2. JRE7/JDK7 以降。

3. Twitter アカウント

ダウンロード

最新の圧縮ファイルを以下のリンクからダウンロードできます。

kaizawa-iumfs-twitterfs.tar.gz

ソースコード

ソースコードGithub で管理していますのでこちらから参照できます。
https://github.com/kaizawa/iumfs-twitterfs

コンパイルとインストール

ユーザモードデーモンプログラム

ユーザモードデーモンプログラムはJavaで書かれています。
上にリンクの圧縮ファイルの中にはコンパイル済みの jar ファイルが含まれていますので基本的には Java のコードをコンパイルする必要はありません。ただ、もし必要であれば以下のように ant コマンドでコンパイルすることもできます。

sol11:/var/tmp/iumfs-twitterfs $ ant
Buildfile: build.xml

jar:

init:

compile:
    [javac] Compiling 107 source files to /var/tmp/iumfs-twitterfs/cmd/build/classes

jar:
      [jar] Building jar: /var/tmp/iumfs-twitterfs/cmd/twitterfsd.jar

BUILD SUCCESSFUL
Total time: 2 seconds
sol11:/var/tmp/iumfs-twitterfs $ 

使い方

マウント方法

方法1) Twitterファイルシステムをオートマウントを利用してマウントする(推奨)

オートマウントを利用して自動的にマウントさせることができます。この方法なら管理者権限で mount(1M)コマンドをマニュアルで実行する必要はありません。
mount(1M) コマンドでのマウントと違い、一般ユーザは管理者の介入なしで自分の Twitter アカウントをセットアップすることができます。

圧縮ファイルの中に含まれる setup_automount というシェルスクリプトを管理者権限で実行してください。オートマウントの設定が自動的に行われます。

# ./setup_automount

何をしているか気になる方はこのスクリプトを見て自分で各コマンドを実行してください。
簡単に言うと automounter マップファイルを作成してマウントポイントが置かれる /twitter ディレクトリを作成し autofs サービスをリスタートしています。

方法2) mount(1M)コマンドを使ってマウントする

オートマウントを利用せずに直接 mount(1M) コマンドを使ってマウントすることもできます。
マウントする際はファイルシステムタイプとして「iumfs」を指定してください。
IUMFS ファイルシステムモジュールをインストールしていれば iumfs 専用の mount コマンドもインストールされており、ファイルシステムタイプをしていすることでこちらが自動的に使われます。

(注) オートマンとを利用するう場合と違い、複数の twitter アカウントを使ってタイムラインを見たい場合には毎回 mount(1M) を実行する必要があります。

使い方

mount -F iumfs -o user=user_name twitters_url mount_point

例)

# /usr/sbin/mount -F iumfs -o user=kaizawa2test twitterfs://twitter.com /mnt

実は上記の「twitterfs」と「twitter.com」に意味は無く実際には何か文字が入っていれば大丈夫です。(でも省略はできません)
-o オプションで twitter アカウントをしていするのを忘れないようにしてください。これは必須オプションです

Twitterファイルシステムユーザモードデーモンの起動

圧縮ファイルを展開するとその中に twitterfsd.jar デーモンプログラム が含まれています。このデーモンプログラムは twitter4j ライブラリを利用して twitter.com にアクセスします。
デーモン起動用に start-twitterfsd というシェルスクリプトを用意してありますのでこちらを使って起動してください。

$ ./start-twitterfsd

もしインターネットに接続するためにプロキシサーバを経由必要がある場合には以下のようにしてプロキシサーバを指定してください。

$ ./start-twitterfsd -Dhttp.proxyHost=192.168.1.1 -Dhttp.proxyPort=8080

タイムラインの表示

オートマウントを使用している場合には /twitter/<あなたのアカウント> に移動してください。<あなたのアカウント>はあなたの Twitter アカウントになります。このディレクトリが予め存在する必要はありません。あなたがこのディレクトリに cd コマンドでアクセスした際に automount デーモンが自動的にディレクトリを作成します。

$ cd /twitter/kaizawa2test

もしこれが始めてのアクセスであれば「setup」というファイルが見つかるはずです。

$ cd /twitter/kaizawa2test
$ ls 
./ ../ setup*

これは Twitter のアクセストークンを取得するための初期設定プログラムです。
このプログラムを実行すると以下の様なメッセージが現れます。

$./setup
Open the following URL and grant access to your account:
http://api.twitter.com/oauth/authorize?oauth_token=9zhKalThfMKB5R20C2pGjdBnc0ydWIODzeDmFS3fsNI
Enter the PIN(if aviailable) or just hit enter.[PIN]:

これは twitterfsd デーモンがあなたのタイムラインを取得したりツイートしたりするのに必要な手順になります。
setup プログラムの出力記載されたURLにアクセスしてください。以下のようなページが現れます。

f:id:kaizawa2:20140103004318p:plain

もしこのアプリを承認する場合には「連携アプリを承認」を押してください。

f:id:kaizawa2:20140103004506p:plain

表示された PID をコピーし、先ほどの setup プログラムのプロンプトに入力します。

$ ./setup
Open the following URL and grant access to your account:
http://api.twitter.com/oauth/authorize?oauth_token=9zhKalThfMKB5R20C2pGjdBnc0ydWIODzeDmFS3fsNI
Enter the PIN(if aviailable) or just hit enter.[PIN]:9194085 <= ここにPIN番号を入力します
Twitter access token setup successfully


これで twitterfsd デーモンは twitter サーバと通信可能な状態になりました。
もしここでエラーになった場合にはあなたの環境ではプロキシサーバが必要である可能性があります。
以下のようにプロキシサーバをしていして setup プログラムをやり直してみてください。

$ ./setup -Dhttp.proxyHost=192.168.1.1 -Dhttp.proxyPort=8080

setup プログラムが終了した後改めてアカウントのフォルダを見ると以下のようにみえるはずです。

f:id:kaizawa2:20140103104305p:plain

「post」以外のそれぞれのファイルはタイムラインを表しています。
また、followers ディレクトリはフォロワーのタイムラインのファイルを持っており、friends ディレクトリはフォローしている各アカウントのタイムラインのファイルを持っています。*1

home ホームタイムライン
user 自分の投稿のタイムライン
followers/<アカウント> フォロワーのタイムライン
friends/<アカウント> フォローしているアカウントのタイムライン
retweet_of_me リツイートされた自分の投稿のタイムライン

これらのタイムラインファイルを UNIX コマンドで開くことができます。
各ファイルはバックグラウンドで自動的に更新されていきます。

例) ホームタイムラインを tail(1M) コマンドでチェックする

f:id:kaizawa2:20140103094337p:plain

home タイムラインはストリームAPIを使っているためリアルタイムに近い更新が行われます。
ただし他のタイムラインについてはTwitter API の取得回数制限回避のため遅めです。*2

タイムライファイルはテキストファイルのように見せていますので cat(1M) や vi(1M) といったテキストコマンドで操作できます。

もちろん、ファイルをコピーしてもコピー先のファイルは更新されませんのであしからず。

ツイートを投稿する

通常の投稿

「post」ファイルがツイート投稿用のファイルです。ファイルの中身は常に空でサイズも0です。
このファイルに UTF-8 で文字列を書き込むことによって Twitter のツイートとして投稿できます。

f:id:kaizawa2:20140103101324p:plain

Twitter 側でこのファイル書き込みが実際に投稿されていることを確認できます。

f:id:kaizawa2:20140103101417p:plain

もしファイルに対して140時以上を書き込んだ場合には、メッセージは自動的に140文字づつに分割され投稿されます。
2番目以降の投稿には「(contd)」という接頭辞が着きます。

f:id:kaizawa2:20140103104059p:plain

リプライとしての投稿

replies フォルダにリプライを投稿したいアカウントのファイルを作成しそのファイルにメッセージを書き込んで下さい。

例) ichgia2test というアカウントに「着いたよ」というリプライを送る。

f:id:kaizawa2:20140103111944p:plain

上記のように予めファイルがある必要はありません。echo のリダイレクト先としてアカウント名をするだけでOKです。
すると、以下のように @ichgia2test という接頭辞が付いて投稿されます。

f:id:kaizawa2:20140103112138p:plain

通常のメッセージに @ichgia2test と自分で付けて投稿しても同じことですが、この方法の場合投稿の前にアカウントの存在確認を行います。もし投稿先のアカウントが存在しない場合には ENOENT が返ります。

f:id:kaizawa2:20140103112546p:plain

Tips

フォローしているアカウントへのリプライを非表示

デフォルトではホームタイムラインにはあなたがフォローしていないアカウントからフォローしているアカウントへのリプライが全て表示されます。これを止めるためには -Dtwitter4j.stream.user.repliesAll=false オプションを使って twitterfsd を起動します。

$ ./start-twitterfsd -Dtwitter4j.stream.user.repliesAll=false 

FAQ

friends、followers フォルダが空なんだけど?

デフォルトでは空です。ls コマンド等で初めてのアクセス後、バックグラウンドで friends, follower のチェックが行われて徐々に追加されていきます。Twitter APIの制限のため1分間に20アカウントづつ増えます。

friends、followers 以下のアカウントのタイムラインが全然更新されないんだけど?

Twitter API の更新回数制限のため5秒に1アカウント分のタイムラインしか更新することができません。このため、friends、follower 数の合計が多い場合には各アカウントの更新頻度は長くなります。
例) 計1,000 の follower/friends が居る場合
更新間隔 = 5 x 1,000 = 5,000 秒 = 83分 = 1時間23分

replies フォルダ空なんだけど?

デフォルトは空です。エディタやリダイレクトなどを使ってリプライを送りたいTwitterアカウント名のファイル名として指定してを作成します。
ただし、実際に存在しないアカウント名を使っても ENOENT エラーとなりファイルは作成されません。

オートマウントディレクトリに知らない名前のがあるんだけど?

オートマウントディレクトリ(例では /twitter) 以下のフォルダは automountd によって自動的に作成されます。
ご自身で明示的にアクセスしなくてもシェルなどのアプリがファイルの存在を確認するためにアクセスしようとするとその名前のフォルダが作成されてしまいます。不要だと思われる場合には管理者権限で umount(1M) してください。

sol11:/twitter $ ls
./             ../            .paths/        kaizawa2test/
sol11:/twitter $ sudo umount /twitter/.paths
sol11:/twitter $ ls        
./             ../            kaizawa2test/

既知の問題

  1. タイムラインファイルのアクセス制限が行われていません。なのでシステムにログイン可能なユーザはすべてのタイムラインが読めてしまいます。

License

Twitter Filesystem is provided under Apache License 2.0.
This program is an open source software and free of charge.
You can use this program freely for any commercial and non-commercial use.

This program uses twitter4j.

Twitter4J
Copyright (c) 2007, Yusuke Yamamoto All rights reserved.
http://twitter4j.org

*1:最初は空です。初めてアクセスを期にバックグラウンドで後徐々にファイルが増えていきます。

*2:FAQご参照ください