Elixirで祝日が欲しかった……

こんにちは。イエウールでエンジニアをしている山浦(@arumi8go)です。

先日開催したSpeeeKaigiで「Elixirで祝日が欲しかった……」と言うテーマで発表しました。

tech.speee.jp

今回は発表内容に少し触れて行こうと思います。

何をやったのか

今回はElixirの勉強の為に祝日取得のライブラリーを一つ公開しました!
そして時々発生する祝日更新のタスクをできるだけ労力をかけずにある程度自動化できないかにも挑戦しました。

ライブラリー詳細

現在のv0.0.1で出来ることは非常にシンプルで

# 渡されたDateObjectが祝日かどうかを判断しBooleanを返す
HolidayJapan.holiday? ~D[2017-05-04]

# 渡されたDateObjectが祝日であればその名前をString型で、祝日でなければnullを返す
HolidayJapan.name ~D[2017-05-04]

の2つの機能しかありません。

内部の仕組みも単純で、 外部で公開されている祝日のデータをライブラリーで使用しやすい形に整形しJSON化してテキストファイルとして保持するようにしています。 これは後述する祝日データの自動更新の為にテキストファイルとして保存しています、その詳細については後述します。 各メソッドは渡されたDataObjectと祝日データを参照し処理を行うようになっています。

祝日更新の自動化

2016年1月1日施行の改正祝日法で増えた「山の日」のように時々祝日が増えたり減ったりします。
当然祝日を扱うライブラリーなのでそれに合わせて更新をする必要が来ると思います。
ですが本当に極稀にしか発生しない上、いちいち手で直していくのも面倒です。 なので出来るだけ頑張らずに自動化してみることにしました。

それが此方です!!

f:id:arumi8go:20171006105152p:plain

これだけだと「なんぞや?」となると思うので順番に説明していきます。

  • その1
    Erlang/Elixirに備えられているescriptで作った。HolidayJapanUpdate君が外部の方が公開している祝日一覧を返すAPIを叩き、かえってきたJSONをHolidayJapanで使いやすい形に整形しHolidayJapanの祝日データファイルを更新。

  • その2
    Github APIを使用して祝日データファイルに変更があれば、その変更をコミットしてプルリクエストを生成。

  • その3
    その1と、その2の実行をシェルスクリプトから行うようにしてcronに登録し月に一回実行されるよう設定。

以上です!!

発表のスライドは此方