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になっていて充分少ないし、時間が経つとメモリ食っていくのも変わらないので、上のプラグインが不要ってわけでもないですわん。

rvm で Ruby 1.9.2 p180 をインストールして移行した

$ rvm update --head
$ rvm reload
$ rvm package install readline openssl zlib iconv
$ rvm install 1.9.2-p180 -C --with-openssl-dir=$rvm_path/usr --with-readline-dir=$rvm_path/usr --with-zlib-dir=$rvm_path/usr --with-iconv-dir=$rvm_path/usr
$ rvm gemset copy 1.9.2-p136@global 1.9.2-p180@global # gemset の数だけ繰り返し

rvm update --head は、今は rvm get latest ってやるのがいいみたい。
rvm gemset copy は失敗したりもしたので、アプリケーションディレクトリ行って bundle install したり。rvm migrate 1.9.2-p136 1.9.2-p180 の方が楽だな。オリジナル Gem があったもんで今回は copy を使った。
まだ検証中なので、rvm uninstall 1.9.2-p136 はしてない。

Ruby on Rails Tutorial の続き文字列折り返しメソッドが大変よろしくないので修正した

Ruby on Rails Tutorial Learn Rails by Example は大変よろしい教材で重宝しているのだが、Chapter 11 User microposts11.5 Exercises 設問 8 に付記されたコード: Listing 11.42. A helper to wrap long words. が大変よろしくない。

app/helpers/microposts_helper.rb

module MicropostsHelper

  def wrap(content)
    raw(content.split.map{ |s| wrap_long_string(s) }.join(' '))
  end

  private

    def wrap_long_string(text, max_width = 30)
      zero_width_space = "​"
      regex = /.{1,#{max_width}}/
      (text.length < max_width) ? text : 
                                  text.scan(regex).join(zero_width_space)
    end
end

HTML エスケープし忘れでござる。<font color="red">red</font> などを入力して確認。

module MicropostsHelper

  def wrap(content)
    raw(content.split.map{ |s| wrap_long_string(s) }.join(' '))
  end

  private

    def wrap_long_string(text, max_width = 30)
      zero_width_space = "&#8203;"
      regex = /.{1,#{max_width}}/
      (text.length < max_width) ? h(text) : 
                                  text.scan(regex).map{|t| h(t) }.join(zero_width_space)
    end
end

これでいいはず。一応メール送っといた。みんなも raw を使うときは気を付けようね。


追記:
メールしたら、"The escaping using 'h' should be unnecessary in Rails 3." とか寝言言ってたので、「Rails 3 でも "raw" メソッドを使ったときは、エスケープしなといけない。」というようなことを書いて返信した。


追記:


とあるので、Book の方は修正されたみたい。メールでは "sanitize" 使ったって書いてあった。Web はまだ修正されてないみたい。


追記:
修正された。全体を sanitize() で囲ってある。これだと、タグが問答無用で削除されるんだが、まぁいいか。サンプルアプリだし。

Ruby の end 等を自動的に補完する Vim プラグインを導入した

※ 追記したので最後まで読んでね。

Ruby の end を自動的に入力する Vim スクリプト改め autoend.vim - ursmの日記」に従い、Ruby の end を自動補完する plugin を導入した。

コードを見て分かるとおり、VimRuby 拡張を使って書いてあるために、vim-ruby パッケージが必要。私の環境は Ubuntu なのだが、vim-ruby パッケージはダミーパッケージのようで、インストールしようとすると、vim-nox, vim-gtk, vim-gnome のどれかを入れろと言われた。Vim 自体をインストールするときに vim-full パッケージが見つからないなーと思っていたが、vim-full は生まれ変わって、環境別にこの3つのどれかを入れろってことらしい。VPS なので vim-nox 一択。

変更は特にない。

ふんげー便利! id:ursm ++


……と思ったら、作者の ursm さん自身が endwise.vim に乗り換えているとのことなので、僕も乗り換えました。てへ。使い心地は変わらないのですが、Ruby 以外にも対応してるみたいです。VB とか。

$ vimana install endwise.vim

したら、どこに格納すべきか情報がないらしく、/tmp/ 以下にダウンロードされたので、手動で ~/.vim/plugin/ に移しました。

Rubyのエンコード指定マジックコメントを##で挿入できるようにした

Vim エディターのスクリプトの作成: 第 2 回 ユーザー定義関数 を読みながら見よう見まねで書いてみた。

ujihisa さんのコメントを受けてちょっと修正。

~/.vim/ftplugin/ruby.vim

function! MagicComment()
  return "# -*- coding: utf-8 -*-\<CR>"
endfunction

inoreabbrev <buffer> ## <C-R>=MagicComment()<CR>

挿入モードで ## を入力すると展開される。escのとこはspaceやcrでもいいみたい。
utf-8 のところを Vim の変数に置き換えればきっと汎用性があるんだろうけど知らん。
あと、新規 *.rb ファイルを開いた時に自動展開されると便利なのじゃろうがわからんちん。とか書いていたら、kumonopanyaさんがやり方を教えてくれた。

~/.vim/templates/rb.tpl を新規作成。

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

~/.vimrc に以下を追加。

autocmd BufNewFile *.rb 0r ~/.vim/templates/rb.tpl

こりゃええわ〜

Rails3 対応 MongoDB ORM、Mongoid 詳解―アップグレード

Mongoid のバージョンをアップグレードする時のリファレンスとしてご利用下さい。

2.0.0.BETA.16 + へのアップグレード

このバージョンは、MongoDB 1.6.0 を必要とします。

2.0.0.BETA.15 + へのアップグレード

もし JSON のシリアライズに include_root_in_json クラス変数を使っている場合は、もはや使用できません。現在は、mongoid.yml において、同名のグローバルな設定オプションを使用します。必要ならば、オンにしてください。(デフォルトは false です)

defaults: &defaults
  include_root_in_json: true

2.0.0.BETA.14 + へのアップグレード

フィールドの :accessible => false オプションは、attr_accessible と attr_protected を推奨するため、削除されました。モデルで定義を変更する必要があります。

gemcutter のソート順は変なので注意してください。Mongoid をアップグレードするときは、厳密にバージョンを指定しなければなりません。Bundler を使うときも、この点に気をつけてください。この Gem はすぐ配布停止されます。

2.0.0.BETA.11 + へのアップグレード

Mongoid.use_object_ids 設定オプションは削除されました。mongoid.yml または設定ブロックから削除する必要があります。

もし id を BSON::ObjectID の文字列表現として使っている場合は、以下のどちらかを行う必要があります。

a) それぞれのモデルに id を String を使うように指示します:

class Person
  include Mongoid::Document
  identity :type => String
end

b) データベースの文字列 id を ObjectID に移行します。スクリプト例は、この Gist を見てください。(Kyle Banker さんありがとう)

2.0.0.BETA.10 + へのアップグレード

smart spawning を使用している Passenger ユーザーは、フォークした時に再接続するイニシャライザを削除してください。現在は Mongoid が自動的に制御します。

preload_app を true にセットしている Unicorn ユーザーも、フォークした時に再接続するイニシャライザを削除してください。同じように、現在は Mongoid が自動的に制御します。