Тэги

Silverlight (36) WPF (10) IIS (7) Visual Studio (7) SharePoint (6) .Net Framework (5) ODP.NET (5) ASP.NET (4) C# (4) common (4) Network Settings (3) JavaScript (2) MS Office (2) Resharper (2) WCF (2) WEB (2) XPath (2) XSLT (2) ADO.NET (1) APEX (1) CMD (1) CSS (1) EF (1) HTML (1) Hardware bugs (1) Java (1) MS SQL (1) Oracle (1) PDF (1) Version Control (1) XAML (1)

четверг, 29 декабря 2011 г.

TortoiseSVN сделал это! Теперь папка ".svn" будет только одна и в корне проекта

Случилось!
Трюки с папками ".svn" закончились.
Пару месяцев назад TortoiseSVN стал работать с одной папкой ".svn" в корне проекта.
Вложенные папки больше не нужны.

Для начала работы с новой версией (в новом режиме) сначала надо конвертировать старые папки (проекты) из контекстного меню Windows.

На сервер SVN это, понятно, никак не влияет.

Для VisualSVN тоже вышел релиз, который такой режим работы с SVN поддерживает.

Реализации IEndpointBehavior бесполезны без открытого конструктора

Любая реализация интерфейса IEndpointBehavior без открытого конструктора по умолчанию (без параметров) бесполезна и не работает, хотя и исключений не кидает в WCF тоже.
Т.е. можно столкнуться с тем, что решение настроено, но не работает.

среда, 28 декабря 2011 г.

Конструктор класса OracleCommand небезопасен и может выкидывать исключения

Конструктор класса OracleCommand небезопасен и может выкидывать исключения при рассогласовании версий DLL от ODP.NET и Oracle Client, или при рассогласовании разрядности (x32 vs x64) и путей.

Это означает, что использовать его вне Data Access Layer нельзя.
Также любое создание объекта new OracleCommand должно быть обработано в блоке try catch.

пятница, 28 октября 2011 г.

ASP.NET: причуда - точка останова в Global.asax срабатывает два раза.


Точка останова в дебаггинге срабатывает два раза на Application_Error в файле global.asax, если в файле MyClass, который определен в <%@ Application  Inherits="MyClass" Language="C#" %> в коде тоже определен метод Application_Error.
При чем в этом файле точка останова не срабатывает.
Мало того, код в этом втором Application_Error игнорируется.
А вот если из Global.asax убрать Application_Error, то другой метод заработает и точки останова будут устанавливаться.

Проверялость на ASP.NET Development Server.

С другими методами ожидаю такое же поведение.

Всегда есть место багам, даже в старом добром ASP.NET.

Silverlight 4: Ошибки, которые должны свести вас с ума


Очередные чудные ошибки Silverlight, которые отображаются вместо нормальных сообщений.

Раз поисковик вас сюда привел, то общее решение вашей проблемы звучит так:
Ищите случайно поставленную точку в заголовке и теле XAML в следующих местах, например:
(Ошибки я выделил красным и жирным)
В заголовке:
xmlns:Some.OtherName="clr-namespace:BlaBla"
xmlns:Some.="clr-namespace:BlaBla"
В теле элемента:
<Some.OtherName:MyClass x:Key="MyClass"/>



Подробное описание:


Обратите внимание, что при этом Designe View в Visual Studio будет отображать страницу правильно, и не ругаться на ошибки.



Далее каждый кейс и его ошибка.


1.
Кейс
xmlns:Some.OtherName="clr-namespace:SomeNamespace; assembly=SomeAssembly"
Ошибка
The property 'OtherName' does not exist on the type 'UserControl' in the XML namespace ''.

2.
Кейс
<Some.OtherName:MyClass x:Key="MyClass"/>
Ошибка 
Error
Length cannot be less than zero.
Parameter name: length

3.
Кейс:
xmlns:Some.="clr-namespace:SomeNamespace; assembly=SomeAssembly"
Ошибка:
The property '' does not exist on the type 'UserControl' in the XML namespace ''.

4.
Кейс:
<Some.:MyClass x:Key="MyClass"/>
Ошибка:
Error
Length cannot be less than zero.
Parameter name: length

пятница, 14 октября 2011 г.

Blogger и Blogpost блокируются в организациях

Пришлось перенести блог из http://it3xlru.blogspot.com на http://blog.it3xl.ru/ .
У меня на работе Blogger и Blobpost ресурсы, на которые доступ закрыт.
Поэтому меняю адрес блога с доменов Google на свой домен.

