はじめに
皆さんは人生を大切に生きていますか?無駄な時間を過ごしていませんか?私はこれまでの人生で無駄な時間ばかり過ごしてきました。
なぜそんなにも無駄な時間を過ごせたのか?それは人生の残り時間を気にしていなかったからではないかと思います。私ももう40歳になりました。これからは人生の残り時間を常に意識して過ごしていきたいと思います。でもどうすれば常に意識することができるのでしょうか?
BitBar
BitBarはMacのメニューバーに任意の項目を作るユーティリティです。ユーザーは決められたフォーマットで標準出力することで柔軟にメニュー項目を作成し、さらには任意の時間間隔で実行することができます。インストール方法などの詳細は他の記事に譲るとして、メニューバーに人生の残り時間が表示されていれば、常に意識して過ごすことができるような気がします。そこで、人生の残り時間を表示するBitBarのプラグインを作成することにしました。
BitBarの紹介記事
Pluginのコード
下記の通り、プラグインを作成しました。BitBarのプラグインは何かしらの標準出力をするスクリプトです。このスクリプトに実行権限を付けて、所定の場所に配置してください。ちなみに私はプラグインの配置先を $HOME/Dropbox/Bitbar/
に設定しています。
#!/usr/bin/env bash
# <bitbar.title>The rest of your life.</bitbar.title>
# <bitbar.version>v1.0</bitbar.version>
# <bitbar.author>Kenji Akiyama</bitbar.author>
# <bitbar.author.github>artifactsauce</bitbar.author.github>
# <bitbar.desc>The rest of your life.</bitbar.desc>
# <bitbar.image>https://qiita-image-store.s3.amazonaws.com/0/5823/a36947b1-27b4-826d-e6a5-366c2f494511.png</bitbar.image>
# <bitbar.dependencies>coreutils</bitbar.dependencies>
set -eu
# Must Edit this
BIRTH_DATE="1980-04-01 18:00"
# Edit if you want
AVERAGE_LONGEVITY=80
FONT_FACE="Menlo"
MENUBAR_ICON=":older_man:"
# Don't edit
DATE_CMD="/usr/local/opt/coreutils/libexec/gnubin/date" # installed by Homebrew
# 生存日数
ELAPSED_DAYS=$(( ($($DATE_CMD "+%s") - $($DATE_CMD --date "$BIRTH_DATE" "+%s")) / 86400 ))
# 生存時間
ELAPSED_HOURS=$(( ($($DATE_CMD "+%s") - $($DATE_CMD --date "$BIRTH_DATE" "+%s")) / 3600))
# 予定死亡日数
LONGEVITY_DAYS=$(( ($($DATE_CMD --date "$AVERAGE_LONGEVITY years" "+%s") - $($DATE_CMD "+%s")) / 86400))
# 予定死亡時間
LONGEVITY_HOURS=$(( ($($DATE_CMD --date "$AVERAGE_LONGEVITY years" "+%s") - $($DATE_CMD "+%s")) / 3600))
echo "$MENUBAR_ICON"
echo "---"
echo "Elapsed: | color=black font=$FONT_FACE"
printf "* %6d days | color=gray font=$FONT_FACE\n" $ELAPSED_DAYS
printf "* %6d hours | color=gray font=$FONT_FACE\n" $ELAPSED_HOURS
echo "Remained: | color=black font=$FONT_FACE"
printf "* %6d days | color=orange font=$FONT_FACE\n" $(( $LONGEVITY_DAYS - $ELAPSED_DAYS ))
printf "* %6d hours | color=orange font=$FONT_FACE\n" $(( $LONGEVITY_HOURS - $ELAPSED_HOURS ))
printf "* %6.1f %% | color=red font=$FONT_FACE\n" $(echo "scale=1; 100 * ($LONGEVITY_HOURS - $ELAPSED_HOURS) / $LONGEVITY_HOURS"| bc)
echo "---"
echo "Refresh | refresh=true color=#C0C0C0"
ファイル名は 名前.実行間隔.拡張子
というフォーマットになっていて、この時間間隔の箇所に 1h
と記載することで、1時間ごとに再実行することを指示しています。
ファイルに実行権限を付与することを忘れないでください。
このプラグインが正常に動作すると、下記のように表示されます。
日本人男性の平均寿命である80歳まで生きることを前提に、人生の残り時間とその割合を示しています。なんと、残りはもう50%を切っています!
誕生日や何歳まで生きるかといったことは、スクリプト中にハードコードされていますので、ご自身の値に変更してください。
また、時間は日数に24を掛けただけの値なので、ほぼ重複していると言っても良いでしょう。どちらかだけ残して表示すれば良いと思います。
解説
Required
このスクリプトはMac OS X標準の date
コマンドでは動作しません。GNUの date
コマンドが必要です。 brew install coreutils
でインストールしてください。
date
コマンドオプション
date
コマンドは現在時刻を取得したり、時刻を設定したりするコマンドとして知られています。しかしGNUの date
コマンドの --date
オプションを利用すると、任意の日時として処理したり、簡単な日数計算をすることができます。
この --date
オプションのパース機能が非常に優れていて、例えばこんな表現でも期待通りに処理してくれます。
$ date --date="2055-10-01 23:56:45 1 year -46 days"
水 8 16 23:56:45 JST 2056
演算 $(())
Shellスクリプトで演算と言えば expr
を思い出す方は多いと思いますが、 expr
コマンドは別プロセスを起動するため、処理速度が非常に遅いという問題があります。今回の要件では大した問題にはなりませんが、処理が軽いに越したことはありません。
BASHには $((...))
という計算を行う構文があり、これを使うとBASH内の処理として計算してくれるので、処理が軽くなります。
最後に
これで私も残りの人生を大切に過ごすことができそうです。
でも人生を本当に大切に過ごしたいなら、こんなバカバカしいスクリプトを作っている場合じゃないような気がします。
BitBarプラグインはGitHubで公開されており、Pull Requestが採用されれば公式ページのリストに加えてもらうことができます。しかしこのプラグインに関しては、もう少し熟成されるまでPull Requestを作るのは控えようかと思っています。