傘をもっていくかどうかを知らせるシェルスクリプト

okamuuu
2012-12-04

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

growlnotify を使う

インストール方法は省略しますが 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

さきほどのシェルスクリプトを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 さんが登場します。お楽しみに。