четверг, 1 сентября 2011 г.

Отличное решение проблемы "first convert it to a node-set" без использования msxsl:node-set()

Для случая
"To use a result tree fragment in a path expression, first convert it to a node-set using the msxsl:node-set() function."
представлено отличное решение проблемы без использования msxsl:node-set().

"get xpath from xsl variable"

<xsl:stylesheet version="1.0"
 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
<xsl:output method="text"/>
 

   
<xsl:variable name ="myVar">
       
<RefData RefTag="test1" bbb="false" />
       
<RefData RefTag="test2" bbb="false" />
       
<RefData RefTag="test3" bbb="false" />
       
<RefData RefTag="test4" bbb="true"  />
       
<RefData RefTag="test5" bbb="false" />
       
<RefData RefTag="test6" bbb="false" />
   
</xsl:variable>
 

   
<xsl:variable name="vrefVar" select=
     
"document('')/*/xsl:variable[@name='myVar']"
     
/>
 

   
<xsl:template match="/">
     
<xsl:value-of select="$vrefVar/*[@RefTag='test3']/@bbb"/>
   
</xsl:template>
</xsl:stylesheet>

Аналог оператора ?? в XPath

Как вариант для дальнейшего развития:

Запись в XPath
( someNode[@key = $key] | otherNode[@key = $key] ) [1]
Запись в C#

int y = xNullable ?? -1;

Управление разбивкой и переносами блоков в XSL

Речь идет о XSL, ранее XSL-FO или просто FO.
Сценарии:
  • Запретить перенос блока
  • Заставить блок переноситься обязательно
  • и т.д.
Напоминалочка.
Чтоб управлять такими вещами нужно изучить атрибуты "keep-..." и "break-...".

пятница, 26 августа 2011 г.

Коллизия нотации "(function)();" в JavaScript или почему JavaScript разработчик будет ставить точку с запятой перед (function)();

Нотацию (function)(); в JavaScript всегда надо начинать с точки с запятой.
Это защитит от трудно определимой ошибки в интерпретации кода JavaScript-движком.


Нотация (function)(); в JavaScript чаще всего применяется в следующих случаях:
  • когда вы хотите ограничить видимость локальных переменный и поиграть с замыканиями (closures), при этом вызывая немедленное выполнение.
  • когда в проекте используется несколько JavaScript фреймворков и они бодаются за переменную по имени $. Эта нотация помогает гарантированно использовать переменную $, независимо от будущих изменений на сайте.
Пример:

;(function ($) { /* do something*/ })(jQuery);


Ниже код, объясняющий почему нужно использовать точку с запятой вначале.

function f1(inp) { alert("f1 - " + inp); }

// Ошибки не будет, все в порядке.
var f2 = function (inp) { alert("f2 - " + inp); }
; (f1)("2");

// Если следующую строку не завершить точкой с запятой, будет ошибка.
var f3 = function (inp) { alert("f3 - " + inp); }
(f1)("2");

// Если следующую строку также не завершить точкой с запятой, будет ошибка.
var int1 = 1
(f1)("1");

Причины применения:
  • Частый рефакторинг и масштабирование кода.
  • Объявления метода в переменную (var f2 = function(){}) стандартная практика, при этом закрывающая метод фигурная скобка и тело метода скрывает наглядность того, что это объявление переменной.

Отличие создания свойств объекта в конструкторе и через прототип конструктора в JavaScript.

Свойства, задаваемые в конструкторе, нельзя подменять через прототип.
Т.е. свойство задаваемое в конструкторе скрывает одноименное свойство в прототипе.

Например, для конструктора
function c() { this.a = "a"; }
запись
c.prototype.a = "a2";
не имеет смысла
(если не обращаться из объекта реализации напрямую, например myObj.constructor.prototype.a).


Далее JavaScript код для просмотра в дебаггинге.
Здесь метод assert никогда не будет выполнен.


var assert = function (res) { if (res !== true) alert("false"); }

function c() { this.a = "a"; }

c.prototype.b = "b";
var t1 = new c();
c.prototype.a = "a2";
c.prototype.b = "b2"; var t2 = new c();

assert(t1.a == t2.a);
assert(t1.a == "a");
assert(t1.b == t2.b);
assert(t1.b == "b2");

суббота, 30 июля 2011 г.

URLScan : Unable to start debugging on the web server. The web server could not find the requested resource.

Еще один сюрприз на эту тему, теперь для тех, у кого чешутся руки.

