BitBar で私家版通勤タイマー (2) - portal shit! の続き。
時刻表を JSON 化した奴を食わせて 60 分以内(まえの記事では 30 分以内にしてるけど 60 分以内に変えた。パラメーターで調整できるようにすると良さそう)の次の電車一覧と発車時刻までの分数を表示できるようになった。あとはこれを BitBar で扱えるようにする。以下のようなシェルスクリプトを用意した。 BitBar をインストールして pup
、 jq
をインストールし、 go get github.com/morygonzalez/jikoku
した上で以下のようなシェルスクリプトを ~/bitbar/jikoku.1m.sh
という名前で保存すればよい。
#!/bin/sh
export PATH="$HOME/bin:/usr/local/bin:/usr/bin:/bin:$PATH"
echo ":train:"
echo "---"
go_filter=""
return_filter="筑 西 唐"
go_base="http://transit.yahoo.co.jp/station/time/28074/?gid=2480"
return_base="http://transit.yahoo.co.jp/station/time/28236/?gid=6400"
day=`date "+%a"`
hour=`date "+%H"`
if [ $hour -lt 13 ]; then
go=true
else
go=false
fi
case ${day} in
"Sun")
kind=4
;;
"Sat")
kind=2
;;
*)
kind=1
;;
esac
if [ $go = true ]; then
url="${go_base}&kind=${kind}"
path="/tmp/jikoku_go_${kind}"
filter=$go_filter
echo "Go | href=$url"
else
url="${return_base}&kind=${kind}"
path="/tmp/jikoku_return_${kind}"
filter=$return_filter
echo "Return | href=$url"
fi
if [ ! -f ${path} ] && [ ! -s ${path} ]; then
curl -s ${url} -o ${path}
else
current=`date +%s`
last_modified=`stat -f "%m" ${path}`
if [ $(($current - $last_modified)) -gt 3600 ]; then
curl -s ${url} -o ${path}
fi
fi
echo "---"
cat ${path} |\
pup 'table.tblDiaDetail [id*="hh_"] json{}' |\
jq '[.[] | { hour: .children[0].text, minutes: [.children[1].children[].children[].children[].children[].children | map(.text) | join(" ") ] }]' |\
jikoku -f "${filter}"
echo "---"
echo "Refresh | refresh=true"
go_base
には往路の、 return_base
には復路の Yahoo! 乗換案内時刻表の URL が入る。 go_filter
と back_filter
はユーザーごとに行き先を絞り込みたいだろうから(自分の場合は福岡市地下鉄の JR 筑肥線直通電車だけを絞り込みたかったので行き先表示に「筑」「西」「唐」が含まれるものだけがフィルタリングされるようにした。BitBar はファイル名を 1h.sh
や 1m.sh
とすることで 1 時間おきの実行や 1 分おきの実行など実行間隔を指定できる。
ちなみに当初は 5m.sh
にしていたが、次の列車までの時間を表示するソフトが 5 分おきに実行とかだったらまずいことに気がついた。メニューバーで確認してまだ余裕だと思ってたら間に合わなかったみたいな事態になる。毎分処理が走らなければ意味がない。毎分実行しても問題ないよう( Yahoo! 乗換案内に迷惑をかけないよう)、時刻表を一時間キャッシュするようにした。もっと長期間キャッシュしても良いのだろうけど、 13 時を境に往路と復路を切り替えるようにしているので、まぁ 60 分もキャッシュすれば十分サーバーリソースにやさしいかなと思い、このような作りにしている。
最初は curl
と pup
と jq
を組み合わせて簡単に作れないかな、と思ってやり始めて意外と簡単にできそうだと思っていたけど結局は結構複雑になってしまった。 Go で書いた jikoku
コマンドの方も複雑かつ終電後の翌朝始発を考慮できていなくていまいち感がある。時刻表は平日と土曜、日曜祝日で異なるので安易に当日のデータを翌日のデータとして使い回せない(曜日判定しないといけない)。たとえば金曜日の終電後に翌朝の始発を金曜日の時刻表を使って表示してしまうとまずい。ちゃんと土曜日の時刻表を使わないといけない。しかし時刻表自体は curl
で HTML を取得して pup
と jq
で JSON に整形しているので、翌日の時刻表が必要になっても Go コマンドの方からはどうしようもない。
- 時刻表の HTML を取得 (いまは
curl
でやってる) - HTML から必要な要素を取り出す (いまは
pup
でやってる) - 取り出した情報を使いやすい形式に直す (いまは
pup
とjq
でやってる) - 次の電車を表示する (いまは自作の
jikoku
コマンドでやってる)
という四つのステップを全部 Go でやった方がよいのかもしれない。そもそも jq
職人だったら jikoku
コマンドみたいなものは不要で、次の電車を表示するところまで jq
でできてしまうのかもしれない。
ちょっともやっとした感じは残ったけどなかなか便利ですのでよかったらご利用ください。
- BitBar - Put anything in your Mac OS X menu bar
- bitbar/jikoku.1m.sh at master · morygonzalez/bitbar
- morygonzalez/jikoku: 私家版通勤タイマー
なお pup
と jq
に依存してますんでインストールが必要です。
brew install pup
brew install jq