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)

Ништяк, но иксы это не Ъ. Настоящие мужчины обходятся консолью.

anonymous
()

Отчего-то у меня в какой-то момент всё упало:

 % ./gone 
2014/06/07 01:09:33 open dump.gob: no such file or directory
2014/06/07 01:09:33 listen on :8001
2014/06/07 01:19:09 class: BadWindow {NiceName: Window, Sequence: 11193, BadValue: 67109109, MinorOpcode: 0, MajorOpcode: 20}
Потом ещё погоняю, посмотрю, что будет.

proud_anon ★★★★★
()

А если все время открыто одно окно IDE или редактора?

Можно еще мониторить чтение/запись файлов и смотреть, принадлежат ли они к какому-нибудь проекту.

Похожие вещи есть в Emacs: CategoryTimeTracking. Выглядит логичнее логировать работу с разными проектами изнутри редактора.

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

Один или два раза тоже вылазило. Ещё не разобрался почему, но идея уже есть.

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

У меня немного другой use-case: много много xterm'ов с коннектами на разные хосты. И так хоть немного видно, где бывал и где сколько времени потратил.

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

Что, никому совсем не интересно? Ну да ладно.

Тогда cast sf и zinfandel: помогите пожалуйста, если не сложно, добавить EwmhDesktops в конфиг xmonad'а. Я просто не знаю как и куда его приткнуть. :(

Конфиг тут: http://pastebin.com/Y18aWjgL

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

Если в этом VirtualBox тоже X11 бежит, то можно подключиться и к нему тоже. Но у меня это ещё не реализовано. Не думал о таком use-case. Но спасибо за идею.

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

Очень круто. Как раз не хватало такого софта. Попробую попользовать. Жаль, что оно на Go, не смогу помочь или дописать. :(

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

Начинал писать на C (благо с Xlib опыт уже есть), но потом подумал, а ну его к чёрту! =)

В итоге за два вечера (с нырянием и копанием в неизвестные и новые для меня пакеты!) оно было готово.

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

На самом деле довольно таки просто: в конфиг надо добавить EwmhDesktops, но я не знаю как. :(

Жду скастованных, головастых ребят. См. выше.

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

Пара замечаний:

1. Принято помещать импорты из stdlib и сторонние в разные группы, отделённые пустой строкой:

import (
	"bytes"
	"encoding/gob"
	"fmt"
	"html/template"
	"log"
	"net/http"
	"os"
	"sort"
	"time"

	"github.com/BurntSushi/xgb"
	"github.com/BurntSushi/xgb/screensaver"
	"github.com/BurntSushi/xgb/xproto"
)

2. Принято писать документирующие комментарии к публичным функциям, методам, переменным и т. д. Это важно скорее для библиотек, а не для утилиты командной строки, но тем не менее.

3. Для предотвращение race conditions с чтением и записью в файл можно использовать sync.Mutex.

anonymous
()

мой маленький поект

Поправьте.

anonymous
()

И

рудеминтарные

Рудиментарные.

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

Спасибо, учёл, добавил. А документацию, да, надо будет написать. Я ещё не всем доволен. У меня там очень похожие названия структур, т.ч. будет ещё переписываться. Для начала хотелось просто оценить верность подхода.

beastie ★★★★★
() автор топика
Ответ на: Почитал код от anonymous

А я и не профессионал. =) Пытаюсь, как могу, учусь писать красиво.

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

Кажется, поторопился. Нет там никакого race condition: load завершается до того, как создаётся горутина. Тот коммит надо ревертнуть. А падает оно из-за расставленных всюду log.Fatal.

anonymous
()
Ответ на: комментарий от beastie
main = do
        xmproc <- spawnPipe "/usr/bin/xmobar"
        xmonad $ ewmh defaultConfig
                { manageHook = manageDocks <+> myManageHook <+> manageHook defaultConfig
                , layoutHook = avoidStruts $ layoutHook defaultConfig
                , logHook = dynamicLogWithPP xmobarPP
                        { ppOutput = hPutStrLn xmproc
                        , ppTitle = xmobarColor "green" "" . shorten 50
                        }
                }

Вроде должно работать. Сейчас go компилятор поставлю и протестирую.

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

Протестил. Работает. Буду пользоваться. Спасибо.

Кстати есть специальный прием для запуска xmobar без создания пайпа вручную.

В твоем конфиге это будет как-то так.

main = xmonad . ewmh =<< statusBar barExec myPP toggleStrutsKey defaultConfig
            { manageHook = manageDocks <+> myManageHook <+> manageHook defaultConfig
            , layoutHook = avoidStruts $ layoutHook defaultConfig
            }
	where
		barExec = "xmobar /home/user/.xmonad/xmobarrc"                        
		toggleStrutsKey XConfig {XMonad.modMask = modMask} = (modMask, xK_b)
		myPP = xmobarPP { ppOutput = hPutStrLn xmproc
                                , ppTitle = xmobarColor "green" "" . shorten 50
                                }
zinfandel ★★
()
Последнее исправление: zinfandel (всего исправлений: 1)
Ответ на: комментарий от zinfandel

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

Для апдейта моей поделки:

cd $GOPATH/src/github.com/dim13/gone
go get -u
go build
./gone

Сегодня я уже с десяток коммитов туда загнал.

PS: и очень радует, что не мне одному она полезна.

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

Обычно редакторы, в заголовке указывают редактируемый файл.

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

Ага. Спасибо. Буду знать.

Я там issue начирикал, про экспорт. Очень кстати программа пришлась, я как раз не так давно по примеру Стивена Вольфрама начал пытаться логгировать все свои действия, и чего-то такого не хватало.

zinfandel ★★
()

А почему только для xmonad? У меня в i3 вроде работает (кроме определения запуска скринсейвера). Хотелось бы ещё суммарные цифры по классам видеть на страничке.

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

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

Суть не меняется в принципе, в итоге происходит тоже самое, но конфиг становится почище.

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

Хотелось бы ещё суммарные цифры по классам видеть на страничке.

Справа же, в зелёной рамочке и с навигацией в отдельные классы.

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

Вечером, или скорее всего уже завтра, добавлю. Устаревшие таски будут уходить в лог и «кнопочка» Export в CSV: «Class, Name, Duration, LastSeen».

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

Я так понимаю, он должен в консольку написать «away from keyboard» - такого нет.

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

С xscreensaver я ещё не до конца разобрался, он почему-то не посылает Event и похоже что не пользуется MIT-SCREEN-SAVER extension.

Паралельно можно просто включить MIT-SCREEN-SAVER, поскольку xscreensaver его похоже всё равно игнорирует:

xset s 600 600

И проверить: xset s activate.

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

Через полчаса работы упало с

2014/06/07 20:17:14 net name: BadWindow {NiceName: Window, Sequence: 2466, BadValue: 69206099, MinorOpcode: 0, MajorOpcode: 20}
В это время как раз зашел на localhost:8001. Правда, до этого тоже заходил, тыкался, и ничего не падало.

HerrWeigel ★★★★
()

Очень здорово, определенно пригодится. Спасибо, буду следить за проектом. Да и на код посмотреть интересно, небольшие проекты для себя на го пишу.

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

Проапдейть, часть кода где был этот log.Fatal поменялась. (go get -u)

Падало из-за debug-стоппера и скорей всего из-за того, что окно ушло, а код пытался в это время прочесть его property.

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

Теперь упало с немного другой ошибкой:

2014/06/07 20:58:07 wait for event: BadWindow {NiceName: Window, Sequence: 629, BadValue: 73400323, MinorOpcode: 0, MajorOpcode: 2}
HerrWeigel ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.