Последние записи
2/20/2012 2:08:35 PM
Убираем сборки зависимостей из репозитория
Сто лет назад вышла версия 1.6 Nuget. Для меня это такой повседневный инструмент, типа ложки, в котором непонятно, что может быть нового :). Но в этой версии добавилась прикольная штука, а именно возможность не хранить бинарники зависимостей в репозитории. Действительно, нафиг это нужно, если в любой момент можно их вытянуть с самого nuget.
Воспользоваться этой фичей у меня получилось не сразу. Почему-то казалось, что оно само все заработает, после обновления nuget — но ничо подобного не произошло. Сборки зависимостей все также сохранялись в репозиторий и без них ничего собираться не хотелось. Печалька накапливалась и достигла критической массы, когда я решил разбораться и все порешать. Решение оказалось состоящим из двух шагов, первый из которых описан в официальном релизе NuGet, а второй я придумал сам. Нужно в игнор файле .[git|hg]ignore прописать следующие строчки:
packages/
!nuget.exe
А дальше оно уже само. И не будет запихивать файлы в репозиторий, и будет вытягивать их при сборке.
2/12/2012 2:45:33 PM
Квест: поиск документации по fubu MVC
Fubu MVC очень крутая и классная вещь. Чтобы постичь всю ее крутоту и классность, я давно пытаюсь найти вменяемую документацию по ней. На удивление, это оказалось не таким уж простым делом :). Поиски напоминают квест, в котором получаешь удовольствие от процесса (а результата все нет -- но об этом дальше).
Итак, полистав интеренет, где ссылки, на которые ссылаются авторы fubu, выпилены, я подумал, что документация эта небось скрыта в самом проекте. Тем более, что readme проекта описывает шаги, как эту самую документацию можно построить. Ага -- не преимущества фреймворка и инструкции, как взлететь, а построение доки. Выходит -- она и есть ключем к успеху понимания всей мощи.
Авторы фреймворка (который, кстати, расшифровывается, как For Us By Us) решили не искать легких путей. И в результате документация строится с помощью Python движка Sphinx, который запускается через Ruby сборщик Rake. Именно так - Ruby запускает Python, который строит документацию для .NET фреймворка. Недавно меня сами эти слова бы напугали настолько, что я бы и думать не стал все это запускать. Но не сейчас.
Читать дальше >>
1/27/2012 1:00:20 AM
Coding dojo как путь к просветлению
Пару дней (блин, уже неделю) назад были вместе с Сашей Белецким на coding-dojo, где (даже) заняли третье место. Мероприятие выдалось весьма прикольным и поучительным. Среди прочего я постиг сайт http://cyber-dojo.com/. Я слышал про него еще раньше -- на XP Days клёвый дядька Йоханнес про него рассказывал. Но тогда я зашел и сразу ушел. Не понравилось мне писать код без привычной IDE и инструментов - xUnit, NSubstitute и т.д.
А вот на coding-dojo я вдруг осознал всю мощь ресурса. Ведь если вспомнить, что kata -- это тренировка с целью довести навыки до автоматизма, то можно представить этот сайт как такой себе спортзал. Суровый, спартанский, но от этого еще более крутой.
Читать дальше >>
1/18/2012 4:23:37 AM
Зачем просто если можно сложно?
Иногда попытки написать идеальный код доводят до абсурда. Вот на что я наткнулся в нашем проекте:
public void RiseMessageProcessedEvent(int? incomingId, int? outgoingId)
{
var args = CreateEventArgs();
if (incomingId.HasValue)
args.ChangedMessagesData.Add(
CreateMessageChangeData(incomingId.Value, MessageDirection.Incoming));
if (outgoingId.HasValue)
args.ChangedMessagesData.Add(
CreateMessageChangeData(outgoingId.Value, MessageDirection.Outgoing));
EventService.FireEvent(NotificationEvents.MessageProcessed, args);
}
Благие намерения -- использовать один и тот же код для разных типов оповещений. Но реализация вызывает вопросы. В глаза бросается суровый копипаст, аргументы выполняют две обязанности (передают значения и являются флагами) и выглядит это все страшненько. А самое интересное, что везде этот метод вызывается с null для одного из аргументов.
Лучше переписать этот метод вот так:
public void RiseMessageProcessedEvent(int messageId, MessageDirection messageDirection)
{
var args = CreateEventArgs();
args.ChangedMessagesData.Add(CreateMessageChangeData(messageId, messageDirection));
EventService.FireEvent(NotificationEvents.MessageProcessed, args);
}
В результате те же два параметра, но меньше кода и больше понятности.
12/25/2011 2:45:38 PM
Анонимус доставляет
Наткнулся на очень интересную особенность анонимных типов. Началось все с теста, которые не проходил, хотя видимых предпосылок для этого не было. Точнее, началось все с идеи использовать анонимные классы в качестве ключей в кеше. Очень удобным казался код типа
[Fact]
public void AnonymousTest()
{
var table = new Dictionary<object, object>();
var value = new object();
table.Add(new {Key1 = "key1", Key2 = "key2"}, value);
table[new {Key1 = "key1", Key2 = "key2"}].Should().Be(value);
}
Читать дальше >>
12/21/2011 4:04:24 AM
Agile Base Camp 2012 в Киеве
После успешного празднования Нового 2012 Года нас ждет весьма интересное событие -- конференция Agile base camp, которая состоится на этот раз в Киеве. Упор конференции сделан на продуктовую разработку, но это вовсе не значит, что для аутсорсеров не будет ничего интересного. Я считаю, что продуктовый взгляд на вещи будет полезен всем. Согласитесь, что лучше думать, что ты "делаешь что-то свое", чем "горбатишься на дядю" :)
Одна из сцен будет полностью посвящена инженерным практикам и мы (программный комитет, в котором я состою) расчитываем собрать там актуальные доклады, ориентированные в первую очередь на разработчиков. Я буду рассказывать о том, какие проблемы ждут продукт в продакшене, и как можно их предотвратить, благодаря чему будет больше времени на семью или хобби :)
Приходите -- для регистрации нажмите на синенький банер справа или сюда.
12/21/2011 3:11:21 AM
Отчет о конференции xpdays.ua 2011

