読者です 読者をやめる 読者になる 読者になる

ruby で twitter とか触れるようになりたいな、とか。

ruby

どうも最近の ruby 界隈では「for 死ね」の気運が高まっているようですね。

 さて。
 ruby というと gem がないと始まりませんが、Twitter のタイムラインを取得するために使われる gem というと、主に 2 種類あるように思います。ひとつは 'twitter' というそのものズバリの gem、もうひとつは 'oauth' と 'net/https' という gem のペアです。

1. gem「twitter」でタイムラインの呟きを表示する
 1.5 秒で入力しましょう。さぁご一緒に。

gem install twitter
 で、こんな感じで呟きを取得します。

# encoding: utf-8

require 'twitter'

Twitter.configure do |config|
  config.consumer_key = MY_CONSUMER_KEY
  config.consumer_secret = MY_CONSUMER_SECRET
  config.oauth_token = MY_ACCESS_TOKEN
  config.oauth_token_secret = MY_ACCESS_TOKEN_SECRET
end

Twitter.home_timeline.each do |tw|
  puts tw['text']
end

2. gem「oauth」「net/https」でタイムラインの呟きを表示する
 これはユーザーストリームから呟きを取得する方法ですね。
 (↓ここのコードをコピペしていじってました。
 『Twitter User Stream API でタイムラインを表示するサンプル』でぶぬる日記

gem install aouth

# encoding: utf-8

require 'rubygems'
require 'net/https'
require 'oauth'
require 'cgi'
require 'json'

consumer = OAuth::Consumer.new(
  MY_CONSUMER_KEY,
  MY_CONSUMER_SECRET,
  :site => 'http://twitter.com'
)

access_token = OAuth::AccessToken.new(
  consumer,
  MY_ACCESS_TOKEN,
  MY_ACCESS_TOKEN_SECRET
)

uri = URI.parse('https://userstream.twitter.com/2/user.json')

https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
https.ca_file = './verisign.cer'
https.verify_mode = OpenSSL::SSL::VERIFY_PEER
https.verify_depth = 5

https.start do |https|
  request = Net::HTTP::Get.new(uri.request_uri)
  request.oauth!(https, consumer, access_token) # OAuthで認証

  https.request(request) do |response|
    response.read_body do |chunk|
      buf = chunk
      begin
        status = JSON.parse(buf.strip)
      if status['text'] then
        puts status['text'] # 呟きを表示
      end
        rescue
        puts "#### Parse error ####"
      end
    end
  end
end

 まだ ruby 1.8 系を使っている場合は「require 'json'」を忘れずに。もし " #### Parse error ####" が出るようであれば rescue 句で Exception を受け取ってエラーメッセージを確認しましょう。

begin
   JSON.parse(buf.strip)
rescue Exception => e
  puts e
end

3. gem 雑感
 ruby に gem という仕組みがあるおかげで、C++ と比べればかなり手軽にライブラリをインストールできます。このお手軽感はどこから来るのかなーと考えてみるに、gem コマンドがライブラリ取得からインストールまで一連の操作の入り口になっているという一点に尽きるのではないかと思います。iPhone アプリをインストールするときの感覚に近いものがあります。

4. ruby の可読性について
 ちょっと話が飛ぶんですけども、Scala で有名な @kmizu さんが、可読性について興味深い post をしていました。

 これは確かにそういう側面はあるんですけども、僕はこう考えてます。

 まぁ.. つまり属人的だよね〜、と。
 で、ruby の可読性だって属人的に評価されるものではあるんだけども、コード書く人が感じる可読性の良し悪しによって、結局コミットされるソースのかたちが影響受けるわけですよね。まぁつまり可読性はインプットだけじゃなくてアウトプットにも関与するよ、と。
 で、僕の中で ruby の可読性の良し悪しが少しずつ構築できてきた気がするんですよね。例えば ↑ 2. のサンプルコードでは最後 end が 4 連発してますけどこれは可読性が悪いように感じます。こういうコードは言語を問わず可読性が低い構造ですが、じゃあこれをどうリファクタリングするのかを考えるに、ruby のブロック構文の強力さをひしひしと感じます。
 例えば↓こんな使い方する関数をサクッと仕立て上げることができます。

each_posts(consumer,access_token ) {|st|
  if st['text'] then
    puts st['text']
  end
}

 ブロック渡しはまるでクロージャを渡しているようなものですが、関数の引数に渡せるブロックは最大ひとつ、というのが ruby の仕様です。関数に渡すものである以上、当然ながら複数個渡せるもんだと思っていたんですが大胆にも最大ひとつという割り切った仕様になっていました。しかしこのおかげでライブラリコード側もユーザーコード側も割とすっきりしたコードに仕上がるようにバイアスされる気がします。
 ブロックの素晴らしさは @yugui さんがスライドで語っていましたので最後に貼っておきます。⇒ 『なぜブロックは素晴らしいか: Yuguiと言います』