<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://dev.net.ua/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang=""><title type="html">Mike Chaliy's Blog</title><subtitle type="html">Покищо навкруги .Net</subtitle><id>http://dev.net.ua/blogs/mikechaliy/atom.aspx</id><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/default.aspx" /><link rel="self" type="application/atom+xml" href="http://dev.net.ua/blogs/mikechaliy/atom.aspx" /><generator uri="http://communityserver.org" version="2.1.60809.935">Community Server</generator><updated>2008-08-11T20:05:41Z</updated><entry><title>Я їду на “Платформа 2009”</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2008/11/28/7226.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2008/11/28/7226.aspx</id><published>2008-11-28T11:23:57Z</published><updated>2008-11-28T11:23:57Z</updated><content type="html">&lt;p&gt;Дякуючи Майкрософт Україна та ГлобалЛоджік, я їду на &lt;a href="http://platforma2009.ru/"&gt;“Платформу 2009”&lt;/a&gt;. Якщо хтось теж їде, кажіть - зустрінемось! &lt;/p&gt;  &lt;p&gt;А ось мій розклад, майже кожного разу в мене на один час більше двох сесій. Вже на місці буду дивитись де цікавіше.&lt;/p&gt;  &lt;table style="border-collapse:collapse;" cellspacing="0" cellpadding="8"&gt;     &lt;tr&gt;       &lt;th class="dayTH"&gt;04 декабря&lt;/th&gt;     &lt;/tr&gt;        &lt;tr&gt;       &lt;td class="timeTD"&gt;08:00-          &lt;br /&gt;10:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Регистрация          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;10:00-          &lt;br /&gt;12:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Открытие конференции. Пленарный доклад (Большой зал).          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;12:00-          &lt;br /&gt;13:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Обед          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;13:30-          &lt;br /&gt;14:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: DB 201          &lt;br /&gt;&lt;b&gt;SQL Server 2008 единым взглядом&lt;/b&gt;           &lt;br /&gt;Место: Большой зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;13:30-          &lt;br /&gt;14:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: AR 201          &lt;br /&gt;&lt;b&gt;Claim-based identity: обзор технологий &amp;quot;Geneva&amp;quot;&lt;/b&gt;           &lt;br /&gt;Место: Желтый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;14:30-          &lt;br /&gt;15:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Перерыв          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;15:00-          &lt;br /&gt;16:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: DT 201          &lt;br /&gt;&lt;b&gt;Платформа Microsoft Windows Embedded: новые возможности для Ваших проектов&lt;/b&gt;           &lt;br /&gt;Место: Красный зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;16:00-          &lt;br /&gt;16:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Перерыв          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;16:30-          &lt;br /&gt;17:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: AR 203          &lt;br /&gt;&lt;b&gt;Обзор перспектив прикладной платформы Microsoft&lt;/b&gt;           &lt;br /&gt;Место: Желтый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;16:30-          &lt;br /&gt;17:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: DB 302          &lt;br /&gt;&lt;b&gt;Миграция на SQL Server 2008 с предыдущих версий&lt;/b&gt;           &lt;br /&gt;Место: Зеленый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;17:30-          &lt;br /&gt;18:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Перерыв          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;18:00-          &lt;br /&gt;19:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: AR 204          &lt;br /&gt;&lt;b&gt;Архитектура приложений на платформе .NET теперь в стиле Софт + Сервисы&lt;/b&gt;           &lt;br /&gt;Место: Желтый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;18:00-          &lt;br /&gt;19:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: DT 204          &lt;br /&gt;&lt;b&gt;Как написать полноценное бизнес приложение на Windows Mobile&lt;/b&gt;           &lt;br /&gt;Место: Зеленый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;19:00-          &lt;br /&gt;19:15&lt;/td&gt;        &lt;td class="nameTD"&gt;Перерыв          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;19:15-          &lt;br /&gt;20:15&lt;/td&gt;        &lt;td class="nameTD"&gt;Круглый стол: RN 204          &lt;br /&gt;&lt;b&gt;Платформа Microsoft - эволюция в облако. Изменит ли реализация S+S стратегии мир?&lt;/b&gt;           &lt;br /&gt;Место: Желтый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;19:15-          &lt;br /&gt;20:15&lt;/td&gt;        &lt;td class="nameTD"&gt;Круглый стол: RN 205          &lt;br /&gt;&lt;b&gt;Виртуализация 360&lt;/b&gt;           &lt;br /&gt;Место: Большой зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;19:15-          &lt;br /&gt;20:15&lt;/td&gt;        &lt;td class="nameTD"&gt;Вечерняя программа          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="font-size:xx-small;" colspan="2"&gt;&amp;#160;&lt;/td&gt; &lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;       &lt;th class="dayTH"&gt;05 декабря&lt;/th&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;09:00-          &lt;br /&gt;09:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Перерыв          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;09:30-          &lt;br /&gt;10:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: IS 303          &lt;br /&gt;&lt;b&gt;Безопасный обмен данными между организациями с использованием Active Directory Rights Management Services и Active Directory Federation Services&lt;/b&gt;           &lt;br /&gt;Место: Бежевый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;09:30-          &lt;br /&gt;10:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: AR 205          &lt;br /&gt;&lt;b&gt;Обзор сервисной платформы Microsoft Azure &lt;/b&gt;          &lt;br /&gt;Место: Большой зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;09:30-          &lt;br /&gt;10:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: DT 405          &lt;br /&gt;&lt;b&gt;Функциональное программирование и параллельные вычисления – новые возможности для разработчиков в .NET: Task Parallel Library и PLINQ&lt;/b&gt;           &lt;br /&gt;Место: Красный зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;10:30-          &lt;br /&gt;11:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Перерыв          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;11:00-          &lt;br /&gt;12:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: AR 206          &lt;br /&gt;&lt;b&gt;Первый взгляд на Oslo, Dublin и Workflow Foundation 4.0&lt;/b&gt;           &lt;br /&gt;Место: Большой зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;11:00-          &lt;br /&gt;12:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: OS 202          &lt;br /&gt;&lt;b&gt;Windows – как создается операционная система&lt;/b&gt;           &lt;br /&gt;Место: Желтый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;11:00-          &lt;br /&gt;12:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: DB 303          &lt;br /&gt;&lt;b&gt;SQL Server 2008: полный контроль над информацией &lt;/b&gt;          &lt;br /&gt;Место: Зеленый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;12:00-          &lt;br /&gt;13:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Обед          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;13:00-          &lt;br /&gt;14:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: DT 207          &lt;br /&gt;&lt;b&gt;Windows Azure: Разработка для облака&lt;/b&gt;           &lt;br /&gt;Место: Красный зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;14:00-          &lt;br /&gt;14:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Перерыв          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;14:30-          &lt;br /&gt;15:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: AR 107          &lt;br /&gt;&lt;b&gt;Внедрение решений Enterprise Project Management: взгляд бизнес-архитектора&lt;/b&gt;           &lt;br /&gt;Место: Бежевый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;14:30-          &lt;br /&gt;15:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: IT 211          &lt;br /&gt;&lt;b&gt;Как Microsoft Consulting Services делает крупные инфраструктурные проекты. Уникальные технологии, средства автоматизации, и практические наработки.&lt;/b&gt;           &lt;br /&gt;Место: Желтый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;14:30-          &lt;br /&gt;15:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: BI 202          &lt;br /&gt;&lt;b&gt;Обзор SQL Server Analysis Services 2008&lt;/b&gt;           &lt;br /&gt;Место: Зеленый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;15:30-          &lt;br /&gt;16:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Перерыв          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;16:00-          &lt;br /&gt;17:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: PS 202          &lt;br /&gt;&lt;b&gt;Проектирование решений для SharePoint Server 2007&lt;/b&gt;           &lt;br /&gt;Место: Желтый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;16:00-          &lt;br /&gt;17:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: BI 303          &lt;br /&gt;&lt;b&gt;Бизнес-аналитика и моделирование в SQL Server 2010 Analysis Services&lt;/b&gt;           &lt;br /&gt;Место: Зеленый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;17:00-          &lt;br /&gt;17:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Перерыв          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;17:30-          &lt;br /&gt;18:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: UC 202          &lt;br /&gt;&lt;b&gt;Новый виток эволюции в объединенных коммуникациях. Office Communication Server 2007 R2&lt;/b&gt;           &lt;br /&gt;Место: Синий зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;18:30-          &lt;br /&gt;18:45&lt;/td&gt;        &lt;td class="nameTD"&gt;Перерыв          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;18:45-          &lt;br /&gt;20:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Закрытие конференции (Большой зал).          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7226" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Microsoft" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Microsoft/default.aspx" /></entry><entry><title>CSV у якості DataSource</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2008/10/29/7095.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2008/10/29/7095.aspx</id><published>2008-10-29T09:43:25Z</published><updated>2008-10-29T09:43:25Z</updated><content type="html">&lt;p&gt;Для Data-Driven тестів я завжди використовував Excel, легко редагувати, легко під’єднати, тощо. Десь з тиждень назад розпочалась нова ера мого життя ;), мій дев лід вказав на старе як мир правило.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Будь який код повинен версіонуватися!&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Все просто. По-перше, в тексті найменша зміна яка піддається діфам та мержам це один символ. В бінарному файлі, тільки сам файл. По-друге, для Data-Driven тестів, Дата це код.&lt;/p&gt;  &lt;p&gt;Ну і добре! Принаймні два рішення. Перше це XML, а друге CSV. XML я одразу відкинув, купа сміття усі ті теги та атрибути. Для табулярних даних це просто оверкіл. Отже CSV.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Головне правило для роботи з MSTest Data-Driven тестами.&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Якщо тест каже піти подивитись Troubleshooting Data-Driven Unit Tests, це треба зробити.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;em&gt;Наприклад я ніколи не читаю щось де є слово Troubleshooting. А тому я витратив декілька годин, на дебаггінг студії, ODBC провайдера, пошуку в інеті, тощо.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;На сторінці &lt;a href="http://msdn.microsoft.com/en-us/library/ms404700(VS.80).aspx"&gt;Troubleshooting Data-Driven Unit Tests&lt;/a&gt; можна знайти нормальні рядки під’єднання, з деякими подробицями. Наприклад:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\;Extended Properties=&amp;quot;text;HDR=Yes;FMT=Delimited”&lt;/p&gt;    &lt;p&gt;&lt;b&gt;Tip&lt;/b&gt;&amp;#160;&amp;#160;&amp;#160; For the test.csv file, use test#csv as the table name.&lt;/p&gt;    &lt;p&gt;&lt;b&gt;Note&lt;/b&gt;&amp;#160;&amp;#160; HDR=Yes means that the first row contains column names, not actual data.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Отже правила.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;1) Крапка в назві файлу повинна бути замінена на “#”. Інше рішення це зовсім прибрати розширення, але реальний файл тоді повинен мати розширення “.txt”.&lt;/p&gt;  &lt;p&gt;2) CSV файли повинні бути в окремій папці. Я на 100% не розумію проблему, але схоже що, з якогось переляку, драйвер перебирає усі файли, і валиться якщо йому щось не зрозуміло.&lt;/p&gt;  &lt;p&gt;3) CSV файлу начхати на формат в якому ви туди щось запишете, але тести працювати не будуть якщо колонки не будуть текстовими. Я знаю два шляхи, якийсь там inf файл в директорію. Але це складно. Другий просто всі значення огортати лапками. Останнє стовідсотково працює.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Приклад тесту&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;   &lt;br /&gt;[TestMethod]    &lt;br /&gt;[DataSource(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"System.Data.OleDb"&lt;/span&gt;,     &lt;br /&gt;            &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\\Data\\;Extended Properties=\"text;HDR=Yes;FMT=Delimited\""&lt;/span&gt;,     &lt;br /&gt;            &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"ValidPostalCodes#csv"&lt;/span&gt;, DataAccessMethod.Sequential)]     &lt;br /&gt;[DeploymentItem(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"\\UnitTests\\Data\\ValidPostalCodes.csv"&lt;/span&gt;, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"Data"&lt;/span&gt;)]     &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;void&lt;/span&gt; Validator_Should_Accept_Example_Postal_Code()   &lt;/span&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Приклад файлу&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;   &lt;br /&gt;PostalCode,Comment    &lt;br /&gt;&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"1555-1899"&lt;/span&gt;, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"We allow dashes"&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"184878848"&lt;/span&gt;, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"9 Digts is maximum"&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"1"&lt;/span&gt;, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"1 digist is also valid postal code"&lt;/span&gt;  &lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7095" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Unit Testing" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Unit+Testing/default.aspx" /><category term="Data-Driven Unit Testing" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Data-Driven+Unit+Testing/default.aspx" /></entry><entry><title>MEF використовується тут…</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2008/10/29/7092.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2008/10/29/7092.aspx</id><published>2008-10-29T08:31:48Z</published><updated>2008-10-29T08:31:48Z</updated><content type="html">&lt;p&gt;Цікава особливість останніх новин. Деякі нові анонсовані продукти використовують &lt;a href="http://code.msdn.microsoft.com/mef"&gt;Managed Extensibility Framework&lt;/a&gt;..&lt;/p&gt;  &lt;p&gt;1) “&lt;a href="http://weblogs.asp.net/israelio/archive/2008/10/28/pdc08-scott-gu.aspx"&gt;New WPF source Editor - based on MEF e.g. you can add new features to the editor&lt;/a&gt;”. В мене зараз студія 2010 в даунлодах, завтра розповім як воно виглядає. По скріншотам схоже на перші версії бленда.&lt;/p&gt;  &lt;p&gt;2) “&lt;a href="http://www.simplegeek.com/"&gt;but I can say that MEF is absolutely core to our text editing tool for Oslo&lt;/a&gt;”, це я вже первірив, 100% використовується, до речі цей Emacs.Net виглядає дуже класно.&lt;/p&gt;  &lt;p&gt;3) Також MEF використовується в інших компонентах Oslo, наприклад парсер “M”. Хоча швидкий пошук так і не дав відповіді що саме вони там використовують.&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;Деякі питання що виникали на останній UNETA та відповіді на них.&lt;/p&gt;  &lt;p&gt;1) &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/MEFramework/thread/c66f561d-1047-4770-a609-d9fe8b525bc6"&gt;MEF for server side applications&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;In the current CTP bits we have not added any specific support for the server. We are planning to focus on server side support however in future releases. Mostly we see this as revolving around caching,      &lt;br /&gt;security and threading.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;2) &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/MEFramework/thread/d7f04cff-75e4-4298-a0ab-fe6ac8dfb870"&gt;MEF for Silverlight?&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Yes, MEF for Silverlight is definitely considered. As far as concrete shape, applicable scenarios and delivery vehicle and timeframe - this is still being discussed&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Також в коді можна знайти SILVERLIGHT директиви.&lt;/p&gt;  &lt;p&gt;3) &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/MEFramework/thread/cf6b7cbc-1123-4b32-9810-c235d9606b66"&gt;Comparison to the AddIn libraries?&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;These technologies can be perceived as complimentary. While both of them provide activation support, support System.AddIn-s technology focuses on versioning and isolation (multiple AppDomain support) while the focus of MEF is dependency injection through Import-Export mechanism, loose type matching and metadata around components. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;4) Що там за нутрощі?&lt;/p&gt;  &lt;p&gt;Компіляція Lambda Expressions, тобто DynamicMethod.&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7092" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Visual Studio" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Visual+Studio/default.aspx" /><category term="Silverlight" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Silverlight/default.aspx" /><category term="Lambda Expressions" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Lambda+Expressions/default.aspx" /><category term="Oslo" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Oslo/default.aspx" /><category term="MEF" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/MEF/default.aspx" /></entry><entry><title>Moq - Stubbing is back!</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2008/10/13/7001.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2008/10/13/7001.aspx</id><published>2008-10-13T13:20:37Z</published><updated>2008-10-13T13:20:37Z</updated><content type="html">&lt;p&gt;Мабуть, я&amp;#160; вже усім прожужав вуха про своє кохання – це &lt;a href="http://code.google.com/p/moq/"&gt;Moq&lt;/a&gt;. Те ще це кохання може засвідчити, той факт що я безкоштовно переклав 300 юніт-тестів з &lt;a href="http://ayende.com/projects/rhino-mocks.aspx"&gt;Rhino.Mocks&lt;/a&gt; на &lt;a href="http://code.google.com/p/moq/"&gt;Moq&lt;/a&gt;, для свого поточного проекту. &lt;/p&gt;  &lt;p&gt;Головна фішка &lt;a href="http://code.google.com/p/moq/"&gt;Moq&lt;/a&gt; це його синтаксис. Я не буду наводити приклади, але це щось! Усілякі рекоди/реплай в минулому.&lt;/p&gt;  &lt;p&gt;Але була і ложка дьогтю, для мене завжди було не зрозуміле повне ігнорування факту, що іноді таки потрібен стаббінг.&lt;/p&gt;  &lt;p&gt;Але це було! А тепер &lt;a href="http://www.clariusconsulting.net/blogs/kzu/archive/2008/10/12/102921.aspx"&gt;Mog 2.6 – і підтримка стаббінгу&lt;/a&gt;. За лінкою можна все прочитати.&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;Декілька фактів&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Підтримує тільки синтаксис побудований на Lambda Expressions, а отже .NET 2.0 в прольоті; &lt;/li&gt;    &lt;li&gt;Все типізоване, все підтримує інтелісенс;&lt;/li&gt;    &lt;li&gt;Саме ця бібліотека використовується Microsoft для публічної версії MVC Framework. Внутрішня використовує щось своє, виплекане в тернях Microsoft;&lt;/li&gt; &lt;/ul&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7001" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Unit Testing" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Unit+Testing/default.aspx" /><category term="Lambda Expressions" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Lambda+Expressions/default.aspx" /><category term="Mocking" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Mocking/default.aspx" /><category term="Rhino.Mocks" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Rhino.Mocks/default.aspx" /><category term="Moq" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Moq/default.aspx" /><category term="Test Doubles" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Test+Doubles/default.aspx" /></entry><entry><title>MVC Framework + .NET Framework 2.0 = Майже працює</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2008/10/13/6999.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2008/10/13/6999.aspx</id><published>2008-10-13T08:49:57Z</published><updated>2008-10-13T08:49:57Z</updated><content type="html">&lt;p&gt;Вчора встановлював додаток написаний на MVC Framework на хостінг який підтримує тільки .NET 2.0. Коротко – майже працює ;).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;По-перше&lt;/strong&gt; знадобилось, закинути усі бібліотеки .NET 3.5 які використовує додаток, в моєму випадку це були System.Core, System.ServiceModel.Web, тощо.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Далі&lt;/strong&gt;, виправив web.config так щоб по прибирати бібліотеки які не використовуються додатком, наприклад в мене не використовувались System.Web.Extensions;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Це теж&lt;/strong&gt;, весь код сторінок повинен бути С# 2.0, ніяких там тобі екстеншен методів… В код бехаінд зрозуміло що можна використовувати будь що. Дещо з коду на C# 3.0 зі сторінки просто перейшло в код-бехаінд.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;І останнє&lt;/strong&gt; – &lt;b&gt;&lt;a&gt;ControllerActionInvoker&lt;/a&gt;&lt;/b&gt; який працює по замовчуванню, використовує лямбда експрешенс для оптимізації швидкості, а той у свою чергу констуртор класу &lt;b&gt;&lt;a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Reflection.Emit.DynamicMethod"&gt;DynamicMethod&lt;/a&gt;&lt;/b&gt; який не підтримується в .NET 2.0 :(. Рішення просте, – скористатися можливостями розширення MVC Framework і переписати &lt;b&gt;&lt;a&gt;ControllerActionInvoker&lt;/a&gt;&lt;/b&gt;, так щоб він використовував тільки те що є. Тут вже є два шляхи бо швидкий для кодування, або швидкий для роботи. Я обрав перший ;). Просто за допомогою рефлекшена викликаю методи контроллера ;). Якщо знадобиться пишіть, надішлю…&lt;/p&gt;  &lt;p&gt;Ось таке от в мене хоббі ;)&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6999" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Fun" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Fun/default.aspx" /><category term="MVC Framework" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/MVC+Framework/default.aspx" /></entry><entry><title>Невеличкий Code Smell – зменшення унікальності</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2008/10/11/6995.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2008/10/11/6995.aspx</id><published>2008-10-11T11:29:00Z</published><updated>2008-10-11T11:29:00Z</updated><content type="html">&lt;p&gt;Сьогодні (і так в суботу), в реалізації кешу нашого додатку знайшов такий приклад коду.&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;  &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt; hashKey &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"{0}_{1}"&lt;/span&gt;,   &lt;br /&gt;        String.IsNullOrEmpty(customerId) ? &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt;.Empty : customerId.GetHashCode().ToString(),    &lt;br /&gt;        String.IsNullOrEmpty(orderId) ? &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt;.Empty : orderId.GetHashCode().ToString());  &lt;/span&gt;&lt;/code&gt;&lt;/p&gt; Обидва ідентифікатори це GUID в форматі рядка.  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;А ось невеличкий код який перевірить такий підхід.&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;  &lt;br /&gt;IDictionary cache &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;new&lt;/span&gt; Dictionary();   &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;for&lt;/span&gt; (&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;int&lt;/span&gt; i &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 0; i &lt;br /&gt;{    &lt;br /&gt;    Guid newId &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; Guid.NewGuid();    &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;int&lt;/span&gt; hashCode &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; newId.ToString().GetHashCode();   &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;if&lt;/span&gt; (cache.ContainsKey(hashCode))   &lt;br /&gt;    {    &lt;br /&gt;        Console.WriteLine(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"HashCode: {0}; First GUID: {1}; Second GUID: {2}"&lt;/span&gt;,    &lt;br /&gt;            hashCode, cache[hashCode], newId);    &lt;br /&gt;    }    &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;else&lt;/span&gt;    &lt;br /&gt;    {    &lt;br /&gt;        cache.Add(hashCode, newId);    &lt;br /&gt;    }    &lt;br /&gt;}  &lt;/span&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;і перші три результати цього кода&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;  &lt;br /&gt;HashCode: 140496230; First GUID: d45781e0-62e6-4793-94e706cb3d2ca14a; Second GUID: ffd2b182-a93d-49d5-853e-ca56e5de6fd0   &lt;br /&gt;HashCode: 1297286347; First GUID: 53d0efc3-393d-4699-89e5fb10e3bf1220; Second GUID: 09bfe993-104c-48d6-9ce2-ab76a9483e89    &lt;br /&gt;HashCode: -1224017075; First GUID: 92ecbaf5-73e5-4f6f-bc4991f0c29b0bf0; SecondGUID: 8c36cfc8-f655-43fa-a2ed-a8584614888b  &lt;/span&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;Цікаво коли ця помилка виявиться на продакшені?&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6995" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Code Review" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Code+Review/default.aspx" /><category term="Code Smells" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Code+Smells/default.aspx" /></entry><entry><title>Asp.NET контроли і HtmlEncode</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2008/09/17/6886.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2008/09/17/6886.aspx</id><published>2008-09-17T09:28:03Z</published><updated>2008-09-17T09:28:03Z</updated><content type="html">&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Дуже цікавий &lt;a href="http://blogs.msdn.com/sfaust/attachment/8918996.ashx"&gt;документ&lt;/a&gt; – тут зібрані всі Asp.NET контроли з інформацією про те чи робить цей контрол HtmlEncode коли рендерить результуючий HTML.&lt;/p&gt;  &lt;p&gt;Наприклад Button.Text не робить. Майже всі ToolTip-и теж не роблять…&lt;/p&gt;  &lt;p&gt;Інформація з блогу &lt;a href="http://blogs.msdn.com/sfaust/archive/2008/09/02/which-asp-net-controls-automatically-encodes.aspx"&gt;Sacha Faust&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6886" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Asp.Net" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Asp.Net/default.aspx" /><category term="HTML" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/HTML/default.aspx" /><category term="Code Review" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Code+Review/default.aspx" /><category term="Security" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Security/default.aspx" /></entry><entry><title>Оце так локалізація!</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2008/09/02/6813.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2008/09/02/6813.aspx</id><published>2008-09-02T20:28:54Z</published><updated>2008-09-02T20:28:54Z</updated><content type="html">&lt;p&gt;Мабуть усі знають що Гугль випустили &lt;a href="http://www.google.com.ua/chrome/"&gt;свій браузер&lt;/a&gt; (на двигуні WebKit). Це вже не цікаво. Цікаво як вони підійшли до процесу локалізації. Те що ми попадемо в оті 43 мови, на які перекладено інтерфейс, я майже не сумнівався. Але реальність просто вразала! Виявилось що локалізовано просто все. Куди не ткнись. &lt;/p&gt;  &lt;p&gt;Наприклад ось вам скрін крешу.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/e6dade65d59b_14244/image_4.png"&gt;&lt;img style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" alt="Скріншот екрану краша, " src="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/e6dade65d59b_14244/image_thumb_1.png" width="453" height="240" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;І набір наших пошуковиків, тут і Мета, і БігМір.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/e6dade65d59b_14244/image_8.png"&gt;&lt;img style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" alt="Скріншот вибору пошуковиків, тут і Мета, і БігМір" src="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/e6dade65d59b_14244/image_thumb_3.png" width="480" height="167" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;І навіть навчальне відео, повністю, як то кажуть з нуля, підготовлено українською.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/e6dade65d59b_14244/image_6.png"&gt;&lt;img style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" alt="Сріншот українізованної вкладки" src="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/e6dade65d59b_14244/image_thumb_2.png" width="462" height="378" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;До речі, якщо вже про про цей браузер, то ось такий чек бокс встановлено по замовчуванню.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/e6dade65d59b_14244/image_10.png"&gt;&lt;img style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" alt="Допоможіть покращити бла-бла-бла, скріншот як Гугль збирає інфу" src="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/e6dade65d59b_14244/image_thumb_4.png" width="501" height="105" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Враження, про браузер суто позитивні, ця бета менш глюкава за IE8 Beta 1 або Safari 3.0, хоча і креши бувають і вісяки.&lt;/p&gt;  &lt;p&gt;І традиційний скріншот нашої комуніті, на пам'ять ;)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/e6dade65d59b_14244/image_12.png"&gt;&lt;img style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" alt="Скріншот сайтй нашої комуніті" src="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/e6dade65d59b_14244/image_thumb_5.png" width="550" height="433" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Апдейт #1. &lt;/strong&gt;Гугль використовує Visual Studio 2005 для розробки.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Апдейт #2.&lt;/strong&gt; Таки є не локалізовані речі, правопис браузер первіряє тільки для англійської.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/e6dade65d59b_14244/image_16.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;border-top:0px;border-right:0px;" border="0" alt="Скріншот інпута, англійстка частина помилки підкреслена, а українська ні" src="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/e6dade65d59b_14244/image_thumb_6.png" width="515" height="119" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6813" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Google Chrome" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Google+Chrome/default.aspx" /><category term="Browser" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Browser/default.aspx" /></entry><entry><title>Visual Studio Express Edition – для дома</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2008/09/02/6800.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2008/09/02/6800.aspx</id><published>2008-09-02T11:01:00Z</published><updated>2008-09-02T11:01:00Z</updated><content type="html">&lt;p&gt;&lt;/p&gt;  &lt;p&gt;На вихідних повна версія Visual Studio сказала що жити їй залишилось 6 днів, я вирішив що це знак і пішов шукати альтернативи. Ще за часів 2005 версії я вже дивився на Visual Studio Express Edition, але на той час вона мене повністю не влаштовувала. Наразі з виходом Visual Studio 2008 Express Edition SP1, Майкрософт дуже пом’якшила обмеження. Це мене і надихнуло ;).&lt;/p&gt;  &lt;h4&gt;Проект&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Веб додаток побудований за допомогою MVC Framework; &lt;/li&gt;    &lt;li&gt;SQL Server Express у якості бек-енду; &lt;/li&gt;    &lt;li&gt;Бізнес логіка, в окремому шарі, і побудована з використання DDD; &lt;/li&gt;    &lt;li&gt;Два тестових проекти, один для юніт тестів, а другий для так званих &lt;a href="http://xunitpatterns.com/customer%20test.html"&gt;тестів замовника&lt;/a&gt;; &lt;/li&gt;    &lt;li&gt;Потрібен контроль версій. &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;MVC Framework та Web Application&lt;/h4&gt;  &lt;p&gt;Починаючи з SP1, Visual Studio 2008 Express Edition повністю підтримує Web Application проекти, а це в свою чергу означає підтримку MVC Framework. Більше &lt;a href="http://weblogs.asp.net/scottgu/"&gt;ScottGu&lt;/a&gt; &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/06/01/asp-net-mvc-support-with-visual-web-developer-2008-express.aspx"&gt;проанонсував&lt;/a&gt; офіційну підтримку.&lt;/p&gt;  &lt;h4&gt;SQL Server Express&lt;/h4&gt;  &lt;p&gt;З підтримкою БД все значно складніше, мені так і не вдалось знайти рішення яке б дозволяло нормальний менеджмент версій. Поки що зупинився на генерації бази даних за допомогою &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.createdatabase.aspx"&gt;Linq to SQL контексту&lt;/a&gt;. Схоже що зроблю пустий проект, і буду зберігати інкрементальні апдейт скріпти.&lt;/p&gt;  &lt;h4&gt;&lt;b&gt;Бізнес &lt;/b&gt;логіка, окремі шари, тощо&lt;/h4&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;В SP1 додали ще одну фішку, це підтримка Class Library, зрозуміло що тепер немає жодних перепон робити повноцінний солюшен, з бізнес логікою в окремій збірці.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Цікаво. Web Developer Express офіційно не підтримує Windows та Console Application-и… Але достатньо створити Class Library, а потім просто змінити тип білда ;). Схоже затримка тільки за тим хто перший зробить(або модифікує існуючий) темплейт який додасть в Web Developer Express підтримку цих проектів.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h4&gt;Автоматичне тестування&lt;/h4&gt;  &lt;p&gt;MSTest-ів як не було, так і немає. TestDriven.Net таки прибрали підтримку для Express версій… Отже все як в добрі часи. Будь який фреймворк для тестування, і зовнішня консоль. Нічого страшного жити можна. Для цього проекту я обрав &lt;a href="http://www.codeplex.com/xunit"&gt;&lt;strong&gt;xUnit&lt;/strong&gt;&lt;/a&gt; і &lt;a href="http://www.gallio.org/Default.aspx"&gt;&lt;strong&gt;Gallio&lt;/strong&gt;&lt;/a&gt; у якості консолі.&lt;/p&gt;  &lt;h4&gt;Контроль версій&lt;/h4&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Після невеличкого пошуку зупинився на &lt;a href="http://subversion.tigris.org/"&gt;&lt;strong&gt;SVN&lt;/strong&gt;&lt;/a&gt;. З сервером я довго не мордувався - &lt;a href="http://www.visualsvn.com/server/"&gt;&lt;strong&gt;VisualSVN Server&lt;/strong&gt;&lt;/a&gt; – єдине що воно потребує так це запустити інсталлер. У якості клієнта &lt;b&gt;&lt;a href="http://tortoisesvn.tigris.org/"&gt;TortoiseSVN&lt;/a&gt;&lt;/b&gt;, я вже колись з ним працював, так чи інакше інтеграції з студією поки що не буде. Майкрософт проти адд-інів. Наразі виявилось що і без інтеграції можна жити довго, добре та щасливо.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Покопирсавшись з &lt;a href="http://www.visualsvn.com/server/"&gt;&lt;strong&gt;VisualSVN Server&lt;/strong&gt;&lt;/a&gt; на домашньому компі, вирішив що я не занадто мобільний. Моє звичайне рішення за допомогою Groove, з кодом працює дуже погано, тим паче з репозитаріями SVN ;). Вирішив &lt;a href="http://search.live.com/results.aspx?q=svn+hosting"&gt;пошукати хостінги&lt;/a&gt;. Продивившись декілька зупинився на &lt;a href="http://unfuddle.com/"&gt;nfuddle&lt;/a&gt;, їхня пропозиція безкоштовного хостінга 200МБ мене поки що задовольнила і тепер мій репозитарій в Інтернеті.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h4&gt;Висновок&lt;/h4&gt;  &lt;p&gt;Я просто на сьомому небі ;), все працює і все влаштовує, подивимось, може ще щось знадобиться. Рекомендую.&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6800" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Visual Studio" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Visual+Studio/default.aspx" /><category term="Unit Testing" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Unit+Testing/default.aspx" /><category term="Revision control" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Revision+control/default.aspx" /><category term="Visual Studio Express Edition" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Visual+Studio+Express+Edition/default.aspx" /></entry><entry><title>Trust Boundaries Identification на прикладі Architects.in.ua</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2008/09/01/6785.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2008/09/01/6785.aspx</id><published>2008-09-01T11:08:57Z</published><updated>2008-09-01T11:08:57Z</updated><content type="html">&lt;p&gt;Architects.in.ua дуже простий сайт, виявилось що розробниками написано лише 316 рядків коду. У той самий час сайт має достатньо коду щоб показати деякі проблеми з безпекою. Сьогодні не буде дірок які можна використовувати прямо не виходячи із браузера, сьогодні я хочу розповісти про вельми теоретичне - Trust Boundaries Identification (Кордони Довіри), і як за допомогою цих кордонів зробити додаток більш безпечним.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Це дуже вільна версія, в порівнянні з процесом, який пропонує Microsoft, будьте ласкаві, вважайте її як адаптовану для нашого приклада.&lt;/p&gt; &lt;/blockquote&gt;  &lt;h4&gt;Декомпозиція&lt;/h4&gt;  &lt;p&gt;З точки зору моделювання небезпек(Threat Modeling), одна за перших активностей це віртуальна декомпозиція додатку на субсистеми. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/ebb6f7f2ad13_10CF1/image_2.png"&gt;&lt;img style="border-right-width:0px;margin:10px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" alt="Діаграмма Architects.in.ua декомпозованна на субсистеми." align="left" src="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/ebb6f7f2ad13_10CF1/image_thumb.png" width="260" height="158" /&gt;&lt;/a&gt;В прикладі з Architects.in.ua, це може виглядати так. Користувач - це браузер користувача, середній чотирикутник - сам сайт, і декілька джерел даних у вигляді RSS Feedів.&lt;/p&gt;  &lt;h4&gt;Кордон Довіри (Trust Boundaries)&lt;/h4&gt;  &lt;p&gt;Така декомпозиція дозволяє вже на діаграмі бачити відносини між субситемами, і що найбільш важливе вже зараз розуміти які субсистеми можуть довіряти, а які ні. Наприклад в більшості випадків Користувач &lt;em&gt;не довіряє&lt;/em&gt; сайтам (наприклад ActiveX недозволено). У той самий час більшість додатків &lt;em&gt;довіряють&lt;/em&gt; своїм даним. &lt;a href="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/ebb6f7f2ad13_10CF1/image_4.png"&gt;&lt;img style="border-right-width:0px;margin:10px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" alt="Діаграма поточного Кордону Довіри." align="right" src="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/ebb6f7f2ad13_10CF1/image_thumb_1.png" width="260" height="174" /&gt;&lt;/a&gt;На це є причини, наприклад дуже часто ці додатки спілкуються лише з базою даних, до якої дуже складно дістатися ззовні.&lt;/p&gt;  &lt;p&gt;Поточна реалізація Architects.in.ua будує Кордон Довіри&amp;#160; так що сайт повністю &lt;em&gt;довіряє&lt;/em&gt; фідам.&lt;/p&gt;  &lt;h4&gt;Наслідки&lt;/h4&gt;  &lt;p&gt;Проблема може виникнути якщо хоча б одне джерело даних буде скомпрометовано. &lt;a href="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/ebb6f7f2ad13_10CF1/image_6.png"&gt;&lt;img style="border-right-width:0px;margin:10px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" alt="Просто картинка зкомпроментованого джерела" align="left" src="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/ebb6f7f2ad13_10CF1/image_thumb_2.png" width="95" height="91" /&gt;&lt;/a&gt;В прикладі з Architects.in.ua це достатньо легко уявити, адже джерелом даних для них являється Live Spaces. &lt;/p&gt;  &lt;p&gt;Далі припустимо що одне з джерел таки cкомпроментовано. Що це означає для нас? Тут вже залежить від того як джерело використовується. В Architects.in.ua&amp;#160; є декілька шляхів як цим скористатися.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/ebb6f7f2ad13_10CF1/image_8.png"&gt;&lt;img style="border-right-width:0px;margin:10px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" alt="Діаграма показує зкомпроментований додаток" align="right" src="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/ebb6f7f2ad13_10CF1/image_thumb_3.png" width="260" height="168" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;По-перше, так само як і з попередніми уразливостями, це може використовуватись для DoS атак, дефейсу тощо. Але це не цікаво.&lt;/p&gt;  &lt;p&gt;Набагато цікавіше те що інформація з джерела після невеличкого очищення (sanitation) просто передається на бік користувача! &lt;u&gt;Тобто &lt;u&gt;скомпрометувавши &lt;/u&gt;джерело, атакуючий &lt;u&gt;за допомогою&lt;/u&gt; Architects.in.ua &lt;u&gt;компрометує &lt;/u&gt;користувача!&lt;/u&gt; &lt;a href="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/ebb6f7f2ad13_10CF1/image_10.png"&gt;&lt;img style="border-right-width:0px;margin:10px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" alt="Діаграма показує зкомпроментованого користувача" align="left" src="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/ebb6f7f2ad13_10CF1/image_thumb_4.png" width="260" height="168" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Приклад коду який опікується очисткою інформації та опис як його обійти можна знайти &lt;a href="http://dev.net.ua/blogs/mikechaliy/archive/2008/08/13/6644.aspx"&gt;в попередньому огляді&lt;/a&gt; (Шукати по RemoveTags). &lt;/p&gt;  &lt;h4&gt;Як протистояти&lt;/h4&gt;  &lt;p&gt;Що ж робити? По-перше виправити Кордон Довіри. Сайт повинен &lt;em&gt;довіряти&lt;/em&gt; тільки собі. &lt;a href="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/ebb6f7f2ad13_10CF1/image_12.png"&gt;&lt;img style="border-right-width:0px;margin:10px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" alt="Діаграма де сайт довіряє тільки собі" align="right" src="http://dev.net.ua/blogs/mikechaliy/WindowsLiveWriter/ebb6f7f2ad13_10CF1/image_thumb_5.png" width="260" height="158" /&gt;&lt;/a&gt;Це нам допоможе зробити переоцінку довіри до джерел.&lt;/p&gt;  &lt;p&gt;Далі вже по ситуації, наприклад, в нашому випадку є два шляхи. Обидва прості. Перший це встановити рейтинг небезпеці, тут він буде достатньо невеликий, адже скомпрометувати Live Spaces достатньо складно, отже і довіра до джерела даних велика, а згодом на небезпеку з малим рейтингом можна і наплювати...&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Схоже саме цей шлях і обрали розробники:&lt;/p&gt;    &lt;p&gt;&amp;gt;&amp;gt; Про XSS не согласен, т.к. источники полностью контролируются, а значит не писать любителей подсунуть скрипт.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Другий шлях дещо складніший... все ж таки не довіряти інформації з джерела, і просто пропустити результати через щось на кшталт HttpUtility.HtmlEncode (або ще краще через &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=efb9c819-53ff-4f82-bfaf-e11625130c25&amp;amp;displaylang=en"&gt;Anti-Cross Site Scripting Library&lt;/a&gt;). Дуже складно?&lt;/p&gt;  &lt;h4&gt;Висновок&lt;/h4&gt;  &lt;p&gt;Я тут багато написав, і може скластися уява достатньо робити енкодінг результатів(Encode Output&lt;strong&gt;)&lt;/strong&gt;…&amp;#160; Це не так, головне це реально бачити такі проблеми. Випадок з атакою за допомогою XPath дуже вдалий приклад коли всі знають про SQL Injection, а ось про &lt;a href="http://search.live.com/results.aspx?q=XPath+Injection"&gt;XPath Injection&lt;/a&gt;..&lt;/p&gt;  &lt;h4&gt;Декілька посилань&lt;/h4&gt;  &lt;p&gt;Провідник від Microsoft - &lt;a href="http://msdn.microsoft.com/en-us/library/ms978516.aspx"&gt;Threat Modeling Web Applications&lt;/a&gt; – відносно стисло і зрозуміло викладено процес;&lt;/p&gt;  &lt;p&gt;Частина книги - &lt;a href="http://msdn.microsoft.com/en-us/library/aa302419.aspx"&gt;Chapter 3 – Threat Modeling&lt;/a&gt; – детально викладено весь процес, без залежностей від вебу.&lt;/p&gt;  &lt;p&gt;Пісемістична заміна для HttpUtility.HtmlEncode - &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=efb9c819-53ff-4f82-bfaf-e11625130c25&amp;amp;displaylang=en"&gt;Anti-Cross Site Scripting Library&lt;/a&gt;;&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;Якщо тема моделювання небезпек та &lt;a href="http://msdn.microsoft.com/en-us/security/cc448177.aspx"&gt;Security Development Lifecycle&lt;/a&gt; взагалі для вас цікава, вітаю до коментарів, інакше я нічого писати не буду, бо ця тема мені здається досить нудною для викладання в блозі.&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6785" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Code Review" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Code+Review/default.aspx" /><category term="architects.in.ua" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/architects.in.ua/default.aspx" /><category term="Security" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Security/default.aspx" /><category term="Code Smells" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Code+Smells/default.aspx" /><category term="Threat Modeling" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Threat+Modeling/default.aspx" /><category term="Security Development Lifecycle" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Security+Development+Lifecycle/default.aspx" /></entry><entry><title>IE8 ‘Porn mode’</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2008/08/26/6756.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2008/08/26/6756.aspx</id><published>2008-08-26T15:07:32Z</published><updated>2008-08-26T15:07:32Z</updated><content type="html">&lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Навіть додати щось неможливо, просто лінка - &lt;a href="http://blogs.zdnet.com/microsoft/?p=1550"&gt;Microsoft to roll out more granular ‘porn mode’ with IE 8&lt;/a&gt;!&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6756" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Fun" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Fun/default.aspx" /><category term="Internet Explorer" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Internet+Explorer/default.aspx" /><category term="Internet Explorer 8" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Internet+Explorer+8/default.aspx" /></entry><entry><title>SharePoint за 80 годин</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2008/08/17/6682.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2008/08/17/6682.aspx</id><published>2008-08-17T16:09:00Z</published><updated>2008-08-17T16:09:00Z</updated><content type="html">&lt;P&gt;&lt;STRONG&gt;“Вміти розробляти під SharePoint за 80 годин”&lt;/STRONG&gt; - щось схоже було моїм таском перед новим проектом. Зараз проекту вже приблизно півроку. Проект достатньо успішний, принаймні Майкрософт його оцінили дуже високо. А значить ті години також були успішні. Саме про них, точніше про те що я в їхніх рамках робив, я і хочу розповісти.&lt;/P&gt;
&lt;P&gt;Використовуючи &lt;A href="http://dev.net.ua/blogs/mikechaliy/archive/2008/02/15/5411.aspx"&gt;свої поради&lt;/A&gt;, 80 годин я витратив на SDK, декілька книжок, рефференс реалізації, блоги і зрозуміло на розробку прикладів.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;Якщо буде нудно, то наприкінці поста я зробив висновок з усієї цієї писанини.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;H2&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?familyid=6D94E307-67D9-41AC-B2D6-0074D6286FA9&amp;amp;displaylang=en"&gt;SharePoint Server 2007 SDK: Software Development Kit&lt;/A&gt;&lt;/H2&gt;
&lt;P&gt;Попри все, SDK так і залишається майже найглибшими знаннями (найглибші це .Net Reflector, але нажаль деякі частини COM). Як і в більшості SDK тут можна знайти всю довідкову інформацію, на кшталт опису об’єктної моделі, формату конфігураційних файлів, how-to-шок, тощо.&lt;/P&gt;
&lt;P&gt;Цікавим бонусом є підбірка сатей, вони не потрібні для того щоб розпочати розробляти, але в перспективі можуть допомогти, так би мовити скласти повну картину.&lt;/P&gt;
&lt;P&gt;Біля &lt;A href="http://www.microsoft.com/downloads/details.aspx?familyid=6D94E307-67D9-41AC-B2D6-0074D6286FA9&amp;amp;displaylang=en"&gt;SharePoint Server 2007 SDK: Software Development Kit&lt;/A&gt;, можна також знайти &lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyId=05E0DD12-8394-402B-8936-A07FE8AFAFFD&amp;amp;displaylang=en"&gt;Windows SharePoint Services 3.0: Software Development Kit (SDK)&lt;/A&gt;. Це просто утята версія першого. На мою думку краще завжди ставити першу.&lt;/P&gt;
&lt;H2&gt;Книга - &lt;A href="http://www.amazon.com/exec/obidos/ASIN/0672329034/ref%3Dnosim/wssdemo-20"&gt;Microsoft(R) SharePoint(R) 2007 Development Unleashed&lt;/A&gt;&lt;/H2&gt;
&lt;P&gt;Це перша книга з тих що я прочитав. Чесно кажучи не дуже сподобалось. Занадто багато “води”, якась непослідовність викладення. Іноді схожа на кальку з SDK. &lt;/P&gt;
&lt;P&gt;Можливо тому що книга дуже нагадує SDK, читається дуже швидко (якщо не читати розшифровок класів ;)). Її можна рекомендувати як повноцінний замінник SDK для об’єктної моделі SharePoint без пошуку... Це фонове читання.&lt;/P&gt;
&lt;P&gt;Моя оцінка – 3 з 5ти. Так і не зрозумів для кого ця книга.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Вирішив подивитись яку оцінку дали на Amazon – виявилось теж 3 з 5ти ;).&lt;/EM&gt;&lt;/P&gt;
&lt;H2&gt;Книга - &lt;A href="http://www.amazon.com/Microsoft-Windows-SharePoint-Services-Developer/dp/0735623201"&gt;Inside Microsoft Windows SharePoint Services 3.0&lt;/A&gt;&lt;/H2&gt;
&lt;P&gt;Після Development Unleashed, це було просто приємне читання. Функціональна структура дозволила цій книзі в одній главі розповідати і з адміністративного боку і з девелоперського.&lt;/P&gt;
&lt;P&gt;Зокрема мені дуже сподобався опис деплоймента (Солюшени, Фітчери), опис системи Безпеки. Саме те що важко зрозуміти з SDK.&lt;/P&gt;
&lt;P&gt;Дуже потішила частина про AJAX! Почитайте, однією фразою - “AJAX для корпоративних енікейшиків”.&lt;/P&gt;
&lt;P&gt;Книга дає &lt;EM&gt;майже повну&lt;/EM&gt; картину процесу розробки. Кодування, конфігурація, деплоймент, безпека, об’єктна модель, веб–сервіси, веб-парти, бібліотеки документів, workflow. Все дається в мінімальному обсязі, тільки для того щоб розпочати. Для більш глибокого вивчення потрібні інші ресурси. &lt;/P&gt;
&lt;P&gt;Також можна зазначити, що є частини повністю не покриті цією книгою. Наприклад Custom Fields, MOSS...&lt;/P&gt;
&lt;P&gt;Я б рекомендував цю книгу, як першу в світі SharePoint.&lt;/P&gt;
&lt;P&gt;Моя оцінка 5 з 5ти. Amazon 4.5 з 5ти.&lt;/P&gt;
&lt;H2&gt;Книга - &lt;A href="http://www.amazon.com/Professional-SharePoint-2007-Development-Programmer/dp/0470117567"&gt;Professional SharePoint 2007 Development&lt;/A&gt;&lt;/H2&gt;
&lt;P&gt;Одразу кинулось у вічі, що структура книги дуже схожа на &lt;A href="http://www.amazon.com/Microsoft-Windows-SharePoint-Services-Developer/dp/0735623201"&gt;&lt;STRONG&gt;Inside Microsoft WSS 3.0&lt;/STRONG&gt;&lt;/A&gt;.&amp;nbsp; На відміну від останньої книга робить спробу розповісти про все і про Windows SharePoint Services 3.0 (WSS 3.0) і про Microsoft Office SharePoint Server 2007&amp;nbsp; (MOSS 2007). Це дещо відбилось на розмірі – 774 сторінок в порівнянні з 416.&lt;/P&gt;
&lt;P&gt;Книга в достатньому обсязі дає інформацію про MOSS. WSS частина більш зверхня і схоже написана для того щоб було легше зрозуміти про MOSS. Мабуть це зумовило недостатнє покриття деплойменту та безпеки. Дуже цікаво те що в WSS частині є дуже багато того чого немає у &lt;A href="http://www.amazon.com/Microsoft-Windows-SharePoint-Services-Developer/dp/0735623201"&gt;&lt;STRONG&gt;Inside Microsoft WSS 3.0&lt;/STRONG&gt;&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Я б рекомендував цю книгу, як другу після &lt;A href="http://www.amazon.com/Microsoft-Windows-SharePoint-Services-Developer/dp/0735623201"&gt;Inside Microsoft WSS 3.0&lt;/A&gt;. Книгу можна радити навіть тим хто не планує розробляти під MOSS 2007.&lt;/P&gt;
&lt;P&gt;Моя оцінка 5 з 5ти. Amazon 4 з 5ти.&lt;/P&gt;
&lt;H2&gt;Книга - &lt;A href="http://www.amazon.com/Beginning-SharePoint-2007-Administration-Microsoft/dp/0470125292"&gt;Beginning SharePoint 2007 Administration: Windows SharePoint Services 3.0 and Microsoft Office SharePoint Server 2007&lt;/A&gt;&lt;/H2&gt;
&lt;P&gt;Про книгу можна сказати тільки те що вона справді не для розробників, і справді для початківців. &lt;/P&gt;
&lt;P&gt;Таких речей мені не зрозуміти:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P&gt;Open Internet Explorer.&lt;/P&gt;
&lt;LI&gt;
&lt;P&gt;Go to Tools –&amp;gt; Internet Options –&amp;gt; Security.&lt;/P&gt;
&lt;LI&gt;
&lt;P&gt;Click Trusted Sites and the Sites button.&lt;/P&gt;
&lt;LI&gt;
&lt;P&gt;Add the URL address for your virtual server (for example, http://srv1) as a trusted site.&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Так чи інакше, а якусь адмінську книгу продивитись потрібно, заради “погляду з того боку”, інакше розробка може вийти “чужою” для системи. Отже ця книга для фонового читання так само як і Development Unleashed.&lt;/P&gt;
&lt;P&gt;Моя оцінка 3 з 5ти. Amazon 4 з 5ти.&lt;/P&gt;
&lt;H2&gt;Референс Реалізація - &lt;A href="http://www.codeplex.com/CKS"&gt;Community Kit for SharePoint&lt;/A&gt;&lt;/H2&gt;
&lt;P&gt;Це мабуть найбільша відкрита розробка для SharePoint. Написано відносно добре – для людей з корпоративним підґрунтям просто супер.&lt;/P&gt;
&lt;P&gt;Найцікавіше що можна відкопати це:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Відлагоджена структура проекту; 
&lt;LI&gt;Система автоматичного збору WSS Solution(я зробив іншу, але ідея та сама); 
&lt;LI&gt;Активація/Деактивація фітчерів 
&lt;LI&gt;Інтеграція з Asp.Net – HttpHandler, AJAX 
&lt;LI&gt;Стилізація сторінок &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Просто рекомендую. На відміну від книжок це реальний професійний досвід.&lt;/P&gt;
&lt;H2&gt;Референс Реалізація - &lt;A href="http://www.codeplex.com/features"&gt;SharePoint 2007 Features&lt;/A&gt;&lt;/H2&gt;
&lt;P&gt;Набір фітчерів, код також відкрито. Дуже багато подробиць для розробки фітчерів. Код іноді просто жахливий, але ж ніхто і не збирається копі-пастити. Так? Так.&lt;/P&gt;
&lt;H2&gt;Блог - &lt;A href="http://blogs.msdn.com/sharepoint/default.aspx"&gt;Microsoft SharePoint Team Blog&lt;/A&gt;&lt;/H2&gt;
&lt;P&gt;Майже немає технічних подробиць, мене зачепило &lt;A href="http://blogs.msdn.com/sharepoint/archive/2008/01/10/sharepoint-connector-for-confluence-how-we-did-it.aspx"&gt;SharePoint Connector for Confluence - How We Did It&lt;/A&gt;. Дуже цікава реалізація. Принаймні для мене це стало proof of the concepts того що ми обрали дуже складний шлях ;). Там є тріальна версія, а там є необфусковані .Net збірки. Але я вам цього не казав.&lt;/P&gt;
&lt;H2&gt;Блог - &lt;A href="http://blogs.threewill.com/implementingsharepoint/default.aspx"&gt;Implementing SharePoint Blog&lt;/A&gt;&lt;/H2&gt;
&lt;P&gt;Просто новини з світу SharePoint.&lt;/P&gt;
&lt;H2&gt;Блог - &lt;A href="http://sharepointsolutions.blogspot.com/"&gt;SharePoint Solutions Blog&lt;/A&gt;&lt;/H2&gt;
&lt;P&gt;Дуже технічний блог. Я пролистав весь блог. Вони пишуть не новини, вони пишуть невеличкі статті. Дуже рекомендую.&lt;/P&gt;
&lt;H2&gt;Блог - &lt;A href="http://www.sharepointblogs.com/"&gt;SharePoint Blogs&lt;/A&gt;&lt;/H2&gt;
&lt;P&gt;Фігня якась, якісь новини більше схоже на анонси Майкрософт...&lt;/P&gt;
&lt;H2&gt;Висновок&lt;/H2&gt;
&lt;P&gt;Для тих кому потрібно розробляти для WSS 3.0, рекомендую зпершу почитати &lt;A href="http://www.amazon.com/Microsoft-Windows-SharePoint-Services-Developer/dp/0735623201"&gt;Inside Microsoft Windows SharePoint Services 3.0&lt;/A&gt;, потім WSS частину в &lt;A href="http://www.amazon.com/Professional-SharePoint-2007-Development-Programmer/dp/0470117567"&gt;Professional SharePoint 2007 Development&lt;/A&gt;. Для MOSS 2007 все те саме плюс частину про MOSS в останній книзі. Для повноти ще бажано прочитати щось “адмінське”, наприклад &lt;A href="http://www.amazon.com/Beginning-SharePoint-2007-Administration-Microsoft/dp/0470125292"&gt;Beginning SharePoint 2007 Administration: Windows SharePoint Services 3.0 and Microsoft Office SharePoint Server 2007&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;Найповніша Референс Реалізація, це &lt;A href="http://www.codeplex.com/CKS"&gt;Community Kit for SharePoint&lt;/A&gt;, але все залежить від того що саме потрібно розробляти.&lt;/P&gt;
&lt;HR&gt;

