【Mac】勉強時間を記録するshellscriptを作成してみた!

10月 4, 2023

※すぐにスクリプトを確認されたい方は"記録スクリプト"の章より閲覧してください。


どもども、来月は絶対にスニーカーを購入するぞと心に誓うsaisaiです。


皆様、日々「勉強」しておりますでしょうか。僕は毎日少しでも勉強する時間を確保し、学習習慣を継続するよう頑張っています。しかし、なかなか腰が重く「今日はもういいかな…。」なんて思ってしまう日もあります。


そこでせっかく築き上げてきた学習習慣を崩さないよう以下のノルマを自分に課しています。


① 1週間の学習時間が少なくとも10時間
② 1週間に一回は必ずブログに技術記事を投稿する。


②の方は成果物で達成しているかを判断できるので問題ないのですが、①の方は日々学習時間を記録しなければなりません。


しかし、いざ勉強するぞ!という時にまず学習記録サービスやアプリを起動して開始時間を記録して…という工程を踏みたく無いのです…。


そこで「勉強を始める際、ほぼ必ずMacのターミナルをまず開くからスクリプト作ってコマンド一発で記録できるようにしたろ!」と思ったのが今回の記事の発端です。


前置きが長くなりましたね。早速今回作成したスクリプトを紹介させていただきます。

記録スクリプト

まずは今回のスクリプト関連一式を配置するディレクトリを作成します。その後月別記録ファイルを置いておくディレクトリと、月別学習時間の現時点合計秒数を記録するファイルを配置するディレクトリをその中に作成しておきます。月別学習時間の現時点合計秒数を記録するファイルの用途については後ほど説明いたします。

$ mkdir learning-time #今回のスクリプト関連を保存しておくディレクトリ
$cd learning-time
$ mkdir record #月別学習記録ファイルを置いておくディレクトリ
$ mkdir buffer #月別学習時間の現時点合計秒数を記録するファイルを配置するディレクトリ

ではスクリプトを配置していきます。


・start_learning.sh

学習開始時に実行するスクリプトです。内容はこんな感じ。

#!/bin/bash

MONTH=`date +%Y%m`
TODAY=`date +%Y%m%d`
START_TIME=`date +%H:%M`
START_TIME_FOR_CUL=`date +%s`

#今月分の学習記録ファイルがなければ作成
if [ ! -e /Users/saisai/learning-time/record/monthly_result.$MONTH ]; then
  touch /Users/saisai/learning-time/record/monthly_result.$MONTH
  date +%Y/%m >> /Users/saisai/learning-time/record/monthly_result.$MONTH
  echo "#######" >> /Users/saisai/learning-time/record/monthly_result.$MONTH
fi

#今月分の学習時間の現時点合計秒数を記録するファイルがなければ作成
if [ ! -e /Users/saisai/learning-time/buffer/buffer.$MONTH ]; then
  touch /Users/saisai/learning-time/buffer/buffer.$MONTH
  echo 0 > /Users/saisai/learning-time/buffer/buffer.$MONTH
fi

#学習開始時刻とそのUnixTimeをファイルに記録する
echo $START_TIME $START_TIME_FOR_CUL >> /Users/saisai/learning-time/start.$TODAY

“date +%s"で現在時刻をUnixTimeで出力することができます。学習時間を算出する際"終了時刻-開始時刻"という計算が必要になるわけですが、そのためには時刻をUnixTimeに変換する必要があるため通常フォーマットの開始時刻とともに記録しておきます。

これで開始時刻に関する情報が記録された“start.YYmmdd"ファイルが作成されます。

その他細かい説明はスクリプト上に記載いたしましたのでご確認ください!


・finish_learning.sh

次に学習を終了する際に実行するスクリプトを紹介いたします。

#!/bin/bash

DATE=`date +%d`
TODAY=`date +%Y%m%d`
MONTH=`date +%Y%m`

