Вышла свеженькая версия
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)
пятница, 22 июня 2007 г.
Resharper 3.0
на 15:27 0 коммент.
Ярлыки: Agile Tools, C#
четверг, 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
на 18:34 1 коммент.
Ярлыки: Тренинги
вторник, 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)
на 17:32 1 коммент.
воскресенье, 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. В русском эквиваленте я даже не придал значения этому факту.
на 21:54 0 коммент.
среда, 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
на 10:09 0 коммент.
Ярлыки: C#
суббота, 2 июня 2007 г.
В C# много синтаксического сахара
Перечитываю Рихтера первое издание. Так фраза Кирилла, что в c# много синтаксического сахара , просто позволяет совсем другими глазами на многое взглянуть.
и ведь точно много сахара. например:
yield - скрывает под собой нумератор, то есть просто обёртка над классом (реализация паттерна Iterator)
delegate - тоже обёртка над классом (реализация паттерна Observer, но можно приспособить и для Command, Strategy и другие)
event - расставляет private для delegate, то есть тоже класс обёртка над другим классом обёрткой - delegate (реализация Observer чистой воды).
Как много условностей, но и в тоже время красиво!
на 19:38 1 коммент.
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) вариант, так как оба хороши. Всё зависит являются ли части логического выражения граничными условиями или нет.
на 17:48 2 коммент.
Ярлыки: Patterns, Refactoring
пятница, 1 июня 2007 г.
Среда для разработки.
Что нужно для разработчика. Visual Studio? А ннет. Нужно многое, чтобы было качествено и хорошо.
Например боевой комплект может выглядить так:
jira- управление требованиями, задачами, версиями и багтрэкер
confluence - любой проект содержит 2 вещи: программа и документ. Это IDE для создания документа на базе WIKI.
subversion - репозиторий для хранения кода
cruise control - сборка, которая может подхватывать любые другие плагины (о них ниже)
nunit - тестирование
nant - гибкий билд процесс
fxcop - главныйы инструмент качественного кодирования
Сейчас это дело соберу на виртуальной машине -- и можно будет пользоваться пока trial позволяет :)
на 18:35 1 коммент.
Ярлыки: Agile Tools, IDE