トップ 最新 追記 RSS feed

shinoのときどき日記


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;
Tags: Code

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付与を許可してもらえたのでヘッダにライセンスをつけた。
Tags: Code

あわせて読みたい

あわせて読みたい (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] 複数日にまたがった予定
** 詳細

詳細はデータがなければ省略されます。

ダウンロード

Tags: Code

2007年06月20日(Wed)

亜土ちゃんメソッド

最近、おもしろそうなカンファレンスがたくさんあって、そのいずれにも出席できない自分が歯がゆいのですが、一方、最近はその様子を動画で掲載してくださる方もいて、その場にいなくても内容が見られるのがとてもうれしいことです。

で、今回は、RubyKaigiの平鍋さんの発表の様子を動画でみて、「を。これは、最近見た、ビデオで説明するWikiWayと似た手法だ!」と思い、さらに、さらに、むかーし、むかし、これらに似た何かがあったのを思い出しました。

そうです。

水森亜土さんこと亜土ちゃんの、あの歌ってクリアボードに何かを書いていくのに。(え?わたしだけ?それを連想したのは)。似てるのは手書きってとこだけ?でも絵も描いてるやん。

というわけで、俺様命名。「亜土ちゃんメソッド」と今後は呼ぶことにします。

亜土ちゃんの動画をYouTubeで探してみたのですがうまく見つかりませんでした>< 変わりにこんなん見つけました。 亜土ちゃんにも、平鍋さんにも、動画WikiWayにも共通する何かが歌われています。みんな夢のばくだんだよね。


2007年06月28日(Thu)

FSWiki導入。

サイトのトップにFSWikiを導入してみました。:-)


トップ 最新 追記 RSS feed
2000|03|
2007|01|03|04|05|06|10|12|
2008|01|02|03|04|05|06|07|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|11|12|
2015|01|02|04|05|09|10|12|
2016|01|03|04|05|08|
2017|01|02|04|05|06|07|08|09|10|
2018|05|06|
2019|08|12|
2020|01|03|04|
2021|01|12|
2022|01|09|11|
2023|01|