自動化のススメ ー 自分の開発環境を自動化する

## はじめに

こんにちは、Mikatus株式会社のエンジニアの野田です。
今年の１月に入社し、事業企画グループに所属して、税理士向けサービス「キャッシュ・イズ・キング」の開発に携わっています。今後も新規プロダクトをどんどん開発していく予定です。

突然ですが、日々の業務において作業を自動化させることは、効率の面でも非常に重要です。
Mikatus でも「テストの自動化」「デプロイの自動化」など、様々なことを実装し、日々税理士のみなさんの業務に貢献していると思っています。
また、エンジニアとしてもう一つ大事な自動化として、「開発を効率的におこなうための自動化」があります。コードを commit して、push して、Pull Request を出して、Ticket を update する。日々の業務は繰り返しの毎日です。

ミスが許されないエンジニアの繰り返し業務。その効率化を図るため、今回は毎月の勤怠申請の自動化に成功したので、その成果を報告したいと思います。

## どんなツールなの？

Mikatus では毎月その月の出勤時間、退勤時間を Google スプレッドシートに記入して勤怠申請をします。毎日出退勤時間を入力するのは面倒ですし、毎日の出退勤時間は忘れてしまうのでそのあたりを自動化しました。

まず会社で使っている Mac を起動したら、出勤時間をログに残し、シャットダウン時に退勤時間をログに残す仕組みを作りました。そして、yyyy/MM を指定して実行すると、１ヶ月の出退勤時間がこんなカンジで標準出力されます。

![command_02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14252/8c5ec823-3faa-f244-8d29-76365e043095.gif)

作ったものを順を追って説明していきます。

## OS 起動、シャットダウン時にログを出力する AppleScript

まず MacBook Pro を起動すると、ダイアログで「出勤時間を記録しますか？」とダイアログで聞くようにします。

<img width="418" alt="スクリーンショット 2019-12-02 18.30.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14252/4dfc1f1d-c710-85a4-bec7-a30e97438b6c.png">

Yes をクリックすると、出勤時間をDocumentフォルダ下にあるログファイル(shukkin.log)に追記します。シャットダウン時には「退勤時間を記録しますか？」と聞いて、ログ(taikin.log)を記録します。
 
作り方は以下です。

まず、スクリプトエディタで以下のコードを書きます。スクリプトエディタは「アプリケーション > ユーティリティ」から起動できます。

<img width="634" alt="スクリーンショット 2019-12-02 18.35.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14252/9b08f6da-3839-9bef-72bc-13b7415862b3.png">

これをアプリケーションとして保存します。「ハンドラの実行後に終了しない」にチェックを入れます。保存先はアプリケーションフォルダにでも。
<img width="334" alt="スクリーンショット 2019-12-02 18.37.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14252/31f97f8b-c0ab-a11f-687c-b64b78f5b8e5.png">
次にシステム環境設定の「ユーザとグループ」を選び、ログイン項目タブを表示します。下の＋をクリックして、先ほど作ったアプリケーションを選んで追加します。非表示にチェックを入れます。
<img width="445" alt="スクリーンショット 2019-12-02 18.38.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14252/c80861dd-f602-3b1b-c2b4-9e91fdcf8d32.png">
すると、OS起動時にアプリケーションが起動して shukkin.log に出勤時間の記録をします。シャットダウン時にこのアプリケーションが閉じるタイミングで taikin.log に退勤時間を記録します。

## 休暇日を手動で書いておく
休暇を取った日は出退勤時間を記入しないのですが、代わりに休暇である旨を記述する必要があります。休暇日を yasumi.log に書いておきます。

```:yasumi.log
2019/08/24 有休(終日)
2019/10/24 有休(終日)
```

## その月の出勤時間をログから抽出する Bash スクリプト
shukkin.log と yasumi.log の該当する日を grep して、時間を標準出力します。コードは以下です。

