2012-08-23
■ [ruby] Enumerable#lazyでTwitterの過去の発言を検索してみた
所用でこのツイートの前後の会話を見たかったので、Twitter gemでトライしてみた。
Ruby 2.0のEnumerable#lazyを使うと、API経由でネットワーク越しにやってくる過去のツイートの列も普通のEnumerableと同じインターフェイスで操作することができる。
(1..Float::INFINITY).lazy .flat_map{|page| sleep 1 p page:page Twitter.user_timeline(count: 200, page: page, trim_user: true) }.drop_while{|tweet| tweet.created_at > Time.new(2012, 5, 15) }.take_while{|tweet| tweet.created_at > Time.new(2012, 4, 15) }.each{|tweet| attrs = tweet.attrs cleanup!(attrs) pp attrs }
「ツイートの列」と書いたけど、Twitter APIでは一度に200件ずつ発言が降ってくる。flat_mapを使うと、これを自然にツイートの列として扱うことができる。便利。
そのあとは、当該発言のあたり(4/15 - 5/15)だけ取り出すためにdrop_whileとtake_whileを使っている。 最初はselectでいけるかなと思ったけど、selectだと列の終わりまで全部チェックしてしまうのでダメなのであった。