Skip to content

Instantly share code, notes, and snippets.

@tkatochin
Last active September 30, 2015 03:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tkatochin/5d14a7b7ddab52772aca to your computer and use it in GitHub Desktop.
Save tkatochin/5d14a7b7ddab52772aca to your computer and use it in GitHub Desktop.
Macのキーとマウスのログから日々の稼働開始〜終了時間を出力する
#!/usr/bin/python
# -*- coding: utf-8 -*-
# こちら↓の成果のログから稼働開始〜終了時間を出力する
# http://qiita.com/edvakf@github/items/721afa8d2e69c556ba64
import sys
import os
import glob
import datetime
from datetime import datetime, timedelta
if len(sys.argv) != 2:
print "Usage: {0} [Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec]".format(sys.argv[0])
quit()
targetMonth = sys.argv[1]
time_min_per_day = {}
time_max_per_day = {}
row_min_per_day = {}
row_max_per_day = {}
files = glob.glob('/var/log/keymouselog.log*')
files.sort()
current_file = files[0]
del files[0]
files.append(current_file)
last_key = ""
last_month = ""
last_path = ""
keys = []
for path in files:
# 3ヶ月より前のローテートログは削除する(被っちゃうから)でもsudoで実行してね。
if ".T" in path:
pathParts = path.split(".T")
rotate_time = long(pathParts[1] + "l")
rotate_time = datetime.fromtimestamp(rotate_time)
one_year_ago_time = datetime.now() - timedelta(31*3)
if rotate_time < one_year_ago_time:
os.remove(path)
continue
# 読み取り実行
f = open(path, "r")
last_path = path
keys = []
for row in f:
rowParts = row.split(" ")
if "" in rowParts:
rowParts.remove("");
month = rowParts[0]
day = rowParts[1]
time = rowParts[2]
key = "{0} {1:>2}".format(month, day)
if key not in keys:
keys.append(key)
if time_min_per_day.has_key(key):
min = time_min_per_day[key]
if time < min:
time_min_per_day[key] = time
row_min_per_day[key] = row
else:
time_min_per_day[key] = time
row_min_per_day[key] = row
if "" != last_key:
if last_month == targetMonth:
print last_key + "\t\t" + time_min_per_day[last_key] + " - " + time_max_per_day[last_key]
if time_max_per_day.has_key(key):
max = time_max_per_day[key]
if time > max:
time_max_per_day[key] = time
row_max_per_day[key] = row
else:
time_max_per_day[key] = time
row_max_per_day[key] = row
last_key = key
last_month = month
f.close()
#過去のキーログは圧縮
if ".T" in path:
os.remove(path)
f = open(path, "w")
for key in keys:
if row_min_per_day.has_key(key):
f.write(row_min_per_day[key])
if row_max_per_day.has_key(key):
f.write(row_max_per_day[key])
f.close()
if "" != last_key:
if last_month == targetMonth:
print last_key + "\t\t" + time_min_per_day[last_key] + " - " + time_max_per_day[last_key]
@tkatochin
Copy link
Author

ファイル履歴の取り方が間違っていたので修正。

@tkatochin
Copy link
Author

指定月でしか取得できないように修正。
1年以上ログがたまると計算がおかしくなっちゃうから1年経過しているログは削除するようにした。
ただし、keymouselogがrootで実行されているので、sudo付きでこのシェルを起動する必要がある。

@tkatochin
Copy link
Author

ファイルがソート済みなんだから最後まで出力をためないで、確定した時に都度出力するようにした。

@tkatochin
Copy link
Author

つか保存期間は3ヶ月で十分

@tkatochin
Copy link
Author

毎回巨大なログを走査するのが時間の無駄なので、一度走査したファイルは開始と終了時間だけ残して上書きするようにした。2回目以降は爆速になった。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment