пятница, 22 июня 2007 г.

Resharper 3.0

Вышла свеженькая версия
http://www.jetbrains.net/confluence/display/ReSharper/Download
(http://www.jetbrains.com/resharper/download/index.html)

Основные полезности:
http://www.jetbrains.com/resharper/features/newfeatures.html

Из системных требований:
* Processor: Pentium III 850 Mhz minimum (Pentium IV 1.5 Ghz recommended)
* Memory: 512 Mb minimum (1Gb recommended)
* Disk space: 100 Mb
* Operating System: Microsoft Windows 2000/XP/Vista
* Software installed: Microsoft Visual Studio 2005 with Service Pack 1 or Microsoft Visual Studio 2008 codename "Orcas" Beta (experimental support)

четверг, 21 июня 2007 г.

Web Services

C 27-29 на площадке Люксофта будет проводится курс по Web-Services.
Курс будет компиляция для нужд компании материалов по тренингам Course 2548, Course 2549 (тренинги подготовки к сертификации - MCTS: .NET Framework 2.0 Distributed Applications)

Смотрю, какое состояние в Microsoft по этим делам

Книжки:
MCTS Self-Paced Training Kit (Exam 70-529): Microsoft .NET Framework 2.0 Distributed Application Development

ПОДГОТОВКА: MSC-010 WebServices
http://search.microsoft.com/results.aspx?mkt=en-US&setlang=en-US&q=webcast+web+services
http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032265801&Culture=en-US MSDN Webcast: Web Services (Level 300)
http://support.microsoft.com/kb/821377/ Support WebCast: Introduction to Microsoft Web Services Enhancements
http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?culture=en-US&EventID=1032299316&CountryCode=US
MSDN Architecture Webcast: Introducing Web Services Enhancements for Microsoft .NET (WSE) 3.0 (Level 200)
http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?culture=en-US&EventID=1032284289&CountryCode=US
MSDN Webcast: Introducing Web Services in SQL Server 2005 (Level 200)


Web Services Enhancements (WSE)
http://msdn2.microsoft.com/en-us/webservices/aa740663.aspx
http://msdn2.microsoft.com/en-us/webservices/aa740663.aspx#wse3video

INSTALL
Web Services Enhancements (WSE) 3.0 for Microsoft .NET
http://www.microsoft.com/downloads/details.aspx?familyid=018A09FD-3A74-43C5-8EC1-8D789091255D&displaylang=en

вторник, 12 июня 2007 г.

Business Intelligence (BI)

Завтра начну 3 дневный курс Course 2796. Designing an Analysis Solution Architecture Using Microsoft SQL Server 2005 Analysis Services на площадке Люксофта.

Курс расчитан на BI-разработчиков. Так звучит в официальной документации :) А по простому - есть решение типа Access с мелкими нюансами и нужно научиться им пользоваться. Прорабатываются концепции и идеология BI.

Кстати о концепци. В отличии от Access здесь вместо одного приложения для одного пользователя аж-но три - для целого предприятия :)

Три составляющих успеха:
1) Нужно получить данные из кучи мест. Используем SSIS
2) Было бы неплохо эти данные причесать к одному виду и заранее предоставить нужные выборки - то есть сделать OLAP-куб. Для этого изучаем SSAS
3) Отдать конечному пользователю - картинки, отчёты, таблицы, и главное интерактивно и через Web. Изучаем - SSRS

Всё :) Если объяснений в 3 пункта не хватило -- смотрим курс BI на SQL 2005


Справка. OLTP-база отличается от OLAP-базы по принципу использования. Если OLTP это наша любимая база, в которую мы пишем, читаем и модифицируем со скоростью наших мыслей (SELECT, UPDATE...), то OLAP-база заточена только на SELECT. Соотвесно в ней всё наоборот. Нам нужно ускорить выборки, а не бороться с дубликацией денных. Как? Денормализация и другие ухищрения, о которых идёт речь на курсе.


Источники. Незаменимым подспорьем во время подготовки были:
SQL Server 2005 Analysis Services Tutorial - тут примерчики посмотреть
SQL Server Analysis Services - а здесь про концепции и понятия почитать
Chapter 17: Data Warehouse Design - Глава из книги про SQL 2000, где разъясняется про SCD и RCD
Главный ресурс по технологии SSAS - там внизу есть webcasts (например: SQL Server Video Tour)

воскресенье, 10 июня 2007 г.

Microsoft по-русски

Много раз слышал, да может и сам говорил: "Почему Билл Гейтс не русский".
Хотя по некоторым сведениям его помощник собрался покататься на нашем космическом корабле и одно из условий подучить русский. Видать и Гейтс решил не отставать и дал команду переводить MSDN на русский :)

Документация по MS SQL Server 2005

а самое приятное - Русский MSDN Magazine

Конечно читать по-русский приятней. Но иногда перевод вводит в тупик.

Пример: тема Агрегаты из SSAS 2005.
"Агрегаты — это предварительно вычисляемые сводные данные конечных ячеек"
а вот оригинал: "Aggregations are precalculated summaries of data (nonleaf cells) that improve query response time by preparing the answers before the questions are asked"
Оригинал оказался понятней и чётко подчёркивает nonleaf cells. В русском эквиваленте я даже не придал значения этому факту.

среда, 6 июня 2007 г.

Friends из C++ в C#

NUnit.
Вопрос: где разместить код теста.
Проблема: чтобы достучаться до закрытых методов и полей класса.
Решение: reflection или внутри сборки.

На самом деле эта проблема может быть решена с использование модификатора доступа "friend", который был в С++, но отсутствует с языке С#.

Теперь это можно сделать декларативно. В нашем классе объявить друзей:


