NKMR6194/tsukuba-gc - GitHub
tsukuba-gc | RubyGems.org
正月ハッカソン2017 #正月ハッカソン の成果物である tsukuba-gc v0.1.0 をリリースしたので紹介したいと思う。
これは、つくば市がPDFで配布しているごみ収集カレンダーを、JSONで出力するためのツールだ。
経緯
一人暮らしをしていて、ゴミ出しを忘れることが結構あった。とくに、燃えないゴミとか、回収の頻度が低くてなかなか出さないやつ。そこで、収集日をリマインドしてくれるツールを作りたかった。しかし、つくば市ではPDFしか配布していなかったので、まず扱いやすいデータに変換したかった。
使い方
rubygemsとして実装したので、gemを使って導入する
$ gem install tsukuba-gc
CLI
ダウンロードしてきたPDFと年度を指定してCLIを実行する
$ tsukuba-gc 28north.pdf 2016
-o
指定すると出力先を指定できる
$ tsukuba-gc 28north.pdf 2016 -o calendar.json
ライブラリ
ライブラリとしても実装しているので、Rubyでrequire
すれば呼び出せる。
require 'tsukuba-gc'
Tsukuba::GC.parse(2016, "28north.pdf") #=> [schedule, ...]
仕組み
まず、PDFをPDFをして解析するのはハードルが高いので、rmagicで画像として扱っている。
肝心の判定は、収集する品目ごとに背景の色が決まっていることを利用している。各日付のセルから背景色を取ってきて、事前にサンプリングしておいた色と、背景色を比較して、距離が近いものを収集物として出力する。
日付に対応したピクセルの座標を決める必要があるが、日付のセルは規則的に並んでいるのを利用して、職人の絶妙な調整を元に座標を計算している。
お分かりの通り、やっていることは非常に簡単で、文字の読み取りなどは行なっていない。文字列取得等をすれば高度に柔軟にデータ化することができるかも知れないが、実装するコストと精度を考えるとこれで十分だと思った。
CLI
CLIには optparse を利用した。Rubyに標準添付されているライブラリで、コマンドライン引数を渡すといい感じにやってくれる。
--help
--version
といったCLIにありがちなところをカバーしてくれるので、非常に使いやすかった。
Ruby界隈でよく使われる thor も試してみたが、今回のケースではあまりフィットしなかった。bundler のようにサブコマンドを活用するタイプのCLIとは非常に相性がいいが、 tsukuba-gc にはサブコマンドがないので、合わなかった。実際、bundler では thor が使われているようだ。
結び
正月ハッカソンと言いながら、大晦日から作業をしていたが、2日間で求めていたものを求めていたレベルで作ることができたので、非常によかった。
アイディアを一気に実装する機会を催してくれた正月ハッカソン主催の @e10dokup と、プロジェクト名のアイディアをくれた @a_maumau_ に感謝したい。
tsukuba-gc という名前は非常に気に入っているので、これからもメンテしていきたい。
蛇足
リマインドにはSlack 1人チームの中でbotにやってもらおうと思っている。
botのプロジェクトはこちら
https://github.com/NKMR6194/nagato