Последний из трех дней конференции заняла, как это ни банально звучит, сама конференция.
Место БЦ "Парус", как по мне, оказался отличным местом. Удобное расположение в центре плюс утро субботы сделали задачу "добраться до места" достаточно тривиальной. Залы были изолированы друг от друга, и не было такого, что слышишь доклад из соседнего зала вместо своего, как иногда случается на некоторых событиях. Немного неадекватный мужской туалет и теснота перед гардеробом -- пожалуй единственные минусы. Да и те скорее для галочки, а не реальные напряги.
Люди делают события событиями. Какие бы не были крутые докладчики и классные организаторы, ценность конференций -- в общении с коллегами. Я был очень рад встретить знакомых ребят и пообщаться с ними за чашкой кофе (и не только). Также приятно было познакомиться с новыми людьми.
Читать дальше >>
12/21/2011 1:41:14 AM
Тренинг xpdays: TDD in .NET
В последнее время водоворот событий захлестнул меня с головой, и у меня никак не доходили руки написать обо всем происходящем в блоге :). Сейчас вроде все поутихло и можно попробовать вспомнить всё. Начну с конца, пока впечатления еще яркие.
На прошлой неделе в Киеве проходила конференция xpdays. В течении трех дней происходили разные интересные мероприятия, в которых принимал участие и я.
Праздник для меня начался с двухдневного тренинга по TDD, которым мы проводили вместе с Сашей Белецким. Все прошло отлично. Я первый раз работал с Сашей и остался очень довольным. У нас совпало отношение к TDD и опыт его использования оказался похожим. Это позволило выступить нам на одной волне, дополняя и поддерживая друг друга.
Отдельное спасибо группе. Уровень подготовки оказался весьма высоким, и это позволило нам рассказать и показать все, что мы планировали.
Как и должно быть после хорошего тренинга, новые знания получили не только слушатели, но и тренеры. Я, например, открыл для себя Fluent Assertions, о котором напишу отдельный пост.
Спасибо всем участникам и организаторам за то, что это стало возможным, и до встречи на новых событиях!
11/21/2011 4:14:17 PM
Тренинг TDD .NET in Action
25-26 ноября в Киеве состоится очередной тренинг scrumguides. Вместе с Виталием Стаховым мы покажем, как с помощью TDD .NET-разработчик может значительно повысить свою эффективность. После двухдневного погружения в мир тестов вы будете готовы начать применять этот подход на следующий день в своей работе.
Одна из самых частых ошибок при внедрении TDD – это создание хрупких тестов, когда изменения в одном месте рабочего кода требуют каскадных изменений в коде тестов. Затраты на эти изменения со временем растут, и в итоге TDD забрасывается с очередным постом на тему «Нафиг TDD». Мы расскажем, как этого можно избежать.
Мы еще много чего интересного расскажем и покажем. Максимум практики позволит научить не только голову, но и руки.
Для перехода к более детальному описанию тренинга и регистрации нажмите на баннер (должен быть на страничке такой оранжевый и мигает).
Приходите -- будет интересно!
И еще: если у вас есть сайт, пожалуйста, повесьте на нем наш баннер. А мы за это дадим вам скидку 10% на посещение тренинга. Код банера:
11/11/2011 1:22:40 AM
Знай свой инструмент
А вот такая задача. Допустим, вам нужно в winforms приложении показать диалог с какими-то данными, дать пользователю их изменить и сохранить. Данные представляют собой набор полей разных типов. Классический подход – натаскать элементов управления с палитры, поназывать их в стиле txtName, при показе формы пройтись по всем, заполняя текущими значениями, а в обработчике кнопки опять пройтись – и уже обновить поля модели значениями из элементов управления. Не очень увлекательный процесс. Если вдруг понадобится добавить полей к данным, нужно будет для каждого поля добавлять код чтения/записи его значения. Скукота, одним словом.
Удивительно, но из моих знакомых мало кто знает про возможности Visual Studio в этом плане. На самом деле процесс можно радикально упростить.
Читать дальше >>