&lt;P&gt;Наступного разу я розповім про тулзи для полегшення життя розробника.&lt;/P&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6682" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="SharePoint" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/SharePoint/default.aspx" /><category term="Reading" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Reading/default.aspx" /><category term="Learning" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Learning/default.aspx" /><category term="WSS" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/WSS/default.aspx" /><category term="Reference Implementation" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Reference+Implementation/default.aspx" /><category term="MOSS" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/MOSS/default.aspx" /><category term="Books" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Books/default.aspx" /></entry><entry><title>Невеличка DoS атака за допомогою XPath</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2008/08/15/6670.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2008/08/15/6670.aspx</id><published>2008-08-15T09:42:00Z</published><updated>2008-08-15T09:42:00Z</updated><content type="html">&lt;P&gt;Продовжу розбирати Code Smells сайту &lt;A href="http://architects.in.ua/"&gt;Architects In UA&lt;/A&gt;. Наразі сьогодні розберу цей код:&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;XPathNodeIterator nodes &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; navigator.Select(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"/rss/channel/item[guid='{0}']/title"&lt;/span&gt;, item)); &lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;while&lt;/span&gt; (nodes.MoveNext()) &lt;br /&gt;{ &lt;br /&gt;       Header.Title += &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;" :: "&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;+&lt;/span&gt; nodes.Current.Value; &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Також потрібно додати що item це просто відображення параметру в рядку запита. Тобто аткуючий може змінювати її на свій розсуд.&lt;/P&gt;
&lt;P&gt;Перше що впадає у вічі це те що я можу змінити XPath.&lt;/P&gt;
&lt;P&gt;Якщо item буде &lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;' or [somethig] or ''!&lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt;'&lt;/span&gt;&lt;/code&gt; &lt;/P&gt;
&lt;P&gt;то результучий XPath буде &lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;/rss/channel/item[guid='' or [somethig] or ''!&lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt;'']/title&lt;/span&gt;&lt;/code&gt; &lt;/P&gt;
&lt;P&gt;Тепер питання що з цим можна робити. Для Denial-of-service (DoS) атаки нам потрібно що сервер максимально довго міркував. Так? Так. Якщо б це був Regex &lt;A href="http://dev.net.ua/blogs/mikechaliy/archive/2008/03/24/5752.aspx"&gt;я б вже знав що робити&lt;/A&gt; ;). Але це не Regex, отже потрібно пошукати.&lt;/P&gt;
&lt;P&gt;Одразу ж знайшлась цікава лінка - &lt;A title=http://amachang.art-code.org/xpathperformance/ href="http://amachang.art-code.org/xpathperformance/"&gt;http://amachang.art-code.org/xpathperformance/&lt;/A&gt; – таблиця де зібрані варіанти XPath та час виконання. Воно не про .Net але мені цього більш аніж достатньо.&lt;/P&gt;
&lt;P&gt;Результати тесту для невеличкого фіда скачаного з головної сторінки dev.net.ua.&lt;/P&gt;
&lt;TABLE style="PADDING-RIGHT:10px;PADDING-LEFT:10px;PADDING-BOTTOM:10px;PADDING-TOP:10px;" cellSpacing=0 cellPadding=2&gt;

