こんにちは、アドベントカレンダー4日目です!
アドベントカレンダーといえばクリスマスですね。
そこで今回はクリスマスまでのカウントダウンができるようにしたいと思います。
以下のワンライナーを実行すると。。。なんとCLI上でクリスマスまでの時間をカウントできます!!!嬉しいですね!!!うん、うれしい!!!!
Mac上で検証しているためdateコマンドはBSD準拠のdateであることに注意してください。
code
y=$( [ $(date +%m%d) -gt 1225 ] && echo $(( $(date +%Y)+1 )) || echo $(date +%Y) );r=$(($(date -jf "%Y-%m-%d %H:%M:%S" "$y-12-25 00:00:00" +%s)-$(date +%s))); printf "クリスマスまで残り %d日 %02d時 %02d分 %02d秒\n" $((r/86400)) $(((r%86400)/3600)) $(((r%3600)/60)) $((r%60))
output
クリスマスまで残り 20日 17時 55分 49秒
解説
ワンライナーにしているので、まずは分解していきます。
y=$( [ $(date +%m%d) -gt 1225 ] && echo $(( $(date +%Y)+1 )) || echo $(date +%Y) );
r=$(($(date -jf "%Y-%m-%d %H:%M:%S" "$y-12-25 00:00:00" +%s)-$(date +%s)));
printf "クリスマスまで残り %d日 %02d時 %02d分 %02d秒\n" $((r/86400)) $(((r%86400)/3600)) $(((r%3600)/60)) $((r%60))
1行目
y(year)変数に年を入れていきます。
今年が12月25日よりも前か後ろかを判定しています。
12月25日を過ぎていた場合は年を翌年にする感じです。
y=$( [ $(date +%m%d) -gt 1225 ] && \
echo $(( $(date +%Y)+1 )) || \
echo $(date +%Y) );
2行目
r(remaining)変数に残りの秒数を入れていきます。
次のクリスマス秒数から現在の秒数を引いています。
-fオプションはフォーマット適応を行っていて、 -jオプションは-f実施時にシステムへ入力した値を適応してしまわないようにするためのものです(BSDのdateだけの仕様らしい)。
r=$(($(date -jf "%Y-%m-%d %H:%M:%S" "$y-12-25 00:00:00" +%s) - $(date +%s)));
3行目
print文で文字を出力しています。
UNIX時間になっているので、必要に応じて割ってあげます。
printf "クリスマスまで残り %d日 %02d時 %02d分 %02d秒\n" \
$((r/86400)) $(((r%86400)/3600)) $(((r%3600)/60)) $((r%60))
もっと身近に感じたいあなたへ
CLIを出して実行するのは面倒、もっと簡単に見たいという方はAutomatorを使いましょう。
Automatorにてアプリケーションを選択した後、シェルスクリプトを実行を選択します。
その後、スクリプト入力箇所に以下のスクリプトを入力します。
変更箇所はメッセージを変数に格納し、osascriptを利用してアラートを出す処理を追加したところです。
y=$( [ $(date +%m%d) -gt 1225 ] && echo $(( $(date +%Y)+1 )) || echo $(date +%Y) ); \
r=$(($(date -jf "%Y-%m-%d %H:%M:%S" "$y-12-25 00:00:00" +%s)-$(date +%s))); \
m=$(printf "クリスマスまで残り %d日 %02d時 %02d分 %02d秒" $((r/86400)) $(((r%86400)/3600)) $(((r%3600)/60)) $((r%60))); \
osascript -e "display alert \"$m\""
最後にお好みの名前でアプリケーションを保存します。xmas_countとか。
spotlightやお好みのランチャーソフトにて、保存した名前のアプリを起動すればこの通り。
やったね。
まとめ
仕事中でも安心してクリスマスまでの期間を確認できますね。お子さんがいる方、パートナーがいる方、他にも友達がいたり用事があったりする方、プレゼントを忘れないように!
僕は使う機会がなさそうです!
Automatorは現在時刻をpbcopyに渡すスクリプトをアプリとして保存しておけば、spotlightから即席でタイムスタンプをクリップボードに入れられたりできるので便利です。
shell書くのが辛い人はhammerspoonを入れて、luaで書いちゃってもいいと思います。
(hammerspoonとかでもやりたかったがギリギリなため断念)
次は @TAKAyuki_atkwsk さんの記事となります。
引き続きアドベントカレンダーがんばっていきましょー!
