Управление делами

2013.03.12

Я работаю программистом сразу в нескольких местах, у меня есть куча собственных проектов или проектов, в которые я ввязался, дел по дому и обустройству нашей новой жизни.  Дел так много, что их невозможно удержать в голове; во многих опенсорсных проектах есть свои трекеры, но даже список этих трекеров в голове не удержать, и, конечно, времени на ежедневный их обход нет.  Кроме текущих дел надо ещё не забыть что-то прочитать, посмотреть какой-то фильм.  Чтобы со всем этим справиться, понадобился органайзер.

Я перепробовал много органайзеров с веб-интерфейсами, пробовал разные GUI и консольные программы — всё не то.  Однажды написал утилиту tremor, которая обходит указанные в настройках трекеры и присылает мне на почту перечень задач, которые на мне висят, но приходилось вести отдельный список локальных дел, которые не относятся к программированию.

Однажды я узнал про TaskWarrior (слушая FLOSS Weekly #175), и он оказался как раз тем, что мне нужно.  Это консольный органайзер, который позволяет делить задачи на проекты, управлять приоритетами, метками, зависимостями, откладывать задачи до нужной даты, добавлять к ним комментарии и произвольные атрибуты, выводить самые разные отчёты и отслеживать время, затраченное на каждую задачу (что важно при почасовой оплате труда).  Он много чего ещё умеет, чем я не пользуюсь (вроде синхронизации с удалённой базой), но некоторые функции делают его для меня незаменимым.

Вывод самых важных данных

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

task project:work or start.not:""

Чтобы не печатать получившийся длинный запрос каждый раз, я описал в ~/.taskrc собственный отчёт, который выводится по команде task now:

report.now.description=Running tasks
report.now.columns=id,project,priority,age,description
report.now.filter=project:work or start.not:"" status:pending
report.now.sort=start-,priority-,description+

В большинстве случаев мне интересна именно эта информация, поэтому если я не указываю никаких параметров, скрипт t добавляет за меня параметр "now".  Теперь для вывода всех важных задач мне достаточно выполнить команду t.

Остановка задач при покидании рабочего места

Иногда мне надо быстро отойти, и писать команды для остановки таймера нет времени.  Для этого я создал файл /etc/acpi/local/lid.sh.pre с таким содержимым:

#!/bin/sh
yes | su -c "task start.not: stop" hex

Импорт данных

Компании, с которыми я работаю, используют для постановки задач Мегаплан, TeamLab и RedMine.  Раньше у меня был скрипт, который каждое утро присылал мне список моих задач из всех этих систем.  Это лучше, чем ничего, но гораздо удобнее видеть все задачи в одном месте.  Специально для таких случаев есть сторонняя утилита BugWarrior.  Изначально она поддерживала только распространённые в мире open source системы, но я научил её работать с нужными мне.

Импорт работает просто: для каждой удалённой задачи формируется заголовок, содержащий её удалённый идентификатор, заголовок и ссылку на оригинальный трекер.  Полученная строка используется для локальной идентификации задачи.  Когда задача из удалённой системы исчезает, она считается закрытой.

Список выглядит так:

ID  Project        Pri Age Description                                                                       
174 tycoon         H    1d (bw)Is#2130951 — SEO-рекомендаций .. http://j.mp/asdfg
156 acme           H    2d (bw)Is#5409 — Яндекс.Директ, вывод данных .. http://j.mp/qwerty

Экспорт данных

Любые данные можно получить в формате JSON, что удобно для машинной обработки.  У меня есть скрипт, который выбирает все актуальные задачи из проекта wishlist и размещает их на сайте.

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

Пользовательские атрибуты

Кроме предопределённых свойств пользователь может добавить задачам собственные.  Я использую это, например, для оформления вишлиста.  Для этого нужно в ~/.taskrc я добавил такие строки:

uda.url.type=string
uda.url.label=URL

После этого я добавляю ссылки к задачам таким образом:

t 123 mod url:"http://bit.ly/example"

Эти данные видны при просмотре информации (task info), их можно выводить в списках и они включены в набор данных, получаемых по команде task export.

Другая автоматизация

TaskWarrior сам по себе не умеет запускать пользовательские скрипты в ответ на его действия, но в UNIX это легко решается обёрткой, которая у меня выглядит примерно так:

#!/bin/bash
task $@ && nohup run-parts $HOME/.config/taskwarrior/after.d >/dev/null 2>&1 &

После любой операции запускаются все скрипты из папки after.d, каждый скрипт выполняет одно действие: корректирует метки, публикует вишлист, отправляет время по только что остановленной задаче на внешний трекер (если он есть) и т.п.  Всё это делается в фоне, чтобы не тормозить мои действия в консоли.

Следить за развитием событий можно через RSS ленту или почтовую рассылку.