10 February 2012

Личные цели: контроль версий и красивая распечатка одним щелчком

GTD
Sandbox
Приветствую уважаемое сообщество! Как многие успели заметить, прошлый год давно кончился — успешно??? Чтобы с уверенностью судить об этом каждому лично для себя, полезно обзавестись "системой отчетности". Или, по выражению классика, PAS. В более ранних статьях того же автора приводятся обоснование, пример использования и обсуждение практик. В частности, высказана критика в адрес большинства программных инструментов для планирования (так называемый "hi-tech" самоменеджмента). Основная претензия — нехватка гибкости. В этом, преимущество за "mid-tech" и "low-tech" средствами (notepad, карандаш и бумага, пластиковые файлы и байндеры на кольцах — продолжите сами...).


Зачем и как


Ставя цели и составляя планы, хочется работать с цифровыми документами — легче править. (А для актуальности, переписывать цели и планы советуют часто!) С другой стороны, в бумажной форме — удобнее воспринимать, перечитывая "для вдохновения". Значит — распечатывать! На печати желательно иметь читабельные заголовки, списки-отступы и т.д., но заниматься этим на ходу — значит отвлекать себя от главного. В такой ситуации, логическое форматирование — привлекательное решение (wiki, TeX и т.п.). Правда, придется поступиться принципом WYSIWYG… Зато, формат простого текста дает еще одну ценную возможность: держать исходники под контролем версий, подробнее об этом — ниже. И конечно, весь набор из полудюжины-десятка документов (причем, у каждого он свой!) нужно обрабатывать — например, отсылать на распечатку — пакетом, а не возиться по отдельности.

Что получится


Теперь, когда ожидания в целом очерчены, можно задуматься над реализацией. Обойдемся всего лишь стандартными средствами, главное — в нужном сочетании! В результате, из набора несложных инструментов получим систему и функциональную, и гибкую. Кроме того, собрав "на коленке" нечто немудрящее, но донельзя удобное, испытываешь неповторимое DIY-чувство. Инструкции ниже и 40 минут времени — и вы счастливый обладатель "персональной системы отчетности" с головокружительными возможностями:
  • Многостраничный интерфейс с настраиваемыми закладками: цели на жизнь-год-квартал-месяц по отдельным документам в формате простого текста.
  • Логическое форматирование текста: заголовки, списки, жирный и курсив… (синтаксис wiki).
  • Отслеживание изменений между версиями документов (средствами SVN).
  • Просмотр в браузере, распечатка всех страниц одним щелчком.
  • Для поклонников бумажных органайзеров БОНУС!!! Календарь (на любой месяц) и распорядок (семь дней) — бланки составляются сами!

Цель — заманчива и притягательна, так что — поехали!

1. Редактирование в Notepad++


Все, кто еще не пользуется — скачиваем! Главный аргумент "за" — многодокументный интерфейс с закладками. Еще из хорошего — много настроек на любой вкус. Из них одну нужно включить обязательно:
Settings > Preferences > New Document > Encoding > "UTF-8 without BOM"

Это нужно, чтобы правильно отрабатывал транслятор в html.
Создадим отдельные файлы для целей/планов на разные сроки, например:
  1. формулировка миссии;
  2. долгосрочные цели (3-10 лет);
  3. цели на ближайшие 18 месяцев;
  4. цели на квартал;
  5. план на квартал;
  6. цели и план на месяц.

Содержание файлов, конечно, индивидуально. Примеры структурирования текста (заголовки, списки, таблицы) можно посмотреть в Приложениях A, B и C.

2. Отслеживание изменений при помощи TortoiseSVN


Использовать контроль версий данных можно, например, так. Начало месяца — поставлены цели, сохранена версия. При каждом пересмотре с распечаткой — сохранение отдельной версии. Конец месяца — заменяем в списках дефисы (-) на плюсы (+), если цель достигнута, и сохраняем (можно без распечатки). Цели на следующий месяц набираем в том же файле — распечатка, сохранение. Так получится, что позже можно припомнить, какие цели ставились, как изменялись и были ли достигнуты.
Для начала создадим структуру каталогов и запишем в них исходные текстовые файлы (созданные в Notepad++, чтобы кодировка была — UTF-8). Структура, например, такая:

