Perl Advent Calendar 4日目を担当しますokamuuuです。
皆さん朝出かけようとしたら雨が降っていて傘を取りに戻った経験はありませんか?
今住んでいるところはエレベーター付きなので、そんなことがあると下まで降りて、また昇って、傘取って来てまた降りるっていう無駄な作業が発生します。
怠慢な皆さんはすでにお気づきだと思いますが、これは「いつまでも繰り返されるであろう無駄な作業」です。
そんなのもうハックしちゃいましょう。
※ちなみにこの記事Macユーザーを対象にしています。ご了承下さい。
というわけで適当な天気予報サイトを巡回します。今回は以下のURLを使います。
東京都以外の人は適宜自分の地域に置き換えて下さい。
http://weather.yahoo.co.jp/weather/jp/expo/umbrella/13/4410.html
curlコマンドで情報を取得します。
% curl http://weather.yahoo.co.jp/weather/jp/expo/umbrella/13/4410.html
そうすると一杯文字がでてくると思いますので必要なものだけを取得しましょう。パイプでつないで grep します。
% curl http://weather.yahoo.co.jp/weather/jp/expo/umbrella/13/4410.html | grep '<b>指数' % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 101 5990 0 5990 0 0 13860 0 --:--:-- --:--:-- --:--:-- 102k
んが。curlコマンドがエラー出力になんかしゃべってます。黙ってもらいましょうか。
2> /dev/null を追記してエラー出力を亜空間に向けてしまいます。
% curl http://weather.yahoo.co.jp/weather/jp/expo/umbrella/13/4410.html 2> /dev/null | grep '<b>指数' <b>指数:0</b> <b>指数:60</b>
さっきよりもいい感じになりましたね。grep の結果が2件表示されていますが、これは今日と明日の予報です。必要なのは今日だけなので head コマンドにパイプしましょう。
% curl http://weather.yahoo.co.jp/weather/jp/expo/umbrella/13/4410.html 2> /dev/null | grep '<b>指数' | head -n 1 <b>指数:0</b>
このあたりで正規表現の出番です。よかった Perl でてきたよ。
% curl http://weather.yahoo.co.jp/weather/jp/expo/umbrella/13/4410.html 2> /dev/null | grep '<b>指数' | head -n 1 | perl -ne 'if(/<b>(.*)<\/b>/) { print "傘", $1, "\n"; }' 傘指数:0
インストール方法は省略しますが growl をコマンドラインから呼び出す事ができるので以下のように growl にパイプします。
% curl http://weather.yahoo.co.jp/weather/jp/expo/umbrella/13/4410.html 2> /dev/null | grep '<b>指数' | head -n 1 | perl -ne 'if(/<b>(.*)<\/b>/) { print "傘", $1, "\n"; }' | growlnotify --sticky -t '傘指数'
オプションに --sticky を指定すると自動的に消えるのを防げます。
これを ~/script/weather.sh として保存しておきましょう。
% cat ~/script/weather.sh curl http://weather.yahoo.co.jp/weather/jp/expo/umbrella/13/4410.html 2> /dev/null | grep '<b>指数' | head -n 1 | perl -ne 'if(/<b>(.*)<\/b>/) { print "傘", $1, "\n"; }' | growlnotify --sticky -t '傘指数'
一応言っておくと chmod +x で実行権限をつけておきましょう。
% chmod +x ~/script/weather.sh
さきほどのシェルスクリプトをcronに登録します。まあこんな感じでいいんじゃないですかね。
% crontab -l | grep weather.sh 0 7 * * * /Users/okamura/script/weather.sh >>/tmp/cron.log 2>>/tmp/cron-err.log
ということで毎朝7時にMacを見ると傘が必要かどうかを知ることができると思います。
今回はPerlでガリガリとスクレイピングの処理を書かずにできるだけ既存のコマンドを活用してみました。
まあエラーハンドリングしてませんが、ある程度の事はこれで実現できると思います。目的は完璧なプログラムではなくハックなのでこれでいいでしょう。
明日は yusukebe さんが登場します。お楽しみに。