« 布引ハーブ園 | トップページ | 縮小しなくてもNokia機で上下にずれないフリーで美しい日本語フォント »

2008/05/13

片方向シンクロ、hp200LXからGoogle Calendarへ

922SHでGoogleCalendarに直接予定を持っていこうとして、そういえばLXからは失敗して放置したままだったかも、と見直してみました。

そうか、Outlookとシンクロできているから、別に問題ないのか。
「lx_ol.zip」

でもWindowsは既にメインじゃないし。直接hp100/200LXからGoogleCalendarにデータを反映できて、しかも予定が二重に登録されたりしないのがいいな。予定をひとつづつインポートするのも面倒だから一括でできるのがいいし、過去の予定まで処理すると遅いから未来予定だけでいいよなあ、うーん。


「lx2ggl.zip」をダウンロード

こんな感じかな。
Lxggl02

hp200LX上で、maxdos経由BATファイルを起動。


rem LXのAppointmentsからGoogleCalendarへ
rem 今月以降のappointmensのデータをCSVへ
dayexec apptout -a -g/YYMM01/ -x A:\_DAT\appt.adb >appt.csv
dayexec apptout -e -g/YYMM01/ -x A:\_DAT\appt.adb >>appt.csv
rem シンクロ Outlook to LX
VZ appt.csv
perl A:\HOME\PROG\LX2GCAL.PL appt.csv >A:\lxappt.ics


んで、Perlスクリプトはこんな感じかな。


#!/usr/bin/perl
# LXのapptout出力csvからGoogleCalendarで取り込めるiCal形式へ変換
# 2008/05/13 GoogleCalendar対応。複数予定可能。UID生成。
# UIDはYYYYMMDDTTTTTTTZ_SUMMARY_LX2GCAL@AYATI.COM
# 件名、場所はQUOTED-PRINTABLEにせずシフトJISのまま書出し。

# memoやlocationや件名を何文字で切るか
$maxlen = 78;

$jst = 9;
@mdays = ('31', '31', '28', '31', '30', '31', '30',
'31', '31', '30', '31', '30', '31' ) ;

print 'BEGIN:VCALENDAR';
print "\n";
print "PRODID:-//ayati.com//LX2GCAL 0.1//EN";
print "\n";
print 'VERSION:1.0';
# print 'VERSION:2.0';
print "\n";
# print 'METHOD:REQUEST';
# print "\n";

while($line = <>){
@arr = split(/,/, $line);
$cntarr = @arr;
if ($cntarr < 8){
print 'BEGIN:VEVENT';
print "\n";
@datearr = split("/", substr($arr[1],1,10));
$year = $datearr[0];
$mon = $datearr[1];
$date = $datearr[2];
if ($arr[2] eq 'NONE') {
$hour = 0;
$min = 0;
} else {
@timearr = split(/:/, substr($arr[2],1,5));
$hour = $timearr[0];
$min = $timearr[1];
}
$hour = $hour - $jst;
if ($hour < 0) {
$hour = $hour + 24;
$startdateflag = 'CHANGE';
$date--;
if ($date < 1) {
$mon = $mon - 1;
$date = $mdays[$mon];
$date++ if (($mon == 2) &&
((($year % 4) == 0) &&
( ($year % 100) || (($year % 400)==0) )));
if($mon < 1){
$mon = 12;
$year--;
}
}
}
$UID1 = sprintf("%04d%02d%02dT%02d%02d00Z",$year,$mon,$date,$hour,$min) . '_';
print 'DTSTART:';
print sprintf("%04d%02d%02dT%02d%02d00Z",$year,$mon,$date,$hour,$min);
print "\n";
if ($arr[3] eq 'NONE') {
$hour = 0;
$min = 0;
} else {
@timearr = split(/:/, substr($arr[3],1,5));
$hour = $timearr[0];
$min = $timearr[1];
}
$hour = $hour - $jst;
if ($hour < 0) {
$hour = $hour + 24;
} else {
if ($startdateflag eq 'CHANGE'){
@datearr = split("/", substr($arr[1],1,10));
$year = $datearr[0];
$mon = $datearr[1];
$date = $datearr[2];
}
}
print 'DTEND:';
print sprintf("%04d%02d%02d\T%02d%02d00\Z",$year,$mon,$date,$hour,$min);
print "\n";
print 'SUMMARY:';
# print 'SUMMARY;ENCODING=QUOTED-PRINTABLE:';
# print "\=\n";
$summary = substr($arr[0],1,length($arr[0])-2);
$summary = substr($summary,0,$maxlen) if(length($summary) > $maxlen);
$UID2 = $summary . '_';
$UID2 =~ s/(\W)/sprintf("%2X",ord($1))/ge;
# $summary =~ s/(\W)/sprintf("=%2X",ord($1))/ge;
print $summary;
# $summary =~ s/=([0-9A-Fa-f]{2})/pack("C",hex($1))/ge;
# print $summary;
print "\n";
print 'CATEGORIES:MISCELLANEOUS';
print "\n";
$location = substr($arr[4],1,length($arr[4])-2);
if ($location ne ''){
print 'LOCATION:';
# print 'LOCATION;ENCODING=QUOTED-PRINTABLE:';
# print "\=\n";
$location = substr($location,0,$maxlen) if(length($location) > $maxlen);
# $location =~ s/(\W)/sprintf("=%2X",ord($1))/ge;
print $location;
# $location =~ s/=([0-9A-Fa-f]{2})/pack("C",hex($1))/ge;
# print $location;
print "\n";
}
print 'CLASS:PUBLIC';
print "\n";
print 'UID:';
print $UID1;
print $UID2;
print 'LX2GCAL@AYATI.COM';
print "\n";
($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
$year = $year + 1900;
$mon = $mon + 1;
print 'LAST-MODIFIED:';
print sprintf("%04d%02d%02dT%02d%02d%02dZ",$year,$mon,$day,$hour,$min,$sec);
print "\n";
$memo = substr($arr[6],1,length($arr[6])-3);
if ($memo ne ''){
print 'DESCRIPTION;ENCODING=QUOTED-PRINTABLE:';
$memo = substr($memo,0,$maxlen) if(length($memo) > $maxlen);
$memo =~ s/(\W)/sprintf("=%2X",ord($1))/ge;
print $memo;
# $memo =~ s/=([0-9A-Fa-f]{2})/pack("C",hex($1))/ge;
# print $memo;
print "\n";
}
print 'END:VEVENT';
print "\n";
}
}
print 'END:VCALENDAR';
print "\n";


LXAPPT.ICSというファイルができるので、それをMacやPCやなにかのインターネット端末で、Google Calendarを開いてインポートすればいけるはず。

…どこだっけ、インポート。あ、あったあった。
Google Calndarで、[設定]-[カレンダー]-[カレンダーを追加]-[カレンダーのインポート]だ。

Lxggl01


おっけー、おっけー。
あれ、シフトJISでいけるようになってるな。そういえば今回nkf使ってなくていけたもの。

UIDを設定しているので、一度取り込んだ予定は次に取り込もうとしてもはじいてくれます。必要なら、UIDに枝番なりを付加すれば別の予定として認識されて再取り込みが可能です。

うーん、これでまた現役だな、hp200LX。

|

« 布引ハーブ園 | トップページ | 縮小しなくてもNokia機で上下にずれないフリーで美しい日本語フォント »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/69188/41191674

この記事へのトラックバック一覧です: 片方向シンクロ、hp200LXからGoogle Calendarへ:

« 布引ハーブ園 | トップページ | 縮小しなくてもNokia機で上下にずれないフリーで美しい日本語フォント »