Багатоплатформовий Open Source Time Tracker


У цій статті я хочу розповісти про те, навіщо мені знадобився тайм-трекер, як я його шукав, чому не знайшов і що з цього всього в підсумку вийшло.

Вибір трекера

Майже всю свою кар'єру я працюю фрілансером. Специфіка діяльності така, що всі контракти з оплатою не погодинної, а за зроблену у встановлений строк роботу. В таких умовах звикаєш працювати коли є настрій — головне вкластися в термін. Тобто весь день не торкатися до проекту, а на наступний день 16 годин безвідривно орати як раб на галерах — звичайна справа. Замовникам це, як правило, байдуже. Працюючи в такому режимі, про тайм-трекері не замислюєшся.
На початку 2015 року мені запропонували цікавий віддалений проект і раптово з оплатою не за виконану роботу, а з фіксованою зарплатою кожен місяць.
Через пару місяців з моменту початку роботи, стало очевидно, що мій звичайний підхід працює погано. Коли перед тобою висить якийсь дедлайн, а факт оплати прив'язаний до здачі роботи — додаткова мотивація не потрібна, тим більше що порушення строків може вилитися в солідну компенсацію. У разі фіксованої оплати справа йде інакше. Усвідомивши це, я зрозумів, що працюю неефективно і навряд чи мій роботодавець буде задоволений, якщо я продовжу працювати в тому ж темпі.

В кінці березня на хабре була опублікована стаття Наглядач для фрілансера: вибираємо систему обліку робочого часу. Ця стаття ідеально співпала з моїми роздумами про підвищення ефективності. Вона присвячена в основному веб-інструментів і не підходить під мої завдання, але основна ідея з урахуванням часу здалася мені срібною кулею, яка дозволить правильно розподілити робочий час та не підвести роботодавця.
На мою удачу в коментарях до статті читачі ділилися своїм досвідом використання різноманітних трекерів, а Alexey2005 виклав посилання на порівняльну таблицю трекерів.
Чим далі я заглиблювався у вивчення різноманітних трекерів, тим очевидніше ставало, що жоден мені не підходить.
Був сформований список вимог до трекера:
  1. Ніяких ручних таймерів. У світі, де користувач постійно перемикається між різними завданнями, відходить «покурити», відповідає коханці в ICQ, точність ручних таймерів прагне до 0.
  2. Тільки Open Source. Вважайте мене параноїком, але я не хочу, щоб закрите ЗА віддавало інформацію про моєї активності на чужий сервер. Ще пару років тому я б не став про це навіть замислюватися і спокійно встановив собі пропрієтарний трекер. Але останні тенденції в світі стеження навчили мене двом речам:
    • Якщо у компанії є дані — вона буде їх використовувати.
    • Дані обов'язково витечуть або будуть надані за судовим запитом

    Дуже не хочеться, щоб в один прекрасний день до мене «прийшли» зі звинуваченнями у використанні якогось забороненого bitcoin.
  3. Крос-платформа. Як розробник ігор, я в основному працюю в Windows, Linux і Mac OS X також супроводжують значну частину моєї активності. Тайм-трекер, який буде відслідковувати активність тільки в одній з ОС, не буде давати повної картини.
Автоматичних кросплатформених трекерів існує дві з половиною штуки. Open Source серед них я не знайшов жодного.

Пишемо свій

Що ж робити? Вибір очевидний — будемо писати свій трекер.
Основний алгоритм роботи простий — програма висить у фоні і, при зміні активного вікна, запам'ятовує на який додаток переключився користувач. Якщо протягом певного часу користувач не натискаючи ніяких кнопок, не рухав миші і вікна не переключалися — переходимо в режим сну, скорегувавши відповідним чином останню запис (віднімемо час, який користувач був неактивний).
Було б логічно прив'язатися до переходу ПК в режим енергозбереження (відключення моніторів), але у багатьох цей режим вимкнений, або пауза занадто велика, так що покладатися на нього не можна.
Крім цього, очевидно, що для точності підрахунку часу потрібні профілі. В залежності від типу поточної діяльності різні програми можуть відноситися до різних категорій. Наприклад, я використовую notepad++ як у фріланс-проектах, так і в своїх власних.
Профілі дозволяють призначити додаток в різні категорії. Відповідно, якщо активний профіль «свої проекти», то час використання notepad++ буде записано в одну категорію, а якщо активний профіль «фріланс» — в іншу.

Зовнішні трекери

І ось перша версія трекера написана і запущена. Після кількох днів активного тестування виявляється, що поточної автоматизації недостатньо. На скріншоті в заголовку видно, що Хром з'їв 3 години 50 хвилин і, в теж час, категорія Прокрастинація теж зайняла 3 години 50 хвилин. Але на самій-то справі Хром використовується також для доступу до багтрекеру, документації, stackoverflow. Але перша версія трекера не вміла відрізняти ці дії і записувала все в одну категорію. Одне з тимчасових рішень — використовувати Хром для читання хабра / пошти / vk і т. п., а всю робочу діяльність вести в Frirefox. Але звичка була занадто сильна і все одно в підсумку частина роботи робилася за звичкою в Хромі.
Проблема посилилася при роботі у віртуальній машині. Трекер, природно, сам по собі не здатний побачити: що там діється всередині VBox і бачить лише активність VirtualBox.exe. Звичайно, під віртуальними машинами в один момент часу велася діяльність тільки одного типу і проблему можна було вирішити перемиканням профілів. Але спочатку дуже хотілося відійти від ручного управління.
В результаті народилося рішення у вигляді зовнішніх трекерів.
Зовнішній трекер — це програма, яка запускається всередині недоступного для тайм-трекера оточення і передає звідти інформацію. Наприклад, у разі віртуальної машини цей трекер веде себе ідентично тайм-трекера, але не запам'ятовує, що за програми запущені, а по udp-каналу повідомляє про них основного трекера на 25855 порт.
Формат повідомлень вийшов досить простим:
5 char — фіксований заголовок. TYTET
1 int - номер версії протоколу. Зараз 1.
utf8 рядок(1 int довжина рядка і далі масив char) — поточний стан системи. Наприклад, віртуальна машина просто віддає поточний додаток у вигляді chrome.exe, qtcreator.exe, explorer.exe. З браузером — трохи складніше, так як сайтів — море, а в якості стану віддаються основні сайти, з якими взаємодіє користувач: habrahabr.ru, geektimes.ru, vk.com, gmail.com, google.com і т. п. Інші сайти йдуть під загальним статусом: undefined. Тобто основні сайти визначаються відповідні категорії на рівні тайм-трекера, а undefined йдуть в окрему категорію. Наприклад, undefined у мене пишуться в Прокрастинацию, так як набагато простіше визначити набір робочих сайтів, ніж мільйони сміттєвих, на які потрапляєш, читаючи чергову фігню.
1 int — кількість перекриваються додатків
utf8 — масив рядків з ім'ям кожного перекривається програми