[PurposeMissionGoals]
    |--[html]
    |--[tools]
    |--1_Slogans.txt
    |--2_LongTermGoals.txt
    |--3_MidTermGoals.txt
    |--4_QuarterlyGoals.txt
    |--5_QuarterlyPlan.txt
    |--6_MonthlyGoalsAndPlan.txt

Дальше — что кому больше по вкусу. Можно импортировать данные в централизованный репозиторий (если уже есть поднятый сервер), а можно — создать репозиторий локально и импортировать туда. На всякий случай (вдруг и гуманитариям статься пригодится), второй вариант — подробнее.
  1. Установить TortoiseSVN — это клиент для системы контроля версий, а в нашем случае — также и сервер. После установки в контекстном меню проводника появляется пункт TortoiseSVN.
  2. Создать каталог, например, D:\planning\PurposeMissionGoalsRepository. Здесь будут храниться данные. Щелкнуть на этом каталоге правой кнопкой, выбрать TortoiseSVN > Create repository here.
  3. Щелкнуть правой на каталоге PurposeMissionGoals с исходной структурой, выбрать TortoiseSVN > Import.... В поле "Url of repository" указать (для этого примера): file:///D:/planning/PurposeMissionGoalsRepository. "OK", теперь данные сохранены, и PurposeMissionGoals можно удалить.
  4. Создать (в любом месте на диске) "рабочий каталог", например PurposeMissionGoalsWorkingDirectory. Щелкнуть на нем правой кнопкой, выбрать SVN Checkout.... В уже знакомом поле "Url of repository" указать тот же путь: file:///D:/planning/PurposeMissionGoalsRepository. "OK", теперь данные скопированы для работы, изменения из рабочего каталога можно сохранять в репозиторий по мере надобности — ничего не пропадет!

И снова же, на всякий случай, минимальный набор команд SVN на каждый день:
  • Check for modifications
    Просмотреть список файлов, измененных в данном рабочем каталоге.
  • Diff
    Просмотреть изменения по тексту конкретного файла. (Также, двойным щелчком из списка файлов.)
  • Revert...
    Перезаписать файл из рабочего каталога его старой версией из репозитория — изменения будут потеряны!!!
  • Commit...
    Сохранить все изменения данного каталога или конкретный объект (файл, каталог) в репозиторий.
  • Show log
    Просмотреть список коммитов, касающихся данного каталога или конкретного объекта.
  • Update [to revision...]
    Привести рабочий каталог в соответствие с состоянием репозитория — либо в его последней версии, либо на определенный момент.

3. Из wiki в html через pandoc


Исходные файлы можно превратить в веб страницы и затем просматривать в браузере. (Оттуда же будем и распечатывать, об этом — ниже.) Для конвертации форматов разметки есть замечательная утилита — скачиваем и устанавливаем.

Мастер установки заканчивается страницей "Select Additional Tasks". На ней — только флажок "Add application directory to your path". Его следует оставить включенным. Тогда команда pandoc будет доступна из командной строки, и ее можно использовать в скрипте. Файл скрипта поместим в каталог PurposeMissionGoals\tools, если следовать предложенной выше структуре.

Скрипт можно написать по-разному. Для Виндоуз подойдет самое простое (.bat), а кросс-платформенным вариантом пусть будет Питон. К слову, для генерирования бланка календарного графика (см. Приложение D) Питон все равно понадобится, так что есть смысл установить, если еще не установлен. (Чтобы проверить, можно на системном диске поискать каталог установки, например C:\Python27.)

Если следующий текст сохранить в файл PurposeMissionGoals\tools\generate_html.py, то его запуск будет приводить к появлению в каталоге PurposeMissionGoals\html набора веб страниц, соответствующих текстовым исходникам из каталога PurposeMissionGoals.
# ...\PurposeMissionGoals\tools\generate_html.py

import os, string, shlex, subprocess, sys

toolDir = os.path.dirname(sys.argv[0])
os.chdir(toolDir)

for p in os.listdir('..'):
    (name, ext) = os.path.splitext(p)
    if ext == '.txt' :
        commandLine = ('pandoc --from markdown --to html --standalone -o ../html/%s ../%s'
                       % (name + '.html', name + '.txt') )
        args = shlex.split(commandLine)
        subprocess.Popen(args)

