序
稼働時間をつける必要ができたので、簡単なスクリプトを書いた。
これは、自分でまとめて稼働時間を申請する用で、何らかのフォーマットに整えるものではない。
考え方
- 時間をかける意味はないので、簡易にする
- どのマシンでつけることになるかは定かでないため、サーバー上記録にする
- コマンド一発で打刻できるように
- 連続する開始または終了の打刻が問題にならないように
設計
epochseconds.(up|down)
これで時刻変換ができ、up/downで出勤・退勤を表現できる。
SSH経由でサーバーを叩く、そこで$SSH_ORIGINAL_COMMANDを使って判定とすれば簡単にできる。
打刻スクリプト
#!/bin/zsh
carg=(${=SSH_ORIGINAL_COMMAND})
case ${carg[1]} in
up)
touch ~/timecard/$(date +%s).up
;;
down)
touch ~/timecard/$(date +%s).down
;;
note)
cat > ~/timecard/$(date +%s).note
;;
list)
~/.local/bin/timecard_list.rb ${carg[2]}
;;
esac超単純。
表示スクリプト
#!/bin/ruby
Encoding.default_external = "UTF-8"
target=ARGV[0] or abort "No target given"
works = Hash.new {|h,k| h[k] = []}
stamps = Dir.children("/home/white/timecard").sort
stamps.each do |i|
time, type = i.split(".")
time = Time.at(time.to_i)
div = time.strftime("%Y%m")
if works[div][-1]&.fetch(:type) == type
next
end
if type == "note"
works[div].push({type:, note: File.read("/home/white/timecard/#{i}").strip})
else
works[div].push({time:, type:})
end
end
works[target].each do |i|
if i[:type] == "note"
puts("*note - " + i[:note])
else
printf("%s - %s\n", i[:time].strftime("%0d %H:%M"), i[:type])
end
endこっちも結構単純。
ファイル名ソートした上でエポック秒から日時に変換、連続する同一タイプは圧縮している。