印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
Windows Palm から Google Calendar へ: Ruby スクリプト

Ruby スクリプト dba2ics を使って,Palm Desktop 4 の dba 形式のファイルを iCalendar 形式に変換する。Ruby は Cygwin 上で動作させる。

■ ■ ■

はじめに

Palm の予定表を Google Calendar に移行する方法を試してる (nlog(n): Palm の予定表を Google Calendar に移行する方法)。今回は Ruby スクリプトを使うものを紹介する。

動作環境は,Windows Vista Business SP 2,Cygwin 1.5。Ruby スクリプトは,snbhsmt_log さんが公開しているものを使う。Ruby スクリプトは OS によらないので,Linux でも動作するはず。変換元のファイルは Palm Desktop 4 形式の datebook.dat で,これを iCalendar 形式に変換する。定期的に繰り返される予定にも対応している。

スクリプト作者の snbhsmt さんに感謝する。

準備

Cygwin の Ruby

Cygwin は Windows 上で動作する Unix/Linux ライクな環境である (Cygwin Information and Installation)。現時点の最新版はバージョン 1.7.1。1.5 から 1.7 への移行は手動操作が必要で,面倒なのでやっていない。今回は 1.5 を使う。

Cygwin 内の Ruby はデフォルトではインストールされないので,setup.exe 内で明示的に指定してやる必要がある。Ruby は,「Devel」セクション内にある。インストールされるバージョンは 1.8.7-p72-2 である。

Cygwin の作業ディレクトリは,上位ディレクトリに半角スペースや日本語が入っていない場所を選ぶのがよい。意味不明のエラーを回避することができる。

RubyGems

次に RubyGems をインストールする。Cygwin では,ソースコードを取得してインストールする (RubyGems のインストール)。RubyGems の現時点での最新版は 1.3.5 となっている (RubyForge: RubyGems: Project Filelist)。

$ cd rubygems-1.3.5
$ ruby setup.rb
RubyGems 1.3.5 installed
...
RubyGems installed the following executables:
        /usr/bin/gem

RubyGems をインストールすると,gem コマンドが使えるようになる。gem コマンドは,ネットワーク経由でパッケージを取得してインストールまでしてくれる優れものである。Perl の cpan コマンドみたいな。次のように,gem で icalendar パッケージをインストールする。

$ gem install icalendar
Successfully installed icalendar-1.1.0
1 gem installed
Installing ri documentation for icalendar-1.1.0...
Installing RDoc documentation for icalendar-1.1.0...

icalendar は /usr/lib/ruby/gems/1.8/gems/ ディレクトリにインストールされるが,このディレクトリを意識しておく必要はない。

Ruby スクリプト

Ruby スクリプトの取得

必要なスクリプトは次の通り。

作業ディレクトリにこれらのスクリプトと,Palm Desktop 4 の datebook.dat を保存すれば準備完了。

Ruby スクリプトの実行

次のコマンドを入力すればよい。dba2ics.rb に実行権限を与えておけば ruby コマンドは不要。

$ ruby dba2ics.rb datebook.dat > datebook.ics

実行に成功すれば datebook.ics というファイルが出来上がる。これを Google Calendar にインポートすればよい。

エラー

Ruby スクリプトのエラー

datebook.dat に何らかの問題がある場合,エラーが発生して処理が止まる。例えば,次のような具合になる。

$ ruby dba2ics.rb datebook.dat
dba2ics.rb:46:in `at': bignum too big to convert into `long' (RangeError)
        from dba2ics.rb:46:in `_dt'
        from dba2ics.rb:38:in `dtstart'
        from dba2ics.rb:165
        from /usr/lib/ruby/gems/1.8/gems/icalendar-1.1.0/lib/icalendar/calendar.rb:36:in `instance_eval'
        from /usr/lib/ruby/gems/1.8/gems/icalendar-1.1.0/lib/icalendar/calendar.rb:36:in `event'
        from dba2ics.rb:164
        from dba2ics.rb:160:in `each'
        from dba2ics.rb:160

メッセージ内容からすると,日付のフォーマットに問題があるようだ。この datebook.dat は,Palm 本体と Palm Desktop で HotSync させたときに,予定表の同期の画面のままいつまで経っても HotSync が終わらない現象が起きていたファイルである。

Palm Desktop 6 の形式の datebook.dat の場合は,次のエラーで停止する。

$ ruby dba2ics.rb datebook6.dba
./dbareader.rb:16:in `read_dba': illegal data format (RuntimeError)
        from dba2ics.rb:145

Google Calendar のエラー

Ruby コマンドで生成された datebook.ics を Google Calendar でインポートしようとしたところ,次のエラーが表示された。

Import calendar
Processed zero events.
Failed to import events: Unable to process your iCal/CSV file..
Error at line 21469: Expected [VEVENT], read [VCALENDAR]
Google Calendar - Import Error
Google Calendar - Import Error


エラー箇所の予定を削って再度試みたが,そうするともっと前の予定で同じエラーが発生してしまった。その場合は,Sunbird あるいは,Thunderbird の Lightning 拡張で読み込み (Calendar プロジェクト - Lightning と Sunbird®のホーム),Google と同期させればよい。

まとめ

Palm Desktop 4 形式の datebook.dat は,Ruby スクリプト dba2ics で iCalendar 形式に変換することができる。定期的な予定にも対応している。定期的な予定の中で一部だけが変更されているようなものには対応していないとのことだが (iCalendar の繰り返し予定の例外 - snbhsmt_log),そのような予定はごく稀であるので無視できる範囲だろう。

Posted by n at 2010-01-28 23:03 | Edit | Comments (0) | Trackback(0)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
Comments
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?