Перекриваються програми — це-список програм, які будуть підмінятися при наявності свіжої (менше 10 секунд) інформації з трекера. Наприклад, трекер Хрому перекриває два додатки:
chrome.exe і Google-chrome-stable.
Відповідно, якщо від нього приходить поточний статус habrahabr.ru, то тайм-трекер під час активності в chrome.exe під віндою і Google-chrome-stable в лінуксі буде писати в БД не Хром, а habrahabr.ru.
1 unsigned char — контрольна сума. Контрольна сума вважається простим складанням всіх байт в пакеті
Тайм-трекер в комбінації з зовнішніми трекерами дозволяє отримати максимально коректну інформацію про час, проведений за ПК.
В принципі, нічого не заважає зовнішнього трекеру бути дійсно зовнішнім, наприклад, андроїд-телефону. Це дозволить враховувати активність і за межами ПК. Але мені такий функціонал не потрібен, тому я його не реалізовував.

Робота з трекером

З точки зору користувача програма представляє із себе іконку в треї, у якої є контекстне меню, що викликає потрібний функціонал:

Незначні функції:
Налаштування дозволяють визначити загальні деталі функціонування програми.
Профілі дозволяють, не відкриваючи вікон програми, перемикатися між активними профілями.
І найважливіше:
Програми — дозволяють розподілити програми по категоріях (додатки автоматично додаються в список під час роботи) і редагувати профілі:

Статистика — дозволяє видерти з БД інформацію за зазначену дату і намалювати графік і таблицю.

З одного боку — відображення статистики є важливою частиною тайм-трекера. Але я вважаю, що саме додаток трекера має бути лише простим поверхневим інструментом для аналізу даних. Основне — це збір. А гарні діаграми можна і LibreCalc намалювати на основі експортованих CSV даних.

Окремо варто обговорити роботу з БД.
Спочатку я побоювався, що вона буде дуже швидко зростати і доведеться програмно розбивати її на частини.
Але процес тестування першої версії показав, що за півроку роботи в трьох ОС з сотнею додатків БД займе всього 1 мегабайт. 20 мегабайт за 10 років. Не той розмір, про який варто турбуватися. Зате код програми спрощується, якщо тримати БД одним шматком.
Так тримати окремий файл для кожної ОС безглуздо з точки зору статистики, то для себе я зробив exFAT-розділ на 100 мегабайт, куди поклав БД і тепер Windows / Linux / Mac OS X працюють одним файлом. В результаті — загальна статистика, доступна в одному місці.

Йдемо в Open Source

Пройшло близько 10 місяців з тих пір, як була написана перша версія програми. Для себе я оцінив додаток як дуже придатне. По щасливою випадковості січні вийшла стаття Чому і навіщо писати open-source код?. І подумалося — а не опублікувати чи тайм-трекер на github, адже завдання підрахунку часу досить актуальна, а Open Source рішень не так вже багато.
І ось, знайомство з github, переписування програми з урахуванням всіх нюансів, накопичених за майже рік використання і перша збірка лежить, готова до завантаження і створення fork'ів.

Let me speak from my heart
Раптово найскладнішим при публікації Open Source-проекту виявилося погане знання англійської. В той момент, коли стало зрозуміло, що проект не має сенсу без хоча б мінімальної документації і коментарів — виникло бажання не публікуватися, щоб не ганьбитися… Тому що мій англійський дозволяє дивитися фільми з субтитрами, читати документацію, розуміти просту розмовну мову… Але писати осмислені, граматически і орфографічно чисті пропозиції — це мені не по зубах…
І встав вибір:
  1. Нічого не публікувати взагалі.
  2. Обмежитися односкладовими коментарями. Авось не здогадаються, що я не знаю англійської.
  3. Писати стільки, скільки вважаю за потрібне на поганому англійському.
Перший варіант здався неприйнятним. Проект бачиться корисним і публікація його важлива. Думаю, кілька десятків користувачів для нього знайдеться, так що шкода залишати неопублікованим.
Другий варіант не дозволяє повноцінно розписати важливі моменти по роботі з вихідними кодами і самим додатком. Та й яка ймовірність, що я зможу в коротких пропозиціях розписати все правильно?
У підсумку зупинився на третьому варіанті. Зрештою це не іспит з англійської і не книга, а ЗА. Можливо серйозні косяки поправлять більш освічені товариші, а може бути додаток зможе функціонувати і з моїми кривими коментарями.

Вихідні коди доступні тут:
github.com/Allexin/TrackYourTime

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.