Причина проблемы
Есть такое средство Microsoft Web Platform Installer и решили вы им доустановить что-то новенькое.
Одни из компонентов который вы выбрали был URLScan.
Вы даже не почитали, для чего он нужен. :)
Установка средства URLScan убивает дебаггинг сайтов на сервере IIS. И, видимо, еще много чего может убить по умолчанию.
Не ставьте его на разработческие машины!

Что такое URLScan
URLScan это всего лишь ISAPI-фильтр (Internet Server API filter), который посажен на инсталлятор, и который слушает и фильтрует входящие на IIS запросы.

"UrlScan 3.1 is a security tool that restricts the types of HTTP requests that IIS will process. By blocking specific HTTP requests, the UrlScan 3.1 security tool helps to prevent potentially harmful requests from reaching applications on the server. UrlScan 3.1 is an update to UrlScan 2.5 supports IIS 5.1, IIS 6.0 and IIS 7.0 on Windows Vista and Windows Server 2008."

Кто виноват
В науке о создании программ есть целый раздел, который называется - давать имена, которые соответствуют назначению переменной, метода, программы и т.д. или хотя бы не вводят в заблуждение. Из названия не понятно ЧТО ЭТО.
Лично я, когда за доли секунды выбирал этот компонент для установки из десятков других, подумал, что это очередное средство для форвардинга запросов.

Лечение

1. Удаление URLScan
Удаляется как обычная программа.
Откройте Установка и удаление программ (Windows XP и Server 2003) или Программы и компоненты (современные Windows).
Найдите там пункт по имени Microsoft URLScan Filter v[Version.Number].
Нажмите на нем кнопку Удалить.
Перезагрузите IIS! Или машину.

