save_image - 指定したツイートの画像を保存するEarthquakeプラグインを書いた

チョリーッス!昨日はブログ書かなかったけど挫折したんじゃないよ!マジで。先日のfav_machineを2つに分けたから同時に公開したかったのだ。マジでマジで。

fav_machineはふぁぼったツイートの画像を自動で保存するだけで、コマンドは作らなかったので必ずふぁぼらないと保存できなかったんだけど、今回はちゃんとコマンドにして切り分けてみました。そして、次の記事で解説するevent_chainと合わせるとfav_machine相当以上のことができます。

インストール

⚡ :plugin_install https://gist.github.com/babie/7215585

設定

~/.earthquake/configに、

Earthquake.config[:save_image] = {:dir => "path/to/your_save_dir"}

と書けば、保存ディレクトリを指定できます。デフォルトは~/.earthquake/imageになります。

使い方

Earthquake内で、

⚡ :save_image $xx

としてください。$xxはツイートのidを指すEarthquakeが用意したエイリアスです。

コード

基本はfav_machineから切り出しただけっす。画像がなかったらエラーメッセージ表示したり、確認プロンプトだしたりちょっぴり拡張してます。

今後

なんか拡張することあるじゃろか?単機能のこれで良さそう。

次回予告

fav_machineよりもっと柔軟性を持たせたevent_chainを紹介するよ。若干面白いことしてるので楽しみにしていてね。この後すぐ!

update_profile - Twitterのユーザー情報を更新するEarthquakeプラグインをアップデートした

いやー、ギリギリ間に合った〜。いやー、数分ぐらい間に合ってないけど記事のURLと日付は見かけ上間に合った〜。ん?いやいや、さっきまで寝てて急遽10分で以前のプラグインの修正でお茶を濁したとかそういうわけじゃないですよ?やだなー、2日前の今後の予定に修正するかもって書いてたじゃないっすかー、やだもー。

インストール

修正前と同じっす。更新も同じく

:plugin_install https://gist.github.com/babie/7076697

設定

なし。

使い方

ちょっとこの辺変わりました。

:description
{
    "description" => "ちん強 推していく"
}
⚡ :update_description Comic X-EROSまだ読んでない
⚡ :description
{
    "description" => "Comic X-EROSまだ読んでない"
}

みたいな感じ。

表示は名前そのまま、更新は:update_を頭につけることにしました。この方が行儀がいいかなと思って。:update_が付いてればまず更新系だとわかるし。つっても流石に:update_profile_にはしなかった。長いし別に被らないし。あとユーザー情報表示を簡素にしたかった。

:me:bioは廃止です。前者は他のプラグインでよく使われるコマンド名だというのと、後者は各自エイリアスを張ってもらうのが筋かな、と。

あと、descriptionの更新の複数行入力も廃止しました。入力は受け付けるけど、ウェブクライアント・スマートフォンクライアント共に表示に特に反映されるわけではないので。

コード

descriptionの特別扱いがないのですっきりしましたね。特にどうということもない感じ。

今後

拡張予定なし!これはこれで完成でしょう。

次回予告

多分、fav_machineをいじるわ。

ばいなり〜

lists - Twitterのリストを表示するEarthquakeプラグインを書いた

1日1リリース、4日目〜。三日坊主にはならんかったな。良かった。
えー、昨日はコマンドライン書くかもって言ってたけど、Earthquake関連をまとめて終わらせちゃおうと思って、やっぱこれにしました。記事はまとまってた方が探しやすいしね。リストは:recent babie/funnyとかでも見れるんだけど、これだと巡回するのがめんどいなと思って作ってみました。

インストール

おなじみEarthquake内コマンドで、

⚡ :plugin_install https://gist.github.com/babie/7169374

でっす。

設定

ないっす。ZeroConfでござる。

使い方

例えば自分のリストにbabie/funnyってリストがあったとして、

:list funny

と、自分のユーザー名を省略できます。

もちろん他人の公開リストも見れて、

:list a_matsuda/ruby-rails-ja

てな具合。

んで、*(ワイルドカード)を使用すると、

:list *

自分の購読している全リストを巡回してざざざっと表示します。

このプラグインのチャームポイントは、コンピレーションがちゃんと効いていて、リストだけ候補に挙がるとこです!!

コード

こんな感じですわ。

最初作った時は:listsとか:list :allとか:list_allとかコマンド名に迷いがあったんだけど、コンピレーションが同じプラグイン内でぶつかるのもうざいので、すっきり:listにまとめました。

あと、jugyo/twitter_oauthlists.rbが古いっぽいわ。Twitter API 1.1に対応してないのかな?fork元のmoomerman/twitter_oauthがあんま更新してなくてforkして、Earthquakeでもこの辺は使ってないから問題にならなかったんでしょう。プルリク出しとかなきゃな。なので、クラス開いて上書きしてますわ。

