M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2007年4月27日 02:15

ゴールデンウィークみたいな連休があるとき翌営業日をGoogle Calendar APIを利用して表示するCGI(実用性ない)

このエントリーをはてなブックマークに追加 mixiチェック

休日直前になると作り始める悪いくせだ。

土曜・日曜・祝日をよけて入力された日の次の営業日を出します。
休日データは、Google Calendar API を使う。

いちおう、XERA.COMで最初っから入っているようなモジュールを選んでみたつもり。

※注意!かなりコスト高いプログラムなんで、直す余地いっぱいあります。

#!/usr/bin/perl
use strict;
use warnings;
 
use utf8;
use Encode;
use CGI;
$CGI::DISABLE_UPLOADS = 1;
use Date::Simple;
use HTML::Template;
 
# メインだお
 
my $q = CGI->new();
 
my $date = $q->param('date'); # ほんとはクリーニングすればいいよね
 
my $d = Date::Simple->new();
 
if ( $date ) {
  $d = Date::Simple->new($date)
    or $d = Date::Simple->new();
}
 
my $holidays = get_holidays(); # 休日データ持ってくる(遅い!)
 
$d++; # 日付1日増やす
 
while(1) {
  if ($d->day_of_week() == 6) { # 土曜日
    $d++;
    next;
  }
  if ($d->day_of_week() == 0) { # 日曜日
    $d++;
    next;
  }
  if(exists $holidays->{$d->format('%Y-%m-%d')}) { # 祝日
    $d++;
    next;
  }
  last;
}
 
my $html = <<"END_OF_HTML";
<html>
  <body>
    <h1>翌営業日を調べます。</h1>
    <p>営業日は土日祝日以外です。</p>
    <form method="get" action="<TMPL_VAR NAME=SCRIPT>">
      <label for="date">日付(yyyy-mm-dd)</label>
      <input type="text" name="date" id="date"
        value="<TMPL_VAR NAME=DATE>" />
      <input type="submit" />
    </form>
    <p>入力された日にち
      <TMPL_VAR ESCAPE=HTML NAME=DATE>
      の翌営業日は</p>
    <p>
      <TMPL_VAR ESCAPE=HTML NAME=NEXTDATE>
    </p>
    <p>です。</p>
  </body>
<html>
END_OF_HTML
 
my $tmpl = HTML::Template->new(
             scalarref => \encode('utf8', $html),
             associate => $q,
           );
$tmpl->param(
         NEXTDATE => $d->format('%Y年%m月%d日'),
         SCRIPT   => $q->script_name(),
);
 
print $q->header(-charset => 'UTF-8',);
print $tmpl->output();
 
exit 1;
 
 
# ---------------------------------------------
# get_holidays: Google から休みの日付を取るよ。
# ---------------------------------------------
sub get_holidays{
  use XML::Simple;
  use LWP::Simple;
  my $xml = get(
    'http://www.google.com/calendar/feeds'
  . '/japanese@holiday.calendar.google.com/public'
  . '/full?start-min=2007-01-01&start-max=2008-01-01'
  . '&max-results=30');
  my $xs = new XML::Simple();
  my $ref = $xs->XMLin($xml);
  my $holidays;
  
  foreach my $key (keys %{$ref->{'entry'}}) {
    my $date  = $ref->{'entry'}->{$key}->{'gd:when'}->{'startTime'};
    my $title = $ref->{'entry'}->{$key}->{'title'}->{'content'};
    ($holidays->{$date} = $title) =~s/\s//g;
  }
 
  return $holidays;
}

実行例(重たい)

LWP::Simple で毎回データをとっているところにキャッシュ組み込むべきだし、XML::Simple も重いから一回シリアライズしたやつを別ファイルにして取っておくような工夫しておくと軽くなるかな。

さて、これ作って気付いたんですけれども、うちの印刷会社、ゴールデンウィークは平常通り営業です。このプログラム意味ないじゃん!

投稿 大野 義貴 [Perl] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/2054

コメントする