Линукс, Vim, LaTeX, полезные скрипты, визуализация данных, численные расчёты, немного ФП

20100129

Автоматический учёт времени: Arbtt macht frei!

В линуксе есть несколько разных программок для учёта времени, самая простая и незамысловатая, и при этом вполне функциональная — это, пожалуй, Hamster. С ней всё понятно: добавляем на панель, вбиваем новое дело всякий раз, когда за него берёмся. Главное, не забывать.

А вот есть программка похитрее: arbtt. Пользоваться ей, правда, легче. Она полностью автоматическая. Достаточно запустить arbtt-capture и заниматься своими делами*. arbtt-capture будет записывать когда и какие программы были запущены и какие у окон были заголовки.

* Автор arbtt рекомендует сразу добавить arbtt-capture в автоматически запускаемые приложения.


Чтобы увидеть необработанные сырые данные, можно выполнить arbtt-dump, но это не очень полезно. Для просмотра статистики удобнее использовать использовать утилитку arbtt-stats.

Чтобы arbtt-stats могла выдавать осмысленные результаты, нужно вначале задать свою классификацию запущенных программ. Эти правила вписываются в файл ~/.arbtt/categorize.cfg. Пример и описание формата правил есть в документации. Приведу свой (сокращённый) пример с комментариями по-русски:
-- правила имеют вид:
-- [условие ==>] tag [категория_тега:]тег,
-- в условиях и тегах можно использовать несколько специальных переменных,
-- почти все они встречаются в примерах ниже

-- Не учитывать время простоя
$idle > 60 ==> tag inactive,

-- Все записи за последние 24 часа пометить тегом last-day
$sampleage <= 24:00 ==> tag last-day,
-- Пометить тегом last-hour все записи за последний час
$sampleage <= 1:00 ==> tag last-hour,

-- Все типы окон Firefox учитывать в одном теге program:web (program — это категория тега)
current window $program == "Navigator" ==> tag program:web,
current window $program == "firefox-bin" ==> tag program:web,
current window $program == "gecko" ==> tag program:web,
-- Общий тег для всех видов терминалов (на будущее)
current window $program == "gnome-terminal" ==> tag program:terminal,
-- Пометить все остальные программы пометить тегами вида program:имя_программы
tag program:$current.program,

-- Классифицировать заголовки Firefox с помощью регулярных выражений. Тут у каждого будут свои шаблоны.
-- Присваивать теги категории web.
current window ($program == "Navigator" && $title =~ /^Gmail.*/) ==> tag web:Gmail,
current window ($program == "Navigator" && $title =~ /.*Google Search.*/) ==> tag web:Google,
current window ($program == "Navigator" && $title =~ /^Twitter.*/) ==> tag web:Twitter,
current window ($program == "Navigator" && $title =~ /.* on Twitter - Iceweasel$/) ==> tag web:Twitter,
current window ($program == "Navigator" && $title =~ /^Springer.*/) ==> tag web:Papers,
current window ($program == "Navigator" && $title =~ /^Wiki - Editing.*/) ==> tag web:Papers,
-- ...
--
current window $program == "Navigator" ==> tag web:$current.title,

-- Теги категории time-of-day для классификации по времени суток
$time >= 2:00 && $time < 8:00 ==> tag time-of-day:night,
$time >= 8:00 && $time < 12:00 ==> tag time-of-day:morning,
$time >= 12:00 && $time < 14:00 ==> tag time-of-day:lunchtime,
$time >= 14:00 && $time < 18:00 ==> tag time-of-day:afternoon,
$time >= 18:00 && $time < 22:00 ==> tag time-of-day:evening,
$time >= 22:00 || $time < 2:00 ==> tag time-of-day:late-evening,

-- Помечать над каким проектом работаю судя по заголовку окна.
-- Присваивать теги категории project.
current window $title =~ m!~/work/projectA! ==> tag project:projectA,
current window $title =~ m!~/work/projectB! ==> tag project:projectB,
-- ...
--

-- Помечать, какой тип текста я редактирую судя по заголовку окна.
-- Присваивать теги категории edit.
current window ($title =~ /^[^ ]+\.c .* - G?VIM.*$/) ==> tag edit:c,
current window ($title =~ /^[^ ]+\.py .* - G?VIM.*$/) ==> tag edit:python,
current window ($title =~ /^[^ ]+\.hs .* - G?VIM.*$/) ==> tag edit:haskell,
-- Когда использую suduedit
current window ($title =~ m!.*\(/var/tmp\) - G?VIM.*$!) ==> tag edit:config,
-- Когда редактирую что-то онлайн в Its All Text
current window ($title =~ m!.*/itsalltext\) - G?VIM.*!) ==> tag edit:itsalltext,

Для отчёта по определённой категории:
$ arbtt-stats -c имя_категории
Для просмотра отчётов по всем категориям:
$ arbtt-stats --each-category
Для ограничения выборки только записями с определённым тегом, например, last-hour, есть опция -o. Всё вместе:
$ arbtt-stats -o last-hour -c program -c edit
Statistics for category program
===============================
_____________Tag_|___Time_|_Percentage_
program:terminal | 29m00s | 48.33
program:gvim | 17m00s | 28.33
program:web | 13m00s | 21.67
program:Pidgin | 1m00s | 1.67

