Skip to content

Instantly share code, notes, and snippets.

@yusukemihara
Last active September 6, 2021 09:15
Show Gist options
  • Select an option

  • Save yusukemihara/963ea2223e172f7520879fe43081744c to your computer and use it in GitHub Desktop.

Select an option

Save yusukemihara/963ea2223e172f7520879fe43081744c to your computer and use it in GitHub Desktop.
簡易工数記録スクリプト

rt

簡易工数記録スクリプト

使用方法

$ rt task1
... 3 minutes

$ rt task2
... 5 minutes

$ rt task1
... 10 minutes

$ rt end

$ rt
----
task1,00:13,780.0
task2,00:05,300.0

最後のrt endは省略可能(現在時がendになる)

記録方法

以下のようにファイルに記録する。 修正はテキストエディタで簡単にできる。

$ cat ~/.rt/2021/09/06.txt
task1,2021-09-06T09:59:11+09:00
task2,2021-09-06T10:02:11+09:00
task1,2021-09-06T10:07:11+09:00
end,2021-09-06T10:17:11+09:00

フォーマットは"タスク名,iso8601"となっている。

#!env ruby
require 'time'
require 'fileutils'
DEFAULT_DIR_ROOT=File.join(ENV['HOME'],'.rt')
class TimeRecorder
def initialize(y, m, d)
@time = Time.new(y,m,d,"18:00")
init_file
end
def initialize
@time = Time.now
init_file
end
def record(name)
File.open(@file, "a") do |io| io.puts "#{name},#{@time.iso8601}" end
end
def report
sum = summary
unless sum
STDERR.puts "data empty"
exit
end
puts "----"
sum.each do |a|
h, m = sec_to_hour(a[1])
puts "#{a[0]},#{format("%02d:%02d",h, m)},#{a[1].floor}"
end
end
private
def init_file
root = ENV['RT_DIR_ROOT'] || DEFAULT_DIR_ROOT
a = @time.strftime("%Y,%02m").split(",")
@dir = File.join(root, *a)
FileUtils.mkdir_p(@dir)
@file = File.join(@dir, @time.strftime("%02d.txt"))
end
def summary
return unless File.exist?(@file)
prev = nil
list = File.open(@file, "r").readlines.map do |line|
line.chomp!.split(",")
name, t = line.split(",")
time = Time.iso8601(t)
{name: name, time: time}
end
return if list.empty?
index = list.index do |l| l[:name] == "end" end
if index
list = list[0..index]
else
list << {name: "end", time: @time}
end
prev = nil
sum = {}
list.each do |l|
if prev
elapsed = l[:time] - prev[:time]
n = prev[:name]
sum[n] = 0 unless sum[n]
sum[n] += elapsed
end
prev = l
end
sum.sort
end
def sec_to_hour(sec)
min = sec / 60
hour = min / 60
min = min % 60
[hour.floor, min.floor]
end
end
# main
rt = TimeRecorder.new
if ARGV.size > 0
rt.record(ARGV[0])
else
rt.report
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment