Utilu IE Collection

29 дек. 2011 г. | | |

Думаю, что эта штука пригодится многим веб-разработчикам, знакомым со словом "кроссбраузерность": Utilu IE Collection - сборник всех поколений адового броузера Internet Explorer от MS. Сборник содержит версии IE:
  • Internet Explorer 1.0 (4.40.308)
  • Internet Explorer 1.5 (0.1.0.10)
  • Internet Explorer 2.01 (2.01.046)
  • Internet Explorer 3.0 (3.0.1152)
  • Internet Explorer 3.01 (3.01.2723)
  • Internet Explorer 3.03 (3.03.2925)
  • Internet Explorer 4.01 (4.72.3110.0)
  • Internet Explorer 5.01 (5.00.3314.2100)
  • Internet Explorer 5.5 (5.51.4807.2300)
  • Internet Explorer 6.0 (6.00.2800.1106)
  • Internet Explorer 6.0 (6.00.2900.2180)
  • Internet Explorer 7.0 (7.00.5730.13)
  • Internet Explorer 8.0 (8.00.6001.18702)

На сайте сборника есть даже таблица совместимости ОС и версий броузера. Ссылка для скачивания.

42

26 дек. 2011 г. | | |

Недавно довелось написать небольшую утилиту на Delphi. Да, это не опечатка :) Опустим события, ставшие причиной данного извращения, но, кажется, на меня снизошло озарение, ответ на вопрос жизни, Вселенной и вобще: почему не стало delphi-программистов? Так вот, они не выдержали психологической давки со стороны кода! Легко ли программировать, когда на тебя пялится код, всячески выражая своё пренебрежение?

Подкасты

2 дек. 2011 г. | | |

Накопилось еще немного ссылок на интересные подкасты.
http://distributedpodcast.com/ - интересный подкаст о CQRS
http://www.dotband.com - русскоязычный подкаст о дотнете. 
http://www.thisdeveloperslife.com/ - англоязычный подкаст о разработчиках и их жизни
http://deepfriedbytes.com/podcast/
http://polymorphicpodcast.com/shows

Хитрый Delete для Sql Server CE

23 нояб. 2011 г. | | |

Маленький хак для Sql Server CE, который компенсирует отсутствие возможности удаления записей из таблицы с помощью такой конструкции
DELETE FROM bookings LEFT OUTER JOIN accounts ON bookings.AccountID = accounts.ID WHERE accounts.AccountNumber="1100"
Вместо этого вы можете использовать конструкцию
DELETE FROM bookings WHERE AccountID NOT IN (SELECT ID FROM accounts WHERE accounts.AccountNumber<>"1100")

Webbrowser. Сохраняем картинку.

16 нояб. 2011 г. | | |

Задача: сохранить из webbrowser генерируемую на лету (на основе данных post-запроса) картинку.
Решение:

Extensions, Static methods & null

23 окт. 2011 г. | | |

Методы расширения (extension methods), появившиеся ещё в C# 3.0,  - очень полезная штука.
Методы расширения позволяют "добавлять" методы в существующие типы без создания нового производного типа, перекомпиляции или иного изменения исходного типа. Методы расширения являются особым видом статического метода, но они вызываются, как если бы они были методами экземпляра в расширенном типе. (из MSDN)
Т.е. если в классе String нам не хватает какого-нибудь метода, то не нужно создавать еще один класс, наследуясь от String или, чего хуже, делая декоратор, а можно создать метод расширения:

public static class MyExtensions
{
        public static int WordCount(this String str)
        {
            return str.Split(new char[] { ' ', '.', '?' }, 
                             StringSplitOptions.RemoveEmptyEntries).Length;
        }
 }   
(пример тоже из MSDN)
Иногда бывает ситуация, когда нужно вызвать метод расширения в статическом методе класса. Но этого нельзя сделать, несмотря на то, что
Методы расширения являются особым видом статического метода, но они вызываются, как если бы они были методами экземпляра в расширенном типе. (из MSDN)

Но, если всё же очень надо, то есть пара приёмчиков :)

Assert.True()

21 окт. 2011 г. | | |

Рефакторинг

20 окт. 2011 г. | | |

Сегодня наткнулась на такой вот метод:

Ещё чуть-чуть о тестах

18 окт. 2011 г. | | |

И еще одна небольшая заметка о TDD, точнее о том, что такое тест в контексте TDD.
Начинающие тэдэдэшники часто переусердствуют, стараясь тестировать всё и вся, забывая, что тест в TDD - это небольшой метод, проверяющий конкретное бизнес-правило. Акцент тут следует сделать на бизнес-правилах, они специфицируют поведение приложения, именно их нужно тестировать. С помощью TDD мы разрабатываем бизнес-логику. Не следует тестировать работу с БД, с файловой системой, сетевое взаимодействие - это уже совсем другой вид тестирования. Это интеграционные тесты. TDD позволяет нам быстро разрабатывать бизнес-логику, подтверждая работоспособность (или наоборот) кода мгновенным фидбеком. Если приходится специально что-то настраивать, чтобы запустить тест, и настройка занимает больше времени, чем написание самого теста, следует насторожиться. Метод для теста должен быть черным ящиком: известно только, что на входе, нужно удостовериться в правильности того, что на выходе.
В реальной жизни часто бывает так, что нужно взять выборку из БД и подсунуть данные методу для выполнения сложных расчетов. Для тестирования таких методов придумали Mocks, Fackes, Dummies & Stubs. Все эти технологии позволяют абстрагироваться от уровня физического взаимодействия, генерируя методы-заглушки. А методы заглушки возвращают тот набор данных, который им подсовываем. Чтобы было понятнее, вот простенький пример с Mock-библиотекой Moq.

to ORM or not to ORM?

16 окт. 2011 г. | | |

Плюсы и минусы ORM обсуждались не раз. Скорость vs удобство (отсутствие чистого SQL в коде), возможность тонкой настройки запросов для узких мест vs машинная генерация запросов (порой не оптимизированных)... Да и вобще, кому нужны эти лишние прослойки?
Почему стоит отказаться от ORM рассказывает Rob Conery в своём докладе "Kill Your ORM" на NDC 2011 , где, кстати, было очень много интересных докладов.


Максим Цепков. Domain Driven Design - модель вместо требований

11 окт. 2011 г. | | |

Выступление Максима Цепкова на Летнем Аналитическом Фестивале - 2011. Иваново, 25 июня 2011 года.

Запахи TDD

8 окт. 2011 г. | | |

Перевод статьи "TDD Process Smells "

Данный список запаховболее сфокусирован на выполнении принципов самого TDD процесса, чем на  содержимом тестов. Без сомнения, существует множество подобных запахов; я же выбрал наиболее часто встречающиеся по правилу 7 (+/- 2).

Linq DataContext и Dispose

7 окт. 2011 г. | | |

Как известно, любой DataContext объект является IDisposable. При использовании конструкции вида
using (CDataContext db = new CDataContext(ConnectionPool.Connection)) {...}
метод  Dispose() вызывается автоматически, и все занимаемые ресурсы освобождаются.
Насколько критично вызывать метод Dispose() вручную для такого кода?
CDataContext db = new CDataContext(ConnectionPool.Connection);
 return (from tbl in db._addresses
        where tbl.IsCustomer.Equals(true)
        select tbl).ToList();

Перефразируя вопрос: что плохого случится, если не вызвать  Dispose()? Ведь GC всё равно вызовет этот метод, разве что не сразу. DataContext не держит соединение c БД открытым (только, если не открывать его явным способом вроде DataContext.Connection.Open() ) т.е. никаких тяжеловесных ресурсов не занимает, и ничего плохого не происходит. Т.е. совсем не обязательно вручную вызывать Dispose().
Но. Если вы напишите такой код
using(CDataContext db = new CDataContext(ConnectionPool.Connection))
{
    return (from tbl in db._addresses
            where tbl.IsCustomer.Equals(true)
            select tbl);

}
произойдёт исключение "Cannot access a disposed object. Object name: 'DataContext accessed after Dispose.", потому что дерево запроса (возвращаемый тип  IQueryable<_address>) попытается выполнится после того, как DataContext будет уничтожен. Произойдёт это потому, что запрос выполнится тогда, когда будет впервые вызвано перечисление элементов (метод ToList<T>(), например). Если же написать такой код
CDataContext db = new CDataContext(ConnectionPool.Connection)
 return (from tbl in db._addresses
        where tbl.IsCustomer.Equals(true)
        select tbl);

