2013-05-23

Про коллективное общение

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

2013-05-15

Концепция Пространства-Времени

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

Во сколько лет человек осознает и начинает оперировать этими понятиями? Сами понятия можно узнать очень рано (в детском саду), но начать свободно оперировать ими - сильно позже, в школе. Можно даже нарисовать карту знаний как в цивилизации: числа, десятичная система счисления, арифметика, время, карта - сложно отсчитывать время и пройденное расстояние, если не можешь вычесть два числа в уме.

Интересно, насколько пониманию абстракций помогают реальные предметы. Например счетчик из магнитофона пониманию десятичной системы.

Сначала человек понимает числа в пределах десяти, потом сотни, потом понимает позиционный принцип заложенный в систему счисления. Cо временем граница переполнения для различных объектов растет: метры превращаются в километры, секунды в года. Но всё равно, у всех есть определенная граница, после которой наступает "много".

Этологический эксперимент

Летом, дядька собирается приехать с сыном в гости. Шестилетнему братану предстоит преодолеть больше тысячи километров в течении суток.

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

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

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

Интересное наблюдение

Когда пришел в книжную лавку, на самых козырных местах были сонники, гадалки, энергетика, лечение всякой магией. Атлас (офигенный, кстати) был на такой высоте, что я его не разглядел, а продавец полез за стулом, чтобы его достать.

2013-05-07

Топологическая сортировка репозитория

Abstract

В систему контроля версий mercurial версии 2.6 [1] был добавлен новый алгоритм сортировки closesort в команду convert, позволяющий оптимизировать расположение коммитов, в которых закрываются ветки. В отличие от алгоритма datesort, который might well increase the size of the destination repo by 10-20 times [2], closesort незначительно меняет размер репозитория. Данный алгоритм может быть интересен для workflow в которых активно ведется работа с ветвями, причем все открытые ветви закрываются.

Rationale

Fig. 1 Визуальный мусор
При активной работе с ветками рано или поздно может возникнуть ситуация, когда необходимо массово закрыть устаревшие ветви. Множество очень старых ветвей приводит к тому, что граф заполняется визуальным мусором. На Fig. 1 изображен типичный пример такой массовой чистки устаревших ветвей, на 1 живую ветвь приходится 15 мусорных. 

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

Methods

Порядок версий необходимо менять, с использованием максимально стандартного механизма, желательно с использованием внутреннего API, что избавило бы от парсинга вывода команд.

Попытка 1

Поиск готовых или похожих решений натолкнул на обсуждение [3] проблемы оптимизации чрезвычайно больших репозиториев, вылившихся в итоге в расширение shrink-revlog [4]. Данное расширение как раз занималось топологической сортировкой и достаточно было написать собственную функцию сортировки к двум имеющимся. Алгоритм был написан, при этом потребовалось прокинуть внутрь функции сортировки объект репозитория.

Но первый же запуск на реальном репозитории привел к ошибке выхода за пределы массива. Выяснилось, что в репозитории используется два файла changelog и manifest [5]. В первом хранится информация о коммитах, а во втором информация о файлах [6], при этом, если в коммите не было изменений в файлах, то появится расхождение в нумерации между этими двумя файлами. Сортировка же changelog была запрещена, поскольку это повредит репозиторий.

Попытка 2

В качестве "Плана Б" можно было встроиться в стандартное расширение convert. В нем уже присутствовали branchsort, datesort и sourcesort. Необходимый алгоритм отличался от sourcesort одним условием:
        def makesourcesorter():
            """Source specific sort."""
            keyfn = lambda n: self.commitcache[n].sortkey
            def picknext(nodes):
                return sorted(nodes, key=keyfn)[0]
            return picknext

        def makeclosesorter():
            """Close order sort."""
            keyfn = lambda n: ('close' not in self.commitcache[n].extra,
                               self.commitcache[n].sortkey)
            def picknext(nodes):
                return sorted(nodes, key=keyfn)[0]
            return picknext 

И успешно решал поставленную задачу.

Pull request

Я сразу пошел в IRC разработчиков с целью обсудить данное решение, но особого интереса там не проявили и отправили в мейллист. После этого, Kevin предложил попробовать branchsort [7]. Данный алгоритм упорядочивал только самые простые случаи, но не справлялся со сложными. На IRC мне посоветовали засылать патч, раз никто не возразил. Патч был заслан и запушен Bryan [8]. В этот раз на всё-про-всё, от идеи до аппрува, ушел всего лишь месяц, а не пол года, как в прошлый раз [9].

Results

Максимальная ширина

На реальном рабочем репозитории с 5528 коммитов, максимальная ширина графа составляла 60 параллельных веток. После конвертации, ширина максимальная ширина репозитория уменьшилась до 26.

Средняя ширина

Подсчет средней ширины графа производился командой hg log -G | awk '/changeset/ {cnt++; width += (index($0,"changeset")-2)/2} END {print width / cnt}'. Данная подсчет не учитывает некоторых особых случаев, но подойдет для примерной оценки. До конвертации 21.16 и после 6.08.

Discussion

Алгоритм успешно, в разы сокращаяет ширину графа избавляя от визуального мусора. Из главных минусов можно указать то, что рассчет хэша у ревизии изменился между версиями 1.7 и 2.6, что приведет к несоответствию историй. Но, поскольку repository surgery можно проводить очень редко, это не является большой проблемой.

2013-05-04

Многомерное уважение

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

2013-05-02

Лови волну

Внезапный импульс

Всем не хватает мотивации, чтобы оторвать свою задницу и начать что-то делать. Ментальная ловушка затягивания шепчет: начнем завтра, начнем со следующей недели, с первого числа, честно-пречестно. Не хватает одного маленького усилия. Поэтому, если появляется хоть какой-то импульс что-то начать делать, его ни в коем случае нельзя упускать: именно он позволит сорваться, а дальше попрет.

Когда мы внезапно собрались идти в велопоход (который потом отменился, но это вторично), я понял: эту возможность нельзя упускать, чтобы не свалиться с судорогой на трассе нужно идти и тренироваться по хардкору. Прямо сейчас. Обожаю такие моменты за необычайную ясность ума, когда появляется цель, все остальное становится мелким и вторичным.

Challenge accepted

С этим тесно связаны вызовы, не банальное "на слабо", а те, которые можно бросить только самому себе. Когда до города 50 километров, а ноги уже не едут; когда пульс 180 и не хватает кислорода, а впереди бесконечные 50 секунд бега; когда руки не поднять и захлебываешься, а впереди еще пол километра. Можно отказаться в любой момент, остановиться и уйти, но говоришь себе еще пять секунд, еще пять метров, но они проходят и вроде бы есть еще силы на пять секунд, после которых уж точно нажму стоп, и еще, и еще.

If you can force your heart and nerve and sinew
To serve your turn long after they are gone,
And so hold on when there is nothing in you
Except the Will which says to them: "Hold on!"
R.K.