ogagagaの日記

ruby、mac、スポーツ、釣り、アウトドア、etc・・・について、気ままに・・・。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

iCalendar形式のデータを読み書きしたい

Ruby逆引きレシピAdvent Calendarの8日目です。

こちらの本ですが、Rubyを使ってお仕事をしている人達にとってとても重宝すると思います。特に9章以降の「エラー処理/ログ」、「テスト/最適化」、「デバッグ」、「システム管理/自動化」、「ドキュメンテーション/パッケージ化」などは、Rubyでどうやったらいいんだろう?なんて思ったときにレシピ先輩が華麗に教えてくれます。そして、Rubyインストール直後に役立つ事がかいてある第一章も大変役に立つことがかかれています。また、5名の方々はそれぞれ違う方面でご活躍されていることもあり、内容が幅広いのも特徴です。
手元に一冊あって損はしないです。

Ruby 逆引きレシピ すぐに美味しいサンプル&テクニック 232 (PROGRAMMER’S RECIPE)Ruby 逆引きレシピ すぐに美味しいサンプル&テクニック 232 (PROGRAMMER’S RECIPE)
# 作者: 島田浩二,設樂洋爾,村田賢太,前田智樹,谷口文威
# 出版社/メーカー: 翔泳社
# 発売日: 2009/07/25

商品詳細を見る


本日は、本をぱらぱらっとめくりお題は iCalendar形式を扱うにしました。Calendarつながりってことで、ここが気になりました。

以下は、本を見ながら書いたコードです。特に自分でカスタマイズすることなく、ほぼ本の内容を忠実に守ってコードを書いてみました。

まずは、インストール

ogagagaMacBook-478:~ ogagaga$ sudo gem install icalendar
Password:
PostInstall.txt
Successfully installed icalendar-1.1.5
1 gem installed
Installing ri documentation for icalendar-1.1.5...
Installing RDoc documentation for icalendar-1.1.5...



でもその前に、iCalendarのドキュメントを見たくなったので、参照してみることに。
おっと、ここでもレシピ先輩の出番ですよ!

#ドキュメント参照
#==========================================================================
# Ruby逆引きレシピ 010 RubyGems でインストールしたパッケージのドキュメントを参照したい
#==========================================================================
ogagagaMacBook-478:~ ogagaga$ gem server
Starting gem server on http://localhost:8808/


上記URLにアクセスするとドキュメントが参照できます。
これまた、この本でお手軽に調べる事ができます。

以下はコードです。

#==========================================================================
# Ruby逆引きレシピ 139 iCalendar 形式のデータを読み書きしたい
#==========================================================================

require 'rubygems' # Unless you install from the tarball or zip.
require 'icalendar'
require 'date'
require 'kconv'

require 'pp' # for debug


include Icalendar # Probably do this in your class to limit namespace overlap

# Create a calendar with an event (standard method)
cal = Icalendar::Calendar.new

# ブロック内で定義されたイベントをカレンダーに追加する
cal.event do
dtstart Date.new(2010, 12, 03)
dtend Date.new(2010, 12, 05)
summary "札幌Ruby会議03"
description "地域Ruby会議(Regional RubyKaigi;りーじょなるるびーかいぎ)"
klass "PRIVATE"
end

# iCalendar 形式へ変換!
cal.to_ical

pp(cal)

# ogagagaMacBook-478:src ogagaga$ ruby icalendar_sample.rb
# ## @components=
# {:events=>
# [## @components={},
# @name="VEVENT",
# @properties=
# {"sequence"=>0,
# "ip_class"=>"PRIVATE",
# "dtend"=>#,
# "dtstart"=>#,
# "uid"=>"2010-12-13T23:25:40+09:00_165775011@ogagagaMacBook-478.local",
# "dtstamp"=>#,
# "description"=>
# "地域Ruby会議(Regional RubyKaigi;りーじょなるるびーかいぎ)",
# "summary"=>"札幌Ruby会議03"}>]},
# @name="VCALENDAR",
# @properties=
# {"version"=>"2.0", "calscale"=>"GREGORIAN", "prodid"=>"iCalendar-Ruby"}>