А вот — все же вариант для Виндоуз без Питона:
@REM ...\PurposeMissionGoals\tools\generate_html.bat

FOR /F "delims=. tokens=1" %%A IN ('dir .. /B *.txt') ^
DO pandoc --from markdown --to html --standalone -o ..\html\%%A.html ..\%%A.txt

Таким образом, "цикл разработки" будет выглядеть следующим образом:
  1. Редактировать .txt файлы из PurposeMissionGoals.
  2. Запустить generate_html.py из PurposeMissionGoals\tools.
  3. Открыть .html страницы из PurposeMissionGoals\html и просмотреть результаты.
  4. Возврат к пункту 1.

Выполнение пункта 2 можно настроить при нажатии клавиши F5 из Notepad++. А пункт 3 уже ко второй итерации сводится к переключению на браузер и обновлению страницы. В следующем разделе — добавим еще одно небольшое удобство при просмотре.

4. Просмотр страниц: Firefox плюс Tab Mix Plus


Чтобы всякий раз открывать весь набор документов целиком, можно сохранить окно браузера с открытыми вкладками. Плагин, который обеспечивает эту возможность, не нуждается в рекламе.
Однажды выбрать Tools > Session Manager > Save This Window..., и нужные документы всегда будут на расстоянии щелчка. Осталось обеспечить ту же легкость при отправке на печать — и дело сделано!

5. Пакетная распечатка из Firefox с помощью UniversalPrint


Чтобы вывести на печать все результаты разом, пригодится этот плагин. Название следующего пункта меню говорит само за себя:
File > Universal Print > Print All Tabs

При распечатке встретилась только одна тонкость: чтобы был надлежащий вид у таблиц с цветной фоновой заливкой (см. Приложение C), нужно включить следующую опцию:
File > Page Setup > "Print Background (colours & images)"

Итого


Ценой всех трудов, получили систему простую, как табуретка — и тоже на четырех ножках:
  1. Конвертация формата разметки.
  2. Версионирование.
  3. Просмотр в сохраняемом окне браузера.
  4. Распечатка всех страниц.



Задача решена? Решена. Гибкость? Поменять набор документов, поменять внешний вид, подключить источник данных? Да пожалуйста — все, на что сноровки хватит! Вот уж воистину, "если бы люди действительно умели пользоваться find, grep и awk, — тысячи прикладных программ так и не были бы написаны". (с)

Приложение A. Пример форматирования списка целей



<!--2_LongTermGoals.txt-->

+6 месяцев (июль 2012)
========================

* Цели на полгода...

* ...

+1 год (февраль 2013)
=====================

* Цели на год...

* ...

+5 лет (2017)
=============

* Цели на пятилетку!!!

* ...

+10 лет (2022)
==============

* Цели на десятилетие...

* ...

Приложение B. Слоганы (mission, purpose) — выравнивание по центру


<!--1_Slogans.txt-->

<table cellspacing="0" cellpadding="5" width="100%" border="0">
<tr><td align=CENTER>
СМЫСЛ
=====
</td></tr>
<tr><td align=CENTER>
AKA "Purpose" -

&#45; чем (и зачем) я занимаюсь на этой земле

(вероятно, останется в общем неизменным до конца жизни).

</td></tr>
<tr><td align=CENTER>
ЦЕЛЬ
====
</td></tr>
<tr><td align=CENTER>
AKA "Mission" -

&#45; долгосрочная крупная цель

(когда будет достигнута, ее сменит другая).
</td></tr>
</table>

Приложение C. Пример таблицы целей по категориям


<!--4_QuarterlyGoals.txt-->

Ноябрь 2011 - декабрь 2011: цели
================================

<table cellspacing="0" cellpadding="5" width="100%" border="0">
<tr> <td bgcolor="#FFFF80">
Имущество
---------
</td>
<td width="100%" valign=TOP>

* Техника:
    - ... ;
    - ... .

* Обстановка:  ... .

</td></tr>
<tr><td bgcolor="#FF8080">
Социальность
------------
</td>
<td width="100%" valign=TOP>

* Спорт:  ... .

* Общение:  ... .