Readline.completion_procの書き換えはイマイさんのno6v/friend_completion.rbが参考になったわ。サンクス。Earthquake標準で用意されてるコンピレーション候補追加DSLcompletion do ... endは、基本的に候補付け足すもの(?)で他の候補を抑制する方法がよくわからんかったから使わなかった。

今後

:create_listとか:update_listとか充実させるかなぁ?んー、今はいらんな。必要になったら拡張するわ。

次回予告

これで俺のEarthquake環境は大体整ったので別のカテゴリに移るか、もしかしたら先日のfav_machineupdate_profileを改良するかもしれんわ。その場合、記事は全面書き換えた方がいいんかね?ま、適当に処理しまっす。

update_profile - Twitterユーザー情報を更新するEarthquakeプラグインを書いた

Updated update_profile - Twitterのユーザー情報を更新するEarthquakeプラグインをアップデートしたをお読みください!

今日で1日1リリース、3日目!
寝込んでて9:30から作業始めたんですけど間に合いました!

予告通り、Earthquakeプラグインを作りました。

今日のプラグインは、 名前やバイオを手軽に更新したかったでござる。:bio ほげほげみたいな感じで。

インストール

:plugin_install https://gist.github.com/babie/7076697

設定

ZeroConfでございます。

使い方

:name 我々はボーグだ
⚡ :description お前たちは同化される。抵抗は無意味だ。
⚡ :url http://ja.memory-alpha.org/wiki/%E5%90%8C%E5%8C%96:location 浮遊機械都市
⚡ :me
{
...
              "name" => "我々はボーグだ",
...
       "description" => "お前たちは同化される。抵抗は無意味だ。",
               "url" => "http://t.co/ks4Wv00N9P",
          "location" => "浮遊機械都市",
...
}

みたいな感じっす。:bio:descriptionエイリアスになっております。長いので。上では特に付け足しませんでしたが、yes/no聞かれるんで安心して打ってください。
:me:user #{twitter.info['screen_name']}の略です。確認するのにめんどかったので入れた。
:screen_nameの更新はnoを優先で入れようか迷ったけど、重大すぎるので入れるのやめました。

コード

update_profile.rb

descriptionの複数行入力はEarthquakeの:updateコマンドからパクってきたんだけど、前々回のauto_restart プラグインみたいに入力がおかしかったのでsttyコマンドを挟んでます。

  • stty icrnlは「復帰キャラクタを改行キャラクタに変換する」で、\rを\nに変換
  • stty brkintは「ブレークによって割り込みシグナルを発生する」で、\Dを表示するんじゃなくてINTシグナルに変換

して対処してますん。
なんか俺の端末がおかしいっぽいな。プログラム起動するとstty設定忘れるんじゃろか?

class_evalはプラグイン読み込みに便利ですねぇ。

今後

現在は:name ほげほげとかで更新できるようになってるけど、:name(引数なし)の時はただの表示にした方がいいかも。んで更新は:update_name ほげほげに変える。オリジナルコマンドとの整合性的に言っても。長いのが嫌で現状こうなってんだけど、そこは各ユーザーにエイリアス張ってもらう方がいいのかもしれん。
あと:meは別プラグインに分けた方がいいだろうなぁ。名前被ってるプラグインコマンドも散見されるし:myselfにリネームしようかなぁ。

次回予告

3日坊主回避できるかな?
まだEarthquakeプラグインのネタ残ってんだけど、ちょっと趣向を変えてコマンドラインでも作ってみようかな。

fav_machine - favしたツイートの画像を保存するEarthquakeプラグインを書いた

Updated
このプラグインをsave_imageevent_chainに分割して、もっと汎用的にしました。使ってる人いないと思うけど、いればそちらをオススメします。

はい、予告どおりEarthquakeプラグインでございます。

はい、名前はアレです、おっさんなので。このプラグイン入れて常時起動しておけば、Earthquake上はもちろん、スマートフォンなんかのTwitterクライアントでfavしてもローカルに保存されます。Bitcasaのディレクトリなんか保存先に指定すればいいんじゃないでしょうか。

ちょっと話は逸れますが、特定のユーザーやキーワードを監視してツイートや画像を延々とBitcasaフォルダに溜め続けてBitcasaアカウントにそのフォルダのアクセス権与えるサービス(有料)を企画したんですが、Twitter API利用規約に「再配布禁止」って書いてあったので諦めました。そりゃそうだ。迂回方法なー。
ちなみにBitcasa APIは2013年10月24日現在まだありません。

インストール

Earthquake内で、

:plugin_install https://gist.github.com/babie/7076697

してください。

設定

Earthquake.config[:fav_machine] = {
  :dir => "~/.earthquake/fav_machine",
  :screen_names => ["babie"]
}

のように~/.earthquake/configに設定します。デフォルトで、~/.earthquake/fav_machineディレクトリが自動で作られ、自分がfavった画像が入ります。よく考えたら他人がfavった情報ってuser_streamに入ってなかったっけ?:screee_namesいらんかったかも。てへ。

使い方

マッスィーンなので自動です。

コード

ネスト深くてごちゃっとしてますねぇ。

Object#tryActiveSupportによる拡張です。この場合はeachできるならするって意味です。画像ついてないツイートのときはmediaが入ってないから。

んで、今のところ pic.twitter.com 画像URLのみサポートですわ。必要になったらnokogiri使ってtwitpicとかpixivとかもサポートするかも。需要ありそうだな。

ついさっきまで、デフォルト設定が「俺(babie)がふぁぼった画像を保存する」という、わりとひどい仕様になってたので、ユーザーの名前突っ込むように直したわ。てへ。

今後の拡張予定

あれだ、もっとマッスィーンっぽく色々できた方がいいかも。:retweet をチェインするとか。ちょっと考えるわ。

次回予告

明日もまたEarthquakeプラグインの予定です。ばいなり〜

auto_restart - Earthquakeをメモリ解放のために一定時間で再起動するプラグインを書いた

あの日見たソフトウェアの能力を僕はまだ知らない。(名前は知ってた)

皆さん、Twitterクライアントは何をお使いでしょうか?私は最近Earthquakeというターミナルで動くクライアントを使い始めたところです。いや、数年前からあったんですけど、あの大地震の記憶も冷めやらぬときにツイートが回ってたもんですから、てっきりTwitterで地震速報を受け取れるソフトだと勘違いしてました。

Earthquakeの良いところ

使い始めた感想ですが、今までのTwitterクライアントで通常時のメモリ使用量が格段に少ない(38MB!弊社調べ)とこが気に入りました。

そして、このソフトウェア、Rubyで書かれているのですが、言語内DSLが素晴らしいです。壮絶技巧な黒魔術もなく平易に書かれているので、Rubyの入門用ソースコードリーディングにも最適です(全部は読んでないですが、多分)。綺麗。

また、プラグインが特定ディレクトリにファイルを1個置くだけって手軽使用なんで、入門用ソースコードライティングにもオススメです。公開もgistにアップロードするだけ。ステキ!抱いて!

んで、僕もプログラミングのリハビリにプラグインを書いてみました。auto_restartって名前のメモリ解放のための自動再起動プラグインでっす。

Rubyのソフトウェアは常時起動してるとメモリがぶくぶく太って行き再起動が必要なことがあります。ツラい。デーモン管理ツールのBluepillなんかを使うのも良いですが、ちょっと導入が面倒ですよね。なのでプラグイン化してみました。

インストール

Earthquake内コマンド一発です。

⚡ :plugin_install https://gist.github.com/babie/7069234

頭の稲妻マークは除けてコピペしてくださいね。んで :restart すればプラグインが読み込まれます。

設定

デフォルトで1時間間隔となってますが、お好みで変更できます。例えば2時間にするには、

Earthquake.config[:auto_restart] = { :interval => 2.hours }

こんな感じです。秒数なので注意してくださいね。EarthquakeはActiveSupportを読み込んでいるので2.minutesとか書けます。もちろん60 * 60 * 2なども可です。

使い方

名前の通り自動です。というか手動リスタートは標準コマンドに:restartってのがありんす。

コード

こんな感じです。

gist7069234

タイマーしかけて時間が来たら標準コマンドのEarthquake::Input#input(":restart")を呼ぶってすげぇ簡素なコードなんですが、めちゃめちゃハマりました。何回か再起動してると入力しても文字が表示されないことがあるんです。
Readline.readline が動いているスレッドを避けてリスタートしたり特に念入りに殺してリスタートしたりしてみたけどよくわからない。ググってググってようやく辿り着いたのがstty echoです。なんかReadlineの動いてるスレッドをkillするときstty -echo(入力をターミナルで反響しない)しちゃう時があるみたいです。
うーむ、terminfoとかターミナルに特有なUnixの知識を避け続けたのが仇になったようです。読めない略語が多くてつらいんだもん。まぁ、時間はかかったがなんとか成って良し。

今後の拡張予定

あれだ、RSS(実メモリ)はリセットされるんだけど、VSZ(仮想メモリ)の減らし方は知らん。まー、実際に専有してなきゃええんじゃないか?

次回予告

明日はまたEarthquakeプラグインを紹介します。

Earthquakeプラグイン書くの楽しい!✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

追記

なんか次回の関係でソースコード読んでたら、ActiveSupport::Cache::MemoryStore 使ってるので、設定ファイルでconfig[:cache] = ActiveSupport::Cache::MemoryStore.new(:size => 16.megabytes)とかするとキャッシュサイズ制限できるっぽい。けど、元々デフォルトで32MBになっていて充分少ないし、時間が経つとメモリ食っていくのも変わらないので、上のプラグインが不要ってわけでもないですわん。