Statistics for category edit
============================
_____________Tag_|___Time_|_Percentage_
edit:itsalltext | 17m00s | 28.33
edit:haskell | 4m00s | 6.67
(unmatched time) | 39m00s | 65.00
В последнем примере я показал примерный вывод программы. Сразу видно, сколько времени за последний час я что-то редактировал и что именно и какие программы использовал. Писал эту заметку, в общем.

Кстати, arbtt есть не только в линуксовых репозиториях, но в скором времени (а может и уже) будет доступна и пользователям Windows.

Некоторые замеченные изъяны: arbtt-stats при печати портит заголовки окон с уникодом (патчем на 20 строк исправляется, должно быть ОК при сборке новым GHC), пока нельзя классифицировать по дням недели или по месяцам, сообщения о синтаксических ошибках в правилах очень невнятны.

Дополнение: замеченные недостатки, не без моего скромного участия, исправлены во время Хакатона в Цюрихе; используйте GHC 6.12 и устанавливайте новую версию 0.5; там всё ОК.

Приятных всем выходных!

18 коммент.:

  1. спасибо за линк на арбтт! у меня сразу появилась идея - а что если ети результаты положить в хамстер, прикинь?! :)
    вот и буг: https://bugzilla.gnome.org/show_bug.cgi?id=608469



    P.S. used translit to write, so pardon the spelling. patches are welcome

    ОтветитьУдалить
  2. Автоматически передавать в хамстер будет, наверное, сложно; arbtt собирает только названия программ и заголовки окон, а как их интерпретировать и определять соответствие задачам (тегам) — это очень специфично для каждого пользователя (разные программы, разные определения «задач», могут быть «перекрывающиеся» задачи).

    ОтветитьУдалить
  3. В последней убунте в репозиториях нету :-(

    ОтветитьУдалить
  4. Ну, значит, будет в следующей, когда они haskell-platform из Debian unstable к себе перетащат.

    ОтветитьУдалить
  5. gertzog,

    Думаю, должно работать; во всяком случае в истории изменений программы есть правки сентября 2009, чтобы собиралась под MacOS. Чтобы проверить, наверное, проще всего поставить Haskell Platform и собрать из исходников (cabal update ; cabal install arbtt).

    ОтветитьУдалить
  6. Есть ещё один удобный способ учёта времени - по рабочим столам. К примеру, если текущум рабочим является 1-й или 3-й, то время проведённое за данными столами плюсуется к одной задаче, если за другим столом (или столами) то к другой. По такому принципу работает программа KArm в KDE.

    Если человек долго отсутствовал, то программа заметит это и предложит 3 варианта:

    1. промотать назад и сделать вид что работа на самом деле "кипела"

    2. промотать назад и отключить таймер (т.е. во время простоя данной задачей я не занимался и сейчас тоже заниматься ей не планирую)

    3. продолжать учет времени с момента побуждения. Т.е. во время отсутствия задачей я не занимался, но вот сейчас пришёл и принятся за работу.

    ОтветитьУдалить
  7. Александр,

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

    ОтветитьУдалить
  8. gertzog, я уточнил у Йоахима, в данный момент arbtt в OS X не работает; однако портировать её в Windows оказалось просто; так что дело за человеком, который знает API OS X, вряд ли это будет сложно.

    ОтветитьУдалить
  9. Спасибо за ссылку на arbtt и комментарии к ней. Давно пытаюсь подобрать приемлимый инструмент для учета своего времени, а то все сложнее становится искать 25-ый час в сутках ;) В выходные начну пробовать arbtt :)

    ОтветитьУдалить
  10. Сергей, в винде программа работает отлично. Радуюсь :) В Ubuntu возникли проблемы с компиляцией связанные с X-ами. Если вам интересно, то могу скинуть лог, например, почтой дабы не загромаждать тут.

    ОтветитьУдалить
  11. Присылайте. Взгляну.

    ОтветитьУдалить
  12. Поставил arbtt 0.4.4-1 из репозиториев Ubuntu 10.04. Взял ваш конфиг. Работу в программках прекрасно тегирует, а вот с заголовками ни в какую, даже когда нет кириллицы в заголовке не добавляет теги.

    ОтветитьУдалить
  13. В 0.4 правила по уникодным заголовкам ещё не должны были работать. Попробуйте сделать правило "tag program:$current.title," и посмотреть, как действительно выглядят сохранённые заголовки. Может регулярное выражение из примера к ним просто не подходит.

    ОтветитьУдалить
  14. Добавил "tag program:$current.title,". Выдает единственный пустой тег: "program:".
    Поставил arbtt (0.5-1) с репозиториев дебиана: http://packages.debian.org/sid/arbtt
    эффект тот же: "program:". Похоже не видит заголовков вообще.

    ОтветитьУдалить
  15. Stasikos4/8/10 08:27

    в 10.04 - есть.
    arbtt:
    Installed: 0.4.4-1
    Candidate: 0.4.4-1
    Version table:
    *** 0.4.4-1 0
    500 http://ua.archive.ubuntu.com/ubuntu/ lucid/universe Packages

    ОтветитьУдалить
  16. В версии 0.4 будут проблемы с русским языком (уникодом).

    Там, где нету, можно поставить через кабал. В последней убунту (10.4) можно поставить ghc6 (6.12.1) и cabal-install. После этого, от обычного пользователя выполнить cabal update, а затем cabal install arbtt. Он скачает и соберёт все зависимости, исполняемые файлы поместит в ~/.cabal/bin (можно добавить в PATH). Для сборки вероятно потребует заголовочные файлы некоторых сишных библиотек.

    ОтветитьУдалить