2007年06月14日(Thu)
■ (gcal2text.pl改変)Tie::iCalでGoogle Calendarのデータ利用
塚本さんが作成されたgcal2text.plを改変してみました。
このコードは、次の問題点に対応してみました。
iCalには終日の予定は、例えば8月24日の予定は「開始:2006/08/24、終了:2006/08/25」、8月24日から8月25日の予定は「開始:2006/08/24、終了:2006/08/26」のように、終了が最終日の翌日で入ってきます。作成時に意図していたのは、8月24日の予定は「2006/08/24」とだけ出力することなのですが、これを私が考慮していないので「2006/08/24 - 2006/08/25」と出力されてしまいます。
gcal2text.pl(改変版)
use Date::Manip; use Tie::iCal; use Jcode; # 出力文字コードの指定 my $jcode = 'sjis'; # ファイルの読み込み my $file = shift(@ARGV); my %events; tie %events, 'Tie::iCal', $file || die qq(Can't read "$file".); my @items = map { $events{$_}->[1] } keys(%events); untie(%events); # ソート、テキストへの変換 @items = sort { $a->{'DTSTART'}->[1] cmp $b->{'DTSTART'}->[1] } @items; $jcode = undef unless (Jcode->can($jcode)); my @texts; foreach my $item (@items) { my $from_date = sprintf("%04d/%02d/%02d", $1, $2, $3) if ($item->{'DTSTART'}->[1] =~ /^(\d{4})(\d{2})(\d{2})/); my $till_date = sprintf("%04d/%02d/%02d", $1, $2, $3) if ($item->{'DTEND'}->[1] =~ /^(\d{4})(\d{2})(\d{2})/); my $from_time = sprintf(" %02d:%02d", $1, $2, $3) if ($item->{'DTSTART'}->[1] =~ /T(\d{2})(\d{2})(\d{2})/); my $till_time = sprintf(" %02d:%02d", $1, $2, $3) if ($item->{'DTEND'}->[1] =~ /T(\d{2})(\d{2})(\d{2})/); my $time; #同じ日の予定(YYYY/MM/DD HH:MM - HH:MM) if( $from_date eq $till_date ){ $time = "$from_date $from_time - $till_time"; #終日予定 } elsif(($from_time eq '') && ($till_time eq '')) { $from = ParseDate($from_date); $till = ParseDate($till_date); $till = DateCalc($till, "-1 days"); $flg = Date_Cmp($from, $till); #複数日終日予定 (YYYY/MM/DD - YYYY/MM/DD) if($flg<0){ $till_date = sprintf("%04d/%02d/%02d",$1, $2, $3) if( $till =~ /^(\d{4})(\d{2})(\d{2})/); $time = "$from_date - $till_date"; #1日のみの終日予定(YYYY/MM/DD) } elsif($flg==0) { $time = "$from_date"; } #複数日予定(YYYY/MM/DD HH:MM - YYYY/MM/DD HH:MM) } else { $time = "$from_date $from_time - $till_date $till_time"; } $time =~ s/ +/ /g; my $subj = $item->{'SUMMARY'}; my $desc = $item->{'DESCRIPTION'}; $desc = '' if (ref($desc) eq 'ARRAY' and @{$desc} == 0); $desc =~ s/\\n/\n/g if (not ref($desc)); $desc =~ s/(^\n+|\n+$)//gs; my $text = "■ $subj ($time)\n\n$desc\n\n"; $text = jcode($text)->$jcode if ($jcode); $text =~ s/\s+\n\n$/\n\n/s; push(@texts, $text); } # 出力 print @texts;
2007年06月15日(Fri)
■ (gcal2text.pl改変) Tie::iCalでGoogle Calendarのデータ利用(2)
昨日に引き続き、塚本さんが作成されたgcal2text.plを改変してみました。
今回はデータに対して、日付の範囲指定を有効にしました。
使い方
>gcal2text.pl ics_filename [YYYYMMDD [YYYYMMDD]]
- 第一パラメータ
- iCal形式ファイルです。
- 第二パラメータ
- 開始日付(省略可)
- 第三パラメータ
- 終了日付(省略可)
コマンド発行例
1.データに対する抽出開始、終了の日付を指定してデータをテキスト変換する
>gcal2text.pl hogehoge.ics 20070610 20070616
この場合、hogehoge.icsにある、2007/06/10から2007/06/16までに開始日が設定されてるスケジュールを抽出し、テキストに変換します。
2.データに対する抽出開始日付を指定してデータをテキスト変換する
>gcal2text.pl hogehoge.ics 20070610
この場合、hogehoge.icsにある、2007/06/10以降に開始日が設定されているスケジュールを抽出し、テキストに変換します。
3.全データをテキスト変換する
>gcal2text.pl hogehoge.ics
日付指定が省略されていれば、hogehoge.icsに記述されている全スケジュールをテキスト変換します。
ソース
# # gcal2text.pl version:0.302 # # Copyright (C) 2006, Makio Tsukamoto <tsukamoto@gmail.com> # Copyright (C) 2007, shino <shino@freedomcat.com> # You can redistribute it and/or modify it under GPL2. use Date::Manip; use Tie::iCal; use Jcode; sub get_time; sub date_cmp; # 出力文字コードの指定 my $jcode = 'utf-8'; #my $jcode = 'sjis'; # ファイルの読み込み my $file = $ARGV[0]; my $param_start = $ARGV[1]; my $param_end = $ARGV[2]; #print "\$file=$file \$param_start=$param_start \$param_end=$param_end\n"; my %events; tie %events, 'Tie::iCal', $file || die qq(Can't read "$file".); my @items = map { $events{$_}->[1] } keys(%events); untie(%events); # ソート、テキストへの変換 @items = sort { $a->{'DTSTART'}->[1] cmp $b->{'DTSTART'}->[1] } @items; $jcode = undef unless (Jcode->can($jcode)); my @texts; foreach my $item (@items) { if( ($param_start ne '') ){ if( &date_cmp( $item->{'DTSTART'}->[1] ) ){ #print "$item->{'DTSTART'}->[1] データを飛ばします\n"; next; } } my $time = &get_time($item->{'DTSTART'}->[1],$item->{'DTEND'}->[1]); my $subj = $item->{'SUMMARY'}; my $desc = $item->{'DESCRIPTION'}; $desc = '' if (ref($desc) eq 'ARRAY' and @{$desc} == 0); $desc =~ s/\\n/\n/g if (not ref($desc)); $desc =~ s/(^\n+|\n+$)//gs; my $text = "■ $subj ($time)\n\n$desc\n\n"; $text = jcode($text)->$jcode if ($jcode); $text =~ s/\s+\n\n$/\n\n/s; push(@texts, $text); } # 出力 print @texts; sub get_time{ my ($start,$end) = @_; my $time; my $from_date = sprintf("%04d/%02d/%02d", $1, $2, $3) if ($start =~ /^(\d{4})(\d{2})(\d{2})/); my $till_date = sprintf("%04d/%02d/%02d", $1, $2, $3) if ($end =~ /^(\d{4})(\d{2})(\d{2})/); my $from_time = sprintf(" %02d:%02d", $1, $2, $3) if ($start =~ /T(\d{2})(\d{2})(\d{2})/); my $till_time = sprintf(" %02d:%02d", $1, $2, $3) if ($end =~ /T(\d{2})(\d{2})(\d{2})/); if( $from_date eq $till_date ){ #同じ日の予定(YYYY/MM/DD HH:MM - HH:MM) $time = "$from_date $from_time - $till_time"; #終日予定 } elsif(($from_time eq '') && ($till_time eq '')) { $from = ParseDate($from_date); $till = ParseDate($till_date); $till = DateCalc($till, "-1 days"); $flg = Date_Cmp($from, $till); if($flg<0){ $till_date = sprintf("%04d/%02d/%02d",$1, $2, $3) if( $till =~ /^(\d{4})(\d{2})(\d{2})/); #複数日終日予定 (YYYY/MM/DD - YYYY/MM/DD) $time = "$from_date - $till_date"; } elsif($flg==0) { #1日のみの終日予定(YYYY/MM/DD) $time = "$from_date"; } } else { #複数日予定(YYYY/MM/DD HH:MM - YYYY/MM/DD HH:MM) $time = "$from_date $from_time - $till_date $till_time"; } $time =~ s/ +/ /g; return $time; } sub date_cmp { my ($start) = @_; my $flg; my $ret; $start_date = ParseDate($start); $ps_date = ParseDate($param_start); $ps_date = Date_SetTime($ps_date,"00","00","00"); $pe_date = ParseDate($param_end); $pe_date = Date_SetTime($pe_date,"23","59","59"); # データ日付とパラメータ開始日の比較 $flg = Date_Cmp($start_date, $ps_date); if( $flg < 0 ){ # print "パラメータ開始日よりも前:該当しない\n"; $ret = 1; }elsif( $flg==0){ # print "パラメータ開始日と同じ :該当する\n"; $ret = 0; }else { # print "データ日付がパラメータ開始日よりも後\n"; if( $param_end eq '' ){ # print "終了日付が指定なし :該当する\n"; $ret = 0; } else { $flg = Date_Cmp($start_date, $pe_date); if( $flg < 0 ){ # print "パラメータ終了日よりも前:該当する\n"; $ret = 0; }elsif( $flg==0 ){ # print "パラメータ終了日と同じ :該当する\n"; $ret = 0; }else{ # print "パラメータ終了日よりも後:該当しない\n"; $ret = 1; } } } return $ret; }
マイナーバージョンアップ
- 0.300
- バージョン0.3初回掲載
- 0.301
- 開始日がパラメータでした終了日の場合、AM00:00以外のデータが抽出できない件に対応
$ps_date = ParseDate($param_start); $pe_date = ParseDate($param_end);
↓
$ps_date = ParseDate($param_start); $ps_date = Date_SetTime($ps_date,"00","00","00"); $pe_date = ParseDate($param_end); $pe_date = Date_SetTime($pe_date,"23","59","59");
- 0.302
- 塚本さんからコードに対するGPL2付与を許可してもらえたのでヘッダにライセンスをつけた。
■ あわせて読みたい
あわせて読みたい (awasete.com)を入れてみました。
2007年06月18日(Mon)
■ (gcal2text.pl改変)gcal2text.pl バージョン0.4.00リリース
gcal2text.plのバージョン0.4.00をリリースします。
gcal2text.plとは?
GoogleCalendarなどで提供しているiCal形式のファイルをテキストに変換するツールです。現在、変換されたテキストは標準出力に出力されます。
使い方
gcal2text.pl [options] [file]
オプションは次の通りです。
Options are: [-s|start YYYYMMDD] set the start date [-e|end YYYYMMDD] set the end date [-v|version] print version number and quit [-h|help] print this help message [-m|man] print man
-s,-eオプションは省略可です。
- -sオプションのみの場合は、指定日付以降のデータを変換します。
- -eオプションのみの場合は、指定日付以前のデータを変換します。
- -s,-eオプション両方がある場合は、-sで指定した日付以降、-eで指定した日付以前を変換します。
- -s,-eの両方がない場合は、指定したファイルの全データを変換します。
例
gcal2text.pl basic.ics -s 20070601 -e 20070630
- basic.icsはGoogleCalendarのiCal形式ファイルをダウンロードしたファイル名です。
出力書式
*[YYYY/MM/DD] 一日のみの終日予定 ** 詳細 *[YYYY/MM/DD - YYYY/MM/DD] 複数日にまたがった終日予定 ** 詳細 *[YYYY/MM/DD HH:MM - HH:MM] 一日のうちの予定 ** 詳細 *[YYYY/MM/DD HH:MM - YYYY/MM/DD HH:MM] 複数日にまたがった予定 ** 詳細
詳細はデータがなければ省略されます。
ダウンロード
2007年06月20日(Wed)
■ 亜土ちゃんメソッド
最近、おもしろそうなカンファレンスがたくさんあって、そのいずれにも出席できない自分が歯がゆいのですが、一方、最近はその様子を動画で掲載してくださる方もいて、その場にいなくても内容が見られるのがとてもうれしいことです。
で、今回は、RubyKaigiの平鍋さんの発表の様子を動画でみて、「を。これは、最近見た、ビデオで説明するWikiWayと似た手法だ!」と思い、さらに、さらに、むかーし、むかし、これらに似た何かがあったのを思い出しました。
そうです。
水森亜土さんこと亜土ちゃんの、あの歌ってクリアボードに何かを書いていくのに。(え?わたしだけ?それを連想したのは)。似てるのは手書きってとこだけ?でも絵も描いてるやん。
というわけで、俺様命名。「亜土ちゃんメソッド」と今後は呼ぶことにします。
亜土ちゃんの動画をYouTubeで探してみたのですがうまく見つかりませんでした>< 変わりにこんなん見つけました。 亜土ちゃんにも、平鍋さんにも、動画WikiWayにも共通する何かが歌われています。みんな夢のばくだんだよね。