/var/www/yatta47.log

/var/www/yatta47.log

やったのログ置場です。スクラップみたいな短編が多いかと。

Twitter gemを入れたらwarningだけどエラーをはくようになったのでその解決法を調べた。

最近自分で作ったアプリで、ずっとエラーが出ている。といっても、WARNINGなので、動き自体には特に問題ないんだけど、どうにも気になるので調べました。

ちなみに作ったアプリはこちら

作ったのはシンプルなまとめサイトみたいなものです。

https://newgameapps.tumblr.com/newgameapps.tumblr.com

 

ゲームアプリで面白いのないかなーと思って、毎回AppStore見に行っていたのですが、いかんせんめんどくさい。

新しく出たゲームアプリを知りたくて、かといってNewReleaseを最初から追うのもめんどくさいと思ったので、前日のランキングと比較して新たにランキングに入ってきたものだけ見れるようにしたいと思って作りました。

誰かのために作った・・・といえば、そうでもあるのですがどちらかというと自分向けですwwもし需要があればRSS登録でもして使ってあげてください。

 

表側はTumblrをそのまま使って、データを生成する裏側をRailsで作ってあります。

エラーが発生したのはこの情報をTwitterにも投稿しようとTwitter連携機能を作り終えたとき。現象としてはRailsのErrorログが永遠に吐かれている状態です。

環境的には以下。

  • rubyのバージョン : 2.2.2p95
  • twitterのgem : 4.8.1

 

出ているエラーは2種類。

こんなエラーが出ています。

/var/www/app/feeder/vendor/bundle/ruby/2.2.0/gems/twitter-4.8.1/lib/twitter/cursor.rb:51: warning: circular argument reference - collection
Faraday::Builder is now Faraday::RackBuilder.

エラーメッセージとしては2種類。それぞれを調べていこう。

 

warning: circular argument reference - collection

/var/www/app/feeder/vendor/bundle/ruby/2.2.0/gems/twitter-4.8.1/lib/twitter/cursor.rb:51: warning: circular argument reference - collection

原因としては、Rubyの2.2からデフォルト値付のメソッド引数の挙動が変わったそうです。(口述したサイト様の受け売りそのままですがww

自分の場合はPATHにも書いてある通り、TwitterのGEM内にそれがあるようです。

なので、以下を変更しました。

<変更前>

    def all(collection=collection, cursor=next_cursor)
       ・・・・・
    end

<変更後>

    def all(collection=collection(), cursor=next_cursor)
       ・・・・・
    end

細かい変更ですが、collection=collectioncollection=collection() とカッコを付けています。

これでwarningが出なくなりました。よかったよかった。

 

解決にいたったサイト様はこちら。ありがとうございます。

warning: circular argument reference を回避する - コバログ

Faraday::Builder is now Faraday::RackBuilder.

今度はこちらのエラー。

Faraday::Builder is now Faraday::RackBuilder.

エラーメッセージの通り、「今は違うのを使ってるんだよ」というメッセージ。

使っているTwitterのgemを入れたら出てきたので、これもTwitter gemの影響ですね。

 

StackOverFlowにも同様の質問があったので、それを参考にしました。

ruby - Twitter gem usage - Faraday builder error - Stack Overflow

 

解決方法としてはTwitter gemのバージョンを上げるか、もしくはfaraday gemのバージョンを下げるか。

バージョンの不一致を解除するためにgemとかでパッケージ管理しているのにそこが不一致を起こすって ワラワラ って感じではありますが、ひとまず自分の使っているgem関連のバージョンを調べることに。

で、現在のgemのバージョンを調べると以下。(関係しているところだけ抜粋)

$ bundle exec gem list

*** LOCAL GEMS ***

・・・
faraday (0.9.2)
faraday_middleware (0.9.2)
・・・
tumblr_client (0.8.5)
・・・
twitter (4.8.1)
 $ 

Gemfileには以下を記載してあります。

gem 'tumblr_client'
gem 'twitter'

faradayっていうGemは自分では入れた記憶はなかったんだけど、上記のtumblr_clientが依存関係として入れていたようです。

    tumblr_client (0.8.5)
      faraday (~> 0.9.0)
      faraday_middleware (~> 0.9.0)
      json
      mime-types
      oauth
      simple_oauth

tumblr_client gemが0.9系が必要ってことなので、faraday gemのバージョンを下げるのはできないのでtwitter gemのバージョンを上げることに。

なにも指定しなければ最新のgemがインストールされるのかと思っていたのですがそうではない状況だったので、現在のtwitter gemの最新バージョンはいくつなんだろうと調べて、バージョン指定をして入れようと思います。

バージョンはRubyGems.orgで調べます。

twitter | RubyGems.org | your community gem host

f:id:yatta47:20161106143448p:plain

確認したら最新バージョンが5.16だったので、そのバージョンを入れます。っていうか画面横にある「GEMFILE:」の内容をGemfileにコピペ。

gem 'twitter', '~> 5.16'

そしてbundle updateを実施。

$ bundle update twitter

これで解決!!よかったよかった。

厳密にいうと、4.X系ではTwitter::Clientを使っていたけど、5.XにあげたらTwitter::REST::Clientを使いださないといけなかったので、別問題が発生したんですけど、それも解消しました。

余談ですが、以下のようなoauth関連の注意のエラーが出てきた場合は、Twitter::ClientからTwitter::REST::Clientに実装を変更してあげると解消されると思います。

[DEPRECATION] #oauth_token= is deprecated. Use #access_token= instead.
[DEPRECATION] #oauth_token_secret= is deprecated. Use #access_token_secret= instead.

 

終わりに

課題はいつでも出てきますね。これでTwitter APIも使えるようになったので、その辺を活用してアプリのほうを拡張、別アプリを作る時の糧にしようかと思います。

でもよくわからないのが、バージョン指定したにもかかわらず最新のtwitter gemが入らなかったこと。何かあるのかな。っていうか最新が入るっていう知識が間違っているのかな。その辺の基準はそのうち調べよう。

ほかのアプリも今はちょくちょく作っているので、そのうちgithubにでも公開できたらいいなぁ。

っていうかアプリを作っている最中、すごく思いました。

「オレ、フロントエンド・・・・嫌いだwww」

ってwww

 

画面のレイアウトとか、Railsでも当然Viewがあるのでそこで自前で作ることもできたんだけど、ロジック組んでいるほうが楽しくて、画面は・・・・ほかのでいいやwwってことでTumblrを選択したぐらいなので。そのTumblrでのレイアウトでさえ結構めんどくさいと思ったんですけどねwww

Tumblrの勉強にもなったのでそれはそれで面白かったんだけど、フロントをJavaScriptで作るとか、今の自分からしたらしんどい・・・・って真っ先に思ってしまいます。

 

フロントもやらないといけないんですけどねー。っていうかこれ以上にもっとAWSとかESXiとかOpenStackとかのインフラ関連のほうをもっとやらないといけないんですけどね。

あー。これからこの本読んで設計できるようAWSの勉強開始します。

それではまたー。