[assembly:InternalsVisibleTo("cs_friend_assemblies_2")]
class Class1 ...

А используем так:

// compile with: /reference:cs_friend_assemblies.dll /out:cs_friend_assemblies_2.exe
public class M
{
static void Main()
{
Class1 a = new Class1();
...


http://msdn2.microsoft.com/en-gb/library/0tke9fxk.aspx
http://www.infoq.com/news/2007/06/Friend-Assemblies

суббота, 2 июня 2007 г.

В C# много синтаксического сахара

Перечитываю Рихтера первое издание. Так фраза Кирилла, что в c# много синтаксического сахара , просто позволяет совсем другими глазами на многое взглянуть.

и ведь точно много сахара. например:
yield - скрывает под собой нумератор, то есть просто обёртка над классом (реализация паттерна Iterator)
delegate - тоже обёртка над классом (реализация паттерна Observer, но можно приспособить и для Command, Strategy и другие)
event - расставляет private для delegate, то есть тоже класс обёртка над другим классом обёрткой - delegate (реализация Observer чистой воды).

Как много условностей, но и в тоже время красиво!

Refactoring: Replace Nested Conditional with Guard Clauses

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


public bool MyFunc()
{
if(IsEnable() &&
TabbedMdiManager != null &&
TabbedMdiManager.ActiveTab != null &&
TabbedMdiManager.ActiveTab.IsSelected &&
(TabbedMdiManager.ActiveTab.Form as BaseForm).Navigate())
{
return true;
}
else
{
return false;
}

}

Ради чего делалась проверка условий, если потом пишем два блока с return загадка.
Поэтому без большой науки я преобразовал код к следующему виду:

Вариант 1.

return (IsEnable()
&& TabbedMdiManager != null
&& TabbedMdiManager.ActiveTab != null
&& TabbedMdiManager.ActiveTab.IsSelected
&& (TabbedMdiManager.ActiveTab.Form as BaseForm).Navigate());

Здесь ВАЖНО: 1) return 2) начинать новую строку && - сразу визуально видно в чём попс.

После мелких раздумий, казалось бы ничего нам не мешает написать так:

Вариант 2.

bool NoMdi = TabbedMdiManager != null;
bool NoActiveTab = TabbedMdiManager.ActiveTab != null;
bool IsSelected = TabbedMdiManager.ActiveTab.IsSelected;
bool DoesNavigate = (TabbedMdiManager.ActiveTab.Form as BaseForm).Navigate();

return InEditMode() && NoMdi && NoActiveTab && IsSelected && DoesNavigate;

Или так:

Вариант 3.

bool x = IsEnablee();
x = x && TabbedMdiManager != null && TabbedMdiManager.ActiveTab != null && TabbedMdiManager.ActiveTab.IsSelected;
x = x && (TabbedMdiManager.ActiveTab.Form as BaseForm).Navigate();
return x;


Но оба вариант (2) и (3) имеют ошибку. Оператор if может завершить вычисление не дойдя до конца логического выражения.
А вот вариант 2 и 3 такое не могут. Соответствено мы получим исключение во время проверки, например в строчке IsSelected.


Но если посмотреть на код с другой стороны. То можно увидеть, что первые 4 проверки являются стороживыми условиями для выполнения функции Navigate().
Соответственно используем метод "Replace Nested Conditional with Guard Clauses" получаем:

Вариант 4.

public bool MyFunc()
{
If( !InEnable() ) return false;
If(TabbedMdiManager == null ) return false;
If(TabbedMdiManager.ActiveTab == null ) return false;
If(!TabbedMdiManager.ActiveTab.IsSelected ) return false;
if(!(TabbedMdiManager.ActiveTab.Form is BaseForm)) return false;

return TabbedMdiManager.ActiveTab.Form.Navigate());
}

Вывод: Вариант 1. Затрудняет отладку -- не понятно, какое условие сработало. Нужно делать дополнительные телодвижения.

вариант 2, 3 - содержат ошибку, которая заложена в if. В исходном коде делается предположение, что все хорошо
знают, что if может и не дойти до конца.

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

Вариант 4. К нему нужно привыкнуть. Множественный выход - религиозные войны. Но для проверки входных условий -- очень мощный механизм. Ещё один минус -- важен порядок. Последовательные строки с if...return могут создать ложное предположение, что строчки можно поменять местами.

Вывод: народ проголосовал за вариант 1. Я остался при своём (вариант 4).

А проблема одна: условия связанные и их раздирать по варианту (2) и (3) нельзя.

Полезно:
http://www.refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html


Кстати, сейчас проголосовало несколько человек за варианты. Если бы не было ошибок, то за

вариант 1 - отдано 2 голоса
вариант 2 - отдано 1,5 голоса
вариант 3 - отдан 1 голос
вариант 4 - 0.5 голоса

я отдал за (2) и (4) вариант, так как оба хороши. Всё зависит являются ли части логического выражения граничными условиями или нет.

пятница, 1 июня 2007 г.

Среда для разработки.

Что нужно для разработчика. Visual Studio? А ннет. Нужно многое, чтобы было качествено и хорошо.

Например боевой комплект может выглядить так:
jira- управление требованиями, задачами, версиями и багтрэкер
confluence - любой проект содержит 2 вещи: программа и документ. Это IDE для создания документа на базе WIKI.
subversion - репозиторий для хранения кода
cruise control - сборка, которая может подхватывать любые другие плагины (о них ниже)
nunit - тестирование
nant - гибкий билд процесс
fxcop - главныйы инструмент качественного кодирования

Сейчас это дело соберу на виртуальной машине -- и можно будет пользоваться пока trial позволяет :)