...

суббота, 23 января 2016 г.

Кроссплатформенный 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) — текущее состояние системы. Например, виртуальная машина просто отдает текущее приложение в видe 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. Писать столько, сколько считаю нужным на плохом английском.

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

Исходники доступны здесь:
http://ift.tt/1ZJ0Xsz

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

Комментариев нет:

Отправить комментарий