職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

カレンダー連携

カレンダー機能「単体」で見ると、iPhoneよりもauのガラケーの方が操作性などで優れていると感じる。ただ単に慣れの問題であるかもしれないが、これはガラケーの強みの一つであると思う。
しかし、操作性から一歩外れた視点で考えると、例えばPCやGoogleCalendar等との連携ではiPhoneの方が圧倒的に優れている。なので外出先でどちらのスケジュール機能を利用するかは悩ましいところである。
選択肢には GoogleCalendar をガラケーのWebブラウザから使う というものも有るが、それではガラケーの高い操作性を活かしきれない。

こういった悩みを抱えつつも、これまではスケジュールは全てauのガラケーで管理していたのだが、先日、スケジュールが一杯(500件)になったので、au携帯の古いスケジュールをiCalへ連携し、iCalで保管することにした。

■今回の目標
 ・auガラケーのスケジュールをiCalへ取り込む
 ・iCalからiPhoneへは正常に同期が取れることを確認する

■auガラケーからのスケジュール取得
 幸い、使っているガラケーにはSDカードへの出力機能がある。それをPCで開いてみると、拡張子「VCS」のファイルが出力されていた。初めて見る拡張子であるが、中身を見るとテキストベースのフォーマットでスケジュール情報が記述されていることは分かった。

(例)
BEGIN:VCALENDAR // この行がファイルの先頭。XMLで言うところのrootタグか?
VERSION:1.0
BEGIN:VEVENT // これが個別のタスクの先頭
CLASS:PUBLIC
DTSTART:20101128T010000Z
DTEND:20101128T063000Z
SUMMARY;ENCODING=QUOTED-PRINTABLE:TOEIC
LAST-MODIFIED:20100823T224622Z
END:VEVENT // これが個別のタスクの末尾
BEGIN:VEVENT // 2件目の先頭。
CLASS:PUBLIC
DTSTART:20101104T150000Z
DTEND:20101105T150000Z
SUMMARY;ENCODING=QUOTED-PRINTABLE:=8A=D6=90=BC=83=49=81=5B=83=76=83=93=83=5C=81=5B=83=58 // マルチバイト文字はquoted-printableで(これは標準の話ではなくauガラケーの仕様かも?)
LAST-MODIFIED:20100530T004804Z
END:VEVENT // 2件目の末尾
END:VCALENDAR // これがファイルの末尾

■とりあえずiCalへ!
 あまりファイルフォーマットを見ずに「きっとiCalなら取り込んでくれるだろう」という楽観的な思考に基づいて取り込んでみると、何となく取り込むことができたっぽい。しかし、日本語が表示されない!日本語とASCII文字が混在しているものも全滅。日付や時間などの情報が正常に取り込めていることから、これは単純な文字コードの問題であると推測し、ファイルフォーマットとiCalの読み込み機能について実験してみることに。
そこで分かったこと:
・auガラケーが吐き出したquoted-printableなマルチバイト文字は、shift-jis表現のバイト列を表している
・iCalはUTF-8表現なら受け取ってくれる

(注)iCalでは「読み込む」の取り消し操作はできないので、取り消す可能性がある場合は、新規に作成するカレンダーに対して読み込むことをお勧めする。取り消したい場合は作成したカレンダーを削除すれば良い。

■shift-jis ⇒ utf-8変換プログラム
単なる変換なら高機能なテキストエディタを使えば一発!なのですが、今回はquoted-printableな状態で読み込む必要があること、そして恐らくutf-8のquoted-printableで出力した方が良いだろうということで、変換プログラムを作ることにした。本当は練習の意味も込めてperlObjective-Cで組みたいところであるが、急いでいたので使い慣れているJavaで組むことに。そんなに大きなプログラムではないのだけど。
開発のポイントは…
SJISのquoted-printableを読み込んでJavaのStringへ
JavaのStringからUTF-8のquoted-printableへ
といったところだろうか。
これだけ長い記事を書いた割には、プログラムの内容は「大学で初めてプログラミング学ぶんです」って人向けの宿題くらいのレベルになってしまった。。

■結果とこれから
カレンダーは無事に取り込むこに成功。もちろん、そのままGoogleCalendarにも連携。
しかし、この話はもっと発展の余地があるかと。
最終的に目指すところは「auガラケーにbuilt-inされているカレンダーとGoogleCalendarの同期」としよう。

今後追加したい機能
・逆方向連携(iCal⇒auガラケー
・差分更新(VCSファイルに LAST-MODIFIED という項目があることを見逃してはいないっ!)
GUI実装
・GoogleCalendar直接連携

■使用機材
auのガラケー: W42SA by SANYO http://products.jp.sanyo.com/products/w/W42SA_67/index.html
iPhone 3GS with iOS 4.1(8B117)
iCal:4.0.4(1395)
iCalを動作させているMac:MacBook(early 2008) with MacOSX 10.6.5
Javaプログラム開発&実行環境:秀丸エディタ64(8.02), Java SE 1.6.0_22-b04, Windows7 Professional 64bit

■参考情報
quoted-printableの仕様:RFC2045 "Internet Message Bodies" 6.7 Quoted-Printable Content-Transfer-Encoding
http://www.ietf.org/rfc/rfc2045.txt


※文中に登場する製品名などは、各社の商標または登録商標である。