#"start.YYmmdd"ファイルから開始時刻を取り出して代入する
START_TIME=`awk '{print $1}' /Users/saisai/learning-time/start.$TODAY`
#"start.YYmmdd"ファイルからUnixTimeを取り出して代入する
START_TIME_FOR_CUL=`awk '{print $2}' /Users/saisai/learning-time/start.$TODAY`
FINISH_TIME=`date +%H:%M`
FINISH_TIME_FOR_CUL=`date +%s`
#終了時刻のUnixTimeから開始時刻のUnixTimeを引き算して合計学習時間を求める
LEARNING_TIME=$(($FINISH_TIME_FOR_CUL - $START_TIME_FOR_CUL))
#記録しておいた今月分の月間学習時間の現時点合計秒数を代入
LEARNING_TIME_RECORDED=`cat /Users/saisai/learning-time/buffer/buffer.$MONTH`
#今回の学習時間の秒数と前回までの月別学習時間の合計秒数を合算する
LEARNING_TIME_MONTHLY=$(($LEARNING_TIME + $LEARNING_TIME_RECORDED))

#合算した月間学習時間の合計秒数を上書きする
echo $LEARNING_TIME_MONTHLY > /Users/saisai/learning-time/buffer/buffer.$MONTH

#UnixTimeで計算した学習時間は秒単位なので時:分:秒フォーマットに変換する
((sec=LEARNING_TIME%60, min=(LEARNING_TIME%3600)/60, hrs=LEARNING_TIME/3600))
TOTAL_TIME=$(printf "%d:%02d:%02d" $hrs $min $sec)

#合算した月別学習時間の合計秒数を時:分:秒フォーマットに変換する
((sec_monthly=LEARNING_TIME_MONTHLY%60, min_monthly=(LEARNING_TIME_MONTHLY%3600)/60, hrs_monthly=LEARNING_TIME_MONTHLY/3600))
TOTAL_TIME_MONTHLY=$(printf "%d:%02d:%02d" $hrs_monthly $min_monthly $sec_monthly)

#全ての結果を"monthly_result.YYmm"ファイルに記録する
echo "[${DATE}日] 開始時間:${START_TIME} 終了時間:${FINISH_TIME} 日計:${TOTAL_TIME} 合計:${TOTAL_TIME_MONTHLY}" >> /Users/saisai/learning-time/record/monthly_result.$MONTH

#今回学習分の開始時刻情報は不要になるので削除する
rm -f /Users/saisai/learning-time/start.$TODAY

それぞれの処理内容はスクリプト内で補足説明しました。最後の“start.YYmmdd"ファイルを削除することで不要なファイルを削除すると同時に、同一日で学習を再開した場合でも情報を記録できるようにしています。

“monthly_result.YYmm"ファイルをみてみると、学習時間が記録されたことがわかるかと思います。

あとはこのスクリプトにaliasを設定してお好みのコマンドで開始・終了・確認が行えるように設定してください!

参考までに僕が設定しているaliasは以下の通りです。

$ less .zshrc

alias learning-s='/Users/saisai/learning-time/start_learning.sh'
alias learning-f='/Users/saisai/learning-time/finish_learning.sh'
alias learning-c="less /Users/saisai/learning-time/record/monthly_result.$(date +%Y%m)"


ちなみに上記スクリプトを少し改良するとcsv形式で出力することも可能ですので、Excelに取り込んだりS3に取り込んでAthenaからのQuicksiteを利用してみたりするなど何かと応用が効くと思います。

是非一度お試しください!

さいごに

無事学習時間を記録するスクリプトを作成することができました。


…と思っていましたが、実は今回のスクリプトで一つやり残したことがあります。それは「週別学習時間の記録」機能の実装です…。


この機能に関しては現在構想を練っている段階ですので、完成しましたら番外編として記事にしようかなと考えております。その際はまた見にきていただけると嬉しいです!


最後まで読んでいただきありがとうございました!


↓オススメ教材

shellscript

Posted by CY