祝日処理ってどうしてる?

マネーフォワードのプログラマ、奥野(@bugslife)です。

最近、話題の映画ベイマックスを見ました。
賛否あるものの素晴らしい映画です、開発チームに居て欲しいですね。ベイマックス。メンターでしょうか?
「泣きたい時は、泣いてもいいんですよ」

今回は、エンジニアブログの箸休めとしてトリビアネタです。
必ず必要になるけど、あんまり重要視されず秘伝のソースになる事が多い、そう 『祝日処理』 です。

私の経験だと

  • GoogleCalenderから引っ張ったり
  • 偉い人が 年次でDBにエイヤッと入れてストアドでつついたり
  • もっと凄い何か

等など。ちょっとやりたい事に対して手間が掛かり過ぎですよね?

勿論MFにはちゃんとした運用がありますが、hubotなどでライトに使いたい時など、、、
そんな状況を簡単に救えたら・・・
 

そうだ、gemを使おう!

holiday_jp @ komagataさん作が良さそうです。
人気漫画の言葉を借りるなら
「ほーいいじゃないか こういうのでいいんだよ こういうので」

1970〜2050年の祝日が含まれているようです。
ただ、未来の祝日は変わっていくので、定期的にgemを更新すればいいかと思います。
 

rubyで使う場合

HolidayJp.holiday?(Date.today)

なんの問題もありません。
独自の祝日を持つケース、一日が24時で切り替わらない、なども拡張すれば出来そうですね。
 

cronで起動する場合

cronの記述には曜日設定はあれど祝日は記述できません。
こんな感じでコントロールしては如何でしょうか?
 

環境変数読み込みに設定

ruby -rholiday_jp -e 'exit HolidayJp.holiday?(Date.today).nil?'
export IS_HOLIDAY=$?

 

各起動スクリプトの先頭で・・・

if test $IS_HOLIDAY -eq 1 ; then
  exit 0
fi

 

デーモン等(ruby以外)の場合

gemはrubyの世界を出れません。また、cronの定時起動作戦は起動時のみしか使えません。
そんな時には、Webサーバーを立てましょう!
I love Sinatra.

Webサーバー側

ruby -rholiday_jp -rsinatra -e 'get "/" do; "{\"is_holiday\": #{HolidayJp.holiday?(Date.today).nil?}}" ;end'

クライアント側

JSON.parse(open('http://localhost:4567/').read)

 

最後に

如何でしょうか?もっと良い方法等あるかと思います。
そんな熱い思いを誰かにぶつけたい貴方は・・・

マネーフォワードでは、Railsエンジニアを大募集しています!
みなさまのご応募お待ちしております!

マネーフォワード採用サイト
https://recruit.moneyforward.com/

Wantedly
https://www.wantedly.com/companies/moneyforward

Pocket