то нужно понимать, что DataContext откроет соединение к базе, извлечет элементы и будет уничтожен только в том месте кода, где произойдет IQueryable<_address>.ToIEnumerable<_address>()

Чего нет в SQL Server Compact 4.0

4 окт. 2011 г. | | |

А нет в 4-ом компакте целой кучи всего:
  1. Репликация данных с SQL Server - ни через Sync Framework, ни через слияние или удаленный доступ к данным. 
  2. Нет поддержки службы SQL Server 2008 Integration Services (SSIS)
  3. SQL Server Management Studio для Sql Server Compact 4 тоже не поддерживается
  4. О мобильных платформах (Windows Mobile, Windows Phone или Windows CE) тоже можно забыть. 
  5. Не поддерживается LINQ to SQL (чего стоило, но не хотелось, ожидать). Все дружно переходим на Entity Framework.

Но всё это поддерживается в SQL Server Compact 3.5 SP2.
Т.е. для того, чтобы перевести существующий проект (SQL CE 3.5 + Linq2Sql) на использование Sql Server CE 4.0, нужно заодно  переехать на Entity Framwork либо другую ORM-прослойку. Стоит ли оно того, вот в чем вопрос.

Выучить С++ за 21 день

30 сент. 2011 г. | | |

8 советов

| | |

Сегодня попались мне две статьи о том, как улучшить свой код. В сумме это дало 8 советов.

Moq: ошибка номер раз

29 сент. 2011 г. | | |

Дабы не получить ошибку "Invalid setup on a non-virtual (overridable in VB) member" при работе с библиотекой Moq, мокать нужно либо интерфейс класса:

var mock = new Mock<IEventsStorage>(); //этот подход является рекомендуемым

либо мокаемый метод нужно объявлять виртуальным:

var mock = new Mock<EventsStorage>();
mock.Setup(storage => storage.LoadEvents(Monthes.Januar)).Returns(new List<Event>());
 

...
 

public class EventsStorage
{
    public virtual List<Event> LoadEvents(Monthes monthNumber) {...}
}




20 аддонов для VS

| | |

Пройдя по ссылке вы сможете найти 20 бесплатных аддонов для Visual Studio, помогающих ускорить разработку и избавить вас от некоторых рутинных действий.
http://msdn.microsoft.com/ru-ru/vstudio/hh162051

Библиотека

18 авг. 2011 г. | | |

Steve Freeman, Nat Pryce. Growing Object-Oriented Software, Guided by Tests (скачать)
Test-Driven Development (TDD) is now an established technique for delivering better software faster. TDD is based on a simple idea: write tests for your code before you write the code itself. However, this "simple" idea takes skill and judgment to do well. Now there's a practical guide to TDD that takes you beyond the basic concepts. Drawing on a decade of experience building real-world systems, two TDD pioneers show how to let tests guide your development and “grow” software that is coherent, reliable, and maintainable.
Steve Freeman and Nat Pryce describe the processes they use, the design principles they strive to achieve, and some of the tools that help them get the job done. Through an extended worked example, you’ll learn how TDD works at multiple levels, using tests to drive the features and the object-oriented structure of the code, and using Mock Objects to discover and then describe relationships between objects. Along the way, the book systematically addresses challenges that development teams encounter with TDD—from integrating TDD into your processes to testing your most difficult features.

Библиотека

| | |

Фридман А.Л. - Основы объектно-ориентированной разработки программных систем. (скачать)
Книга написана как учебное пособие для студентов старших курсов. В ней рассматриваются основные понятия объектно-ориентированного программирования, методы анализа задач и проектирования программных систем на его основе. Исследуются современные способы организации процесса создания программного обеспечения и их взаимосвязь с методами анализа проектирования систем, прежде всего на основе подхода "проектирование по образцам".
 Тимоти Бадд - Объектно-ориентированное программирование в действии (скачать)