Как я понял, на IIS 6 и это средство не нужно (http://msdn.microsoft.com/en-us/library/ms165025.aspx). В версиях выше не помню, может оно идет там подключаемым модулем.

2. Изменение настроек URLScan
Можете поковыряться с URLScan и настроить его на дебаггинг, но я не советую этого делать на разработческой машине, т.к. технологий много, параметров настройки еще больше, поэтому лучше сохнанить время и удалить URLScan (см. выше), т.к. еще чего-нибудь можно словить на нем.
Для настройки URLScan используйте файл UrlScan.ini из папки %systemroot%\system32\inetsrv\urlscan.
Подробно здесь: Error: The Web Server Has Been Locked Down and Is Blocking the DEBUG Verb.

Как убедиться, что вы имеете проблему с URLScan
Вы не увидите URLScan, ни в меню Пуск, ни в настройках IIS (смотрел на 5й версии).
Журнал событий Windows тоже будет пуст.

1. Во первых проверьте, что он у вас есть в списке установленных программ (не в меню Пуск, а откуда программы удаляются).

2. В системе будет папка %systemroot%\system32\inetsrv\urlscan.

3. Чтоб узнать точно, что он у вас что-то начал "резать", посмотрите логи из %systemroot%\system32\inetsrv\urlscan\logs
Например:

2011-07-30 08:40:53 127.0.0.1 1 DEBUG /MyWeb/MyWebTestPage.aspx Rejected verb+not+allowed HTTP+method - -
2011-07-30 08:42:28 127.0.0.1 1 DEBUG /MyWeb/debugattach.aspx Rejected verb+not+allowed HTTP+method - -

Все.

четверг, 28 июля 2011 г.

Что такое ASP.NET Web Pages

Что такое "ASP.NET Web Pages", как я вижу.
Это новый стиль создания сайтов в ASP.NET максимально приближенный к статическим страницам.
В ASP.NET есть основные подходы Forms, MVC, а теперь еще Web Pages.
* В ASP.NET легко писать и на низком уровне без использования любого из подходов. *
Главная идея в Web Pages - легко начать с нуля, изучая полезности ASP.NET только по необходимости.
Можно начать разрабатывать без установки Visual Studio, при помощи облегченного средства WebMatrix.

В Web Pages, как и в MVC, предполагается активное использование Razor.
Razor, это вставка динамического содержимого прямо в разметку HTML страницы.
Такое было изначально в ASP.NET, но Razor предложил компактную, не загрязняющую HTML форму написания, которая сразу всем полюбилась.
Пример Razor на картинках и сравнение со стандартными вставками здесь - http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx

Все нужное для начала работы найдется на странице http://asp.net .

Невозможно загрузить файл или сборку "Microsoft.WebPages.Configuration"

Ошибка на сайтах с ASP.NET 4:
Невозможно загрузить файл или сборку "Microsoft.WebPages.Configuration, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" или один из зависимых от них компонентов. Не удается найти указанный файл.
или
Could not load file or assembly 'Microsoft.WebPages.Configuration, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The module was expected to contain an assembly manifest.

Решение:
Не проверенно на последствия, но зато быстро, если надо срочно запустить сайт.
Откройте файл C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Config\web.config
и закомментируйте строку
<add assembly="Microsoft.WebPages.Configuration, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
_
Перестановка ASP.NET 4 не помогает.
Возможно поможет перестановка ASP.NET Web Pages.

вторник, 10 мая 2011 г.

Компьютер не виден по сетевому имени.

Компьютер оказался не виден по имени компьютера в локальной сети.
Пытался зайти на свой компьютер через удаленный рабочий стол (по RDP), но он оказался недоступен по своему сетевому имени.
Был доступ только по IP.

Решение:
Windows 7, Server 2008, Vista.
Откройте Панель управления \ Центр управления сетями и общим доступом.
Под именем сети написано Общественная сеть
Кликните по этой надписи и в открывшемся окне кликните либо Домашняя сеть либо Сеть предприятия.
Примечание:
Если вы выберите Домашняя сеть, то вам предложат создать Домашнюю группу - нажмите отмена, если вам это не надо делать, ну или настраивайте домашнюю группу.

Этот пост написал потому, что не нашел ничего полезного по следующим запросам в Google:
компьютер не виден по сетевому имени
компьютер недоступен по имени
компьютер доступен только по ip
компьютер не определяется по имени в локальной сети
компьютер не находится по имени в локальной сети

Переехал с http://it3xl.wordpress.com/

Я пока попробую здесь постить http://it3xlru.blogspot.com/ .
Если все понравиться, то перееду сюда из http://it3xl.wordpress.com/ .

понедельник, 9 мая 2011 г.

среда, 16 марта 2011 г.

Ускорение компиляции Visual Studio Solution методом "Copy Local = False".

Обычное исключение из компиляции не изменяемых проектов через Build -> Configuration Manager (колонка Build напротив каждого проекта) не единственный подход для ускорения компиляции в Visual Studio (VS).
Другой способ, строится на том, что нужно отключить поведение Visual Studio по умолчанию, когда VS копирует сборки проектов, в проекты которые ссылаются на первые.

Почему и как:
Если проект A ссылается на проект B, то проект B компилируется первым.
По умолчанию, сборка проекта B дублируется и кладется вместе со сборкой проекта A.
Подход предлагает отключить копирование сборок проектов в Solution с помощью установки свойства референса на сборку Copy Local равным False, а также помещать все сборки в общую папку.

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

Реализация.
Общее описание, которое подойдет для существующих проектов и для вновь создаваемых.

Внимание!
Не приступайте к реализации, не изучив пункт Исключения после этих шагов.

  1. Если вам надо будет добавлять референсы на другие проекты внутри solution, то не важно через что вы будете это делать в окне Add Reference, через вкладку Projects или через вкладку Browse. Только не забывайте пройти все пункты этой инструкции для каждого нового проекта.

  2. Настройте общую папку(и) для сборок внутри Solution.В свойствах каждого проекта выберите вкладку Build.
    Далее зададим путь до общей папки через поле Output path, но сначала обратите внимание, что вверху вкладки Build есть выпадающий список Configuration, где выбирается конфигурация компиляции (обычно Release или Debug или какая-то ваша кастомная, если была создана).Если вы хотите задать одинаковую папку для всех конфигураций компиляции, то выберите в этом списке "All configurations" и задайте значение в поле Output path, например такое "..\bin\", тогда в корне проекта у вас появится папка bin.Если же вам для каждой конфигурации нужно задать отдельную папку, то задайте путь в поле Output path для каждой конфигурации в списке Configurations, кроме значения "All configurations". Например для Release можно задать "..\bin\Release\", а для Debug "..\bin\Debug\".Внимание!
    У Web-проектов ASP.NET папка bin может находиться только внутри корневой папки Web-проекта.

    Внимание!
    Если у вас есть проекты, расположены не в корне папки солюшена, то соответственно, поправьте путь для таких проектов.
    Например может понадобится написать не "..\bin\", а "..\..\bin\".

  3. Проверьте и настройте, если понадобится, вручную порядок компиляции.
    Мне еще не приходилось воспользоваться этим пунктом, но по мнению Patrick Smacchia (см. в конце) это может понадобится.
    Будьте предельно внимательны, иначе вы можете получать неприятные ошибки.
    Порядок компиляции можно посмотреть из Solution Explorer вызвав из контекстного меню любого проекта или солюшена пункт Project Build Order.
    Настроить порядок можно там же через пункт Project Dependencies.

  4. Задайте Copy Local равным False!
    Во всех проектах, в свойствах каждого референса на проект внутри Solution задайте Copy Local = False.
    Для этого в Solution Explorer выберите проект, разверните в нем вкладку References, там и лежат референсы.

  5. В конце, чтоб подхватились новые референсы (сборки) в зависимых проектах, выполните Rebuild Solution!
    При ошибке отсутствия dll выполните ребуилд еще раз.

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


Исключения.

  1. Случай, когда у вас Solution, в котором несколько корневых проектов!
    Смысл тут такой - для каждого звена (tier) нужна своя общая папка.
    Т.е. для каждого "корневого" проекта должна быть своя общая папка.
    Например, у вас в солюшене, помимо проектов относящихся к Silverlight, есть и другие проекты (обычно ASP.NET), в этом случае для Silverlight создавайте свою отдельную общую папку.
    Понятно, что нет смысла перемешивать в одной папке DLL от ASP.NET и Silverlight.

  2. Случай, когда у вас несколько корневых проектов, но они используют общую сборку одного проекта в вашем Solution.
    Лучше сразу попытаться избавиться от этой ситуации или призадуматься, стоит ли применять описанный в статье подход, если общих сборок много. Например такое можно встретить, если у вас в проекте несколько сайтов ASP.NET.К этому случаю не относится Solution в котором одновременно Silverlight и ASP.NET, т.к. у них разные версии .NET Framework и они обычно не пересекаются по сборкам (ну или делайте кросс-компиляционные проекты).
    В случае WCF этого, обычно, тоже можно избежать.Тут вы должны подойти творчески.
    Во первых теперь только для одного "корневого" проекта можно оставить Copy Local равным False в свойствах референса на разделяемый проект (сборку).
    Делайте с расчетом на то, что те проекты, в которых пришлось оставить Copy Local равным True, больше подходят под категорию проектов, которые можно исключить из компиляции (Build -> Configuration Manager, колонка Build напротив каждого проекта).
    Либо можно закрыть глаза на наличие не нужных сборок и exe и запихать таки всё в одну папку. Тогда при развертывании, у вас будут на звеньях (tier) не относящиеся к звену компоненты. Фу какая гадость :) . Хотя это решается скриптом подготовки релиза в Post Build Event. Но это уже муторно.


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

