Information

 

Home > Archives > 2008年1月 9日

2008年1月 9日

Plaggerで列車運行情報を取得(その後)- LDTrain.pm

以前2chdat.pmを変更してから小変更を何度か経て、そのまま運用していた。
特に問題は出ていないように見えたが、Livedoor列車運行情報に特化しすぎていて少しもやもやしていた。

そんな中、Livedoor列車運行情報CustomFeedの作者様からトラックバックをいただき、変更があったことを知った。
主な変更点は、タイトルの情報を増やすこととTwitterへの投稿の部分のようだ。
タイトルの情報については自分も少しいじっていて、ほぼ平常通りの場合は「○」、遅れがある場合は「△」などを付加していたが、LDTrain.pmではなくて2chdat.pmの方で処理していた。
汎用性も考えると、作者にならってLDTrain.pmの方で処理した方が良いので変更した。
変更したところは、

  • プラグインの名前
    すみません。列車関連の情報なので変えさせていただきました。
  • Feedのタイトル
    更新日時を付加した。
    sub loadのところで$ymに処理時点の日時が入っているが、形式が違うので新たに$renewaltimeを定義した。
  • FeedのDescription
    以前は2chdat_m.pmでLivedoor列車運行情報に関するテキストを直接書き出していたが、LDTrain.pmに持ってきた。
    内容的にはFeedのDescriptionではないが、他に適当なものがなかったので代用した。
  • Entryのタイトル
    以前は2chdat_m.pmで運行状態を表すシンボルを付加していたが、LDTrain.pmに持ってきた。
    本文の内容とシンボルが直感的にあっているか様子見する必要がある。
    作者みたいに【運転再開】【列車遅延】などを付加した方がわかりやすいのでどうするか迷い中。
  • パース後に取得したリストをソート
    LivedoorのサイトではJRや私鉄などで掲載が分かれているが、単純に時間の新しいものが上に来て欲しいのでソートするようにした。

オリジナルはこちら
以下、変更後のコード。
作者様、本当にありがとうございました。

package Plagger::Plugin::CustomFeed::LDTrain;
use utf8;
use strict;
use base qw( Plagger::Plugin );
 
use Plagger::Date;
use Plagger::Util;
use Switch;
use URI;
 
sub register {
    my ($self, $context) = @_;
 
    $context->register_hook(
        $self,
        'subscription.load' => \&load,
    );
}
 
sub load {
    my($self, $context) = @_;
 
    my $ym = Plagger::Date->now()->strftime("%y%m");
    my $feed = Plagger::Feed->new;
    $feed->aggregator(sub {$self->aggregate($context, $ym);});
    $context->subscription->add($feed);
}
 
sub aggregate {
    my ($self, $context, $ym) = @_;
 
    my $urls = "http://transit.livedoor.com/traffic_info/kantou";
    my $feed = Plagger::Feed->new;
    my $renewaltime = Plagger::Date->now();
    $renewaltime->set_locale("ja_JP");
 
    $feed->link($urls);
    $feed->title("Livedoor鉄道運行情報 [".$renewaltime->strftime("%m/%d(%a) %H:%M")."更新]");
    $feed->description("○:ほぼ平常通り、△:運転再開、遅れあり、×:運転見合わせ、運休");
 
    my $list = $self->parse(Plagger::Util::load_uri(URI->new($urls)));
    for my $item (@$list) {
        my $entry = Plagger::Entry->new;
        $entry->title($self->add_status($item->{body})." ".$item->{title}." [".$item->{hour}.":".$item->{min}."]");
        $entry->body($item->{body});
        $entry->date(Plagger::Date->strptime("%y%m%d%H%M", $ym.$item->{day}.$item->{hour}.$item->{min}));
 
        $feed->add_entry($entry);
    }
 
    $context->update->add($feed);
}
 
sub parse {
    my ($self, $content) = @_;
 
    my $list = [];
    while ($content =~ m{
<tr>
.*?<th.*?>(\d{2})/(\d{2}).(\d{2})\:(\d{2})</th>
.*?<td.*?>(.*?)</td>
.*?<td.*?>(.*?)</td>
.*?</tr>
    }gsx) {
        push @$list, {
            month => $1,
            day => $2,
            hour => $3,
            min => $4,
            title => $5,
            body => $6,
            hm => $3.$4,
        };
    }
 
    @$list = sort { $b->{hm} cmp $a->{hm} } @$list;
    $list;
}
 
sub add_status {
    my($self, $body) = @_;
    my $status = "";
    {
    if ($body =~ /平常通り/) { $status = "○" ; last ; }
    if ($body =~ /再開|遅れ|運転変更/) { $status = "△" ; last ; }
    if ($body =~ /見合わせ|運休/) { $status = "×" ; last ; }
    $status = " ";
    }
 
    $status;
}
 
1;

ZERO3後継機はUMPC?

すでに各所で盛り上がっているが、アメリカで開催されている「2008 International CES」でウィルコムの端末(おもちゃレベルのモックらしいが)が展示されているようだ。
IntelのMenlowを採用するらしい、とのことで、もしかしたらZERO3後継機はUMPCか?との推測が飛んでいる。
確かにWindowsMobileだと性能的に物足りない場面もあるのでPCだったら、と思うこともあるが、ハンドリングの軽さという面ではWindowsMobileに軍配が上がる。
それぞれメリット、デメリットがあるので1台ですべてを満足させるというのは無理なのかもしれない。
日経系の雑誌に4月にはAd[es]の後継機が来る、との情報もあり、いろいろ選択肢が増えていきそうなので楽しみだ。