Второе американское издание книги известного специалиста по объектно - ориентированному программированию выпускается на русском языке по лицензии издательства Addison Wesley Longman. В ней рассматриваются теоретические и практические аспекты ООП (как на уровне разработки программ, так и на уровне работы компиляторов), позволяющие с наименьшими затратами получать современные программы со сложной логической структурой. Автор обобщает опыт объектно - ориентированного программирования на примерах таких языков, как Java, C++, Object Pascal и др. Соответствующий круг вопросов весьма актуален, поскольку в практике современного программирования приходится иметь дело со все более сложными логическими и программными объектами. Рассмотрение теоретических вопросов настраницах книги удачно сочетается с многочисленными наглядными примерами. Для понимания материала достаточно владения каким - либо традиционным языком программирования типа С или Pascal, хотя в отдельных случаях (особенно в последней четверти книги) могут оказаться желательны (но не необходимы) и более глубокие знания. Книга будет полезна преподавателям, студентам, разработчикам прикладных программ и всем, кто хочет освоить современные подходы к программированию.

Библиотека

| | |

Мартин Р. Чистый код. Создание, анализ и рефакторинг (скачать)
Эта книга посвящена хорошему программированию. Она полна реальных примеров кода. Мы будем рассматривать код с различных направлений: сверху вниз, снизу вверх и даже изнутри. Прочитав книгу, вы узнаете много нового о коде. Более того, вы научитесь отличать хороший код от плохого. Вы узнаете, как писать хороший код и как преобразовать плохой код в хороший.
Книга состоит из трех частей. В первой части излагаются принципы, паттерны и приемы написания чистого кода; приводится большой объем примеров кода. Вторая часть состоит из практических сценариев нарастающей сложности. Каждый сценарий представляет собой упражнение по чистке кода или преобразованию проблемного кода в код с меньшим количеством проблем. Третья часть книги — концентрированное выражение ее сути. Она состоит из одной главы с перечнем эвристических правил и «запахов кода», собранных во время анализа. Эта часть представляет собой базу знаний, описывающую наш путь мышления в процессе чтения, написания и чистки кода

Статические методы и методы экземпляра: кто быстрее

9 авг. 2011 г. | | |

Для некоторых методов класса Microsoft Code Analysis даёт такой совет:
CA1822 : Microsoft.Performance : The 'this' parameter (or 'Me' in Visual Basic) is never used. Mark the member as static (or Shared in Visual Basic) or use 'this'/'Me' in the method body or at least one property accessor, if appropriate. 
В MSDN по этому поводу написано:

«Members that do not access instance data or call instance methods can be marked as static (Shared in Visual Basic). After you mark the methods as static, the compiler will emit non-virtual call sites to these members. Emitting non-virtual call sites will prevent a check at runtime for each call that ensures that the current object pointer is non-null. This can result in a measurable performance gain for performance-sensitive code. In some cases, the failure to access the current object instance represents a correctness issue.»
Какие преимущества у static метода перед методом экземпляра? При каждом вызове метода экземпляра происходит проверка указателя на null. Для статических методов такого не делается, что даёт небольшой прирост производительности. Кроме того, согласно MSDN, для всех объектов класса будет существовать только один экземпляр метода, что так же увеличит производительность.

Аспектно-ориентированное программирование

13 июл. 2011 г. | | |

Что же такое  аспектно-ориентированное программирование? Ещё одна модная тенденция в мире разработки? Вики дает такое определение:

Аспе́ктно-ориенти́рованное программи́рование (АОП) — парадигма программирования, основанная на идее разделения функциональности для улучшения разбиения программы на модули.
Как-то знакомо звучит.

C# Finalize/Dispose pattern

| | |

Два интересных обсуждения о Finalize/Dispose в C#  на StackOverflow (http://stackoverflow.com/questions/898828/c-finalize-dispose-pattern/898867#898867) и Хабре (http://habrahabr.ru/blogs/net/122639/)

Боян про отладку

8 июл. 2011 г. | | |

Злободневно с баша

15 июн. 2011 г. | | |


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

YYY: Причем из этих двух молотков, один был бы самодельной киянкой!

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

YYY: И предложил бы свой вариант самореза с правой резьбой под шестигранную отвертку с логотипом Sun…

