Category: россия

Category was added automatically. Read all entries about "россия".

glider

#ADD2010

На днях съездил с докладом на конфу Application Developer Days, которая проходила в Ярославле. Причем ни с чем-то, а с первой демонстрябельной версией Конфлакса. Мой доклад и детали по нему будут выложены отдельным потсом, а здесь поток сознания.

1. На 90% ехал для того, чтобы девиртуализироваться и пообщаться с жж-шными френдами. Это удалось на все 900%. Народ перечисляю в порядке знакомства. Олега zamotivator я узнал за пару секунд - когда они стояли и курили с Кириллом (catap.ru). Такие же поток сознания и жоская движуха, как и в ЖЖ. Кирилл оказался челом медитативного плана, который по жизни на позитиве, но знает он реально дохрена - его совместный доклад на тему SQL vs NoSQL было жутко любопытно послушать. Женя antilamer и Юля grrrl - мегаприятные и душевные в общении люди, заодно еще профессиональные и совсем не фрики, а эти качества вместе случаются очень редко =)

2. Перемещение тела обошлось в чуть более, чем сто баксов туда-обратно (Минск - Москва - Ярославль - Москва - Минск). С проживанием удалось разрулить вообще на ура - за 1300 р. в сутки снял квартиру, правда горячую воду отрубили в день моего проезда, но это настоящая квартира, где никого нет рядом, тихо и просторно. Я фшоке. И это в то время, когда нормальные отели в Ярославле (в честь его недавнего тысячелетия) начинаются с 4000 в сутки.

3. По докладам (см. расписание вот тут: http://it-conf.ru/ru/content/331.htm; при клике на доклад можно почитать его тезисы и информацию об авторе).

3а) SQL vs NoSQL, наверное, задумывался более как справочник - из полуторачасовой беседы у меня в голове осталось два пунктика: 1) в распределенности все сложно, 2) см. презентацию - там все детали по 100500 хранилищам данных. Здорово повеселил аудиторию Кирилл, постоянно повторяя, что "счастья нет" =)

3б) Дальше был срач по поводу систем контроля версий. Жесть, прямо как в каментах у Олега - жуткий поток сознания, из которого вылавливаешь полезное для себя. Я выловил git rebase (интересно, как такое сделать автоматом в меркуриале, не прибегая к mq) и то, что svn, оказывается, неожиданно полезная, ибо уже есть работающий svn merge --reintegrate. Насчет последнего еще рассказывал Стас Фомин в докладе "Золотая середина. Открытые системы поддержки разработки". Жаль тока в том докладе время закончилось раньше, чем началось самое интересное.

3в) После этого выступал я (об этом в отдельном потсе), а после своего доклада пошел гулять по городу. Было жалко пропускать рассказ про статический анализ доменной модели в C#, но меня так захватил Ярославль (я приехал на день раньше конфы и успел уже прогуляться), что пришлось чем-то жертвовать. Если у кого-нибудь есть ссылка на слайды доклада - расскажите мне, пожалуйста.

3г) На следующий день я успешно проспал презентацию windows phone 7 и начал день с фтыкания в хадуп. Походу, это есть опен-сорс реализация нашумевших в свое время концептов гугла про мап-редьюс, биг тейбл и распределенную fs. Докладчик, который по долгу службы работает с хадупом, ввел нас в курс дела, после чего я забился в уголок погуглить на тему того, как переводить всякие, например, джоины в мап-редьюс, окуклился и протащился. Потом пришел Катап и сказал, что хадуп любить падать и уносить за собой в могилу данные. Фак. Всю идиллию разрушил.

3д) Круглый стол SQL vs NoSQL прошел гораздо более организованно, чем предыдущий круглый срач про VCS. Чтобы не было так, что кто-то на букву "О" перекрикивает оппонентов, поставили микрофоны. Но не каждому, а через 3-4 человека. Хорошо поглумились =) а если по сути, то благодаря майевтике Андрея Аксенова я, как неспециалист, понял одно - пока что нет автоматического решения, которое бы позволило мне воткнуть в два раза больше компов и получить в два раза больше перфоманс. Как это объяснил после доклада Олег, здесь есть две проблемы: 1) невозможно автоматическое партицирование в общем случае, 2) очень долго перепартицировать данные после ввода в систему нового кластера - ну в самом деле, даешь перекачать пару терабайт по сети. Еще услышал кейворд Riak. А вот еще. Стас Фомин сидел и (не лень же ему) конспектировал дискуссию в майндмап. Так я познакомился с Freeplane, который, по тому, что вытворял Стас, удобнее MindManager, который я юзаю сейчас.

