技術ブログ - 毎日が成長!

‘Ruby’ タグのついている投稿

ice_cubeでスケジュールの計算

2010年7月24日 土曜日

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

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

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

ice_cubeは、

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

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

インストール

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

$ gem install ice_cube

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

$ gem install activesupport

基本的な使い方

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

schedule = IceCube::Schedule.new(Time.local(2010, 7, 1))

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

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

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

Railsで使う

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

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

参考資料

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

ruby+html+javascriptでデスクトップアプリケーション開発

2010年7月14日 水曜日

こんにちわ、技術ブログ担当の川口です。

今回はちょっと変化球で勝負、ということでRuby+HTML+JavaScriptで
デスクトップアプリケーションが簡単に作れる「bowline」ライブラリを
紹介してみたいと思います。

bowlineは「titanium(クロスプラットフォーム環境)」を元に作られた
Ruby GUIフレームワークで特徴としては下記のような点が挙げられます。

  • gemパッケージ
  • MVCモデルフレームワーク
  • Webベース(WebKit)による画面設計

現状では動作するのはMaxOS XとUbuntuのようですがこれから先
マルチプラットフォーム対応も見込まれているそうなので将来的には
windows上で動作するアプリケーションもコードの変更を行わずに
作成できる様になるかもしれません。

bowlineの公式ページ

公式でサポートしている開発環境は下記の通りです。

  • Mac OSX 10.5以上 or Ubuntu
  • Ruby 1.9
  • Bowline gemライブラリ

※今回はMac OSX 10.5.8 , ruby 1.9.1環境で検証しています。
※webkitのアーキテクチャが32bitでなければ動作しません。
※このライブラリは32bitモードでコンパイルされたrubyが必要です。
 (Snow Leopardデフォルトのrubyでは正常に動作しない可能性が高いです)

bowlineインストール


bowline自体はgemコマンドで簡単にインストール可能です。
(rubyとgemのインストールは各自で行っているものとします)

$ sudo gem install bowline

テストアプリケーションの作成


インストールが完了したらお決まりの「hello world」アプリを作ってみましょう!
公式のInstallページに手順がありますのでそれに沿って作成していくことにします。

※今回は「/User/kawaguchi/bowline」の下に「helloworld」を作成して検証します。

$ cd /User/kawaguchi
$ mkdir bowline
$ cd bowline
$ bowline-gen app helloworld
Generating with app generator:
[ADDED]  vendor
[ADDED]  lib
(中略)
[ADDED]  config/boot.rb
[ADDED]  README

これで「/User/kawaguchi/bowline/helloworld」が作成され、ディレクトリ内には
アプリケーションの雛形が作成されています。
しかしこれだけでは動作することはできません。
必要なライブラリを「helloworld」アプリへ組み込む必要があります。

$ cd helloworld
$ bowline-bundle
Calculating dependencies...
Updating source: http://rubygems.org
Updating source: http://gems.rubyforge.org
/opt/local/lib/ruby/gems/1.9.1/gems/bowline-bundler-0.0.4/lib/bowline/bundler/resolver.rb:115
Caching: activemodel-3.0.0.beta4.gem
(中略)
Installing bowline (0.9.3)
**************************************************

Thank you for installing Bowline.

If you're on Linux, please install the WebKit library:
sudo apt-get install libwebkit-dev

**************************************************
Done.

最後に注意として「もしLinux使ってるならWebkitライブラリもインストールしてね」
メッセージが出ますがMac OSX上では標準で組み込まれているので問題有りません。

これでアプリケーション起動用スクリプトを実行してすれば動作する筈ですが・・・・

$ ./script/run
You don't have tzinfo installed in your application. Please add it to your Gemfile and run bundle install
no such file to load -- tzinfo
・・・

どうやら’tzinfo’ライブラリが必要ですがインストールされていない模様。
gemコマンドで’tzinfo’ライブラリをインストールします。

$ sudo gem install tzinfo

これでバッチリ動・・・きません。
実はgemとしてインストールしてもbowlineアプリケーションが参照している
gemライブラリディレクトリは[helloword/vendor/gems/1.9.1/gems/]以下であり、
[bowline-bundle]コマンドによってダウンロードしてきたものだけとなっています。

よってbundleコマンド実行時に’tzinfo’ライブラリもgemライブラリとして
インストールするように設定ファイルに設定します。

$ vi Gemfile
# Edit this Gemfile to bundle your application's dependencies.
source 'http://rubygems.org'

gem "bowline"
gem "tzinfo"            <=================== これを追記
## Bundle the gems you use: 
# gem "bj" 
# gem "hpricot", "0.6" 
# gem "sqlite3-ruby", :require_as =&gt; "sqlite3"

これで準備は完了です。もう一度bundleしなおして実行してみましょう。

$ bowline-bundle
$ ./script/run

これだけではメリットが分かりづらいかもしれません。
公式のインストールページの下部にgithubへのリンクがあり、サンプルコードとしてtwitterクライアントアプリケーションが公開されていますのでそれを実行してみましょう。

gitコマンドを利用してダウンロードします。
(gitコマンドやgithubに関する説明は割愛させていただきます)

$ cd /User/kawaguchi/bowline
$ git clone git://github.com/maccman/bowline-twitter ./twitter
$ cd twitter

「/User/kawaguchi/bowline/twitter」ディレクトリが作成され、 ファイルが展開されていることを確認してください。
このままでは動作しませんので2つ程設定を変更します。

(application.ymlファイル作成)
デフォルトでは「config/application.exmple.yml」ファイルしかないのでリネームして
「config/application.yml」ファイルとして保存してください。

$ mv config/application.example.yml config/application.yml 

(tiwtterアカウントを設定)
先程のapplication.ymlファイルにtiwtterアカウント情報を設定します。

$vi config/application.yml
username: (twitterアカウント)
password: (twitterパスワード)

設定が完了したら早速bundleして実行してみましょう。
こちらのGemfileにはちゃんと’tzinfo’が追記されているので編集しなくても良いです。

$ bowline-bundle
$ ./script/run</code></blockquote>

無事に起動したでしょうか?
ちなみにこのクライアントアプリの仕様はこんな感じです。

  • 60秒毎に更新
  • 更新は最新データ20件ずつ
  • 既存データの下部に追記されていく
  • つぶやいた際にも更新

まだまだ情報が少ないので大変ですが、今後のマルチプラットフォーム化やバージョンアップに期待がかかるライブラリとして今回紹介させていただきました。