Chienomi

超簡易タイムカードスクリプト

開発::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"

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
    next
  end
  if type == "note"
    works[div].push({type:, File.read("/home/white/timecard/#{i}").strip})
  else
    works[div].push({time:, type:})
  end
end

works[target].each do |i|
  if i[] == "note"
    puts("*note - " + i[])
  else
    printf("%s - %s\n", i[].strftime("%0d %H:%M"), i[])
  end
end

こっちも結構単純。

ファイル名ソートした上でエポック秒から日時に変換、連続する同一タイプは圧縮している。