Money Forward Developers Blog

株式会社マネーフォワード公式開発者向けブログです。技術や開発手法、イベント登壇などを発信します。サービスに関するご質問は、各サービス窓口までご連絡ください。

20230215130734

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

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

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

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

私の経験だと

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

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

勿論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 [/markdown]