超簡易タイムカードスクリプト
開発::noddy
序
稼働時間をつける必要ができたので、簡単なスクリプトを書いた。
これは、自分でまとめて稼働時間を申請する用で、何らかのフォーマットに整えるものではない。
考え方
- 時間をかける意味はないので、簡易にする
- どのマシンでつけることになるかは定かでないため、サーバー上記録にする
- コマンド一発で打刻できるように
- 連続する開始または終了の打刻が問題にならないように
設計
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"
=ARGV[0] or abort "No target given"
target= Hash.new {|h,k| h[k] = []}
works
= Dir.children("/home/white/timecard").sort
stamps .each do |i|
stamps= i.split(".")
time, type = Time.at(time.to_i)
time = time.strftime("%Y%m")
div if works[div][-1]&.fetch(:type) == type
next
end
if type == "note"
[div].push({type:, note: File.read("/home/white/timecard/#{i}").strip})
workselse
[div].push({time:, type:})
worksend
end
[target].each do |i|
worksif i[:type] == "note"
puts("*note - " + i[:note])
else
printf("%s - %s\n", i[:time].strftime("%0d %H:%M"), i[:type])
end
end
こっちも結構単純。
ファイル名ソートした上でエポック秒から日時に変換、連続する同一タイプは圧縮している。