В статье Patrick Smacchia Partitioning Your Code Base Through .NET Assemblies and Visual Studio Projects, где я это подсмотрел, говорится о подходе к ускорению в целом, а не только с использованием метода Copy Local False.

понедельник, 14 марта 2011 г.

Способы слияния сборок .NET Framework.



Merging assemblies приятная задачка, позволяющая на выходе получить один исполняемый файл или одну dll.

Слияние (мерджинг) сборок можно выполнить двумя основными способами:

  1. Использовать утилиту слияния.
    Самая распространенная и бесплатная утилита, это утилита командной строки ILMerge.
    Чтоб ее использовать, например, бросьте в папку главного проекта ILMerge.exe, потом зайдите в свойства этого проекта и в Buil Events пропишите в поле Post-buid events command line вызов этой утилиты, например так:
    "$(ProjectDir)ilmerge" /out:"$(ProjectDir)!Output\$(TargetFileName)" "$(TargetPath)" "$(TargetDir)Prived.Midved.dll" "$(TargetDir)WindowsProcessManager.dll" del "$(ProjectDir)!Output\$(ProjectName).pdb"
    Где ключ /out указывает куда класть не по умолчанию готовую сборку или экзешник. В нашем случае это будет папка !Output в корне проекта.
    Потом перечисляются сборки, который нужно запихнуть в итоговый файл.
    Команда del в конце, используется для удаления файла ".pdb".
    Можно изловчиться и сделать так, чтоб слияние отрабатывало только в случае компиляции не для дебаггинга, но я это делал через свой экзешник передавая в командной строке $(ConfigurationName).

    Мнимый недостаток ILMerge то, что сборки теряют свою идентичность - имя, версию, культуру, публичный ключ.

  2. Загрузка сборок в рунтайме по требованию.
    Это более гибкий метод, но также и более подверженный поздним ошибкам.
    Используется внедрение нужных сборок, как ресурсов в основную сборку и потом реагирование на событие AppDomain.CurrentDomain.AssemblyResolve для извлечения сборок из ресурса и загрузки в рантайме.
    Я вам очень советую в случае использования этого способа написать тест, который при старте приложения вызывает по одному типу (методу, члену) из каждой используемой сборки в ресурсе.

