воскресенье, 29 июля 2007 г.
Вложенные web.config-и
Вот что о нем написано на MSDN: http://msdn2.microsoft.com/en-us/library/ms228167(VS.80).aspx
суббота, 28 июля 2007 г.
Script#
существует компилятор C# -> JavaScript
http://www.nikhilk.net/ScriptSharpIntro.aspx
Это может быть убийцей Google Web Toolkit :-)
Скачал, засел разбираться...
UPD: http://code.google.com/p/extsharp/ - C# programming for ExtJS
Утилиты для отладки веб-приложений
Раньше, я использовал Proximitron. Это приложение Windows, которое изначально предназначно для фильтрации всякого рода рекламы, pop-up-ов и проч. Ну и заодно, показывает HTTP трафик.
Но Proximitron давно не обновлялся, да и настраивать каждый раз параметры proxy в браузере мне было очень лениво, и я стал искать замену...
Devolutions.HTTPSpy
Почти сразу я нашел очень прекрасный и совершенно бесплатный (есть и pro-версия за $50) Devolutions.HTTPSpy.Net, который показывал мне HTTP трафик между локальной машиной и удаленным сервером.
Правда, у HTTPSpy есть один большой минус - он не умеет показывать локальный трафик. То есть, если я отлаживаю свое приложение локально - толку от него нет. И я стал искать дальше...
воскресенье, 22 июля 2007 г.
Command Line Arguments Parser
Выложил парсер командной строки, которым мы пользуемся, в Google Code:
http://code.google.com/p/commandlineargs/
Собственно, сам пост
Разбираясь с исходниками NUnit, наткнулся на любопытный способ разбора параметров командной строки.
Вообще-то, не могу понять, почему в .Net Framework не предусмотрели классов для парсинга командной строки. Банальный же массив string[] args, который передается в Main(), для серъезного дела вообще никак не подходит. Вот и пишет каждый разработчик себе такой класс самостоятельно, потому что дело вроде плевое и импортить что-то чужое не хочется. Я вот тоже писал, и не раз.Так вот, в NUnit используется класс Codeblast.CommandLineOptions. В нем используется интересный подход, суть которого в следующем:
Что нужно хорошему парсеру аргументов командной строки? Несколько вещей, на мой взгляд:
- поддержка опции /help. То есть утилита должна напомнить пользователю, как ее правильно вызывать
- поддержка именованных параметров, вне зависимости от очередности их расположения в строке вызова. То есть util.exe /console /admin должен интерпретироваться так же, как и util.exe /admin /console
- грамотная валидация. То есть утилита должна объяснить пользователю, что он ввел не так
Разработчик command line утилиты создает наследник класса CommandLineOptions, в котором описывает требуемые параметры командной строки просто как properties. Такие properties он помечает специальным атрибутом Option("..."), указывая описание свойства, которое потом автоматически сгенерируется и покажется пользователю.
Авторы (Gert Lombard и James Newkirk) в коментариях к коду дают вот такое описание возможных параметров:
// I define 3 types of "options":
// 1. Boolean options (yes/no values), e.g: /r to recurse
// 2. Value options, e.g: /loglevel=3
// 2. Parameters: standalone strings like file names
//
// An example to explain:
// csc /nologo /t:exe myfile.cs
//
// + parameter
//
// + value option
//
// + boolean option
Вот так этот класс применяется в NUnit console runner. Посмотрите на диаграмму классов:
Пользоваться таким парсером очень просто:
ConsoleOptions options = new ConsoleOptions(args);
if(!options.nologo)
WriteCopyright();
if(options.help)
{
options.Help();
return 0;
}
Решение, на мой взгляд, простое и зрелое - проверяется безопасность типов (при парсинге args[] проверяется PropertyInfo требуемых свойств) и использующему параметры коду уже не нужно беспокоиться об парсинге строковых значений, как это бывает в не столь красивых парсерах. Плюс к тому - описывать набор принимаемых параметров через атрибуты очень удобно.
Во всем этом великолепии, на мой взгляд, не хватает всего пары вещей
- Декларативного описания правил валидации. Ну например, через атрибут RequiredOption().
- Множественных layout-ов, когда в зависимости от значения какого-нибудь параметра изменяются требования к наличию-отсутствию других параметров. Можно сделать, например, через дерево классов-наследников CommandLineOptions.
- Неименованных параметров, чтобы можно было бы сделать так: util.exe /update Module1/src
пятница, 20 июля 2007 г.
UDDI
Вкратце - UDDI (Universal Description, Discovery, and Integration) применяют, чтобы сделать loosely coupled связывание различных систем при помощи веб-сервисов, ремотинга и тому подобной хренотени. Точнее - не само связывание, а управление связыванием, регистрация endpoint-ов и линков между ними в едином месте.
Зачем это нужно? В нашем случае, несколько подсистем разрабатывают разные команды, кто во что горазд. Общего менеджмента над всем этим практически нет, интеграционные риски велики. И вот чтобы избежать ситуации, когда каждый сервис знает обо всех других, будем внедрять единый репозиторий систем. Все участники проекта, вроде, согласны. Посмотрим, как пойдет на практике...
Сайт OASIS UDDI: http://www.uddi.org/
четверг, 19 июля 2007 г.
Антипаттерны "God Object" и "Big Hairy Object"
God Object
Wikipedia: http://en.wikipedia.org/wiki/God_object
“God Object” – это объект, который знает слишком много или делает слишком много.
Программисты создают Объект-Бога, когда не могут (не хотят) нормально провести объектно-ориентированную композицию. Объекта-Бога невозможно покрыть юнит-тестами, потому что у него огромное количество состояний и «завязок» на внешние сущности. Нельзя проверить какой-то один аспект его функциональности, потому что они намертво связаны с остальными.
В результате, однажды никто не сможет понять, как работает такой объект. Попытки дописать в него новый функционал приведут к лавине багов в старом коде, попытки их починить приведут к новым багам.
Решение – покрывать юнит-тестами по чуть-чуть и делать рефакторинг. Желательно использовать для этого автоматизированные средства, такие как JetBrains ReSharper.
Big Hairy Object
Wikipedia: http://en.wikipedia.org/wiki/Big_Hairy_Object
Почти то же самое, но с огромным числом свойств и методов, напиханных «абы как», безструктурно.
См также:
Другие антипаттерны: http://en.wikipedia.org/wiki/Anti-pattern
101 Ways To Know Your Software Project Is Doomed
- Management has renamed its Waterfall process to Agile Waterfall
- You start hiring consultants so they can take the blame
- The Continuous Integration server has returned the error message “Fuck it, I give up”
пятница, 13 июля 2007 г.
Visual Studio 2005 for Database Professionals
После этого пишешь скрипты для записи начальных данных в базу, настройки и т.п. А дальше - либо собираешь "инсталляционный" .sql, либо напрямую деплоишь в БД.
Как и должно быть, система позволяет отслеживать различия между исходной БД и базой назначения, создавать инкрементальные скрипты и т.п. стафф.
Вообщем - чуть-чуть кривенько (окошки моргают, притормаживает) но вполне бодренько.
Умеет работать с SQLServer 2000 и 2005. С Ораклом не умеет :-)
понедельник, 9 июля 2007 г.
Как подключиться к MS SQL Server Embedded Edition
Оказывается, во всем утилитах для MS SQLServer 2005 при подключении к серверу БД можно вместо Server Name вводить имя named pipe. Например, это помогает подключиться к SQL Server Embedded Edition, в котором по умолчанию для standalone установки хранят свои базы SharePoint Services.
Для этого всего лишь надо в поле server name ввести "\\.\pipe\mssql$microsoft##ssee\sql\query"
В противном случае - пришлось бы ставить SQL Server Management Studio Express
Найдено тут: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=949426&SiteID=1
четверг, 5 июля 2007 г.
"квотирование атрибутов в XML" или "век живи, век учись"
Вполне себе валидный. Вот что говорит стандарт:
Literals
[9]
EntityValue ::= ' " ' ([^%&"] PEReference Reference)* ' " ' " ' " ([^%&'] PEReference Reference)* " ' "
[10]
AttValue ::= ' " ' ([^<&"] Reference)* ' " ' " ' " ([^<&'] Reference)* " ' "
Такие дела. Я, когда xml с одинарными кавычками увидел, был на 100 процентов уверен, что он не валидный.
PS: А MS IE например, его открывает нормально, но показывает уже с двойными кавычками.
понедельник, 2 июля 2007 г.
Как пользоваться LINQ или MS DAL
1. http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx
2. http://weblogs.asp.net/scottgu/archive/2007/05/29/linq-to-sql-part-2-defining-our-data-model-classes.aspx
3. http://weblogs.asp.net/scottgu/archive/2007/06/29/linq-to-sql-part-3-querying-our-database.aspx