ice_cubeでスケジュールの計算

AWS運用自動化サービス「Cloud Automator」
この記事は1年以上前に書かれたものです。
内容が古い可能性がありますのでご注意ください。

プログラマのおぐらです。

このところとんでもなく暑い日ばかりですが、みなさんいかがお過ごしでしょうか。こう暑い日が続くと、プログラミングしている間だけでも涼しさを感じられるような工夫が欲しいですね。

というわけで、今回はice_cubeという涼しげな名前のRuby用ライブラリのご紹介です。

ice_cubeは、

  • 毎日
  • 隔週の月曜日と火曜日
  • 毎月1日と最終日
  • 毎月第1と最終の火曜日
  • 2時間おき

といった、「一定のルールに基づいて繰り返し処理を行う」ときにネックとなる日時の計算を一手に引き受けてくれるライブラリです。予定の管理やメールの配信といったスケジューリングの必要な機能を実装する際に利用することで、複雑なルールも容易に扱うことができるようになります。

インストール

ice_cubeはgemパッケージとして公開されていますので、インストールは以下のようにgemコマンドで行います。

ice_cubeの内部ではActiveSupportが既存クラスに対して追加するメソッドを呼び出す箇所があるのでactive_supportもインストールしておきましょう(Railsをお使いであれば既にインストールされているはずです)。

基本的な使い方

ice_cubeの中心となるのはIceCube::Scheduleクラスです。インスタンスを生成する際は、開始日をコンストラクタに渡します。

スケジュールに特定の日付を指定して使う場合は、以下のようになります。

View on gist.github.com

上記のように特定の日時を指定することもできますし、一定の条件で何度も繰り返すスケジュールを定義することもできます。

View on gist.github.com

ただし、複雑なルールを定義した場合の挙動には若干バギーな部分もありますので、実際に使う前には想定した結果が返ってくることを確認しておいたほうがよさそうです。

Railsで使う

IceCube::Scheduleクラスには、スケジュールを永続化するためにYAMLやHashに変換するメソッドも定義されています。

View on gist.github.com

これらのメソッドをうまく利用することで、ActiveRecordなどのモデルにスケジュールを保持させることができます。

参考資料

ice_cubeの作者であるJohn Crepezziさんのプレゼン資料も公開されていますので、興味のある方はこちらもご覧ください。

AWS運用自動化サービス「Cloud Automator」