LINUX.ORG.RU

Where has my time gone?

 ,


13

1

Release early, release often!

В продолжение тем Time Card и Консольный тайм-трекер хочу представить общественности свой собственный велосипед.

Отличается от других велосипедов квадратными колёсами, тем, что время сам считает.

Вобщем, что меня не устраивало в других подобных программах, так то, что надо в ручную заводить, что когда делать начал и не забывать потом ещё всё это вовремя терминировать. А я человек очень ленивый и забывчивый. Поэтому сдружиться с такими программами я не смог.

Так родилась идея всё это дело автоматизировать. Т.е. программа сама следит за тем, какие окна активны и записывает время проведённое в том или ином приложении. К концу рабочего дня можно разобрать на что же было потрачено время и записать уже всё это по-хорошему в систему учёта времени или ещё куда.

Когда срабатывает скринсейвер счёт прекращается. Неактивные таски забываются после 8-и часов (плюс-минус рабочий день).

Всё это дело бежит просто на заднем фоне и предоставляет (пока ещё рудиментарные) результаты на http://localhost:8001/ Записи дампятся каждую минуту на диск, т.ч. рестартов тоже не боится.

Работает с EWMH компатибельными WM. (Для xmonad нужна особая магия, которую я не осилил.) UPD: внизу по треду есть решение.

Т.ч. приглашаю, кому не лень, потестить мой быдлокод и поделиться идеями и предложениями. А так же поругать и поучить. Надеюсь мой маленький проект окажется не безинтересным.

Установка: go get github.com/dim13/gone

ref: https://github.com/dim13/gone

UPD: в планах добавть ещё какую-нибудь fuzzy logic для группировки окон по названиям.

★★★★★

Последнее исправление: CYB3R (всего исправлений: 14)

Ответ на: комментарий от beastie

gccgo 4.7.2

gone.go:16:27: error: import file ‘github.com/BurntSushi/xgb’ not found
gone.go:17:39: error: import file ‘github.com/BurntSushi/xgb/screensaver’ not found
gone.go:18:34: error: import file ‘github.com/BurntSushi/xgb/xproto’ not found
gone.go:48:18: error: expected package
gone.go:49:20: error: expected package
gone.go:50:21: error: expected package
gone.go:51:21: error: expected package
gone.go:52:21: error: expected package
gone.go:53:21: error: expected package
gone.go:64:41: error: expected package
gone.go:72:32: error: expected package
gone.go:72:50: error: expected package
gone.go:72:76: error: expected package
gone.go:77:30: error: expected package
gone.go:85:28: error: expected package
gone.go:99:29: error: expected package
gone.go:124:27: error: expected package
gone.go:184:14: error: expected package
gone.go:191:19: error: expected package
gone.go:328:17: error: reference to undefined identifier ‘sort.Reverse’
gone.go:329:17: error: reference to undefined identifier ‘sort.Reverse’
gone.go:73:9: error: reference to undefined name ‘xproto’
gone.go:74:3: error: reference to undefined name ‘xproto’
gone.go:125:2: error: reference to undefined name ‘xproto’
gone.go:125:40: error: reference to undefined name ‘xproto’
gone.go:126:12: error: reference to undefined name ‘xproto’
gone.go:193:9: error: reference to undefined name ‘screensaver’
gone.go:191:3: error: duplicate type in switch

srrmk
()
Ответ на: комментарий от beastie

я про be говорил :)

не совсем то, зато консольно :)

а штука, которая следит за моими окнами, подглядывает, что я пишу в браузер, ужасается от моих переписок... я её боюсь.

feofil
()
Ответ на: комментарий от srrmk

Похоже, что да. gccgo не пользовал, не знаю. Стандартный go get сам автоматом все зависимости выкачивает.

beastie ★★★★★
() автор топика
Ответ на: комментарий от beastie

http://bugseverywhere.org/

оно, во-первых, консольное, поэтому не забываешь завести. во-вторых - не важно, что человек сделал, важно то, что ему нужно сделать :)

ps. это не имеет прямого отношения к исходной теме. но косвенное - имеет :)

feofil
()
Ответ на: комментарий от feofil

Интересно, но это диаметрально противоположный подход, с которым я и борюсь. =)

У меня просто иногда звонит телефон — «всё горит, ааа!» =) Нету времени заводить тикет, забивать в консольку, что я собирался делать. Надо просто срочно делать.

Разборы полётов, что же я за рабочий день натворил я хочу оставить на потом. О чём собственно и весь сыр-бор. =)

beastie ★★★★★
() автор топика
Ответ на: комментарий от beastie

хм. лично я, если начну делать, не записав, что именно - обязательно забуду, что же я вообще делаю :) и зачем я на свете, красивый такой :)

feofil
()
Ответ на: комментарий от anonymous

Как я понимаю, i3lock работает в комбинации с xautolock / xidle?

В таком случае, поддержка уже есть изначально. (mit-screen-saver extention)

Проблемы создаёт только xscreensaver, автор которого клал большой и толстый на стандарты.

beastie ★★★★★
() автор топика
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от beastie

Хотя оказывается, всё это немного сложнее. :-/

Тот же xautolock тоже варит похоже свой супчик.