Некоторый средства обфускации тоже имеют функцию слияния (точно не помню).

воскресенье, 13 марта 2011 г.

Visual Studio The Watch window bug for XPath.

Ну надо же, как приятно снова встретить старинный баг, плавно перекачевавшый теперь уже в Visual Studio 2010.

Окно Watch не умеет интерпретировать XPath выражения содержащие &lt; и подобрые вещи, например выражение
ServiceRow[position() &lt;= $Count]
в окне Watch отобразиться как недопустимое.

Полностью в XSLT файле это выглядит вот так:
<xsl:variable name="MyVar" select="ServiceRow[position() &lt;= $Count]"/>

В тоже время то, что будет работать в Watch, нельзя вставить в XSLT / XPath, т.к. является некорректным XML:
ServiceRow[position() <= $Count]

Так что не профукайте ваше время впустую.

Лично мой давний запрос, по поводу этого бага, тех. поддержка Microsoft плавненько слила. :)

IIS 6.0 не выгружает файлы с расширением .exe

Если IIS 6.0 не выгружает файлы с расширением .exe, то проверьте, чтоб в настройках каталога / сайта у вас НЕ стояло "Execute permissions" равное "Scripts and Executables". В этом случае еще ошибка "HTTP Error 404" будет отображаться.

Бизнес сказал: С Индией дружить.

На днях, встретил замерзшего индийского программиста в районе Ситроникса (Москва, метро Новослободская).
У Ситроникса давние терки с Индией, поэтому я уверенно направил человека туда.
При этом добрый индус с уверенностью сказал, что знает что такое МТС и Форис (для тех, кто в курсе). Оказалось соврал :) .

Выяснилось, что человек шел устраиваться на работу в друге место и я самолично проводил его в евоную контору.

Показательно, что конторка, видимо, маленькая.

XSLT и XPath баг в MSXML 4.0.

Нашел баг XSLT и XPath в MSXML 4. Видимо в версиях ниже он тоже есть.

Если в XSLT-переменную xsl:variable положить набор нод, полученный с помощью XPath выражения preceding-sibling, то набор строк (Node Set) в этой переменной будет храниться не в том порядке, в котором он представлен в XML.
Вроде, порядок нод будет обратный тогда.

При этом, если перебирать Node Set напрямую в xsl:for-each, без присвоения набора в переменную xsl:variable, то все будет работать правильно. Утверждать не стану, т.к. уже не помню точно, но вроде это так.

Получается в MSXML 4, preceding-sibling можно использовать только для получения количества элементов в наборе нод или для прямого перебора, но не для выборки элементов в переменную.

Проиллюстрирую баг кодом.
В следующей переменной FirstSecondThirdTables.Rows получим набор элементов ServiceRow, лежащих до ноды из переменной $FourthTable.Rows.First.
Но порядок элементов в ней будет не такой, какой он в XML:
<xsl:variable name="FirstSecondThirdTables.Rows" select="$FourthTable.Rows.First/preceding-sibling::ServiceRow"/>
Вот как обойти этот баг:
<!-- it3xl.ru: Сначала получим количество нужных нод лежащих до граничной ноды -->
<xsl:variable name="FirstSecondThirdTables.RowsCount" select="count($FourthTable.Rows.First/preceding-sibling::ServiceRow)"/>
<!-- it3xl.ru: Теперь применим стандартный фильтр по position(). -->
<xsl:variable name="FirstSecondThirdTables.Rows" select="ServiceRow[position() &lt;= $FirstSecondThirdTables.RowsCount]"/>


! Обратите внимание, что Visual Studio с 2005-й версии, да и MS SQL, уже давно используют MSXML 6, поэтому вы можете заметить баг только на промышленной среде.

Чтобы быстро проверить на этот баг в разработческой среде нужен скрипт, который выполняет XSLT преобразования именно через MSXML 4.
Я такой батничек или JS-скрипт затерял, поэтому MSDN вам в помощь для написания этого скрипта. Можно начать отсюда http://msdn.microsoft.com/en-us/library/ms757837(VS.85).aspx.