```bash:shukkin
#!/bin/bash

if [ -z "$1" ]; then
  exit 1
fi

YYYYMM=$1

for I in {1..31}; do
  MYDATE=$YYYYMM/$(printf %02d $I)
  SHUKKIN_TIME=$(cat ~/Documents/shukkin.log | grep $MYDATE | head -n 1 | awk '{ print $2 }')
  KINMU_KUBUN=$(cat ~/Documents/yasumi.log | grep $MYDATE | head -n 1 | awk '{print $2}')

  if [ -z "$SHUKKIN_TIME" ]; then
    echo $KINMU_KUBUN
  else
    KUJI=$(date -j -f "%H:%M" "09:00" +%s)
    CURRENT=$(date -j -f "%H:%M" "$SHUKKIN_TIME" +%s)

    if [ $CURRENT -le $KUJI ]; then
      SHUKKIN_TIME="09:00"
    fi

    if [ "$2" = "-t" ]; then
      if [ -z "$KINMU_KUBUN" ]; then
        echo "出勤"$'\t'$SHUKKIN_TIME
      else
        echo $KINMU_KUBUN$'\t'$SHUKKIN_TIME
      fi
    else
      echo $SHUKKIN_TIME
    fi
  fi
done
```

9時前に出社した場合は9時にするとか、「出勤」と出力する必要があったり、いろいろルールがあります。yasumi.log の内容を持ってきて「有給」と出力したりします。

実行権限を付ければ、以下のコマンドでその月の出勤時間を標準出力させることができます。

```
shukkin 2019/11 -t
```

## その月の退勤時間をログから抽出する Bash スクリプト

taikin.log の該当日を grep して、時間を標準出力します。コードは以下です。出勤よりシンプルです。

```bash:taikin
#!/bin/bash

if [ -z "$1" ]; then
  exit 1
fi

YYYYMM=$1

for I in {1..31}; do
  MYDATE=$YYYYMM/$(printf %02d $I)
  TAIKIN_TIME=$(cat ~/Documents/taikin.log | grep $MYDATE | tail -n 1 | awk '{ print $2 }')
  echo $TAIKIN_TIME
done
```

## 上の bash スクリプトを実行して、勤怠表の形式にする Bash スクリプト

上述した shukkin コマンドと taikin コマンドを実行して保存したファイルに対して、```paste```コマンドを実行します。

shukkin コマンド、taikin コマンド、shuttaikin コマンドを一つのファイルで表現しても良いのですが、プログラムは「一つのことを行い、それをうまくやる」べきだと思っています。UNIX哲学です。

```bash:shuttaikin
#!/bin/bash

if [ -z "$1" ]; then
  exit 1
fi

NOW=$(date "+%Y%m%d%H%M%S")

SHUKKIN_FILE_PATH="/tmp/shukkin_$NOW"
TAIKIN_FILE_PATH="/tmp/taikin_$NOW"

shukkin $1 -t > $SHUKKIN_FILE_PATH
taikin $1 > $TAIKIN_FILE_PATH

paste -d"\t" $SHUKKIN_FILE_PATH $TAIKIN_FILE_PATH

rm $SHUKKIN_FILE_PATH
rm $TAIKIN_FILE_PATH
```

以下を実行すると、2019年11月の勤怠がクリップボードにコピーされます。

```
shuttaikin 2019/11 | pbcopy
```

pbcopy コマンドはクリップボードにコピーできるコマンドです。パイプでつなげば、標準出力をクリップボードにコピーできます。とても便利。これを Googleスプレッドシートに貼り付ければ、その月の勤怠申請は終了です。

空いた時間は「キャッシュ・イズ・キング」の開発に集中します。

## さいごに

「何を自動化すべきか？」を考えるのはとても難しいことですよね。自分の身の回りの細かなことを自動化する癖を付けていき、段々と大きな自動化を推し進めていけば良いのではないでしょうか。

こちらのスクリプトは入社して間もない頃に作りました。今まで黙っててごめんなさい。

明日は、@pons_superus さんよろしくお願いします！！