« 2005年11月 | トップページ | 2006年1月 »

2005/12/31

LXでvCalendar作成!

vCalendarをLXに取り込むことはできました。あとはLXからvCalendar形式データを生成できれば全部つながりそうです。

エンコードもLX上でできるようにJPerlで書きました。青春18きっぷで東海道線を延々西へ乗りながらLXでぷちぷちとスクリプトを組みます。
LX上でAPPTOUTで予定をCSVにしておき、このCSVをvCalendar形式に変換するスクリプトを書きました。
--------------------


#!/usr/bin/perl
# LXのapptout出力csvからvCalendar形式へ変換
# 2005/12/30 W32T

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

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

print 'BEGIN:VCALENDAR';
print "\n";
print 'VERSION:1.0';
print "\n";
# print 'PRODID:LXPERL';
# 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--;
}
}
}
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;ENCODING=QUOTED-PRINTABLE:';
$summary = substr($arr[0],1,length($arr[0])-2);
$summary = substr($summary,0,$maxlen) if(length($summary) > $maxlen);
$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;ENCODING=QUOTED-PRINTABLE:';
$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";
($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";

-------------------- 変換はたとえばこんな感じ。 rem LXのapptoutでのcsv形式から、vCalendar形式へ perl csv2vcal.pl appt.csv >testvcal.txt

で、W32TのminiSDのAU_INOUTフォルダに入れてデータフォルダに振り分け、PIMデータを取り込めば完了です。

PocketPC(h4150)でもvCalendar形式をタップすれば取り込めたな、と試してみます。W32Tのバックアップデータのような複数予定を1ファイルにしたVCSは最初の一つしか取り込めないようです。また、拡張子が大文字の「VCS」だと駄目で、小文字の「vcs」にリネームしただけで取り込めるようになりました。

vCalendarは汎用的に使えるようなので面白そうです。

| | コメント (0) | トラックバック (0)

vCalendarからLXへ予定シンクロ

パッケージ使ってLXで動かなかったボケは素です。(汗

LXで移動中にぷちぷちスクリプト組んで、どうやらケータイから直接LXへ差分予定を自動取り込みすることができました。WINDOWS PCは必要ありません。ケータイでスケジュールをminiSDにバックアップ、LXに挿して、
A:\PRIVATE\AU\BU\B_SL\SL__000?.VCS
のうち最新のタイムスタンプのファイルをC\にコピーします。
フラッシュを元に戻して、以下のスクリプトをバッチから実行すれば、ケータイで登録されてLXになかった予定だけAPPOINTMENTSに登録されます。

#!/usr/bin/perl # auケータイW32TスケジュールバックアップデータからLXへシンクロ用CSV作成 # ケータイの吐くvCalendar形式とLXのapptout形式を比較 # 2005/12/29 LX上で動くJPerl4用。appt.adbへの追加用差分出力。

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

# メモと件名のシンクロ判定を何文字で行うか
$chkchr = 10;

if ($#ARGV < 2) {
die "usage: $0 vcalendar.dat appt.csv addappt.csv\n";
}

open(INVCL, "<$ARGV[0]") || die "Can't open $ARGV[0]";
open(INLX, "<$ARGV[1]") || die "Can't open $ARGV[1]";
open(OUTAP, ">$ARGV[2]") || die "Can't open $ARGV[2]";

$line = ;
if ($line !~ /^BEGIN:VCALENDAR/){
print $_;
die "not VCALENDAR!\n";
}
$cntevt = 0;
@vcalarr = '';
while($line=){
if ($line =~ /^BEGIN:VEVENT/){
$kenmei='""'; $kaisibi='""'; $kaisi='"00:00"'; $syuryo='"00:00"';
$location='""'; $memo='""';
}elsif ($line =~ /^END:VEVENT/){
$outline = $kenmei .','. $kaisibi .','. $kaisi .','. $syuryo;
$outline = $outline .','. $location .',"0",'. $memo;
$vcalarr[$cntevt] = "$outline\n" if ($outline ne '"0"');
$cntevt++;
}elsif ($line =~ /^DTSTART/){
@arr = split(/:/, $line);
$kaisibi = '"'. substr($arr[1],0,4) .'/'. substr($arr[1],4,2) .'/'. substr($arr[1],6,2) .'"';
$timehour = substr($arr[1],9,2) + $jst;
if ($timehour > 23){
$timehour = $timehour - 24;
@datearr = split('/', $kaisibi);
$date = substr($datearr[2],0,2);
$mon = $datearr[1];
$year = substr($datearr[0],1,4);
$date ++;
if ($date > $mdays[$mon]){
if (($mon == 2) &&
((($year % 4) == 0) && ( ($year % 100) || (($year % 400)==0) ))){
;
}else{
$date = 1;
$mon++ ;
if ($mon > 12){
$year++;
$mon = 1;
}
}
}
$kaisibi = sprintf("\"%04d/%02d/%02d\"", $year, $mon, $date);
}
$kaisi = '"'. sprintf("%02d", $timehour) .':'. substr($arr[1],11,2) .'"';
}elsif ($line =~ /^DTEND/){
@arr = split(/:/, $line);
$timehour = substr($arr[1],9,2) + $jst;
$timehour = $timehour - 24 if ($timehour > 23);
$syuryo = '"'. sprintf("%02d", $timehour) .':'. substr($arr[1],11,2) .'"';
}elsif ($line =~ /^SUMMARY;ENCODING=QUOTED-PRINTABLE:(.*)$/){
$qpstr = $1;
$qpstr =~ s/=([0-9A-Fa-f]{2})/pack("C",hex($1))/ge;
$kenmei = '"' . $qpstr . '"';
}elsif ($line =~ /^LOCATION;ENCODING=QUOTED-PRINTABLE:(.*)$/){
$qpstr = $1;
$qpstr =~ s/=([0-9A-Fa-f]{2})/pack("C",hex($1))/ge;
$location = '"' . $qpstr . '"';
}elsif ($line =~ /^DESCRIPTION;ENCODING=QUOTED-PRINTABLE:(.*)$/){
$qpstr = $1;
$qpstr =~ s/=([0-9A-Fa-f]{2})/pack("C",hex($1))/ge;
$memo = '"' . $qpstr . '"';
$memo =~ s/\n/\\n/g;
}
}

$maxvcal = @vcalarr;
@flagarr = '';

while($lxline = ){
@lxarr = split(/,/, $lxline);
$cntarr = @lxarr;
if ($cntarr < 8){
$newitem = "YES";
for ($i = 0; $i < $maxvcal; $i++){
$vcalline = $vcalarr[$i];
@evtarr = split(/,/, $vcalline);
$lxarr[2] =~ s/NONE/00:00/g;
$lxarr[3] =~ s/NONE/00:00/g;
$evtarr[6] =~ s/\\n//g;
$lxarr[6] =~ s/\\n//g;
if (
substr($lxarr[0], 0, $chkchr) eq substr($evtarr[0], 0, $chkchr) &&
$lxarr[1] eq $evtarr[1] &&
$lxarr[2] eq $evtarr[2] &&
$lxarr[3] eq $evtarr[3] &&
$lxarr[4] eq $evtarr[4] &&
substr($lxarr[6], 0, $chkchr) eq substr($evtarr[6], 0, $chkchr)
) {
$flagarr[$i] = 'FOUND';
}
}
}
}
for ($i = 0; $i < $maxvcal; $i++){
print OUTAP "$vcalarr[$i]" if ($flagarr[$i] !~ /FOUND/);
}

close(INOL);
close(OUTAP);

vCalendar(ケータイW32T等バックアップファイル)→LXシンクロ用サンプルバッチファイルは、以下の通りです。


rem auのケータイW32TスケジュールバックアップからLXのAppointmentsへ登録
rem SDからコピー
copy APPT.ADB APPTOLD.ADB
copy A:\_DAT\APPT.ADB
for %%F in (C:\SL__000*.VCS) DO copy %%F vcal.dat
rem appointmensのデータをCSVへ
apptout -a -x appt.adb >appt.csv
apptout -e -x appt.adb >>appt.csv
rem 差分csv生成au vCalendar to LX
perl vcal2lx.pl vcal.dat appt.csv newappt.csv
rem 新adb生成
apptout -x appt.adb -i newappt.csv -o newappt.adb -a

rem \_DATへコピー
echo APPT.ADBを更新します。
copy A:\_DAT\APPT.ADB A:\_DAT\APPTOLD.ADB
copy NEWAPPT.ADB A:\_DAT\APPT.ADB

| | コメント (0) | トラックバック (0)

2005/12/30

鳥山の後

これがなければ年が越せない。年末恒例です。
すばちゃん家にはキティちゃんが。ちょっとひぐらし風に撮ってみました。051230_224501.JPG

| | コメント (0) | トラックバック (0)

旅へ

051230_001402.JPG
三ノ宮駅が夜中の12時を回ると、日常の通勤電車の終電も出て、寝台特急が入線してきます。貨物列車の影響で5分遅れとのアナウンス。
051230_001801.JPG
9号車26号、Bシングル上側の個室です。車掌の検札を受け、寝間着に着替えて寝転がると、街の夜景から夜空へと湾曲した窓を通して外の景色が動いていきます。
051230_002201.JPG
年末忙しかった仕事は忘れ、身体を伸ばします。
h4150で動画を眺めます。W32Tの送信メール雛形をHP100LXでぷちぷちと。W32Tで撮った写メールの本文をを書き込みます。京都を過ぎるとまぶしい街明かりも控えめになります。

(我、使命を受けし者なり。契約の下、その力を解き放て。風は空に、星は天に。そして不屈の心はこの胸に。この手に魔法を、レイジングハート、セットアップ!)

HP100LXを持ってきたのは、vCalendarをLXのappointmentsと比較して必要な未登録の予定のみ自動でLXに追加登録するPerlスクリプトが途中のままだったから。旅行記だけならOQOのEBt WDEか、h4150のTOMBOでもよかったのですけれど。
051230_003302.JPG
大晦日から正月三が日は、恒例冬の飯田線。豊川稲荷初詣から、天竜峡、そして諏訪へと厳冬の中、東海・信州への鉄な旅行です。詳しくはてるすたえきちょにおまかせなので良く分かっていませんけれど、きっと雪の天竜川とか、誰も訪れないような秘境の駅とか、そういうマニアックな感じだと思われます。楽しみ。今年は寒いだろうなあ。

まずは明日の鳥山忘年会が目的です。北野駅集合。明日の新幹線の予定だったけれど、みどりの窓口で聞いたらサンライズBソロ満席、Bシングルが瀬戸で1室だけ空きがあり、確保しました。旅立ちは寝台列車から。

何はともあれ、恒例の鳥山。野鳥を食べねば年を越せません。

051230_001902.JPG

| | コメント (0) | トラックバック (0)

2005/12/29

LX上でvCalendarからappointへ

HP100LX上で動作するJPerl4で動くスクリプトを書きました。
とりあえず、vCalendar形式から全件apptoutで取込めるcsv形式にするスクリプトです。シンクロ用の比較は行っていません。

auのケータイW32Tでカレンダーのバックアップを取ると、複数イベントを一つのファイルにまとめたvCalendar形式になります。これをapptoutで取込めるcsvに変換するには、

perl vcal2csv.pl vcal.dat >vcalappt.csv

といった感じでこのスクリプトを使います。できたcsvのうち、LXに既に登録されている予定は目で見てテキストエディタなどで行削除し、LXに新規にとりこみたいデータだけにしてから、

apptout -x appt.adb -i vcalappt.csv -o newappt.adb -a

というようにすればappointmentsにvCalendar予定を取込めます。
vCalendarはOutlookからエクスポートしたものでも大丈夫でした。他にもvCalendar形式で吐き出せるデバイスなら使えるかもしれません。

昨日のスクリプトはPerl5用パッケージを使っていましたが、今回はパッケージも外部モジュールも使わず、Quoted-Printableデコードや世界標準時から日本時間への変換を実装しています。手許のデータではそれらしく動きましたけれど、Quoted-Printable形式エラーデータチェックなどしていないので、しばらく使ってみないと実用性はよく見えません。というか、スクリプト書かなくてもなんかソフトあって良さそうなんですけれど、見つけられませんでした。

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

| | コメント (0) | トラックバック (0)

2005/12/28

auW32TからLXのappointmentに

Outlookを通さなくても、auのケータイから直接LXにスケジュールシンクロすればいいんじゃん、とふと思いついて、ActivePerlでスクリプト書きました。auのケータイW32TでスケジュールのバックアップをminiSDに保存し、それとLXのappt.adbを比較しLX側に登録がない予定を抽出、appointmentsに追加登録。

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

パッケージ使いました。まずQPのデコード用
http://search.cpan.org/~gaas/MIME-Base64-Perl-1.00/lib/MIME/QuotedPrint/Perl.pm
MIME::QuotedPrint

それから日本時間への変換用
http://search.cpan.org/~yves/Date-Simple-3.02/lib/Date/Simple/D8.pm
Date::Simple
Date::Simple::D8
Date::Simple::Fmt
Date::Simple::ISO
Date::Simple::NoXS

ちなみにappt.adbとの比較等はしないで、ただ単にvCalendar形式からapptoutのcsv形式に変換するだけのスクリプトはこちら。必要なパッケージは同じです。たとえばOutlookからエクスポートしたvCalendarデータをLXのapptout 形式に変換できます。
「vcal2csv.pl」をダウンロード


なんだかそれっぽく動きました。ActivePerlでは。で、LXにスクリプト移してバッチファイルを書き換えて。
・・・。
Perl5のパッケージ使ったらLXで動かないじゃん。おれアホや。

| | コメント (0) | トラックバック (0)

2005/12/21

出張

今日の夕食は新幹線の中です。051221_164701.JPG
051221_170402.JPG

| | コメント (0) | トラックバック (0)

2005/12/18

気管支炎

今日はしんどくて寝込んでます。昨日も仕事、明日も忘年会があって休むわけにいかないす。
風邪の方はすっかり良くなり、気管支炎が残っているだけだと分かっているので、
2-3日安静にしていれば快癒するのですが。
こじらせないよう薬飲んでまた寝ます。

| | コメント (2) | トラックバック (0)

2005/12/14

チャン・イーモウ監督NOT ONE LESS

邦題あの子を探して という映画をDVDで観ました。

張芸謀(チャン・イーモウ)監督作品です。先日のコンサートで布教されました。
パッケージによると、1999年ベネチア映画祭金獅子賞(グランプリ)受賞だそうです。

山村の小学校のカオ先生が老母の看病に一ヶ月出かけることになり、代理がおらず、誰も見付からないあげく、村長が13歳の女の子を連れてきます。
何もできない女の子で、カオ先生に何が出来ると聞かれて歌が出来る、と1曲だけ(途中忘れながら)歌を歌います。何もできないので教科書を毎日1課ずつ黒板に写すよう言われます。
13歳の女の子は村長に一ヶ月代理先生をするなら50元くれると聞いて来たのです。
後のことが心配でたまらないカオ先生は、もう十数人生徒が減った、これ以上生徒を減らさぬよう、一人も減らなかったら必ず村長に払わせる、村長が払わなければカオ先生が払うからと、くれぐれも13歳の女の子ウェイ・ミンジに生徒たちを頼んで去ります。

で、ウェイ先生になった13歳の女の子がその通り黒板に教科書を写す毎日が始まるのですが…

黒板に写したとたん、「それ、習ってない!」「先生が言ったの」「だって、できないー」
「写すまで教室から出ちゃダメ!」「帰る」「戻って!」
「ホエクーが騒いでる、注意してよ」「私にはどうしようもないわ」「あんた先生でしょ」

教卓ひっくり返って大騒ぎ。うわーって感じで笑えます。
唯一の特技の歌もやっぱり途中で忘れて教えられません。

代理先生と生徒たちは皆素人だそうで、もう本当になんというか、もうもうもう!
可愛いんだこれが。
子供ってこうだよな、ってしみじみ。学校ってこうだよな、って中国の山村ってこうなんだろうなって。
後半、街との対比も面白い。街の方は日本と変わらないわけです。いや日本より中国の方が
今は富豪の数も多いんだろうし、って話が逸れました。

泣ける映画とは違うのでしょうけれど、ボロボロ泣いてました。どっちかって言うと観てておかしくてたまらなくて笑っちゃう映画だろうと思います。

| | コメント (0) | トラックバック (0)

2005/12/11

久しぶりの外出

昨日までは近所のコンビニに行くのも諦めていたけれど、今日は食事も兼ねて出かけます。レトルトおかゆも全部食べ切り、カップラーメンも底を突きました。
高熱は下がり、気管支の炎症が残ります。7-8年前に急性気管支炎をこじらせてから、喉の炎症を伴う風邪が重く長引くようになってしまいました。
灘酒心館は夜になると幽霊でも出そうな景色に変わります。051211_172901.JPG

| | コメント (0) | トラックバック (0)

2005/12/09

熱下がってきました

今日は病院で点滴。だいぶ楽に。
薬は咳止めカプセルが追加になりました。051209_105001.JPG

| | コメント (0) | トラックバック (0)

2005/12/08

38.7℃

ドクターストップです。051208_130001.JPG

| | コメント (1) | トラックバック (0)

2005/12/07

谷山浩子「白と黒」

DISCPIERで平積みでした。051207_171201.JPG

| | コメント (0) | トラックバック (0)

喉の風邪が治りません。051207_180202.JPG

| | コメント (0) | トラックバック (0)

Outlook2000でテスト、バグ修正

Outlook2000で双方向シンクロテストをして、少しバグを修正したものです。
例によって、
dayexecActivePerlAPPTOUTが必要です。

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

| | コメント (0) | トラックバック (0)

2005/12/05

風邪

週末自転車にも乗らずに、土曜日一日寝ていました。疲れが出ただけかなと思っていましたけれど、喉が痛くて、食堂で朝の挨拶をしたら自分のものじゃないような声が出ました。風邪をひいたようです。近所の医者に行って診てもらいます。注射を一本打ってくれました。051205_095101.JPG

| | コメント (1) | トラックバック (0)

2005/12/04

Outlook2002とAPPT.ADB双方向シンクロテスト

Outlookの予定をLXに表示して見ていたら、やっぱLXはいいなあということで、予定をLXでも入力したくなりました。
というわけで双方向に差分を吐き出すスクリプトサンプルを書いてみました。

今度はOutlook2002環境でテストしました。
Outlook2002だと、内容欄の改行コードをそのままCSVに吐いてしまい、行がぶつぎれになります。うげぇ、と思いつつスクリプトを書き換えました。
手許の少ない予定データだと、なんだかうまくそれっぽく動きました。
dayexecActivePerlが必要です。ActivePerlは今週ダウンロードした最新版で動作確認しました。あ、もちろんAPPTOUTも。

Outlookへインポートの際は、「重複するアイテムはインポートしない」にするのが安全です。

バッチファイルを見ての通り、LX側もOutlook側も、予定データを削除することは一切していません。超いいかんげんなでっち上げスクリプトなので、そんなことするの怖くて。それぞれに未登録のデータを抽出する、というスクリプトにとどめています。
あくまでバッチやPerlスクリプトが自分で修正できる人向けです。アラーム周りとか、明らかにアバウトすぎですが、ぼくはOutlookをシンクロ用の踏み台としか使っていないのでこれで支障ないのです。必要性を感じた部分は適当に修正してください。LXの繰り返し予定もバッサリ処理対象から外しています。

「appt2002.zip」をダウンロード
改変しての再配布も歓迎です。どなたかもっとまともなスクリプトぷりーず。

| | コメント (0) | トラックバック (0)

2005/12/03

Outlook2002からAppointments

APPTOUTを利用して、
Outlook2000の予定表CSVから、LXのAppointmentsにデータを一方向追加するようにしてみました。
Outlook2000で、[ファイル]-[インポートとエクスポート]-[ファイルへエクスポート]-[テキストファイル(DOS、カンマ区切り)]-[予定表]-[適当なパスのoutlook.csv]-[完了]の手順でCSVを作って利用します。
同じ予定を二重に登録しないようにスクリプトを組みました。
ActivePerlで動作確認しています。
Outlook2002で試したら、CSVの内容欄に改行をエスケープしないでそのまま吐く仕様なので、
スクリプトを書き直しました。ついでにバグもいくつか修正。
とりあえず片方向追加はこれでいいかな、という感じです。同梱バッチファイルはLXのフラッシュがFドライブで、LX上ではA:\_DAT\APPT.ADBを使っていることが前提のサンプルです。APPTOUTとPerlが必要です。

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

| | コメント (0) | トラックバック (0)

« 2005年11月 | トップページ | 2006年1月 »