Мой большой друг спросил меня по этому поводу: "Ребята из Рэдмонда опять что-то отчебучили?"
Хотел бы я там с ними тоже поотчебучивать :)
Вот только Service Pack на это надо было бы уже давно поставить.

воскресенье, 27 февраля 2011 г.

Resharper 5 Bug - не полное инофрмирование о свойстве класса.

В Решарпере 5 средство "Show Quick Documentation" бажит не отображая корректно информацию о модификаторах доступа свойств класса.
Для свойства вида public bool MyProperty { get; private set; }
Show Quick Documentation (вызываемое по Ctrl-q) не отобразит, что сетер свойства приватный.

Очень плохо.

четверг, 17 февраля 2011 г.

Windows XP - Failed to access IIS metabase.HostingEnvironmentException. Сбой при попытке доступа к метабазе IIS.

Bug:
Failed to access IIS metabase.
System.Web.Hosting.HostingEnvironmentException.
Сбой при попытке доступа к метабазе IIS.

Известный баг проявил себя с новой стороны на Windows XP, затребовав новое решение, т.к. стандартное aspnet_regiis.exe -i не помогает.

Среда:
Windows XP (возможно SP3).
.NET Framework 2 (3, 3.5).
Возможно, машина в домене Active Directory.

Причины:
Установка .NET Framework 2 (3, 3.5) (ASP.NET) произведена до установки IIS.
Приведенное здесь особое "лечение" требуется только на Windows XP, т.к. стандартное aspnet_regiis.exe -i (и аналоги) не помогает.

Лечение:
Выполните в CMD.
iisreset /stop
net user ASPNET /delete
rem
net stop aspnet_state

%WinDir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i
rem net start aspnet_state
iisreset /start

Следующее лечение не помогает:
%WinDir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -u
%WinDir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i

пятница, 11 февраля 2011 г.

Outlook 2007 зависает и не реагирует. Потом может разчухаться.

Баг в Microsoft Outlook 2007.

Симптомы:
Outlook 2007 может зависнуть и не реагировать на любые действия пользователя.
После 5-10 минут возвращается в нормальное состояние.
Может повиснуть до перезагруки компьютера (видел в случае работы с адресами eMail).
Также может пропасть отправка почты. Сообщения будут накапливаться в папке "Исходящие", но не отправляться.

Условия:
Outlook 2007 подключен к (забирает почту из) Microsoft Exchange Server.

Действия вызывающие появление бага:
1. Самопроизвольно.
2. Фактически проявляется при любых действиях, которые требуют неявного или явного обращения к Exchange, например отправка почты, ввод адреса пользователя в строке "Кому" и т.д.

Спасение:

  • Из иконки Outlook в системном трее вызвать контекстное меню и нажать последний пункт - "Отменить запрос к серверу"

  • или нужно на мгновение оборвать подключение к интернет.

Outlook сразу прочухается без каких либо последствий.
Вроде как, при втором способе неотправленные письма уйдут с большей вероятностью и быстрее.

среда, 19 января 2011 г.

WPF Tips: Не доверяйте ложной модальности MessageBox.Show - ее надо заслужить.

Если вы расчитываете на модальности MessageBox.Show, то должен заметить, что ее легко обойти, есил MessageBox.Show("текст") вызывается в момент, когда приложение не активно.
После этого вы можете закрыть окно приложения или выполнить на нем какие-либо действия, и MessageBox, как обычно, не помешает вам это сделать.

Это можно поправить, всегда передавая нужное вам окно в перегрузки метода MessageBox.Show, где первым параметром принимается объект класса Window.

Только учтите следующие замечания:

  1. Нельзя передать null в эти перегруженные методы.

  2. Если вам кажется неправильным тащить за собой целевое окно и вы захотите использовать Application.Current.MainWindow, то учтите, что там может быть null, если еще ни одного окна не открывалось или вы сами можете где-то в коде задать Application.Current.MainWindow = null;,
    а MessageBox.Show при этом порвет (выпадет на исключении)!
    Нужет будет утильный метод который проверяет Application.Current.MainWindow на null и вызывает перегрузку принимающую целевое окно или нет.

WPF/Silverlight Tips: Коварное статическое свойствоDispatcher.CurrentDispatcher - не используйте.

Не используйте свойство Dispatcher.CurrentDispatcher!!!
Или - используйте его по назначению, что фактически означает - "не используйте его никогда, чтоб не попасть в просак".