&lt;TR&gt;
&lt;TH&gt;Значення item &lt;/TH&gt;
&lt;TH&gt;Ticks &lt;/TH&gt;
&lt;TH&gt;Коментар &lt;/TH&gt;&lt;/TR&gt;
&lt;TR&gt;&lt;/TR&gt;

&lt;TR&gt;
&lt;TD&gt;434e5f47-9beb-46b7-aee2-adf5f643f7c6:6644 &lt;/TD&gt;
&lt;TD&gt;9765 &lt;/TD&gt;
&lt;TD&gt;Це в нормальному плині &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;' or .//*[@isPermaLink &amp;lt; 6 and @isPermaLink &amp;gt; 2] or ''!=' &lt;/TD&gt;
&lt;TD&gt;29295 &lt;/TD&gt;
&lt;TD&gt;Це перша спроба, не такий вже і великий розбіг. Зараз коли пишу схоже and потрібно було замінити на or &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;' or .//*[preceding::div] or ''!=' &lt;/TD&gt;
&lt;TD&gt;1230390 &lt;/TD&gt;
&lt;TD&gt;О! Це вже значно краще 
&lt;P&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;' or .//*[preceding::div] or .//*[preceding::div2] or .//*[preceding::div3] or .//*[preceding::div4] or .//*[preceding::div5] or .//*[preceding::div6] or .//*[preceding::div7] or .//*[preceding::div8] or .//*[preceding::div9] or .//*[preceding::div10] or .//*[preceding::div11] or .//*[preceding::div12] or .//*[preceding::div13] or ''!=' &lt;/TD&gt;
&lt;TD&gt;12323430 &lt;/TD&gt;
&lt;TD&gt;А це ще краще! Це вже може бути 1 секунда! &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;' or .//*[preceding::div or preceding::div2] or ''!=' &lt;/TD&gt;
&lt;TD&gt;2675610 &lt;/TD&gt;
&lt;TD&gt;Це просто більш компактна форма, а то може так статися що адресного рядка не вистачить ;) &lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;P&gt;&lt;U&gt;1 секунда чистого серверного часу на невеличкому фіді! Декілька компів, більший фід, і DoS атака вдалась! Отож і воно. Ніколи, ніколи не &lt;U&gt;можна &lt;/U&gt;недооцінювати те що можуть зробити юзери!&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;
&lt;HR&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Як зарадити? Як використовувати? Інші питання? Поради мені? Буду радий почути. Коментарі до ваших послуг!&lt;/P&gt;
&lt;P&gt;
&lt;HR&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Код який використовувася для перевірки.&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;using&lt;/span&gt; (Stream stream &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; File.OpenRead(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;@"D:\Public\Downloads\dev_net_ua.xml"&lt;/span&gt;)) &lt;br /&gt;{ &lt;br /&gt;    XmlDocument document &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;new&lt;/span&gt; XmlDocument(); &lt;br /&gt;    document.Load(stream); &lt;br /&gt;&lt;br /&gt;    XPathNavigator navigator &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; document.CreateNavigator(); &lt;br /&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// XPATH execution statistics taken from &lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// http://amachang.art-code.org/xpathperformance/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;//const string item = "434e5f47-9beb-46b7-aee2-adf5f643f7c6:6644"; //9765 &lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;//const string item = "' or .//*[preceding::div] or ''!='"; // 1230390 &lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;//const string item = "' or .//*[@isPermaLink &amp;lt; 6 and @isPermaLink &amp;gt; 2] or ''!='"; // 29295 &lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;//const string item = "' or .//*[preceding::div] or .//*[preceding::div2] or .//*[preceding::div3] or .//*[preceding::div4] or .//*[preceding::div5] or .//*[preceding::div6] or .//*[preceding::div7] or .//*[preceding::div8] or .//*[preceding::div9] or .//*[preceding::div10] or .//*[preceding::div11] or .//*[preceding::div12] or .//*[preceding::div13] or ''!='"; // 12323430 &lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;const&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt; item &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"' or .//*[preceding::div or preceding::div2] or ''!='"&lt;/span&gt;; &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// 2675610 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt; result &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; String.Empty; &lt;br /&gt;&lt;br /&gt;    DateTime startTime &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; DateTime.UtcNow;                &lt;br /&gt;&lt;br /&gt;    XPathNodeIterator nodes &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; navigator.Select(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"/rss/channel/item[guid='{0}']/title"&lt;/span&gt;, item)); &lt;br /&gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;while&lt;/span&gt; (nodes.MoveNext()) &lt;br /&gt;    { &lt;br /&gt;        result += &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;" :: "&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;+&lt;/span&gt; nodes.Current.Value; &lt;br /&gt;    } &lt;br /&gt;&lt;br /&gt;    DateTime endTime &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; DateTime.UtcNow; &lt;br /&gt;&lt;br /&gt;    Console.WriteLine(endTime.Subtract(startTime).Ticks); &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;HR&gt;

&lt;P&gt;&lt;STRONG&gt;Додатково.&lt;/STRONG&gt;&amp;nbsp;Ця проблема не нова,&amp;nbsp;так само як і SQL Injection ця проблема називається XPath Injection, пошук дає десятки &lt;A href="http://search.live.com/results.aspx?q=XPath+Injection"&gt;результатів&lt;/A&gt;.&lt;/P&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6670" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Code Review" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Code+Review/default.aspx" /><category term="architects.in.ua" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/architects.in.ua/default.aspx" /><category term="Security" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Security/default.aspx" /><category term="Code Smells" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Code+Smells/default.aspx" /><category term="XPath" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/XPath/default.aspx" /><category term="DoS" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/DoS/default.aspx" /></entry><entry><title>Architects in Ukraine – Ще один code review…</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2008/08/13/6644.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2008/08/13/6644.aspx</id><published>2008-08-13T15:06:00Z</published><updated>2008-08-13T15:06:00Z</updated><content type="html">&lt;P&gt;Inspired by - &lt;A title="Architects in Ukraine - code review" href="http://dev.net.ua/blogs/usarskyy/archive/2008/08/08/6606.aspx"&gt;Architects in Ukraine - code review&lt;/A&gt;, та&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;Разработка велась с использованием передовых технологий и продуктов.&lt;/P&gt;
&lt;P&gt;Вы можете их использовать для построения подобных решений.&lt;/P&gt;
&lt;P&gt;Предложения, замечания, отзывы с удовольствием принимаются&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;з поста &lt;A href="http://dev.net.ua/blogs/shatokhin/archive/2008/08/08/6602.aspx"&gt;Architects in Ukraine&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Ось учора ввечері вирішив подивитись…&lt;/P&gt;
&lt;P&gt;Спочатку я почав робити повноцінний код-ревью. Але швидко цю ідею кинув. Тому краще напишу список найкритичнішого.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Сайт має діри для Дефейса, ДОС атаки&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Перше це закачування RSS фіда, в якому адреса задається за допомогою параметрів адресного рядка.&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt; feed &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; Request.QueryString[&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"feed"&lt;/span&gt;]; &lt;br /&gt;itemDataSource.DataFile &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; feed;&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Друге це парсінг HTML&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;new&lt;/span&gt; Regex(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"&amp;lt;img.*?src.*?=.*?\"(.*?)\""&lt;/span&gt;, RegexOptions.IgnoreCase)&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;та &lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&amp;lt;img id=&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"FeaturedSpace1"&lt;/span&gt; src=&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"&amp;lt;%# HtmlProcessor.ExtractImageUrl(XPath("&lt;/span&gt;description&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;").ToString()) %&amp;gt;"&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Такий код дозволяє активний контент затягувати в браузер від імені користувача.&lt;/P&gt;
&lt;P&gt;Далі ще краще&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;static&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt; RemoveTags(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt; html) &lt;br /&gt;{ &lt;br /&gt;    Regex regex &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;new&lt;/span&gt; Regex(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"\\&amp;lt;.*?\\&amp;gt;"&lt;/span&gt;); &lt;br /&gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt; s &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; regex.Replace(html, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;""&lt;/span&gt;); &lt;br /&gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;return&lt;/span&gt; s; &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;А тепер перевіримо такий ШТМЛ…&lt;/P&gt;
&lt;P&gt;&lt;code&gt;[SCRIPT &lt;br /&gt;SRC=http://ha.ckers.org/xss.js ][/SCRIPT]&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Символ "[" потрібно замінити на "&amp;lt;". SRC повинно бути на новому рядку. &lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Читаємо &lt;/EM&gt;&lt;A title=http://ha.ckers.org/xss.html href="http://ha.ckers.org/xss.html"&gt;&lt;EM&gt;http://ha.ckers.org/xss.html&lt;/EM&gt;&lt;/A&gt;&lt;EM&gt;, &lt;I&gt;найцікавіший &lt;/I&gt;ресурс для розробників усіляких HtmlProcessor-ів.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;А ще&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"/rss/channel/item[guid='{0}']"&lt;/span&gt;, item);&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;для тих кому ліньки лізти в код item з QueryString, не знаю навіщо це може знадобитися, адже є більші діри.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;NullReferenceException&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt; feed &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; Request.QueryString[&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"feed"&lt;/span&gt;]; &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;if&lt;/span&gt; (feed.StartsWith(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"http://"&lt;/span&gt;) || feed.StartsWith(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"https://"&lt;/span&gt;))&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;ще&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;_calendar &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; appSettings[&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"calendar"&lt;/span&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Хлопці! Я навіть не знаю яка тулза (Фотошоп мабуть) не перевіряє на можливі нулли…&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Інші проблеми..&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Починав писати розгорнуті відповіді по іншим проблемам, не буду. Ось просто список.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Ім’я Helpers&lt;STRONG&gt; - &lt;A href="http://www.c2.com/cgi/wiki?DontNameClassesObjectManagerHandlerOrData"&gt;Dont Name Classes Object Manager Handler Or Data&lt;/A&gt;;&lt;/STRONG&gt; 
&lt;LI&gt;XmlDataSource у той час коли є System.Web.Syndication; 
&lt;LI&gt;ViewState для зберігання параметрів відображення, це я про Calendar; 
&lt;LI&gt;Оверрайди ідентифікаторів, теж про Calendar; 
&lt;LI&gt;Прямі посилання на CSS, хоча э вбудовані Asp.Net Themes; 
&lt;LI&gt;Не дуже зрозуміле використання CSS, наприклад &amp;lt;body class="NewsStoryBody"&amp;gt;; 
&lt;LI&gt;.Net 2.0. Що ви там казали про “передовые технологии”? 
&lt;LI&gt;Проблеми зі звичайнісіньким ООП; 
&lt;LI&gt;Повне ігнорування автоматичного тестування, система розроблена так що навіть коли хтось схоче писати тести, то потрібно буде рефакторити майже все; 
&lt;LI&gt;Тощо; &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;Висновок&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;А що робити висновки? Просто хотілось би вірити що &lt;EM&gt;я хоча б в чомусь помиляюсь&lt;/EM&gt;, а експерти зможуть пояснити.&lt;/P&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6644" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Offtop" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Offtop/default.aspx" /><category term="Code Review" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Code+Review/default.aspx" /><category term="architects.in.ua" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/architects.in.ua/default.aspx" /><category term="Security" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Security/default.aspx" /></entry><entry><title>Покриття тестами для усіляких там ArgumentException-ів</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2008/08/11/6633.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2008/08/11/6633.aspx</id><published>2008-08-11T17:05:41Z</published><updated>2008-08-11T17:05:41Z</updated><content type="html">&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Як на мене, безглуздо перевіряти код який перевіряє аргументи, адже цей тип помилок набагато легше оптимати за допомогою FxCop чи чогось іншого, дотого ж цілком автоматично. Отже залишається багато коду на кшталт цього:&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;  &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;override&lt;/span&gt; IEnumerable&amp;lt;ConnectionRecord&amp;gt; Query(ConnectionQueryContext context)    &lt;br /&gt;{     &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;if&lt;/span&gt; (context == &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;null&lt;/span&gt;)     &lt;br /&gt;    {     &lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;throw&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"context"&lt;/span&gt;);     &lt;br /&gt;    }     &lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Real code goes here!     &lt;/span&gt;&lt;br /&gt;}  &lt;/span&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;Але іноді дуже вже хочеться 100% покриття, не заради якості коду(покриття і якість аж ніяк не зв’язані), а просто заради 100% ;).&lt;/p&gt;  &lt;p&gt;Тільки вчора спало на думку, що це дуже легко вирішити:&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;  &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;override&lt;/span&gt; IEnumerable&amp;lt;ConnectionRecord&amp;gt; Query(ConnectionQueryContext context)    &lt;br /&gt;{     &lt;br /&gt;    ArgumentUtilities.EnsureArgumentNotNull(context, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"context"&lt;/span&gt;);     &lt;br /&gt;    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Real code goes here!     &lt;/span&gt;&lt;br /&gt;}  &lt;/span&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Навіть без &lt;a href="http://research.microsoft.com/pex/"&gt;Pex&lt;/a&gt; обійшлись…&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=6633" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Unit Testing" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Unit+Testing/default.aspx" /><category term="Tip" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Tip/default.aspx" /><category term="Code Review" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Code+Review/default.aspx" /></entry></feed>