|
|
Строка 33: |
Строка 33: |
| {{question}} Может посчитать {{bad-words|метрики}}? Ненавистные [[RuPedia:Количество_строк_кода|SLOC]] и иже с ними? | | {{question}} Может посчитать {{bad-words|метрики}}? Ненавистные [[RuPedia:Количество_строк_кода|SLOC]] и иже с ними? |
| Да, такие инструменты есть: | | Да, такие инструменты есть: |
− | * [http://www.statsvn.org/ StatSVN] Примеры: [http://www.statsvn.org/demo/continuum/], [http://www.statsvn.org/demo/jodatime/], [http://www.statsvn.org/demo/ruby/], [http://www.statsvn.org/demo/ant/], [http://www.statsvn.org/demo/synapse/], [http://www.statsvn.org/demo/synapse/], [http://www.statsvn.org/demo/qalab/],… | + | * [http://www.statsvn.org/ StatSVN]. Примеры: [http://www.statsvn.org/demo/continuum/], [http://www.statsvn.org/demo/jodatime/], [http://www.statsvn.org/demo/ruby/], [http://www.statsvn.org/demo/ant/], [http://www.statsvn.org/demo/synapse/], [http://www.statsvn.org/demo/synapse/], [http://www.statsvn.org/demo/qalab/],… |
| | | |
| В зависимости от глубины детализации можно получить: | | В зависимости от глубины детализации можно получить: |
Строка 59: |
Строка 59: |
| * [http://code.google.com/p/codeswarm/ CodeSwarm]. | | * [http://code.google.com/p/codeswarm/ CodeSwarm]. |
| * {{good-words|Самая древняя!}} (год с копейками). | | * {{good-words|Самая древняя!}} (год с копейками). |
− | * Визуализация физической модели {{good-words|«Люди и файлы»}} (на самом деле '''4'''-ре модели: «Simple», «Chaotic», «Maxwell», «Legacy»). | + | * Визуализация физической модели {{good-words|«Люди и файлы»}} (на самом деле '''4'''-ре модели: «Simple», «Chaotic», «Maxwell», «Legacy», но не все они «одинаково полезны», наиболее разумная — «Simple»). |
| | | |
| === Основная идея === | | === Основная идея === |
| | | |
| ** «Люди» не любят друг друга — {{bad-words|отталкиваются!}} | | ** «Люди» не любят друг друга — {{bad-words|отталкиваются!}} |
− | ** «Файлы» тоже {{bad-words|отталкиваются!}} «обратно пропорционально расстоянию» | + | ** «Файлы» тоже {{bad-words|отталкиваются!}} «обратно пропорционально расстоянию». |
| ** «Людей» и «Файлы» {{good-words|притягивает при коммитах}}! | | ** «Людей» и «Файлы» {{good-words|притягивает при коммитах}}! |
| ** «Люди» {{good-words|сближаются из-за совместной работы}} над одними файлами | | ** «Люди» {{good-words|сближаются из-за совместной работы}} над одними файлами |
Строка 75: |
Строка 75: |
| * Цветной пульс проекта в динамике. | | * Цветной пульс проекта в динамике. |
| | | |
− | === Что не хватает? === | + | == Gource == |
| + | === Основная идея === |
| + | |
| + | * Визуализация и {{good-words|структур каталогов}} («облака имен»)! |
| + | * Модель {{good-words|«Пчелы» и «цветы»}}! |
| + | * Видны: |
| + | ** «Горячие зоны». |
| + | ** {{good-words|Кроссфункциональные}} парни. |
| + | ** {{bad-words|Заброшенные}} люди и код. |
| + | |
| + | |
| + | |
| + | |
| + | == Что не хватает? == |
| {{important}} Именно поэтому «самодельных» {{bad-words|визуализаций — почти нет}}! | | {{important}} Именно поэтому «самодельных» {{bad-words|визуализаций — почти нет}}! |
| | | |
Строка 85: |
Строка 98: |
| ** {{good-words|«эволюционные доработки»}} — легко и быстро «править кино». | | ** {{good-words|«эволюционные доработки»}} — легко и быстро «править кино». |
| | | |
− | {{important}} [[#Наш фреймворк|Наше решение]] {{good-words|все это делает}}!
| |
| | | |
− | === Примеры === | + | == Наш фреймворк ShowTeamWork== |
| | | |
− | ==== Bugzilla ====
| + | {{important}} Наше решение {{good-words|все это делает}}! |
| | | |
− | <html><center> | + | А именно: |
− | <object width="640" height="360"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6354663&server=vimeo.com&show_title=1&show_byline=0&show_portrait=0&color=00ADEF&fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=6354663&server=vimeo.com&show_title=1&show_byline=0&show_portrait=0&color=00ADEF&fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="360"></embed></object> | + | * Вытаскивается лог-информация, если запустить в workspace проекта под какой-нибудь из известных VCS — поддерживаются самые распространенные системы контроля версий: <tt>CVS</tt>, <tt>SVN</tt>, <tt>GIT</tt>, <tt>Bazaar</tt>, <tt>Mercurial</tt> (в принципе — можно визуализировать любую активность, хоть торговлю трейдеров). |
− | </center> | + | * Автоматически выбирается набор подкаталогов проекта с наибольшей активностью. |
− | </html>
| + | * Для них генерируется случайная цветовая палитра, с взаимоконтрастными и яркими цветами. |
| + | * При отсутствии «сценария субтитров» — генерируется шаблон-заготовка. |
| + | * При отсутствии аудио сопровождения — предлагает заготовленную музыку в стиле «Ambient» |
| + | * Порождает видео, с длительностью равной аудиозаписи, и накладывает субтитры, вычисляя их из формата «сценария субтитров», где события привязаны к датам. |
| | | |
− | ==== MediaWiki ==== | + | === Примеры === |
| | | |
− | | + | Альбом готовых визуализаций для известных софтверных проектов ( |
− | == Gource ==
| + | <tt>bugzilla</tt>, |
− | === Основная идея ===
| + | <tt>bzr-svn</tt>, |
− | | + | <tt>codeswarm</tt>, |
− | * Визуализация и {{good-words|структур каталогов}} («облака имен»)!
| + | <tt>ffmpeg</tt>, |
− | * Модель {{good-words|«Пчелы» и «цветы»}}!
| + | <tt>freemind</tt>, |
− | * Видны:
| + | <tt>git</tt>, |
− | ** «Горячие зоны».
| + | <tt>gource</tt>, |
− | ** {{good-words|Кроссфункциональные}} парни.
| + | <tt>inkscape</tt>, |
− | ** {{bad-words|Заброшенные}} люди и код.
| + | <tt>mediawiki</tt>, |
− | | + | <tt>mercurial</tt>, |
− | == Наш фреймворк ==
| + | <tt>mplayer</tt>, |
| + | <tt>postgres</tt>, |
| + | <tt>subversion</tt>, |
| + | <tt>viewvc</tt>) можно посмотреть [http://vimeo.com/album/160744 здесь]. |
| | | |
| === Мы используем === | | === Мы используем === |
Строка 119: |
Строка 137: |
| * [http://ffmpeg.org/ FFmpeg] (LGPL or GPL). | | * [http://ffmpeg.org/ FFmpeg] (LGPL or GPL). |
| | | |
− | А также несколько треков свободно доступной электронной музыки от [http://tunguskagrooves.com/ Tunguska Music Society] (License: Creative Commons). | + | А также несколько треков свободно доступной электронной музыки от [http://tunguskagrooves.com/ Tunguska Music Society] (<tt>License: Creative Commons</tt>). |
| Если вы поленитесь искать музыку — мы сделаем клип на базе случайного трека (несколько треков идут в комплекте). | | Если вы поленитесь искать музыку — мы сделаем клип на базе случайного трека (несколько треков идут в комплекте). |
| Бесплатно и патриотично! | | Бесплатно и патриотично! |
| Если хотите публиковать свои ролики, напоминаем о пока еще существующих цифровых правах на музыку и рекомендуем использовать только свободно доступную музыку — [http://www.jamendo.com/en/tag/ambient тут огромный выбор музыки в стиле Ambient]. | | Если хотите публиковать свои ролики, напоминаем о пока еще существующих цифровых правах на музыку и рекомендуем использовать только свободно доступную музыку — [http://www.jamendo.com/en/tag/ambient тут огромный выбор музыки в стиле Ambient]. |
| + | |
| + | === Быстрый старт === |
| + | |
| + | {{caution}} Для Windows-пользователей. Linux-пользователи, думаю, поймут сами, что и как. |
| + | |
| + | Скачайте [http://code.google.com/p/showteamwork/downloads/ дистрибутив], распакуйте куда-нибудь его. |
| + | |
| + | |
| + | Зайдите в каталог проекта, т.е. воркспейс под одной из систем контроля версий ( <tt>CVS</tt>, <tt>SVN</tt>, <tt>GIT</tt>, <tt>Bazaar</tt>, <tt>Mercurial</tt>), причем не обязательно верхний уровень — можно на два-три уровня ниже, и вызовите |
| + | <tt>showteamwork.exe</tt>, и отправляйтесь пить кофе. |
| + | |
| + | В конце работы вы получите в каталоге, в котором его запустили пару видеофайлов (с <tt>codeswarm</tt> и <tt>gource</tt> визуализациями, по именам все будет понятно), а также вспомогательные файлы настроек и аудио, с префиксом <tt>stw-</tt>. |
| + | |
| + | Далее, вы сможете редактировать эти файлы, подбирая оптимальные настройки, подходящую музыку, и редактируя историю проекта в субтитрах, и по окончании редактирования, перезапускайте <tt>showteamwork.exe</tt>. |
| + | |
| + | Пересчет будет относительно экономичным — например, если вы меняли только параметры относящиеся к <tt>codeswarm</tt>-визуализации, то gource-визуализация пересчитыватся не будет, а если правили только субтитры — то будет выполнятся только наложение субтитров, без вызова <tt>gource</tt> или <tt>codeswarm</tt>. |
| + | |
| + | Более детально, схема генерации описана ниже. |
| | | |
| === Схема генерации === | | === Схема генерации === |
Строка 128: |
Строка 164: |
| <graph> | | <graph> |
| digraph G{ | | digraph G{ |
− | rankdir=LR | + | rankdir=TB |
| | | |
| edge [color=blue] | | edge [color=blue] |
Строка 134: |
Строка 170: |
| node [style=filled shape=note] | | node [style=filled shape=note] |
| node [fillcolor="goldenrod1" shape=box3d] | | node [fillcolor="goldenrod1" shape=box3d] |
− | "Лог-файл" | + | workspace [label="Workspaсe-каталог \n под VCS" shape=folder] |
| + | svcslog [label="Входной лог-файл: \n cvs.log, svn.log, git.log, \n bzr.log, hg.log, activity.xml"] |
| + | getlog [label="Генератор лога: \n «getlog.py»" URL="#getlog.py"] |
| + | |
| + | |
| | | |
| node [fillcolor=aliceblue shape=note] | | node [fillcolor=aliceblue shape=note] |
− | "Музыка"
| |
− | "Настройки"
| |
− | "Сценарий"
| |
| | | |
− | node [fillcolor="#0084FF" shape=egg] | + | svcslog -> vcslog0 |
− | "Кеш-данные" "Субтитры" | + | vcslog0 -> vcslog [label="есть"] |
| + | vcslog1 -> vcslog [label="есть"] |
| + | vcslog2 -> vcslog [label="есть"] |
| + | vcslog0 -> vcslog1 -> vcslog2 [label="нет" color=red] |
| + | getlog -> vcslog1 |
| + | workspace -> vcslog2 |
| | | |
| + | vcslog0 [label="лог-файл"] |
| + | vcslog1 [label="лог-файл"] |
| + | vcslog2 [label="лог-файл"] |
| + | vcslog [label="Лог-файл: \n cvs.log, svn.log, git.log, \n bzr.log, hg.log, activity.xml"] |
| + | |
| + | node [fillcolor="#0084FF" shape=egg] |
| + | scenario [label="История \n stw-scenario.txt"] |
| + | audio [label="Музыка \n stw-audio.mp3"] |
| + | config [label="Настройки \n stw-config.py"] |
| + | filters [label="Фильтры \n stw-filter.py"] |
| + | |
| + | activity [label="Обработанная \n активность\n activity.xml"] |
| + | |
| + | filters -> activity |
| + | vcslog -> activity |
| + | |
| + | cache [label="Кеш-данные"] |
| | | |
− | "Музыка" -> "Кеш-данные" [label="Задает длительность"]
| |
| | | |
| "Визуализация" [fillcolor=yellow shape=diamond] | | "Визуализация" [fillcolor=yellow shape=diamond] |
− | "Настройки"->"Визуализация" | + | audio -> "Визуализация" [label="Задает \n длительность"] |
− | "Лог-файл" ->"Визуализация" | + | config -> "Визуализация" [label="Настройки \n визуализации"] |
| + | activity -> "Визуализация" |
| | | |
− | "Визуализация" -> "Кеш-данные" | + | "Визуализация" -> cache |
| | | |
| | | |
− | "Сценарий" -> "Субтитры" | + | scenario -> "Субтитры" |
| + | audio -> "Субтитры" [label="Задает \n длительность"] |
| | | |
− | "Субтитры" -> "Результат" | + | "Субтитры" -> result |
− | "Кеш-данные" -> "Результат" | + | cache -> result |
| | | |
− | "Результат" [fillcolor=gold shape=house] | + | result [label="Результат: \n project-codeswarm-xxx.avi \n project-gource-yyy.avi" fillcolor=gold shape=house] |
| } | | } |
| </graph> | | </graph> |
Строка 165: |
Строка 225: |
| Упрощенная схема генерации представлена выше. | | Упрощенная схема генерации представлена выше. |
| | | |
− | Важно знать следующее:
| + | {{note}} Единственное необходимое — история проекта, в виде лог-файла, файла-генератора лог-файла, или просто workspace-проекта под одно из известных VCS, у которое лог-файл можно запросить. |
| | | |
− | {{note}} Единственный необходимый входной файл — лог:
| + | Будучи запущенной <tt>ShowTeamWork</tt> без дополнительных файлов автоматически проанализирует лог, и |
− | cvs log > cvs.log
| + | * выделит наиболее «активные» каталоги |
− | или
| + | |
− | svn --verbose log > svn.log
| + | |
− | | + | |
− | {{note}} Будучи запущенной <tt>ShowTeamWork</tt> без дополнительных файлов автоматически проанализирует лог, и
| + | |
− | * выделит наиболее крупные каталоги | + | |
| * подберет для них случайную контрастную палитру цветов | | * подберет для них случайную контрастную палитру цветов |
− | * сгенерирует файл настроек | + | * сгенерирует файлы настроек |
| * предложит одну из заготовленных<ref>Свободный, выпущенных под лицензией Creative Commons</ref> музыкальных дорожек в стиле ''Ambient''. | | * предложит одну из заготовленных<ref>Свободный, выпущенных под лицензией Creative Commons</ref> музыкальных дорожек в стиле ''Ambient''. |
| | | |
− | == Где скачать? == | + | А теперь поясним, зачем остальные сложности. |
| + | |
| + | === getlog.py === |
| + | При отсутствии известного системе логфайла, <tt>ShowTeamWork</tt> пытается вызвать скрипт <tt>getlog.py</tt>, где вы пропишете, что и откуда надо тянуть. Например, вы собираетесь визуализировать историю большого проекта, у которого свой репозиторий, независимый от вашего проекта по его визуализации. |
| + | <tt>getlog.py</tt> — [[Python]]-скрипт, он мультиплаформенный, в отличие от <tt>bat</tt>-файлов или <tt>shell</tt>-скриптов, и собственно не требует знания [[Python]] — для всех проектов в подкаталоге <tt>samples</tt> есть скрипт <tt>getlog.py</tt>, так что при необходимости, просто скопируйте скрипт, вытаскивающий лог из нужной вам системы контроля версий (в каталоге <tt>samples</tt> представлены все поддерживаемые типы VCS). |
| + | |
| + | В скрипте, вы можете указать, например, параметры ограничивающие дату выборки лог-файла (например, только «последний спринт»). |
| + | |
| + | <code-python> |
| + | import os |
| + | import datetime |
| + | |
| + | begindate=(datetime.date.today()-datetime.timedelta(days=14)).strftime("%Y-%m-%d") |
| + | os.system( |
| + | """ |
| + | svn log --verbose --revision "{%(begindate)s}:HEAD" http://svn.wikimedia.org/svnroot/mediawiki/ >svn.log |
| + | """ % vars()) |
| + | </code-python> |
| + | |
| + | Или вы можете написать свой скрипт, который, например, будет доставать данные из вики-системы, трекера-задач, системы документооборота или любой системы, подразумевающей командную работу. |
| + | |
| + | После работы этого скрипта, ожидается, что в каталоге будет один из следующих файлов: |
| + | |
| + | ;cvs.log: получаемый командой |
| + | cvs log |
| + | ;svn.log: получаемый командой |
| + | svn log -v |
| + | ;bzr.log: получаемый командой |
| + | bzr log -v |
| + | ;git.log: получаемый командой (без шуток и одной строкой): |
| + | git log --name-status |
| + | --pretty=format:"%n------------------------------------------------------------------------%nr%h | %ae | %ai (%aD) | x lines%nChanged paths: |
| + | ;hg.log: получаемый командой |
| + | hg -v log |
| + | ;activity.xml: Стандартный XML-формат представления активности (см. [[#activity.xml]]). |
| + | |
| + | Если <tt>getlog.py</tt> не обнаружено, или он не выдал ожидаемые лог-файлы, |
| + | <tt>ShowTeamWork</tt> пытается получить их самостоятельно, ожидая, что ее запустили в каталоге проекта под какой-нибудь системой контроля версий. |
| + | <tt>ShowTeamWork</tt> смотрит, нет ли одного из следующих подкаталогов (в каталоге запуска или на один-два уровня выше) |
| + | <tt>CVS</tt>, <tt>.svn</tt>, <tt>.bzr</tt>, <tt>.git</tt>, <tt>.hg</tt> — и обнаружив таковой, пытается получить лог-файл от соответствующей системы контроля версий (должна быть установлена и «в путях»). |
| + | |
| + | === activity.xml === |
| + | |
| + | Стандартный XML-формат представления активности (когда, кто, с чем, что сделал): |
| + | <code-xml> |
| + | <?xml version="1.0"?> |
| + | <file_events> |
| + | <event |
| + | date="1263155767000" |
| + | author="rotem" |
| + | action="A" |
| + | filename="/trunk/phase3/languages/messages/MessagesEn.php" |
| + | comment="Localization update for he, and whitespace fix in en.. " /> |
| + | <event |
| + | date="1263155767000" |
| + | author="rotem" |
| + | action="M" |
| + | filename="/trunk/phase3/languages/messages/MessagesHe.php" |
| + | comment="Localization update for he, and whitespace fix in en.. " /> |
| + | </file_events> |
| + | </code-xml> |
| + | |
| + | Т.е. все просто — последовательность <tt>event</tt> вложенных в <tt>file_events</tt>, а атрибуты |
| + | <tt>event</tt> следующие: |
| + | ;date: Время события в миллисекундах от стандартной компьютерной эпохи (1970…). |
| + | ;author: Автор действия |
| + | ;filename: путь |
| + | ;action: (необязательно) |
| + | :;A: добавление |
| + | :;M: модификация |
| + | :;D: удаление |
| + | ;comment: (необязательно) — комментарий |
| + | |
| + | ==Инсталляция == |
| | | |
| Проект (исходники и бинарники) хостится на Google Code — http://code.google.com/p/showteamwork/. | | Проект (исходники и бинарники) хостится на Google Code — http://code.google.com/p/showteamwork/. |
Строка 188: |
Строка 316: |
| | | |
| Под Linux нужно установить (из исходников или пакетами — неважно): | | Под Linux нужно установить (из исходников или пакетами — неважно): |
− | * ffmpeg | + | * <tt>ffmpeg</tt> |
− | * mencoder (из проекта <tt>mplayer</tt>) | + | * <tt>mencoder</tt> (из проекта <tt>mplayer</tt>) |
− | * python (для надежности версии 2.5 или 2.6). | + | * <tt>python</tt> (для надежности версии 2.5 или 2.6). |
− | * gource http://code.google.com/p/gource/ | + | * <tt>gource</tt> http://code.google.com/p/gource/ |
| и сделать, чтобы эти утилиты были прописаны в путях. | | и сделать, чтобы эти утилиты были прописаны в путях. |
| | | |
Строка 200: |
Строка 328: |
| == Контакты == | | == Контакты == |
| * [http://belonesox.moikrug.ru Стас Фомин]. | | * [http://belonesox.moikrug.ru Стас Фомин]. |
− | Но скоро планирую причесать код и опубликовать по-человечески, на хост-фабрике open-source проектов (скорее всего Google Code). | + | |
| + | |
| + | |
| + | == Резюме == |
| + | |
| + | * Это забавная игрушка. |
| + | * Пользоваться ей можно сходу, не приходя в сознание. |
| + | * Но в ней куча настроек и прочих «степеней свободы» — подбор музыки, движка визулизации, параметров, палитры и т.п. — так что изготовление роликов визуализации более-менее искусство. |
| + | * Результаты полезны для: |
| + | ** Рекламы проекта: |
| + | *** Представления проекта на конференции (очень сейчас модно, см. например [http://vimeo.com/6553097 выступление об проекте Debian Installer]). У вас это займет всего минуты четыре, а аудитория проснется и заинтересуется. |
| + | *** Показа проекта без раскрытия кодов, при хедхантинге. Длинные, унылые, проекты с ''legacy''-кодом будут даже смотреться интересней новых и перспективных проектов. И возможно тут предпочтительней использовать Codeswarm-визуализацию. |
| + | ** Показ работы в рамках SCRUM-демонстрации (или чего-то подобного), для донесения идеи — «мы тут вкалываем!» для заказчиков и прочих стейкхолдеров. Когда показывается короткая работа (неделя-месяц) — лучше использовать Gource-визуализацию. |
| + | * Ну и полезно посмотреть на свой или чужой проект, для быстрого и целостного гештальт-восприятия (не затухает ли проект, сколько народу вкладывается в «ядре», и т.п.). |
| + | |
| + | В принципе, наверное все сказано, на всякий случай, вдруг кому пригодится — короткий доклад о ShowTeamWorks на [[AgileDays-2009_(Technical_excelence)|конференции AgileDays-2009]] (особого ничего нового, по сравнению с написанным выше). |
| + | <html><center> |
| + | <object width="640" height="512"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=8246851&server=vimeo.com&show_title=1&show_byline=0&show_portrait=0&color=00ADEF&fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=8246851&server=vimeo.com&show_title=1&show_byline=0&show_portrait=0&color=00ADEF&fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="512"></embed></object> |
| + | </center></html> |
| | | |
| == Примечания == | | == Примечания == |
При грамотном процессе разработки, с применением средств групповой работы, таких, как:
Есть альтернативный способ «увидеть лес за деревьями» и при этом выжать краткую информацию по процессу — Визуализация. В динамике!
В конце работы вы получите в каталоге, в котором его запустили пару видеофайлов (с codeswarm и gource визуализациями, по именам все будет понятно), а также вспомогательные файлы настроек и аудио, с префиксом stw-.
Далее, вы сможете редактировать эти файлы, подбирая оптимальные настройки, подходящую музыку, и редактируя историю проекта в субтитрах, и по окончании редактирования, перезапускайте showteamwork.exe.
Пересчет будет относительно экономичным — например, если вы меняли только параметры относящиеся к codeswarm-визуализации, то gource-визуализация пересчитыватся не будет, а если правили только субтитры — то будет выполнятся только наложение субтитров, без вызова gource или codeswarm.
Более детально, схема генерации описана ниже.
Упрощенная схема генерации представлена выше.
А теперь поясним, зачем остальные сложности.
В скрипте, вы можете указать, например, параметры ограничивающие дату выборки лог-файла (например, только «последний спринт»).
Или вы можете написать свой скрипт, который, например, будет доставать данные из вики-системы, трекера-задач, системы документооборота или любой системы, подразумевающей командную работу.
После работы этого скрипта, ожидается, что в каталоге будет один из следующих файлов:
Стандартный XML-формат представления активности (когда, кто, с чем, что сделал):
Т.е. все просто — последовательность event вложенных в file_events, а атрибуты
event следующие:
и сделать, чтобы эти утилиты были прописаны в путях.
Чуть позже, мы подробно распишем здесь назначение каждой настройки.
В принципе, наверное все сказано, на всякий случай, вдруг кому пригодится — короткий доклад о ShowTeamWorks на конференции AgileDays-2009 (особого ничего нового, по сравнению с написанным выше).