今日の東京の天気を単純に “shiny”, “rainy”, “cloudy” だけで吐いてくれるサービスを作った。

http://shokai.org/~sho/weather/tokyo-weather.cgi

PhysicalComputingとwebサービスは直接連動しないで書いたように、多くのwebサービスのFeedは、テキストを人間が読まなければ意味を理解出来ない。

しかしマイコンのテキスト処理環境は貧弱だし、テキスト表示に使える部品も2×16文字の見づらいディスプレイしか無い。

だからwebのRSSfeedをマイコンでアンビエント/タンジブルな表現(LEDや振動モータで表現出来るような)をするのに扱いやすい形式に変換するサービスを書いた。

これ使って、青/オレンジ/白に変わるてるてる坊主でも作る予定。

■技術的なこと

関東地方の天気 – livedoor 天気情報のRSSを解析する。

titleに”東京”が含まれ、

“雨”が含まれる→rainy

“曇”→cloudy

なにもなし→shiny

とした。

RSSのパースはITmedia エンタープライズ:第2回 RSSフィードの料理はLWPとXML::RSSにおまかせ (1/2)をが参考になった。

tokyo-weather.cgi

#!/usr/bin/perl

#明日の東京の天気を表示

#httpリクエストをキャッシュする

usestrict;

usewarnings;

useEncode;

useLWP::Simple;

useXML::RSS;

useDigest::MD5qw(md5_hex);

useCGI;

our$CacheDir=’./cache’;

if(!-e$CacheDir){

mkdir$CacheDirordie”cannotcreate$CacheDir:$!”;

}

my$cgi=newCGI;

print$cgi->header(-type=>”text/plain”,

-charset=>”UTF-8″);

my$url=”http://weather.livedoor.com/forecast/rss/3.xml”;

my$cache=sprintf(“%s/%s.xml”,$CacheDir,Digest::MD5::md5_hex($url));

LWP::Simple::mirror($url,$cache)

||die”can’tgetcontentfrom$url¥n”;

my$rss=XML::RSS->new;

$rss->parsefile($cache);

for(@{$rss->{items}}){

my$title=encode(‘utf8’,$_->{title});

if($title=~”東京”){

if($title=~”雨”){

print”rainy¥n”;

}

elsif($title=~”曇”){

print”cloudy¥n”;

}

else{

print”shiny¥n”;

}

}

}

正規表現よりXML::RSS使うと楽だとわかった。