BitBarで自分の人生の残り時間を常に意識する

# はじめに

皆さんは人生を大切に生きていますか？無駄な時間を過ごしていませんか？私はこれまでの人生で無駄な時間ばかり過ごしてきました。

なぜそんなにも無駄な時間を過ごせたのか？それは人生の残り時間を気にしていなかったからではないかと思います。私ももう40歳になりました。これからは人生の残り時間を常に意識して過ごしていきたいと思います。でもどうすれば常に意識することができるのでしょうか？

# BitBar

[BitBar](https://getbitbar.com/)はMacのメニューバーに任意の項目を作るユーティリティです。ユーザーは決められたフォーマットで標準出力することで柔軟にメニュー項目を作成し、さらには任意の時間間隔で実行することができます。インストール方法などの詳細は他の記事に譲るとして、メニューバーに人生の残り時間が表示されていれば、常に意識して過ごすことができるような気がします。そこで、人生の残り時間を表示するBitBarのプラグインを作成することにしました。

## BitBarの紹介記事

- [BitBar -Macメニューバーをフル活用できる柔軟性の高いユーティリティ](http://www.softantenna.com/wp/mac/bit-bar/)
- [MacOSXのメニューバーに定期実行したスクリプトの標準出力を出せるBitBarが地味に便利 - Qiita](http://qiita.com/LOUIS_rui/items/222327202e523213691f)

# Pluginのコード

下記の通り、プラグインを作成しました。BitBarのプラグインは何かしらの標準出力をするスクリプトです。このスクリプトに実行権限を付けて、所定の場所に配置してください。ちなみに私はプラグインの配置先を `$HOME/Dropbox/Bitbar/` に設定しています。

```bash:rest-of-your-life.1h.sh
#!/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時間ごとに再実行することを指示しています。

ファイルに**実行権限を付与する**ことを忘れないでください。

このプラグインが正常に動作すると、下記のように表示されます。

<img width="252" alt="elapsed.png" src="https://qiita-image-store.s3.amazonaws.com/0/5823/a36947b1-27b4-826d-e6a5-366c2f494511.png">

日本人男性の平均寿命である80歳まで生きることを前提に、人生の残り時間とその割合を示しています。なんと、残りはもう50%を切っています！

誕生日や何歳まで生きるかといったことは、スクリプト中にハードコードされていますので、ご自身の値に変更してください。

また、時間は日数に24を掛けただけの値なので、ほぼ重複していると言っても良いでしょう。どちらかだけ残して表示すれば良いと思います。
# 解説

## Required

このスクリプトはMac OS X標準の `date` コマンドでは動作しません。GNUの `date` コマンドが必要です。 `brew install coreutils` でインストールしてください。

## `date` コマンドオプション

`date` コマンドは現在時刻を取得したり、時刻を設定したりするコマンドとして知られています。しかしGNUの `date` コマンドの `--date` オプションを利用すると、任意の日時として処理したり、簡単な日数計算をすることができます。

この `--date` オプションのパース機能が非常に優れていて、例えばこんな表現でも期待通りに処理してくれます。

```shell-session
$ date --date="2055-10-01 23:56:45 1 year -46 days"
水  8 16 23:56:45 JST 2056
```

## 演算 `$(())`

Shellスクリプトで演算と言えば `expr` を思い出す方は多いと思いますが、 `expr` コマンドは別プロセスを起動するため、[処理速度が非常に遅い](http://qiita.com/d_nishiyama85/items/a117d59a663cfcdea5e4)という問題があります。今回の要件では大した問題にはなりませんが、処理が軽いに越したことはありません。

BASHには `$((...))` という計算を行う構文があり、これを使うとBASH内の処理として計算してくれるので、処理が軽くなります。

# 最後に

これで私も残りの人生を大切に過ごすことができそうです。

でも人生を本当に大切に過ごしたいなら、こんなバカバカしいスクリプトを作っている場合じゃないような気がします。

BitBarプラグインは[GitHubで公開](https://github.com/matryer/bitbar-plugins)されており、Pull Requestが採用されれば公式ページのリストに加えてもらうことができます。しかしこのプラグインに関しては、もう少し熟成されるまでPull Requestを作るのは控えようかと思っています。