earthquakeが動かなくなった

Posted by @kachina_t on Sun, Feb 8, 2015
In Development
Tags development

諸事情あって、やっとYosemiteへのバージョンアップ許可がでたので アップグレードを繰り返してきたMacbook Airを、この機会にクリーンインストールに挑戦をしました。

愛用していた LockScreen2 が使えなくなったこと以外は購入済みのツールは復旧ができてひと安心 スクリーンロックは 電源 + s でディスプレイをオフにできるみたいなので、当面はこれで対応することにします。

順調に開発環境は整ったのですが、ターミナル向けツイッタークライアントの earthquake を動かすのに苦労したので書き残しておこうと思います。

環境は以下のとおり

  • OS X 10.10.2
  • Ruby 2.2.0
  • earthquake 1.0.2

activesupportの読み込みに失敗する

インストール後、earthquakeを起動すると以下のエラーが出力されました。

/Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/core_ext/module/deprecation.rb:21:in `deprecate': uninitialized constant ActiveSupport::Deprecation (NameError)
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/core_ext/class/delegating_attributes.rb:26:in `<class:Class>'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/core_ext/class/delegating_attributes.rb:6:in `<top (required)>'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/core_ext/class.rb:2:in `<top (required)>'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/core_ext.rb:2:in `block in <top (required)>'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/core_ext.rb:1:in `each'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/core_ext.rb:1:in `<top (required)>'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/earthquake-1.0.2/lib/earthquake.rb:17:in `block in <top (required)>'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/earthquake-1.0.2/lib/earthquake.rb:17:in `each'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/earthquake-1.0.2/lib/earthquake.rb:17:in `<top (required)>'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/earthquake-1.0.2/bin/earthquake:34:in `<top (required)>'
        from /Users/kachina_t/.rbenv/versions/2.2.0/bin/earthquake:25:in `load'
        from /Users/kachina_t/.rbenv/versions/2.2.0/bin/earthquake:25:in `<main>'

この問題は ~/bin/earthquake:9 以下でactive_supportを読み込むことで解決しました。

require 'rubygems'
require 'active_support'
require 'active_support/deprecation'

パラメーターエラーの対応

次に、以下のようなパラメーター不足エラーが発生しましした。

/Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/eventmachine-1.0.6/lib/em/buftok.rb:15:in `initialize': wrong number of arguments (2 for 0..1) (ArgumentError)
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-stream-0.1.16/lib/twitter/json_stream.rb:206:in `new'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-stream-0.1.16/lib/twitter/json_stream.rb:206:in `reset_state'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-stream-0.1.16/lib/twitter/json_stream.rb:140:in `post_init'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/eventmachine-1.0.6/lib/em/connection.rb:58:in `block in new'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/eventmachine-1.0.6/lib/em/connection.rb:49:in `instance_eval'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/eventmachine-1.0.6/lib/em/connection.rb:49:in `new'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/eventmachine-1.0.6/lib/eventmachine.rb:679:in `bind_connect'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/eventmachine-1.0.6/lib/eventmachine.rb:649:in `connect'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-stream-0.1.16/lib/twitter/json_stream.rb:65:in `connect'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/earthquake-1.0.2/lib/earthquake/core.rb:178:in `start_stream'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/earthquake-1.0.2/lib/earthquake/core.rb:163:in `reconnect'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/earthquake-1.0.2/lib/earthquake/core.rb:155:in `block in start'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/eventmachine-1.0.6/lib/eventmachine.rb:187:in `call'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/eventmachine-1.0.6/lib/eventmachine.rb:187:in `run_machine'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/eventmachine-1.0.6/lib/eventmachine.rb:187:in `run'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/earthquake-1.0.2/lib/earthquake/core.rb:130:in `start'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/earthquake-1.0.2/bin/earthquake:39:in `<top (required)>'
        from /Users/kachina_t/.rbenv/versions/2.2.0/bin/earthquake:25:in `load'
        from /Users/kachina_t/.rbenv/versions/2.2.0/bin/earthquake:25:in `<main>'

この問題は ~/lib/ruby/gems/2.2.0/gems/twitter-stream-0.1.16/lib/twitter/json_stream.rb:206 を 以下のように変更することで解決します。

@buffer  = BufferedTokenizer.new("\r", MAX_LINE_LENGTH)
↓
@buffer  = BufferedTokenizer.new("\r")

不要な行をコメントアウト

次に、以下エラーが発生します。

/Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-stream-0.1.16/lib/twitter/json_stream.rb:27: warning: duplicated key at line 30 ignored: :path

この問題は ~/lib/ruby/gems/2.2.0/gems/twitter-stream-0.1.16/lib/twitter/json_stream.rb:27 を 以下のように変更することで解決します。

:path           => '/',
↓
#:path           => '/',

NoMethodErrorの対応

ここまでの修正で earthquake の起動は成功するのですが、25秒すると以下のエラーを出力して異常終了します。

earthquake: reconnecting in: 0.25 seconds
/Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-stream-0.1.16/lib/twitter/json_stream.rb:119:in `unbind': undefined method `empty?' for #<BufferedTokenizer:0x007f95949747b8> (NoMethodError)
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/eventmachine-1.0.6/lib/eventmachine.rb:1454:in `event_callback'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/eventmachine-1.0.6/lib/eventmachine.rb:187:in `run_machine'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/eventmachine-1.0.6/lib/eventmachine.rb:187:in `run'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/earthquake-1.0.2/lib/earthquake/core.rb:130:in `start'
        from /Users/kachina_t/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/earthquake-1.0.2/bin/earthquake:39:in `<top (required)>'
        from /Users/kachina_t/.rbenv/versions/2.2.0/bin/earthquake:25:in `load'
        from /Users/kachina_t/.rbenv/versions/2.2.0/bin/earthquake:25:in `<main>'

この問題は ~/lib/ruby/gems/2.2.0/gems/twitter-stream-0.1.16/lib/twitter/json_stream.rb:119 を 以下のように変更することで解決します。

if @state == :stream && !@buffer.empty?
↓
if @state == :stream && !@buffer.nil?

以上で、earthquakeが正常に動作するようになりました。

クリーンインストールしたので、すげー快適になりました。

あわせて、8系にアップグレードしてからモッサリしていたiPadもクリーンインストールしたら 驚くほど快適になりました。

週末を1日以上使ってしまったけど、大満足の結果です。