Итак, что работает без проблем:

  • xidle + xlock/slock/i3lock/whatever

Что работает непонятно как или совсем не работает:

  • xautolock + whatever — свой доморощенный таймер, не шлёт Event
  • xscreensaver — тоже свой доморощенный таймер, тоже не шлёт Event, свестит и пердит вместо этого

Обходится установкой xset s, так так два последних его всё равно игнорируют. Но это костыль... Буду думать.

beastie ★★★★★
() автор топика
Последнее исправление: beastie (всего исправлений: 3)

Интересная штука, спасибо, я только доли секунд убрал - точность, имхо, избыточная. Надо бы еще цифры в строках выровнять.

Aruifas
()

Классная штука. А альтернатив нет? Просто интересно, не ужели все существующие варианты не устроили?

Deleted
()
Ответ на: комментарий от Deleted

Похожих не встречал. Стал бы я, при своей естественной лени, велосипедить? =)

beastie ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Новая, экспериментальная фича (похоже, что ещё подбагивает ;) ) — что бы не зависить от скринсейвера (хотя он тоже учитывается), следит за активностью пользователя и после 5-и минут бездействия само останавливается и отнимает от накопленного времени время простоя. (Хотя тут у меня наверняка где-то косяк. Буду ещё тестить и думать.)

beastie ★★★★★
() автор топика
Ответ на: комментарий от dexpl

Линукс майнтейнеры, к сожалению, почти нигде не успевают. :( По крайней мере в дебе всё очень грустно. (См. выше про godeb)

Хотя, в опеньке более-менее свежий 1.2 :)

beastie ★★★★★
() автор топика
Последнее исправление: beastie (всего исправлений: 2)
Ответ на: комментарий от beastie

Хотя, в опеньке более-менее свежий 1.2 :)

В центоси с федорой тоже. К счастью, Линукс не исчерпывается одним лишь дебианом сотоварищи :)

dexpl ★★★★★
()
Ответ на: комментарий от dexpl

linux mint 14, который мне пока что не надо было обновлять

когда требуется обновление каждые 6 месяцев - начинает напоминать венду

reprimand ★★★★★
()

Куда делся sync.Mutex? Кто будет синхронизировать запись/чтение в map разными горутинами?

anonymous
()
Ответ на: комментарий от anonymous

Там много чего поменялось. Я отказался от поинтеров в пользу COW. И вообще постепенно переписываю, что бы не делить память между рутинами или делить атомарно.

beastie ★★★★★
() автор топика
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от anonymous

Косяк был в том, что время отнимать не надо, а просто обновить 'last seen'. =) Пофиксил, вроде работает, как надо. Но idle тоже собирать стал. Может ещё использую для статистики.

beastie ★★★★★
() автор топика
Ответ на: комментарий от beastie

Настоятельно рекомендую все же собрать с -race и проверить отсутствие data races. Указатели тут ни при чем, конкурентный доступ к map на чтение и запись небезопасен.

anonymous
()
Ответ на: комментарий от anonymous

Спасибо, это конечно ещё далать буду. (Про -race кстати тоже спасибо, до тебя не знал об этом.)

Но вообще то, пишущая рутина только одна. И пишет она в порядке прихода event'ов.

Читающих несколько (dump и веб). И если там и попадётся одно старое значение — не страшно.

Но проверю, конечно ещё.

beastie ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Специально, для читабельности так сделал. =) Их там несколько в ряд и сам чуть глаза не сломал. Может потом обратно поменяю.

beastie ★★★★★
() автор топика
Последнее исправление: beastie (всего исправлений: 2)
Ответ на: комментарий от beastie

Но вообще то, пишущая рутина только одна

Не играет. Может быть, с текущей реализацией компилятора Go твоя утилитка без синхронизации не упадет, но я бы на это не полагался.

anonymous
()
Ответ на: комментарий от anonymous

Не люблю просто усложнять без надобности. =)

Share memory by communicating; don't communicate by sharing memory.

Туда и стремлюсь.

beastie ★★★★★
() автор топика
Ответ на: комментарий от anonymous

vi + zenburn, но с этим свё в порядке. Я про логическую читабельность, что б глазу за что зацепиться было.

beastie ★★★★★
() автор топика

Прикольная штука. Запустил, вечером интересно будет глянуть статистику.

Кстати, с go дела не имел, запустить просто так не получается. Сначала ругалось на $GOPATH, потом вроде по треду понял что его в любое место надо прописать. А запускать получается надо $GOPATH/bin/gone ?

orm-i-auga ★★★★★
()

Хм, глянул в исходники, я ожидал увидеть больше кода. Надо будет попробовать этот go.

orm-i-auga ★★★★★
()
Ответ на: arbtt от anonymous

Интересно, спасибо. Надо будет глянуть. На первый взляд делает почти тоже самое, но собирает только «Класс»-статистику.

beastie ★★★★★
() автор топика
Ответ на: arbtt от anonymous

arbtt
The source code is in Haskell, and is managed in a darcs

Эти ребята похоже всё делают по своему.

orm-i-auga ★★★★★
()
Ответ на: комментарий от beastie

Ну это да. Но я ставлю из исходников (на arm) и из тарболла на x86_64

RoninDev
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.