例えばある時間に処理を実行したい場合がありますよね。そういう時のために、Reserverがあります。これは0.0.4.525から使えます。
Reserver.new(10){
Post.primary_service.update(:message => '10秒後にツイート') }
Reserver.new("2011/11/23 04:00"){
Post.primary_service.update(:message => 'もう2時か') }
と、指定した時間につぶやくようなことは簡単にできるようになります。他にもTimeを渡せば、その時間が来れば実行されます。Reserverを利用すると、いつかの
よるほープラグインの例 は、以下のようにかきかえられます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*-
# say "よるほー"
# よるほーの例です。あくまでReserverのデモンストレーション用に作りました。
# なので実戦投入はしないこと。よるほーは自分でタイミングを合わせることにこそ意義があるのです。
Plugin.create(:yoruho) do
class << self
def main
Reserver.new(nextyrhtime){
say_yoruho()
sleep 1
main } end
# 次回のよるほー時間を取得
def nextyrhtime
now = Time.new
result = Time.local(now.year, now.month, now.day, 0, 0)
while result < now
result += 86400 end
result end
# よるほーとつぶやく
def say_yoruho()
world, = Plugin.filtering(:world_current, nil)
compose(world, message: 'ておほー') end
end
main
end
とてもすっきり。最も、ピタリだったかどうかをつぶやく機能が無いのであまりこの比較は意味がないですが、いちいち自分でタイミングを合わせる必要がありません。
プラグインを書いていると、特定の時間に処理がしたい場合が出てくると思いますが、これを使えば面倒を見てもらえるので便利です。
当然、mikutterが終了してしまうとこの情報は消えてしまうので、実行されません。一年後の時間とかを設定してもまぁ無意味でしょう。
また、今の実装では、実際にブロックが実行されるたびに新しくThreadを立ち上げます。注意してください。
これからはコアでも積極的に使っていこうと思っていて、periodイベントなんかもこれを利用するようになる予定です。っていうか、periodイベントは精度も悪いし毎分実行しかできないし終わコン…?
駆け込みAPI
話はそれるけどコアでの有効利用の例。
ご存知の通り、TwitterのRest APIは1時間に350回まで使うことができます。APIにアクセスするたびに1づつ減っていって、0になるとアクセスできません。また、最初に叩いてから60分で残数が350にリセットされます。
mikutterではフォローとかリストとか、とにかくいろんなものを取ってきますが、これがなかなかAPIを食ってしまう※。しかも今後も増える予定だし(ふぁぼったツイート、ブロックしたユーザ一覧等)、APIはなかなか貴重なんです。
※ mikutterで一番RestAPI使うのはin_reply_to_statusの参照なんだけどさ
ということで、Reserverを使って、APIが回復する1分前にイベント「
before_exit_api_section 」を発生させるようにしてみました。プラグインはそれを受け取って、待ってましたといわんばかりにAPIを使うわけです。これで万が一APIが切れても、1分以内にまた350回使えるようになります。
今のところ使っているプラグインは、標準で添付されている list.rb くらいですね。
まとめ
指定した時間に実行するとかラクにできてとてもおもしろい
つくっていうのもあれだがあんまり使う機会なさそう/(^o^)\