| Лучше поздно, чем никогда.
Постом на который ссылался аудиослейв некоторое время назад навеяло. Расскажу про наш способ работы с svn-бранчами.
Идея заключается в том, что запоминать с какой же именно ревизии ты отпочковался - накладно. Пусть об этом помнит машина. Для этого мы используем свойство svn о том что сливание веток это всего лишь получение диффа двух поддеревьев и применение его к третьему. Значит вместо записывания ревизии почкования мы можем создать два бранча "рабочий" и "эталонный". А потом найти разницу между ними как итог работы в бранче.
"Рабочий" бранч будет называться как обычно branches/$branch, а "эталонный" branches/$branch--base. В качестве названия бранча я, как правило, использую номер задачи из багтрекера, например FOOBAR-28.
создание бранча
# "базовый" бранч
svn cp $prj/{trunk,branches/$branch--base}`
# "рабочий" бранч
svn cp $prj/branches/$branch{--base,}
# чекаут нового рабочего бранча, начинаем работу
svn co $prj/branches/$branch
cd $branch
вливание бранча в транк
Следствием того, что каждая задача багтрекера - бранч, их жизнь скоротечна и вливание в транк гораздо более частая задача, чем обновление бранча из него. Эта операция проходит, как и предполагалось.
# локальная копия транка для сливания
svn co $prj/trunk $branch--merge
cd $branch--merge
svn merge $prj/branches/$branch{--base,}
# проверяем, что все работает и коммитим
svn ci
обновление бранча из транка
Эта операция чуть более сложная, но все же доступная для понимания =)
# так как мы сольемся с транком "эталонный" бранч должен стать идентичным
# текущему транку
svn cp $prj/{trunk,$branch--new-base}
# сливаем все изменения от старого "эталонного" до нового
cd $branch
svn merge $prj/branches/$branch--{base,new-base}
# подменяем "эталонный" бранч
svn rm $prj/branches/$branch--base
svn mv $prj/branches/$branch--{new-base,base}
| comments: 4 comments or Leave a comment  |
| Flash - замечательная технология, умеет получать информацию из интернета, отправлять ее обратно, и с развитием VM в Flash, и позиционированием ее как платформы для сложных вычислений (появился компилятор C/C++ → Flash Adobe Alchemy: "... Ideally suited for computation-intensive use cases, such as audio/video transcoding, data manipulation, XML parsing, cryptographic functions or physics simulation ...") появляется возможность организовать вычислительный кластер невероятных размеров. Все же и так знают, что от флеша ноутбук начинает греться.
То есть для того чтобы увеличить размер кластера нужно, чтобы как можно больше человек открыло браузером страничку с правильным флешом и не закрывало. Сначала я думал, не сделать ли казуалку, зума бы подошла, я думаю. А потом вспомнил про YouTube. Этим ребятам точно ничего не стоит построить суперкомпьютер (100M показов видео в сутки при средней длительности 1 минута это почти 200 машино-лет(!)) за 0 долларов, 0 центов. =) Так что, когда в следующий раз пойдете смотреть ютуб и у вас включится вентилятор ноутбука, вполне может быть, что он считает вовсе не то, что кажется =) | comments: 2 comments or Leave a comment  |
| такой вопрос: стоит ли делать текстовую версию доклада, который я рассказывал на Exception #08, про поиск лишних объектов и использование инструментария gc/pdb/pickle?
точнее, я понимаю, что стоит, но как много людей это хотят? если наберется больше 10 - сделаю =) | comments: 11 comments or Leave a comment  |
| | Subject: | a12n | | Time: | 08:55 pm |
|
| На днях открыл для себя чудесный мир AppleScript. Устал каждый раз приходя на работу открывать логи разрабатываемого сервиса на двух бекендах. Сделал такой скрипт:
tell application "Terminal"
set blaze_tab to do script "ssh blaze 'tail -f /var/log/yandex/...log' | bin/colorer"
set custom title of blaze_tab to "blaze"
set number of rows of blaze_tab to 80
set number of columns of blaze_tab to 128
set vitalize_tab to do script "ssh vitalize 'tail -f /var/log/yandex/...log' | bin/colorer"
set custom title of vitalize_tab to "vitalize"
set number of rows of vitalize_tab to 80
set number of columns of vitalize_tab to 128
end tell
С циклом заморачиваться не стал, сильно не понравилось как код выглядит.
А bin/colorer - микро-утилитка, которая расцвечивает строки если в них встречаются слова INFO, WARN, ERROR в жирно-черный, желтый и красный соответственно =)
Да, а Automator'у мое фу за то что не дает ускорять набор текста в записанных действиях. | comments: 1 comment or Leave a comment  |
| цель этого поста в том, чтобы освободить голову от мысли, а не в том чтобы претендовать на истинность
чтение философов от кибернетики заставляет думать самого. эта мысль об альтернативном способе измерения информации. в противовес вероятностным методам теории информации назовем его теоретической теорией информации.
основные мысли: - наверное количество информации в системе - это количество информации, необходимое для описания аксиоматики системы. - а количество информации в сообщении - это количество необходимых дополнений (а может быть и изменений/удалений?) в аксиоматику модели для того чтобы сообщение стало истинным для модели.
(sidenote: в случае возможности удалений возможны сообщения с отрицательной информацией относительно системы!)
то есть информация в сообщении - это не абсолютная величина. для измерения информации сообщения нужна система к которой сообщение относится.
так же, возможно, имеет смысл введения понятия "работы" по вычислению конкретного утверждения из заданной аксиоматики. так, например: "4 + x = 7 при x = 3" -- работы мало, "z^n = a^n + b^n не имеет решений при n > 2" - работы очень много. при том что ни то ни другое утверждение не содержит информации. | comments: 7 comments or Leave a comment  |
| | Идея в пустоту: уже существуют внешние жесткие диски с ethernet интерфейсом, почему бы в них кроме возможности шарить файлы по ftp/smb не встроить умение скачивать файлы через bittorrent из интернета? по-моему, это было бы органичным дополнением. | comments: 11 comments or Leave a comment  |
| | Для чего нужны облака тегов? С одной стороны я никак не могу придумать внятного обоснования для их существования, я ни разу не смог воспользоваться ими как навигацией (по-моему это их заявляемое предназначение). С другой стороны мне самому хочется добавить их к каждому проекту, который я делаю, подсознательно, без объективной причины. | comments: 6 comments or Leave a comment  |
| | Ставлю 9 к 1, что грядущий ClientSide окажется даже менее информативным чем прошедший HighLoad. | comments: 1 comment or Leave a comment  |
| При использовании django регулярно натыкаюсь на выразительную убогость темплейтного языка.
Последнее из этой серии. Невозможно сделать следующее:
{% yausername user|nick_or_fio %}
А хотелось простого. yausername - тег который умеет приводить строку к виду elephantum, nick_or_fio фильтр, который выбирает у пользователя первый не пустой аттрибут из списка: [ник, фио, логин].
Но все оказалось не так просто. Фильтры могут применяться только в блоках подстановки переменных ({{ user|nick_or_fio }}), параметры же тегов обрабатываются as is и все ломается на невозможности найти в контексте переменную "user|nick_or_fio".
В принципе, поднатужившись, можно пропатчить джангу в этом вопросе, но стоит ли шкурка выделки? | comments: 20 comments or Leave a comment  |
| | Subject: | icfp | | Time: | 05:42 pm |
|
| какая жалость, я банально пропускаю ICFP 2007 из-за поездки на семинар надеюсь у всех остальных будет возможность принять в нем участие | comments: Leave a comment  |
| как просто раскидать один список в несколько других по условию
In [1]: l = range(20)
In [2]: def cond(x):
...: return x % 3
...:
In [3]: (lambda r: dict((curkey, [item for (key, item) in r if key == curkey])
...: for curkey in dict(r).keys())
...: )([(cond(i), i) for i in l])
Out[3]:
{0: [0, 3, 6, 9, 12, 15, 18],
1: [1, 4, 7, 10, 13, 16, 19],
2: [2, 5, 8, 11, 14, 17]}
| comments: 2 comments or Leave a comment  |
|
>>> class History:
... def __init__(self, data=[]):
... self.data = data
... def append(self, val):
... self.data.append(val)
... def __iter__(self):
... return iter(self.data)
...
>>> h1 = History()
>>> h1.append(1)
>>> list(h1)
[1]
>>> h2 = History()
>>> h2.append(2)
>>> h2.append(3)
>>> list(h2)
[1, 2, 3]
| comments: 5 comments or Leave a comment  |
| очень меня беспокоит, что современное программирование больше походит процесс молекулярной сборки, мой идеал - конструкторы lego
disclaimer: да, я понимаю, что все упирается в сложность системы, однако мне кажется, что в массе случаев эта сложность преувеличивается | comments: 3 comments or Leave a comment  |
|
Силился я найти простой и приятный мне фреймворк для разработки веб-приложений для взаимодействий класса "программа-программа" (отличается от класса "программа-пользователь" тем, что отсутствует тяжелый слой верстки) REST-стиля.
Самым вероятным кандидатом был web.py, однако я не могу смириться с основными концепциями этой библиотеки. Видимо, я слишком много программировал на хаскелле, это вредно. Сейчас я считаю, что у каждой функции все выходы должны быть точечными и начинаться со слова return. Предложение генерировать выходные данные последовательностью self.send_response(...), self.send_header(...), print - меня убивает. Если действительно необходимо сделать не атомарный вывод, как, например, при server-push механизме, то просто нужно возвращать генератор атомарных элементов.
| comments: 4 comments or Leave a comment  |
| |