3е) Дальше был доклад, который из всех на конфе мне понравился больше всего. Выступал Женя Кирпичев (antilamer) с рассказом про параллельное программирование. Тем было затронуто очень много, некоторое время я прокемарил, но стратегии организации общения нодов в распределенной системе меня впечатлили до глубины души. Например, системы с обратной связью. Вдаваться в детали не буду - скоро Женя сам выложит доклад в ЖЖ. Впрочем, здесь тоже масса неразрешимых проблем - например, непреодолимая сложность асинхронных систем. Не только синтаксически мусорная call1(function(result1) { call2(result1.foo, function(result2) ... (ее можно убрать монадами), но просто логическая. Блин, и здесь элегантно легкого решения.

3д) Под занавес доклада зал порвали Яков Сироткин и Андрей Аксенов рассказами о том, как перестать бояться и полюбить бомбу. Технических деталей минус ноль, но зато весело и приятно о психологических факторах разработки как работы и как хобби. Было здорово - технические детали есть и в инете, а вот живого общения в инете не наблюдается.
glider

Автоматическая синхронизация версии проекта с ревизией SVN

Я давно знал, что, указав для версии сборки атрибут [assembly: AssemblyVersion("1.0.*")] (или любую другую версию кроме 1.0), в 2008й студии мы получаем автогенерацию третьей и четвертой позиций версии - то есть номера билда (устанавливается в количество дней, прошедших на момент билда с 31.12.1999) и номера ревизии (устанавливается в количество секунд, прошедших на момент билда с начала суток, разделенное на 2 - если на два не делить, то получится overflow ибо у нас только 16 бит, а секунд в сутках 86400). Этот подход хорош тем, что при обычном процессе разработки практически невозможно выпустить две разных сборки с одной и той же версией (для этого придется успеть что-то поменять и после того еще и перекомпилировать проект в пределах двух секунд). Но на этом достоинства подхода заканчиваются, ибо из автогенерированной версии мы ничего полезного, кроме времени билда, узнать не можем.

В качестве альтернативы напрашивается синхронизация версии проекта с текущей на момент билда ревизией репозитория VCS - с помощью этой техники, например, можно удобно сравнить исходный код произвольного модуля программы с текущим или получить идентичную версию программы в процессе воспроизведения багов по телефону/по интернету. В своих проектах я использую SVN, поэтому сегодня рассмотрим решение этой задачи для SVN (да, я в курсе про то, что Git лучше - просто влом/не успел переехать).

К сожалению, непосредственно в студию такая функциональность не встроена и плагинов, ее обеспечивающих, не существует. Приходится выбирать из пачки не очень удобных вариантов - http://stackoverflow.com/questions/12176/svn-revision-version-in-net-assembly-w-out-cc-net. Написание кастомных тасков для MSBuild требует их последующей установки в систему, макросы SVN для автогенерации AssemblyInfo напрямую не подходят, руками делать тоже не хочется - везде есть какие-то недостатки.

На днях я наткнулся на наименее напряжный, с моей точки зрения, вариант и не поленился реализовать его во всех своих open-source проектах. Вот та самая статья: Using Subversion Revision as the AssemblyVersion - Revisited, а вот воркфлоу моими словами (он опускает некоторые детали, за которыми прошу обратиться к первоисточнику):
1) Используем тул SubWCRev.exe из TortoiseSVN, который умеет заменять макросы SVN на текущие значения,
2) Файлики AssemblyInfo.cs выкидываем из-под сорс контроля и для верности еще и игнорируем, чтобы не было постоянных промптов их добавить обратно,
3) Рядом с файлом AssemblyInfo.cs кладем файл AssemblyInfo.template, в котором заменяем номер билда в версии на макрос $WCREV$ (важно не забыть добавить этот файл в проект, чтобы помнить о его существовании, если надо будет что-нибудь поменять в AssemblyInfo, например, мажорную версию),
4) В пре-билд ивент проекта (конфигурация находится в свойствах проекта на закладке Build Events) записываем вызов тулзы из пункта 1, которая преобразует темплейт в AssemblyInfo.cs, после чего запускается билд,
5) Профит!

В итоге - исходная задача выполнена, и к тому же: 1) париться с настройкой надо всего лишь один раз, причем все необходимые настройки выполняются в файловом менеджере и GUI студии, 2) проект компилируется где угодно, 3) AssemblyInfo.cs заигнорен, поэтому каждый раз не будет мозолить глаза иконкой измененного контента и просьбой закоммитить.

P.S. Конечно же, если проект управляется системой continuous integration, то можно сделать все гораздо проще - плагином или кастомным билд-скриптом. Но, с другой стороны, для небольших проектов развертывание CI - это неоправданная затрата времени + требует надежного хостинга, поэтому такой подход целесообразен не всегда.

P.P.S. Насколько я знаю, ревизия в Git представляет собой непрозрачный длинный токен, который не поместится в 8 байт, отведенных на версию в PE формате. Это осложняет дело. Можно, например, вешать на сборку кастомный атрибут со значением этого токена, но кастомные атрибуты не показываются в меню винды File > Properties - неудобно. Можно также хранить токен в строковых метаданных PE-модуля при помощи атрибутов AssemblyTitle или AssemblyDescription - вроде бы неплохой вариант. Впрочем, сам не пробовал - не знаю, так что это просто догадки.