streamerというCUIアプリを作っています

https://github.com/r7kamura/streamer

概要

ストリームっぽいもの全般を何でもTerminalで流そうよというCUIアプリです。
jugyoさんの作られたTwitterクライアントEarthquake.gemを改造してつくりました。
ストリームっぽいものの例としては、twitterや、2chや、ソーシャルブックマーク
各種ログ、IRC、Email、RSSなどを想定しています。


スクリーンショット


インストール

Ruby 1.9以上を利用して下さい。
rvmを利用している方は日本語表示の為にreadlineオプションを有効化してrubyを入れる必要があります。
Gemでは提供していないので適当なディレクトリに置いて起動してください。

$ git clone git://github.com/r7kamura/streamer.git
$ cd streamer
$ gem install bundler # bundlerというgemを入れて居ない方は入れて下さい
$ bundle install

使い方

以下のような感じで、オプションを渡して使いたいモードを指定しながら起動します。

help(-h, --help)
ヘルプが出ます。
  $ ./bin/streamer.rb -h

twitter(-t, --twitter)
  $ ./bin/streamer.rb -t

hatena-bookmark(-b username, --bookmark=username)
  $ ./bin/streamer.rb -b r7kamura

2ch(-c thread_url, --channel=thread_url)
  $ ./bin/streamer.rb -c http://kamome.2ch.net/test/read.cgi/anime/1301907984/

all
  $ ./bin/streamer.rb -t -b r7kamura -c http://kamome.2ch.net/test/read.cgi/anime/1301907984/

起動後は最近の数件を出力した後、更新がある度に画面に出力されていきます。
:(コロン)で始まるコマンドが利用できます。
:helpと入力することで、使えるコマンド一覧が拙い説明とともに表示されます。
Tabキーを押すとコマンドが補完されます。
そのモードで元から用意されているコマンドと最近入力したコマンドが補完対象になります。

twitterモードについて

UserStreamを利用してTLを取得しているため、FavoriteやFollow等のイベントも取得できます。
イベント発生時にはGrowl通知が来るようにしています。
特定のキーワードが含まれているとGrowl通知するという機能を持っています。
キーワードの追加は「:notify keyword」、一覧は「:notify_filters」、削除は「:notify_delete keyword」でどうぞ。
起動時にデフォルトで自分の名前をキーワードに入れてあります。

2chモードについて

1分に1度、起動時に渡されたURLのスレッドを見に行って更新分を表示します。
レス内にアンカーが含まれていれば、アンカー先のレスもインデントしてツリー表示します。
「:res 200」で200番のレスを表示したりできます。
AAっぽいレス(本文中の記号の割合が6割以上)の場合は省略されます。
1000まで行くと自動的に次スレっぽい候補を3件ほど表示します。
「:thread http://...」で見ているスレを切り替えることが出来ます。
「:post ...」で投稿することが出来ますが、Cookie対策などをしていないので2chの規制で初回は投稿に2分ほど待たされます。

hatena-bookmarkモードについて

http://b.hatena.ne.jp/指定したユーザ名/favorite のページの新着ブクマを見に行って更新分を表示します。
指定したユーザのお気に入りユーザのブクマを表示するだけなので、自分以外のユーザを指定することも出来ます。
「:open $ab」で$abの識別子の付いたブクマのURLへブラウザを開いてリンクします。

開発者向け

自分でストリームっぽいものを取得するスクリプトを書けば、好きなものを画面上に流すことが出来ます。
lib/streamer/hatebu.rb等を参考にして、lib/streamer/辺りにファイルを作ってください。
lib/streamer.rbでrequireし、initブロックの中でstreamsにProc等を定義した適切なHashをPushすれば上手く行くと思います。
なお、active_supportとlib/streamer/ext.rbにより一部クラスの拡張が行われているためご注意下さい。
便利なものを作られた方はpull requestを送っていただければ作者が喜びます。

謝辞

http://github.com/jugyo/earthquake
jugyoさんのearthquake.gemをほぼ丸ごと利用させていただきました。ありがとうございます。


http://github.com/cho45/net-irc
cho45さんのnet-ircからexamples/2ch.rbのThreadDataを利用させていただきました。ありがとうございます。

作った経緯

Rubyでまともなコードを書いたことが無かったので、その頃たまたまjugyoさんがEarthquake.gemを開発されていたのを見つけ、コードリーディングがてら読むかという感じで遊びながら作りました。「twitter2chはてブIRCなんかの情報を一箇所に集約できたら、情報集めに行く時間で寿命縮まらないし良いよねー」という話を元々していたので、色々な情報の流れを1つの流れに集約して流せる感じ = streamer としました。CUIRuby1.9系さえあれば動くので、家に転がっている10年前くらいのiBookが生きる理由を見つけて喜んでいます。