XXX: А потом кто-нибудь прийдет и скажет, что посадил все на суперклей и вроде стоит.

YYY: А кто то будет причитать про то, что раньше вообще без гвоздей строили и стояло века…

Сравнительное тестирование производительности платформ .Net, Java и Mono

8 июн. 2011 г. | | |

Статья на хабре о сравнении производительности платформ .Net, Java и Mono
http://habrahabr.ru/blogs/development/120090/

RegexOptions

25 мая 2011 г. | | |

Есть файл с содержимым вида

<Book>
   <Page number='1'><![CDATA[line1
                                line2
                                line3]]>
   </Page>
   <Page number='2'><![CDATA[line1]]>

   </Page>
</Book>


Нужно распарсить содержимое через RegExpr. Вроде ничего сложного. Тест для класса PageParser должен срабатывать:

//PageParser
class PagePaerser
{
  public static IList<Page> Parse(string xml)
  {
     IList<Page> pages = new List<Page>();
     string pattern = "<Page number='(?<number>\\d*?)'><\\!\\[CDATA\\[(?<content>.*?)\\]\\]><\\/Page>";
     var matches = Regex.Matches(xml, pattern, RegexOptions.IgnoreCase | RegexOptions.Multiline);
     if (matches.Count>0)
     {
        foreach(Match match in matches)
        {
            pages.Add(new Page()
            {
              content = match.Groups["content"].Captures[0].Value,
              number = int.Parse(match.Groups["number"].Captures[0].Value)
           });
        }
    }
    return pages;
  }
}


[TestMethod]
public void ParseMethod_ListOfPages_Test()
{
   var parsed_pages = PageParser.Parse(@"
<Book>
      <Page number='1'><![CDATA[line1
                                  line2
                                  line3]]>
      </Page>
      <Page number='2'><![CDATA[line1]]>

      </Page>
   </Book>

");
   Assert.AreEqual(2, parsed_pages.Count);
}

Но тест не срабатывает. Дело в том, что в RegExpr для обработки multiline-строк, нужно вместо флага RegexOptions.Multiline устанавливать RegexOptions.Singleline, который меняет режим символа "." на улавливание совпадений со всеми символами, а не всех символов, кроме новой строки (\n)

Coding drunk

24 мая 2011 г. | | |

Объектные NoSql базы для .Net

18 мая 2011 г. | | |

Небольшой обзор объектных БД под .Net. В обзор попали Eloquera, STSdb, Siaqodb, Ninja Database Lite.
Ссылка

dotPeek - бесплатный декомпилятор от JetBrains

17 мая 2011 г. | | |

На замену .NetReflector, который стал платным, компания JetBrains выпустила свой бесплатный декомпилятор dotPeek, который умеет
 - декомпилировать сборки .Net всех версий (1-4) в C#
- делать навигацию по коду (такую же как и в ReSharper) и понимает клавиатурные шорткаты,  аналогичные ReSharper’у
- делать подсветку синтаксиса, фолдинг, и в целом предоставлять experience, аналогичный Visual Studio

Детальный обзор dotPeek
Скачать dotPeek

Random numbers generator

28 апр. 2011 г. | | |

Crack.Net 2.0

12 апр. 2011 г. | | |

Crack.Net - freeware runtime debugger для .net-приложений. Позволяет анализировать память, просматривать Debug output, интегрирован с Red Gate’s .NET Reflector. и, что самое вкусное, позволяет работать с объектами и событиями с помощью скриптов на IronPython (для этого нужно добавить IronPython.dll и IronMath.dll в GAC). Мощная штука. Работает под .net framework 3.5 + sp1. Сайт проекта - http://joshsmithonwpf.wordpress.com/cracknet/

Конфигурируем Unity 2.0 через xml-файл

11 апр. 2011 г. | | |

Цель данной заметки - рассмотреть простой случай конфигурации Unity через xml-файл. 
Формат конфигурации Unity и более подробная информация касательно каждой секции тут http://msdn.microsoft.com/en-us/library/ff650027.aspx#config_format

MonoDroid?

7 апр. 2011 г. | | |

Вышел MonoDroid 1.0. Вещь для тех, кто хочет писать под Андроид, не слазя с .Net. Этот релиз богат следующим:
 - разработка на .Net и C# для Android-планшетов и смартфонов
- .NET-биндинги для Android API
- публикация приложений в Android Market
- интеграция с  Visual Studio 2010
- Mono 2.10
Удручает не бесплатность  MonoDroid.
Больше о релизе - http://tirania.org/blog/archive/2011/Apr-06.html

Setter injection with Unity 2.0

25 мар. 2011 г. | | |

Пример Setter injection на Unity 2.0 (продолжая тему этого примера)

Пакеры для .NET exe, dll

| | |

Программы, позволяющие  сделать из exe и кучи приблудившихся dll один exe модуль:

Стандартная от MS - ILMerge - http://www.microsoft.com/downloads/en/details.aspx?FamilyID=22914587-b4ad-4eae-87cf-b14ae6a939b0&displaylang=en

NETZ - http://madebits.com/netz/index.php

Molebox - http://www.molebox.com/

Nbox - http://nbox.codeplex.com/

Рефакторинг - не панацея

| | |

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

А так ли это? Попахивает  фанатизмом.

Насколько б рефакторинг не был полезной техникой, нужно понимать, что рефакторинг - это не панацея. Сколько не переименовывай названия методов и переменных, если архитектура кода из разряда "а всё, что плохо держится, мы подопрем деревянными распорками" (из байки "Если б программисты строили дома"), то лучше она от этого не станет. Проектирование ПО плюс постоянный рефакторинг при написании кода – это сильная связка. Плохо спроектированную систему будет трудно рефакторить – есть где разгуляться, да понять бы, за что сначала взяться - рефакторинг будет перекраивать ее, и, если браться за это, то явно не перед сдачей проекта проекта – это не то, на что следует тратить время. «Приближение срока окончания работ – единственный случай, когда можно отложить рефакториг, ссылаясь на недостаток времени.» - говорит М. Фаулер («Рефакторинг. Улучшение существующиего кода»).  
Но не стоит злоупотреблять этой техникой и в мирные времена, когда срок сдачи еще не близок, а руки чешутся что-нибудь переиначить. Рефакторинг кода к шаблонам может иметь не только положительные стороны, но и отрицательные, например, тотальное усложнение кода. Как и любой техникой, рефакторингом нужно использовать с умом. И вообще, ум нужно использовать, это тоже полезная техника ;)

