ラベル perl の投稿を表示しています。 すべての投稿を表示
ラベル perl の投稿を表示しています。 すべての投稿を表示

2012年8月31日金曜日

CLIで天気情報を表示する。その2

 昔の下書きが出てきたのでリファインしてうぷ(^_^;)
-----------
 以前紹介した weatherget というコマンドが使えなくなった。weather.com がAPI利用するなら登録しろゴラァといってきたので、面倒くさいので利用をやめた。
 かわりの物を探したけどなかったので、しょうがないから作ってみた。

インストール

必要なライブラリを事前に入れておきます。
sudo apt-get install libxml-treepp-perl
次に git で、
git clone  git://github.com/yama-natuki/tenki.git
として tenki.pl を取得してきます。
 実行属性を付けたら、 /usr/local/bin/ あたりに放り込んでおいてください。

使い方

自分の地域のコードを調べる

~$ tenki.pl  --lookup tokyo


空港名 コード 緯度 経度
Tokyo RJTT 35.54999924 139.77999878
Tokyo Heliport RJTI 35.63000107 139.85000610
Kisarazu AB RJTK 35.40000153 139.91999817
--------------------------------------
観測所 ID
Tokyo ICHAOYAN2
Ohta-ku ITOKYOOH1
Oota-ku ITOKYOOO2
Kodaira ITOKYOKO2
Shinjuku-ku,Tokyo ITOKYOSH4
Setagaya ITOKYOSE3
Zama MC8811
Wako-City IU57FCU73
Tokyo - Kashiwa MAS392
Kamakurashi IKANAGAW10
Hino Tokyo ITOKYOHI1
Atsugi IKANAGAW1

 もよりの飛行場観測ポイントコードが出てくるので、それを打ち込みます。

空港の場合。

~$ tenki.pl  --aircode=RJTT

場所    : 東京国際空港 (羽田空港), 日本
更新時間  : 2009年7月15日(水) 15時0分
天候    : ところにより曇り
風     : 9.50 m/s, 南南西の風
気温    : 31℃
体感温度  : 34℃
湿度    : 55%
露点温度  : 21℃
気圧    : 1003 ヘクトパスカル
視程    : 10.0 Km

観測ポイントの場合。

こちらはおまけ程度。
~$ tenki.pl  --pws=ICHAOYAN2

場所    : Sanno Hill, Ota-ku, Tokyo, Tokyo, Tokyo
更新時間  : Last Updated on July 15, 2:49 PM JST
天候    : --
風     : 1.48 m/s, 南東の風
気温    : 32.8℃
体感温度  : 39℃
湿度    : 59%
露点温度  : 23.9℃
気圧    : 1006.0 ヘクトパスカル

 な感じでほぼリアルタイムな気象情報が入手出来ます。更新頻度は各観測ポイント次第。

んで現実的な使い方としては自分の最寄りの空港のコードをネットで検索して調べます。
日本の空港のコード一覧なサイトがあるのでそれを利用すればいいでしょう。

 後はそれで表示すればOK. 空港は気象情報を飛行機に提供しなければいけないので、常に観測しているのです。


2009年7月2日木曜日

CLIで天気予報を表示する

 最近perlを触る機会があり、perlをいじるのは初めてだったのですが、なんとかでっち上げてみました。perlなんて記号だらけの省略記法だらけで大嫌いだったのでですが、時代は変わり、最近ではモジュールを活用してブロックを組み立てるかのように書けるとか。
 実際 CPAN の充実ぶりは凄いですね。あらためて perl を見直しました。

 んで今回はYahooから天気予報を取得して表示するコマンドです。前回は今現在の気象情報を表示するだったのですが今回は予報です。

インストール

 以下のスクリプトを適当な名前、yohou.pl みたいな名前で ~/bin/ あたりにでも保存し、chmod +x yohou.pl として実行属性を付けておいてください。

#!/usr/bin/perl
# last updated : 2009/07/02 15:46:45 JST
#
# Yahooから天気予報を取得する。

use utf8;
use strict;
use warnings;
use XML::TreePP;

binmode STDOUT, ":utf8";


# url
# 以下のurlから調べて下さい。
# http://weather.yahoo.co.jp/weather/public/rss.html
my $url = "http://rss.weather.yahoo.co.jp/rss/days/4410.xml";
# カットする文字列。
my $cut = " 東京(東京) ";




my $tpp = XML::TreePP->new(array_element => [qw( item )]);
$tpp->set( utf8_flag => 1 );
my $tree = $tpp->parsehttp( GET => $url);
my $channelhash = $tree->{rss}->{channel};
print $channelhash->{title} . "\n";
my $itemarray = $channelhash->{item};
foreach my $itemhash ( @$itemarray ) {
my $base = $itemhash->{title};
unless ($base =~ /^\[PR\]/) {
$base =~ s/ - Yahoo!天気情報$//;
$base =~ s/ (\d)日/ 0$1日/;
if ($base =~ /^【 \d\d日/) {
my $idx = rindex($base, '】');
my $day = substr($base, 0, $idx + 1);
$day =~ s/$cut//;
my $wea = substr($base, $idx + 2);
my @tenki = split(/ - /, $wea);
$tenki[0] = trim($tenki[0]);
print sprintf("%s %-4s %s", $day, ume($tenki[0]), $tenki[1]) . "\n";
}
else {
print $base . "\n";
}
}
}
print $channelhash->{copyright} . "\n";

sub trim {
my $val = shift;
$val =~ s/^\s*(.*?)\s*$/$1/;
return $val;
}

sub ume {
my $val = shift;
my $len = length($val);
if ($len < 4) {
$val = $val . " " x (4 - $len);
}
return $val;
}

 次に自分の住んでいる地域の天気予報を表示するために、http://weather.yahoo.co.jp/weather/public/rss.html から地域のurlをコピーして
my $url = ”http://rss.weather.yahoo.co.jp/rss/days/4410.xml"
の行を変更しておいてください。その下の my $cut も同じく地域に合わせて変更を。$cut は単に冗長な部分を削除するだけですから、ほっといても特に問題ありません。

 次にこのスクリプトは XML::TreePP というモジュールを利用しているので、
sudo apt-get install libxml-treepp-perl
としてインストールしておいて下さい。
 以上で準備は完了です。後は ~/bin/yohou.pl とでもして実行すれば、
~$ yohou
Yahoo!天気情報 - 東京(東京)の天気
【 02日(木)】 雨後曇  26℃/21℃
【 03日(金)】 曇り   26℃/21℃
【 04日(土)】 曇時々雨 25℃/22℃
【 05日(日)】 曇時々雨 27℃/21℃
【 06日(月)】 曇り   28℃/22℃
【 07日(火)】 曇時々雨 28℃/22℃
【 08日(水)】 曇時々雨 27℃/22℃
【 09日(木)】 曇時々雨 26℃/22℃
【 23区西部 】警報・注意報はありません
【 23区東部 】警報・注意報はありません
【 多摩北部 】警報・注意報はありません
【 多摩西部 】警報・注意報はありません
【 多摩南部 】警報・注意報はありません
Copyright (C) 2009 Yahoo Japan Corporation. All Rights Reserved.
な感じで天気予報が表示されます。天気情報コマンドと合わせて使えばいいでせう。


# ん〜それにしてもperl の文字列処理のやり方がまだ理解していない・・・でもモジュールは便利だね。というか便利すぎ。
# いままでrubyばかりだったけど、perlで便利なモジュールがある場合はperlを使おう。