# 既存のeventオブジェクトを追加する方法
cal = Icalendar::Calendar.new

event = Icalendar::Event.new
event.dtstart = Date.new(2010, 12, 03)
event.dtend = Date.new(2010, 12, 05)
event.summary = "札幌Ruby会議03"
event.description = "地域Ruby会議(Regional RubyKaigi;りーじょなるるびーかいぎ)"
event.klass = "PRIVATE"

cal.add_event(event)

pp(cal)

# ## @components=
# {:events=>
# [## @components={},
# @name="VEVENT",
# @properties=
# {"sequence"=>0,
# "ip_class"=>"PRIVATE",
# "dtend"=>#,
# "dtstart"=>#,
# "uid"=>"2010-12-13T23:25:40+09:00_120918459@ogagagaMacBook-478.local",
# "dtstamp"=>#,
# "description"=>
# "地域Ruby会議(Regional RubyKaigi;りーじょなるるびーかいぎ)",
# "summary"=>"札幌Ruby会議03"}>]},
# @name="VCALENDAR",
# @properties=
# {"version"=>"2.0", "calscale"=>"GREGORIAN", "prodid"=>"iCalendar-Ruby"}>



と本を読みながら簡単にできます。

ファイルに落とす場合は、こんな感じ。

# ファイルに落とす
# http://ja.wikipedia.org/wiki/ICalendar
# によると拡張子は.ical; .ics; .ifb; .icalendar
File.open("recipe_sample.ics", "w+b") do |f|
f.write(cal.to_ical.toutf8)
end



次は、ファイルの解析。

# iCalendar 形式のファイルを解析する
File.open("recipe_sample.ics") do |f|
cal = Icalendar.parse(f).first
event = cal.events.first

pp(event.dtstart)
pp(event.description)
end

# #
# "地域Ruby会議(Regional RubyKaigi;りーじょなるるびーかいぎ)"



で、なんとなく一意なファイル名で保存したくなった。ここでもレシピ先輩の登場。

# おまけ
# =============================================================================
# Ruby逆引きレシピ 040 ユニークな識別子(UUID)を生成したい
# =============================================================================
# ファイル名を一意にしてみます。
# gem install uuidtools
require 'uuidtools'

File.open("recipe_sample_#{UUIDTools::UUID.timestamp_create}.ics", "w+b") do |f|
f.write(cal.to_ical.toutf8)
end

# recipe_sample_190d9a24-06c9-11e0-a117-002500fffecc.ics が出来上がり。



ということで、この本があると特にググったりしなくても良い場合がありますね。
ほんとに重宝するね!
スポンサーサイト
  1. 2010/12/16(木) 00:00:00|
  2. Ruby
  3. | トラックバック:0
  4. | コメント:0
<<タイトルなし | ホーム | 札幌Ruby会議03 裏話 大懇親会編>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://ogagaga.blog19.fc2.com/tb.php/167-56bc4a80
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

ogagaga

Author:ogagaga
北海道小樽市在住のエンジニア(職場は札幌)です。
Ruby、Rails、Objective-C、カメラ(NIKON D60)、iPhone(3GS)、たいやき、和菓子 etc...

flickr

http://www.flickr.com/photos/y_ogagaga/

flickr

www.flickr.com
y_ogagaga's items Go to y_ogagaga's photostream

SapporoRubyKaigi03_STAFF

RubyKaigi2010_STAFF

SapporoRubyKaigi02_STAFF

RubyKaigi2009_ATTENDEE

最近の記事

Viewサーチ北海道

カレンダー

05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -

カテゴリー

月別アーカイブ

最近のコメント

最近のトラックバック

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。