今日の東京の天気を単純に “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使うと楽だとわかった。