</td></tr>
<tr><td bgcolor="#80FF80">
Здоровье
--------
</td>
<td width="100%" valign=TOP>

1. Анализы.

2. Профилактика.

</td></tr>
<tr><td bgcolor="#8080FF">
Профессия
---------
</td>
<td width="100%" valign=TOP>

* Работа:  ... .
* Удаленный проект: ... .
* Хобби:  ... .

</td></tr>
</table>

Приложение D. Бланк календаря на любой месяц


Чтобы можно было в любой момент распечатать листок календаря формата A4 (на этот или на следующий месяц), сделаем несколько дополнений. В структуре каталогов:

[PurposeMissionGoals]
    |-- ...
    |--[schedules]
    |-- ...

В каталоге tools — новые скрипты:
  • htmlCalendar.py (чтобы скачать — щелкнуть по надписи [calendar_python.zip])
  • generate_calendar.py
  • generate_calendar_next.py

Содержание "генерирующих" скриптов приведено ниже. Веб страницы, которые появляются в результате их работы, нужно распечатывать в "альбомной" ориентации бумаги:
File > Page Setup... > "Landscape"

# ...\PurposeMissionGoals\tools\generate_calendar.py

import datetime
import time

import htmlCalendar

def main(year, month):
    myCal = htmlCalendar.MonthlyCalendar(year, month)

    # Customize calendar appearance.
    myCal.offset = 2                        # start the week on Monday

    scale = 6.0                             # make the calendar big
    myCal.dFontSize *= scale
    myCal.tFontSize *= scale / 2.0          # scale titles almost proportionally
    myCal.hFontSize *= scale / 2.0
    myCal.wFontSize *= scale / 2.0

    myCal.tdBorderColor = '#FFFFFF'         # don't highlight today's day
    myCal.weekNumbers = 1                   # view week numbers: 1 = yes, 0 = no

    brightness = 0xCC                       # print day numbers in gray
    fontColor = "#%X%X%X" % (brightness, brightness, brightness)
    myCal.dFontColor = fontColor
    myCal.saFontColor = fontColor
    myCal.suFontColor = fontColor

    # Name the generated file by month.
    htmlName = "../schedules/MonthlySchedule%s.html" % datetime.date(year, month, 1).strftime('%b%y')

    # Save the result to disk.
    htmlFile = open(htmlName, 'w')
    htmlFile.write(myCal.create())
    htmlFile.close()

if __name__ == "__main__":
    import sys
    year = time.localtime().tm_year
    month = time.localtime().tm_mon

    if len(sys.argv) > 1 :
        year = sys.argv[1]
        month = sys.argv[2]

    main(year, month)

# ...\PurposeMissionGoals\tools\generate_calendar_next.py

import time

import generate_calendar

# Get current month.
now = time.localtime()
year = int(now.tm_year)
month = int(now.tm_mon)

# Advance to the next month.
if month == 12 :
    ++year

month %= 12
month += 1

# Generate calendar for the next month.
generate_calendar.main(year, month)

Приложение E. Распорядок дней недели


Если график плотный, и назначения нужно расписывать с точностью до часов на неделю вперед, пригодится бланк соответствующего формата. Вообще говоря, бумага здесь — уже вчерашний день, многие пользуются календарем от Google (кнопка "Неделя"), кому-то удобнее все "жесткие" назначения держать в мобильном или Outlook-е. А для других ничто не заменит очарования карандаша с ластиком — быстро, наглядно… а когда неделя заканчивается, из напряженного графика можно сложить самолетик.

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

Преимущество Excel-я в том, что можно вырезать и вставлять ячейки, не нарушая формул. Все работает, а выглядит — уже неповторимо (и удобно). При этом снова встретилась тонкость при распечатке — если вдруг после переделок со страницы пропадает половина ячеек по правой стороне, нужно подправить вот эту настройку (в OpenOffice Calc):
Формат > Диапазоны печати > Изменить...

В принципе, можно и электронную таблицу распечатывать автоматически, а текущую дату вводить программно — например, из скрипта на Питоне. Пусть это останется упражнением для читателя.
Tags:gtdцелеполаганиеSteve Pavlinanotepad++wikipython scriptpandocsvnfirefox plugin
Hubs: GTD
+5
2.5k 46
Comments 19