WebService::TimeLine公開しました
かなり以前のことですが、某縁があって7/30,31とniftyさんの開発合宿に参加させて頂きました。
完全に外野からの参加でしたが、いくつかの会社の方が参加していて、普段とは違う刺激になりました。Ruby&Macが多かった。
んで、結局できたものは、サービスの形ではなく、@nifty TimeLineのPerlのモジュールとサンプル
モジュールはCPANに先々週にアップしています
WebService::TimeLine
TimeLineは、時間軸と自由に設定可能な縦軸を持った年表作成サービスで、ソーシャル機能とかも持っています。個人的には、Flashのインターフェイスがとてもいい感じです。
しかも、APIが付いた事でいろいろなデータを自動で追加していける可能性がでてきたので、面白いんじゃないかなーと思ってます。
とりあえず、サンプル的に作ったのは、Gooの地震情報RSSを取得し、API経由でTimeLineにデータを流し込む、地震速報タイムラインです。
(公開した時に既に同じ事をやっている方がいてハゲシクorz)
あと、合宿中にミクシィのあしあとタイムラインもつくってみたけど、こちらは公開はしてなかったりします。
以下、地震情報の取得と登録のプログラムのソース(簡略化版)
フルのコードはこちら
#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use XML::RSS::Liberal;
use DateTime;
use DateTime::Format::W3CDTF;
use Data::Visitor::Encode;
use WebService::TimeLine;
my $ua = LWP::UserAgent->new;
my $res = $ua->get('http://weather.goo.ne.jp/earthquake/index.rdf');
my $rss = XML::RSS::Liberal->new;
$rss->parse($res->content);
my $dev = Data::Visitor::Encode->new();
my $tl = WebService::TimeLine->new( timeline_key => '*************************' );
foreach my $item (@{ $rss->{items} }) {
use utf8;
my $re = '^\[震源地\]\s*(.+)\s*\[最大震度\]\s*震度(\d+)\s*((\d{4})年(\d+)月(\d+)日\s*(\d+)時(\d+)分頃発生';
if ( $item->{title} =~ m!$re! ) {
my $epicenter = $1;
my $intensity = $2;
my $dt = DateTime->new(
year => $3, month => $4, day => $5, hour => $6,
minute => $7, second => 0, time_zone => 'Asia/Tokyo',
);
if ( $content =~ /北緯(\d+\.\d+)度\s*東経(\d+\.\d+)度/ ) {
my $nl = $1;
my $el = $2;
}
$res = $tl->create_article(@{
$dev->utf8_off([
timeline_id => 2940,
title => "$epicenter 最大震度$intensity",
description => "$epicenter 最大震度$intensity " . "$dt",
start_time => DateTime::Format::W3CDTF->format_datetime($dt),
end_time => DateTime::Format::W3CDTF->format_datetime($dt),
grade => $intensity,
link => $item->{link},
])
}) or die $tl->errstr;
}
}
もごもごと、これでWeb API系のモジュールを2つ連続して作った訳ですが、Net::Twitterを少し拡張しただけのWebService::Mogo2と比べて、TimeLineの野良XML APIは非常に面倒。APIを提供していく側はJSONやYAML、あるいはAtompubを採用していくとAPIを利用する開発者は新しいインターフェイスモジュールを用意しなくてもよくなるので、マッシュアップとかハックも楽になるんじゃないかなぁと思いました。