Вместо него нужно использовать
В WPF - Application.Current.Dispatcher.
В Silverlight - Deployment.Current.Dispatcher.

Дело в том, что Dispatcher.CurrentDispatcher вернет диспатчер для текущего потока или создаст новый для потока, в котором нет еще диспатчера.
Если вы работаете в потоке вашего UI, то все о.к., вы получите Dispatcher вашего UI-приложения.
Но если вы работаете во внешнем потоке, то вы получите диспатчер, который никак не связан с вашими UI элементами и окнами и вы никогда не достучитесь до ваших гуев.

Можно поймать неприятные баги, особенно при активном рефакторинге чужого кода.

Универсальное решение для всех фреймворков
SynchronizationContext.Current

среда, 12 января 2011 г.

ReSharper 5: Опять промашка.

Resharper 5 не умеет переименовывать алиасы неймспейсов в дерективе using.

Пример кода C#:

 using YYYY= XxxAaaBbbCcc;

в этом выражении ReSharper не сможет переименовать YYYY.

вторник, 11 января 2011 г.

Баг настройки сети - Основной шлюз подключения не задается, Интернетнедоступен.



Проблема: затруднено подключении к локальной сети и отсутствие доступ к интернет.

Признаки:

  1. На проблемной машине недоступен интернет, тогда как на других он есть.

  2. Основной шлюз подключения на машине не задается при включенном DHCP на роутере.

  3. Задание статических настроек для TCP/IP не помогает.

  4. Админка роутера не доступна или вместо нее отображается ваш корневой сайт на IIS (если задан).

Решение - перейдите на другую подсеть. Смотрите подробнее ниже.

Я опишу на моей конфигурации, вам станет понятно:
Windows XP SP3, IIS 5.1.
Роутер сидит на 192.168.10.1.
Подсеть 255.255.255.0.
Подключение к сети через Wi Fi удачно устанавливается, но значение для основного шлюза отсутствует. Вот загадка!
Задаю в ручную TCP/IP - не помогает (задал статический IP, подсеть, шлюз равный IP роутера).

Причина:
На машине у вас поднят IIS и когда-то (или может сейчас) на нем, для сайта по умолчанию, был задан IP-адрес, такой же как сейчас используется для роутера в локальной сети.

Решение:
Остановка IIS или сайта по умолчанию не помогут. Сносить IIS я не пробовал.
Если вы зададите роутеру другой IP-адрес, то все заработает, но доступ к админке роутера может не появится, если вы останетесь в той же подсети, поэтму я советую перейти на другую подсеть, например в место 192.168.10.1 для роутера задать 192.168.100.1.

Получается, если не хотите проблем с подключением в винде, то лучше взять в привычку избегать IP, которые "на слуху", такие как 192.168.1.1, например.

Тонкости раздачи интернета от мобильных операторов на несколькокомпьютеров.

После прошлого поста про Подключение к интернет через Wi-Fi Ad-Hoc столкнулся с жульничеством мобильных операторов связи, предлагающих мобильный интернет через флешку (мобильный брелок).

Биллайн! Ммм!!!

Ведь флешки для интернета поставляются с программой для удобства включения интерента. Эта программа также сделает так, чтобы ваши близкие не могли выйти в интернет с других компьютеров через ваш мобильный интернет.
Прога будет делать все, чтоб подключится к сети можно было только с ноута, в который воткнута флэха.
Она проконтролирует, если вы расшарили подключение для других компьютеров в вашей сети (Общий доступ к подключению к Интернету) и удалить его. Она просто заботливо удалить само подключение, когда ей удобно, и пересоздаст его с нуля.

Неспортивное поведение! Уверен, что остальные операторы сотовой связи делают так же.

Решения:

  1. Используйте, по возможности, 3G модем вашего мобильного телефона. Многие современные телефоны его имеют. Мобильный оператор должен помочь вас с подключением.

  2. Купите подобную 3G флешку не зараженную мобильным оператором. В этом случае вы должны уметь настроить подключение.

  3. Я могу выполнить и пункт 1 и 2, но мне реально лень, поэтому делайте как я дальше.

Как только интернет остался только там, где воткнут мобильный брелок, откройте свойства подключения, которое создалось после установки программы соединения с интернетом. В моем случае это "beeline" и включите повторно "общий доступ к подключение к интернету". Смотрите картинку ниже.

В моем случае это приходится делать после выхода ноута из сна или после запуска программы соединения с интернетом.

Настройка общего доступа к подключению к Интернету

Нажмите ОК.

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