このエントリはcoins Advent Calendar 2017 21日目のエントリです。私、酒田 シンジについて簡単に自己紹介をすると、coinsのOBで現在CS専攻のM1です。世代的にはcoins13ですね。(ただし三編)

では本題。

ちょうど一年ほど前、つくば市のごみ収集カレンダーをJSON化するツールを作った #正月ハッカソン というのをやりました。これの成果物であるtsukuba-gcではつくば市が配布しているごみ収集カレンダーのpdfを入力として、色と配置を元に日程をJSONにして出力することができるようになりました。その時には一旦の成功を迎えたのですが、年度が切り替わって新しいpdfを投入したところ、全くデタラメな結果を出力するようになってしまいました。これはどうにかしなきゃいけないとと思って、いろいろ考え直すことにしました。

結果として、規則を元にicsを出力するtsukuba-gc-liteというRubyスクリプトを作りました。

ysakasin/tsukuba-gc-lite - GitHub

顧客が本当に必要だったもの:周期性

前の成果物では日程の検出を画像化したpdfで行なっていました。しかし、カレンダーの配置は(おそらく)市職員の手で行われていて、各日付ごとの枠が若干変動します。というのも、月ごとに日程表が作られているため、場合によっては5列や6列必要な時もあります。そこらへんの調整が毎年適宜行われていて、これを追従していくのは非常に困難です。

なぜそもそも自動で検知したかったのかというと、つくば市のごみ収集の日程にはごくたまに例外が発生するからです。基本的に2週間周期で回収の品目が巡っているものの、年末年始や月末に回収なしがあったり、燃えるゴミの日に変わっていたりします。しかし、よくよく考えてみると、これらの例外は回収品目が上書きされるだけなので、周期がずれたりしません。そうしたら周期と例外を事前に知っておけば、比較的簡単に日程表を生成できることになります。

tsukuba-gc-liteではこの周期と例外に着目したスクリプトになっています。以下のように収集品目のサイクルと例外を記述したファイルを用意して、それを元に日程の一覧を生成するようにしました。

tsukuba-gc-lite/seed/2017east.json

{
  "year": 2017,
  "cycle": [
    ["none"],
    ["burnable"],
    ["cans", "used_paper"],
    ["oversized", "pet"],
    ["non_burnale", "glass"],
    ["burnable"],
    ["none"]
  ],
  "special case": {
    "2017-05-30": "none",
    "2017-05-31": "none",
    "2017-06-29": "none",
    "2017-08-29": "none",
    "2017-08-30": "none",
    "2017-08-31": "none",
    "2017-10-31": "none",
    "2017-11-29": "none",
    "2017-11-30": "none",
    "2018-01-01": "none",
    "2018-01-02": "none",
    "2018-01-03": "burnable",
    "2018-03-29": "none"
  }
}

顧客が本当に必要だったもの:ics

前の成果物ではJSONで出力していました。このときは個人SlackにBotを導入してリマインドするというモチベーションがあったのですが、すっかりなくなってしまいました。

こうなるとやはりスマホのカレンダーやGoogleカレンダーで確認したくなります。そうすると、本当に必要だったのはiCalendarだったということがわかりました。なので、tsukuba-gc-liteではjsonとiCalendarのどちらかを選んで出力するようにしました。

やらなかったこと

前回のtsukuba-gcはそれなりに有用そうだなと思ってRuby Gemsに登録しましたが、今回は単純なスクリプトレベルだったのでしませんでした。あと、生成元ファイルも私が使っている分以外はまだ書いていません。Pull Requestをお待ちしています。

このスクリプトはiCalendarのGemを使っていますが、Gemfileはまだ設定していません。

これからしたいこと

Webサイトを整備したいです。生成したファイルに簡単にリーチできるように、GitHub Pagesあたりで公開していきたいです。いまのところ /dist2017east.ics が置いてありますが、もうちょっと統一的な名前 east.ics みたいな名前にして、毎年そこを更新する的な運用をしたいです。 こうすると、各々のカレンダーアプリケーションに east.ics をsubscribeするように設定しておくだけで、ユーザーからすると毎年更新されるという便利なことが実現できます。

私はあと1年ほどでつくばを去ることになるので、次世代に引き継ぎとかできたらいいなーと思っています。我こそは! という方がいたら、ぜひ声をかけてください。