2016年4月5日火曜日

平成28年度 #春日部 ゴミカレンダー Googleカレンダー版の作り方

前回の記事で公開させて頂きました

平成28年度 春日部ゴミカレンダー Googleカレンダー版
※公開したカレンダーはコチラの記事をお読みください。

これをどうやって作ったか?って話を書きたいと思います。

時間と労力さえかければ誰でも作れると思います。
どうするかと言えば、Googleカレンダーを開きただひたすら作成すれば良いだけです。
ちなみに、どれだけ作れば良いかというと

可燃ごみ1812件
不燃ごみ288件
びん・かん等288件
紙・布288件
合計2676件

さすがにコレだけ作成しようとすると心が折れますよね?
そこで、私はこんな方法でCSVファイルを作ってGoogleカレンダーに取り込みました。

法則を導く
春日部市の収集日程には収集区域によって一定の法則があります。
ごみ・資源物の収集日程一覧(平成28年度ゴミカレンダー)の各収集区の収集日程を見ると大きくわけて2つあります。

基本法則
  • 可燃ごみは毎週指定曜日の3回
  • 不燃ごみ・びんかん等・紙布は週番曜日ごとに決め打ちされてる
ただ、何事にも例外はつきものでして

例外法則
  • 祝日の可燃ごみが一部休みになる
  • 1月の正月三が日が不燃ごみ・びんかん等・紙布に当たる収集区は1週ズレる
厄介な例外法則

祝日の可燃ごみが一部休みになる
この例外規定に当てはまる日は12日あります。
  • 4/29 昭和の日
  • 5/4 みどりの日
  • 5/5 こどもの日
  • 8/11 山の日
  • 9/22 秋分の日
  • 11/3 文化の日
  • 11/23 勤労感謝の日
  • 12/23 天皇誕生日
  • 1/1 元旦
  • 1/2 
  • 1/3 
  • 2/11 建国記念の日
この祝日が毎年度休みになるのかはわかりませんが、平成28年度のカレンダーを見た限りではこの祝日のみ。
ただし、すべての祝日が休みになるわけではなく、上記に上げた日のみで可燃ごみに限定されます。
また、この祝日の中にはハッピーマンデーの日は含まれていなかったため考慮は比較的楽かと思います。

正月三が日が不燃ごみ・びんかん等・紙布に当たる収集区は1週ズレる
第5週は原則可燃ごみの収集のみとなります。
しかし、唯一例外となるのがコレ。正月三が日に可燃ごみ以外の収集日が該当した場合、その曜日に限り1週ずつズレるのです。

例えば、第3収集区の場合


12月6日・20日がびん・かん等、13日27日が紙・布です。
これが1月になるとこうなります。


通常なら1月3日がびん・かん等になるのですが、正月三が日に当たるため全て休み。
代わりに10日24日がびん・かん等、17日31日が紙・布となり、第5週が例外的に収集日になります。

なお、正月三が日に当たらない収集区はズレず通常通り。
1月カレンダー右下に書かれた変則になってる場合があるというのはこの法則のためです。

平成28年度にこのルールに該当する収集区はこちら

  • 第2収集区
  • 第3収集区
  • 第4収集区
  • 第9収集区
余談ですが、第1週に可燃ごみ以外の収集が常に無い第12収集区のみこの法則は適用されないと思われます。


法則がわかれば後はツールで
法則さえわかれば、あとはそれに従ってプログラムを書くだけです。
ポイントは2つ。

  • 調べたい日の曜日
  • 調べたい日の月曜日週番号(第何曜日の何にあたる部分)

曜日の調べ方
まず、調べたい日の曜日ですが、西暦1年1月1日は日曜日なのでそこからの総日数を7で割った余りによって調べる事が出来ます。
ただし、総日数を調べるために1年の日数が重要なのですが、うるう年のルールがくせ者で

  • 4年に1度1日を加える
  • ただし100年毎の年はうるう年としない
  • さらに400年毎の年はうるう年とする
この3つの条件で1年が365日になったり366日になったりします。

長々と書きましたが、大抵はツールに曜日を調べる機能があるためそれを使うのが一般的。
表計算なら曜日を調べる関数(例えばWEEKDAY関数)を使えば簡単に調べられますし、プログラム言語なら提供されるライブラリにその機能があります。

そういう機能がなかった場合の予備知識程度に片隅にトドメておくと良いでしょう。

月週番号の調べ方
月週番号は大抵のツールにはありません。単純な計算式で求めます。

(日付÷7)+1=月の週番号(小数点以下切り捨て)

これで導き出せます。

よく勘違いされるのが1年を通してカウントする週番号との混同。
表計算ならWEEKNUM関数があり、さらにそのオプションとしてISO方式とUSA方式の2種類があります。
誤ってこれを使った場合、例えば先に例を上げた2016年12月。


12月1日は第1週、12月7日は第2週になってしまいます。
今回使いたいのは曜日の出現回数。12月1日は第1木曜日、12月8日は第2木曜日となりますし、
12月6日は第1火曜日、12月13日は第2火曜日です。
ですから、難しく考えず7で割った数字を使ってください
なお、1を足しているのは第1週が0となり、第2週が1となり、、、という数学の計算ルールの結果そうなるので1を加えて下駄を履かせてます。

私が使ったツール環境
  • ハードウェアはRaspberry Pi 2 Model B
  • OSはRaspbian
  • プログラム言語はPHP
  • カレンダーはGoogleカレンダー
一見すると難しそうに感じますが、コレはたまたま私の手元にあって作りやすかったから使っただけです。
もっと一般的なもの、例えば表計算ソフトを使っても作ることは可能です。
勉強にもなりますので、課題としてチャレンジしてみても良いかもしれませんね。

最後にお約束の注意事項を

今回調べた法則は独自のモノです。
春日部市が公開しているモノではなく、また平成28年度のカレンダーのみを元としているため、これが平成29年度以降も使えるかどうかはわかりません。
裏取りまでしてシッカリやって作りこみたいという熱心な方は、是非市役所の担当課に問い合わせてみてください。