Constuctor injection with Unity 2.0

18 мар. 2011 г. | | |

Пример Constructor Injection на Unity 2.0.

Прелести байткода или зачем нужен обфускатор

10 мар. 2011 г. | | |

Прекрасная идея портируемости приложений, кроссплатформенности родила языки, использующие виртуальные машины, компилирующие промежуточный платформенно-независимый код (байт-код) в платформенно-специфичный код. Яркие примеры таких языков - Java, C#, VB, ActionScript etc. История, которую я хочу рассказать, будет именно о последнем, но общие моменты касаются всех языков, компилирующихся в промежуточный код.

История одного приложения

9 мар. 2011 г. | | |

История эта началась давно, в те времена, когда деревья были высокими и трава зеленее, да и макароны назывались правильно ... И была поставлена задача - написать простенькое приложеньице, дополнение к главной программе, состоящее буквально из одной формы.

Сравнение IoC-контейнеров

10 февр. 2011 г. | | |

Небольшой сравнительный анализ IoC-контейнеров (AutoFac, MEF, Ninject, Spring.Net, StructureMap, Unity, Windsor) http://elegantcode.com/2009/01/07/ioc-libraries-compared/
Глубокий сравнительный анализ IoC-контейнеров:
http://blog.ashmind.com/index.php/2008/08/19/comparing-net-di-ioc-frameworks-part-1/
http://blog.ashmind.com/index.php/2008/09/08/comparing-net-di-ioc-frameworks-part-2/
Бенчмарк IoC-контейнеров (Unity, Windsor, StructureMap, Spring.NET): 
http://www.codinginstinct.com/2008/04/ioc-container-benchmark-unity-windsor.html
Делайте выводы, решайте сами, иметь или не иметь ;)