Тэги

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)

четверг, 30 декабря 2010 г.

Подключение к интернет через Wi-Fi Ad-Hoc.



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


Ad-Hoc это локальная сеть без использования внешнего роутера/маршрутизатора. В ней компьютеры подключаются напрямую через Wi-Fi или Bluetooth или другой протокол.
)

Оказалось, что нужно, в подключаемом к интернету через Ad-Hoc ноуте/компе, прописать в настройках TCP/IP реальные DNS для "Беспроводное сетевое соединение" (см. ниже инструкцию).

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

Я взял публичные DNS-адреса от Google http://code.google.com/speed/public-dns/ - это IP-адреса 8.8.8.8 и 8.8.4.4 .

Инструкция:

  1. Гуглите и читаете многочисленные инструкции как настроить интернет через Ad-Hoc с Wi-Fi между машинами.
    Много на русском, но есть на En от Microsoft, зато с картинками http://www.microsoft.com/windowsxp/using/networking/setup/adhoc.mspx .
    Возможно сначала стоит начать с инструкций которые просто говорят, как настроить Ad-Hoc (без интернета).

  2. Настраиваете Ad-Hoc.
    Замечание: На соединении которое физически выходит в интернет (не Wi Fi) мне не понадобилось настраивать что либо в Свойства -> вкладка Допольнительно -> блок "Общий доступ подключеия к интернету" -> кнопка Параметры. Это бессмысленно. Вот так это выглядит у меня.

    Рис. 1.

  3. Далее прописываете рельные DNS, как я сказал выше, на ноуте/компе где нет интернета в "Беспроводное сетевое соединение", как на рисунке 2.
    Настройки TCP/IP на компьютере, где нужно получить интернет через Ad-Hoc.Рис. 2.


Проблема в том, что во многих (всех) инструкциях по подключению интернета через Wi-Fi с Ad-Hoc советуют в качестве DNS-IP-адреса, на машине без интернета (рис. 2), писать статический адрес взятый с машины/ноута, на которой есть интернет из свойств TCP/IP у "Беспроводное сетевое соединение" (рис. 3).
Настройка Wi Fi TCP/IP на машине с выходом в интернет, для доступа к инетернету с другой машины через Ad-Hoc.
Рис. 3.
Т.е. в моем примере предлагают в качестве DNS-адреса на рис. 2 подставить 192.168.0.1 из рисунка 3.
Или (!!!) вообще оставить поле DNS-адресов пустым (рис. 2).
Так может не работать, поэтому пишите туда IP-адреса реальных DNS!

Кстати:
DNS от Google быстрее и защищеннее от атак. Почитайте http://code.google.com/speed/public-dns/.
Ваш провайдер же, в своих DNS-серверах, может что угодно банить по своему усмотрению.
И главное, я подключаю разных провайдеров, то ADSL (Стрим), то 3G по USB (Beeline, МТС, Мегафон и др.), то Скайлинк (в Лен области прикольно им пользоваться), а публичные DNS подойдут всегда и для всех.

среда, 3 ноября 2010 г.

APEX Ajax Deadlock Bug

При работе с интерактивным отчетом в Oracle Application Express (APEX), в случае обрыва сети или возникновения ошибки в Oracle (т.е. как бы на сервере 500-е ошибки), все дальнейшие попытки выполнить какие-нибудь действия над интерактивным отчетом на странице будут завершаться с ошибкой.

Так продолжится, пока вы не обновите страницу полностью.
При этом, никаких сообщений, что надо обновить страницу, APEX пользователю не выдаст.
При обновлении теряются все данные, которые пользователь уже ввел для фильтрации, например!
Это крайне раздражает пользователей готового решения на Application Expres и начинают поступать многочисленные вопросы, аля - какого лешего мы не сдалали все на ASP.NET или на "Java".

Файл решения проблемы в APEX 3.2.
Этот баг остался в APEX 4 и мое решение нужно немного доделать для четверки. Если вы это сделаете, то буду благодарен, если вы перешлете мне для публикации.
Для workaround подключите в страницу APEX JavaScript фреймворк jQuery (для версии 3.2 и ранее).
Подключите на нужную страницу APEX JavaScript файл моего решения - apex_ajax_deadlock_treatment.js.
Это все можно сделать через шаблоны страниц.
В APEX 4 jQuery уже внедрен и нужно только немного подправить код только в одном месте.

Как получить этот баг:

  1. откройте любую страницу с интерактивным отчетом APEX.
    (APEX должне быть установлен на другом компьютере)

  2. разорвите подключение к нитернет (или как-то добейтесь, чтоб низлежащий запрос рвал).

  3. выполните любое действие над интерактивным отчетом - пейджинг, сортировка, фильтрация, изменение количества выводимых на странице строк и т.д.

  4. подключите интернет обратно.

  5. Страница с интерактивным отчетом станет "залочена", пока вы ее не обновите.

Это поведение связано с багом в JavaScript AJAX коде APEX.
Что происходит на низком уровне:
А там простая разработческая халтура!
При выполнении действия над интерактивным отчетом запускается AJAX запрос. По его завершении APEX ожидает получить HTML интерактивного отчета и вставляет полученный HTML на страницу, вместо старого.
Даже если AJAX завершился неудачно и полученные данные содержат не отчет, а HTML-страницу ошибки или сообщение об ошибке, делается попытка вставить эту "HTML-помойку" как интерактивный отчет.
Перед вставкой отчета APEX-JavaScript выполняет у элемента div , содержащего все относящееся к интерактивному отчету, замену id со значения "apexir_WORKSHEET" на "apexir_WORKSHEET_old".
Далее происходит исключение в строчке
(для APEX 3.2)
lThis=$u_js_temp_drop();$s(lThis,p.responseText);M.parentNode.replaceChild($x("apexir_WORKSHEET"),M)
Исключение появляется потому, что после замены id у старого элемента, новый не появился из-за того что полученный HTML содержит мусор!
Т.е. мы делаем в DOM следующий запрещенный прием - вставить в дерево DOM вместо какой-то ноды значение "null", что не допустимо:
M.parentNode.replaceChild($x( null, M)
Т.к. исключение никто не перехватил, то никто и не переименовал id у элемента обратно со значения "apexir_WORKSHEET_old" в значение "apexir_WORKSHEET".
После этого все действия над интерактивным отчетом, т.е. любой AJAX, будут рвать уже из-за того, что не удается найти div с id "apexir_WORKSHEET".

Вот такую мертвую петлю построил себе Oracle APEX.

Даже как-то обидно, что в APEX забыли сделать стандартную проверку, по имени "Всегда проверяй данные на входе, особенно полученные из базы данных". )))

понедельник, 13 сентября 2010 г.

суббота, 11 сентября 2010 г.

ReSharper: Решарпер не умеет поддерживать расшаренныекросс-компиляционные проекты.

Есть в Visual Studio приемчик такой, я его называю попростовски - кросс-компиляционный шаринг. ))
Фишка в том, что в таких проектах у вас разные верссии .NET Framework, но общий код!
И правите вы код в одном файле, т.к. физически файл лежит только в одном проекте, а в остальных есть только ссылки на этот файл.
Поскольку namespace в таких проектах общий, то можно спокойно передавать объекты .NET Framework разных версий между звеньями приложения написанными на .NET Framework разных версий.
Удобно также референс добавлять на проект подходящей версии .NET Framework.
Ну как-то так, в общем. Нужно будет – нагуглю вспомню.
Я что-то писал рашньше про это – WPF + WCF + Silverlight + WCF+ ASP.NET.
Фигасе! А товарищи из Решарпера не чешутся. Не умеет ReSharper 5 с этим всем обходится. Жаль. :))
Приходится работать почестному постаринке – поиском по солюшену.
Правда и VS и сама немного тупит при таком подходе. Но совсем немного – один и тот же файл нельзя открыть два раза и контекст на нужный проект у открытого файла не переключается.

четверг, 9 сентября 2010 г.

SVN: Пропали иконки TortoiseSVN.

В проводнике Windows у вас пропали иконки TortoiseSVN.

Для восстановления ставьте текущую версию Tortoise SVN повторно и используйте второй раз режим установки “Repair” (восстановление).

Эта проблема возникает у тех кто ставил или ставит новую версию TortoiseSVN поверх старой.

Информация поступила с официального сайта Tortoise SVN и помогла мне.
Это текущая ситуация, возможно в последующем этот пост станет не актуальным.

ODP.NET: Тонкости биндинга переменных.



“Сколько же можно наступать на грабли от Oracle”, сказал я себе и решил написать этот пост.

ODP.NET это реализация ADO.NET для работы с Oracle.

Перечислю некоторые тонкости биндинга параметров в ODP.NET.

Изначально имеем код запроса, который корректнен и работает:
Начальный пример
var oCom = new OracleCommand
{
    CommandText = @"begin :outP := krn_setting_iapi.get_v(:inpP1,:inpP2,:inpP3); end;",
};
oCom.Parameters.Add("outP", OracleDbType.Varchar2, 100, null, ParameterDirection.Output);
oCom.Parameters.Add("inpP1", OracleDbType.Varchar2, 20, "first", ParameterDirection.Input);
oCom.Parameters.Add("inpP2", OracleDbType.Varchar2, 20, "second", ParameterDirection.Input);
oCom.Parameters.Add("inpP3", OracleDbType.Varchar2, 20, "first", ParameterDirection.Input);

Тонкость 1. Называется “У вас нет такого геммора? Тогда Oracle идет к вам! ”.
Просто так менять порядок биндинга переменных в коде нельзя.
oCom.Parameters.Add("inpP1", OracleDbType.Varchar2, 20, "version", ParameterDirection.Input);
oCom.Parameters.Add("outP", OracleDbType.Varchar2, 100, null, ParameterDirection.Output);
Если вы хотите так сделать, то вам нужно добавить следующую строкчку:
oCom.BindByName = true;
Иначе ODP.NET выдаст тут вам разные исключения, возможно ORA-01403: no data found или/и ORA-06512, ну или ORA-20000.

Тонкость 2. Называется “Геммор - наш стиль!”.
В начальном примере, в параметре inpP1 и inpP3, передается одинаковое значение, но вы не можете сократить количество переменных и следующая запись будет некорректна:
var oCom = new OracleCommand
{
    CommandText = @"begin :outP := krn_setting_iapi.get_v(:inpP1,:inpP2,:inpP1); end;",
};
Не попадитесь на этом!!!
Возможно, положение может исправить строчка кода “oCom.BindByName = true;”, но я сейчас этого не помню точно.

Токость 3. “Мы хуже чем ты думаешь.”
Это практически бага и касается она использования типа параметра OracleDbType.Varchar2 (т.е. оракловый String).
Это может быть не во всех версиях ODP.NET, но встречается часто.
Для этого типа обязательно задайте размер (size), у нас выше в примере это цифры 100 и 20. Детально об этом здесь.
К этому относится и следующее:
метод Parameters.Add(…) в классе OracleCommand не имеет перегрузки для передачи размерности без передачи значения параметра, если еще надо передать ParameterDirection.
По человечески это значит, что вы думаете, что в следующей строке вы зададите размерность для Varchar2 в 100:
oCom.Parameters.Add("outP", OracleDbType.Varchar2, 100, ParameterDirection.Output);
Но на самом деле вы задаете так значение параметра в 100.ToString(), поэтому строка выше работать не будет.
ODP.NET выдаст ошибку: ORA-06502: PL/SQL: numeric or value error: character string buffer too small.

среда, 8 сентября 2010 г.

Вывод в cmd или bat пустой строки.



Как вставить пустую строку в cmd через bat-файл.
Как вывести пустую строку в cmd через bat.
Как добавить переснос строки в CMD вывод.
echo пустой строки.

Чтобы отформатировать в cmd вывод и вывести в окне консоли пустую строку нужно использовать соманду “@echo.

Обратите внимание, что это не просто команда echo с управляющим символом “@” перед ней. Это именно команда echo с точкой на конце без пробела между echo и точкой.

@echo.

суббота, 4 сентября 2010 г.

XPS: Microsoft XPS vs PDF.

Исправлено 17.09.10.Вы хотите выбрать лучший формат для вашей печати (PDF)?
Или хотите чего-то новенького (XML Paper Specification - XPS)?
Выберите PDF или подумайте трижды, прежде чем выбирать XPS!
Таки облажалась команда Microsoft, создавшая реализацию XPS, по части алгоритмов представления и, подозреваю, налажали они не в одном месте.
XPS это здорово, это хорошо работает под WPF, но для промышленного решения мы выбираем проверенные решения, Мы выбираем PDF!
Вот вам, на рисунке, полученный мной при печати сюрприз от XPS.
MicrosoftXPSBug
Здесь есть скругления углов, выполненные наложенными изображениями, но также видны тоненькие линий, пытающиеся дорисовать прямой угол.
Жесть, не правда ли!
Эти тоненькие линии - добавочка, так сказать, от XPS. Это должно быть скрыто под изображением.
Также досадно, что XPS вносит мусор в изображения, в отличии от PDF. Как буд-то это JPEG какой-то. Увеличте изображение и мусор будет заметен на скруглениях углов.
Добавлено:
Обидно, но на низком уровне печать в Windows всегда идет через XPS (могу быть не точным в этом), даже в Windows XP.
Если вам надо обойти эту багу, то есть два решения:
1. Не используйте PNG изображения в верстке. Видимо, начиная с Internet Explorer, Microsoft не дружит с этим форматом графики. :)
2. Или постарайтесь найти фичу "Печать как картинка". Например она есть в Adobe Reader и доступна по нажатии кнопки "Advanced" на странице настроек печати:

пятница, 3 сентября 2010 г.

Visual Studio 2010: Невозможные баги.

Есть баги, появление которых невозможно в таком продукте, как Visual Studio 2010.
Зато с их появлением сразу ставятся точки над i и становятся смешны коллеги до одурения подсевшие на разные тестовые фреймворки и подходы. Slacker idiots…
Как не крути, а шаг в сторону от бизнес логики и оказывается, что без грамотного гуиста не обойтись.

У команды VS 2010 есть оправдание. Ими проделана огромная работа по переводу Visual Studio на WPF.
Но встает вопрос! А кто тогда делал бэта-тестирование? Манагеры? Планктон? Бесчисленные лекторы-профаны?

Самая смешная из известных ошибок, это когда окно поиска, открываемое в VS 2010 по нажатию Ctrl – F, каждый раз увиличивается на чуть-чуть. Приколько, когда после нескольких дней работы PopUp окошко поиска занимает почти весь экран ))).

Посчастливилось и мне найти багу. Это не так весело, потому что она напрямую касается читабельности кода и скорости работы.
Стандартная операция – вы свернули блок кода или разметки XML, и хотите поменять его табуляционные отступы. Вы выделяете, как в старых версиях VS, строку со свернутым кодом, нажимаете клавишу TAB, но, вместо корректного добавления отступа в каждую строчку, вы получаете кучу символов табуляции только в первой строке свернутого кода.
Думаю я не первый кто на это наткнулся.

Добавлено:
Таки MS отреагировал на мою багу. Они сделали workaround неполное решение - при нажатии на табуляцию XML разворачивается (при работе с C# код остается свернутым).
Но эта бага все-равно осталась в других более тонких сценариях форматирования отступов и переноса кода, например когда у вас свернутый блок внутри родительского XML или что-то подобное, уже не помню.

понедельник, 30 августа 2010 г.

Как заставить IIS выгружать файлы с расширением .7z

Зайтидет в свойства сайта в IIS (или любой сущности в дереве IIS), во вкладке HTTP Headers задайте новый MIME тип нажав на кнопку MIME Types...
Extension: .7z
Mime type: application/zip
Да, да, надо задать именно application/zip, а не application/x-7z-compressed, тогда можно будет хостить на сайте файлы с расширением .7z и они будут нормально загружаться как файлы, а не как текстовая страница.

четверг, 12 августа 2010 г.

Java: Weblogic: Error enabling XMLBeans builder on project

Имеем: проект для Weblogic 9.2 и Workshop (Eclipse).

Выполняем: Миграция / восстановление проекта Weblogic.

 

При добавлении XMLBeans Builder в Project Fasets происходит следующая ошибка.


Failed while installing XMLBeans Builder 2.0.
  Error enabling XMLBeans builder on project
    Generated root overlaps Java build path

 

Для решения этой проблемы в свойствах проекта зайдите в Java Build Path и во вкладке Source удалите в Source folders on build path запись ИмяПроекта/.xbean_src.

Далее, при переходе на другое свойство проекта может быть предложено сохранить изменения (... save changes ...) - согласитесь.

Потом сразу добавляйте фасет проекта XMLBeans Builder.

Сохраняйте изменения.

Все, это решение для данной проблемы.

При этом Java Build Path, который мы удалили ранее ИмяПроекта/.xbean_src восстановится автоматически.

 

Видимо это связано с тем, что добавление фасета XMLBeans Builder в проект создает запись /.xbean_src в Java Build Path и если эта запись уже существует, то происходит сбой добавления указанного фасета.

Это баг конечно и даже Google тут не поможет.

среда, 21 июля 2010 г.

Звук сообщений из vkontakte.ru в формате mp3 и wav.


Звук сообщений из VKontakte.ru в формате mp3 и wav.

Это которые "Мгновенные сообщения" или "Быстрые сообщения".

 

Скачать можно у меня из хранилища Windows Live SkyDrive.

 

В формате mp3 можно скачать прямо с VKontakte.ru  http://vkontakte.ru/mp3/chat_sound.mp3

 

понедельник, 12 июля 2010 г.

Невозможно загрузить exe файлы размещенные на IIS.

IIS 6.

Невозможно загризить exe файл через IIS из браузера.

Вы разместили на IIS 6 для скачки исполняемый файл. При наборе адреса этого файла в браузере его невозможно загрузить.

В браузере пишется ошибка:

The page cannot be found

HTTP Error 404 - File or directory not found.
Internet Information Services (IIS)

 

Для решения этой проблемы откройте оснастку IIS (Internet Information Services (IIS) Manager).

Разверните слева дерево меню до папки в которой лежит ваш экзэшник.

На папке вызовите контекстное меню и в нем выберите Properties.

В откерывшемся окне (вкладка Directory) для Execute permissions выберите из выпадающего списка значение Scripts Only или None, но только не Scripts and Executables.

Для сохранения нажмиите кнопку OK или Apply.

Все, теперь загрузка ваших экзешников из браузера возможна.

вторник, 8 июня 2010 г.

.NET Framework: Слабо документированная фича инициализаторов C#, граничущая с приличиями.

Решарпер наткнул меня на следующий интересный случай.

Я порылся и ничего не нашел в MSDN.

Это относиться к .NET Framework 3.0 и длалее.

 

Оказывается запись


var classLevelOne = new ClassLevelOne
{
    PropClassLevelTwoInOne =
    {
        ClassLevelThreeInTwo =
new ClassLevelThree()
    }
};
Не тоже самое, что запись

var classLevelOne = new
ClassLevelOne
{
    PropClassLevelTwoInOne = new PropClassLevelTwo
    {
        ClassLevelThreeInTwo =
new ClassLevelThree()
    }
};

 

Первая запись говорит о том, что нужно не задать, а взять из свойства (PropClassLevelTwoInOne ) уже заданный там ранее объект и задать члены этого объекта.

Как я понимаю, объект в этом свойстве нужно задать ранее в конструкторе или в этом же "скобочном" инициализаторе.

 

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

 

А ответ удалось найти в спецификации языка C#.

Т.е. такая конструкция говорит о том, что в этом случае объект уже должен быть заранее инициализирован и что тут происходит только задание его членов.

 

A member initializer that specifies an object initializer after the equals sign is an initialization of an embedded object. Instead of assigning a new value to the field or property, the assignments in the object initializer are treated as assignments to members of the field or property. A property of a value type cannot be initialized using this construct.

 

A member initializer that specifies a collection initializer after the equals sign is an initialization of an embedded collection. Instead of assigning a new collection to the field or property, the elements given in the initializer are added to the collection referenced by the field or property. The field or property must be of a collection type that satisfies the requirements specified in §26.4.2.

 

the following construct can be used to initialize the embedded Point instances instead of assigning new instances:

var r = new Rectangle {
   P1 = { X = 0, Y = 1 },
   P2 = { X = 2, Y = 3 }
};

which has the same effect as

var r = new Rectangle();
r.P1.X = 0;
r.P1.Y = 1;
r.P2.X = 2;
r.P2.Y = 3;

 
Другими словами, такой конструкцией можно задавать члены объекта в уже инициализированном свойстве.

Свойство должно уже быть ранее определено в конструкторе или в том же "скобочном" инициализаторе.

 

Фича действительно очень удобная и чувствовалось, что ее не хватало, а она оказывается есть.

Но! Мы получили еще одно уязвимое место, плодящее скрытые ошибки при изменении типов и, как минимум, все такие мест обязаны быть покрыты тестами.
Также такой код слабо читаем и различим, что опять ведет к ошибкам.

 

Вот полный код для консольного приложения чтобы проверить работу этой конструкции. Здесь свойство не инициализируется и поэтому выбрасывается исключение в подобной конструкции:

_________________


namespace

ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var classLevelOne = new ClassLevelOne

{


PropClassLevelTwoInOne =


{


ClassLevelThreeInTwo =

new ClassLevelThree()

}


};


}


}


internal class ClassLevelOne

{


private ClassLevelTwo _propClassLevelTwoInOne;

public ClassLevelTwo PropClassLevelTwoInOne

{


get

{


return _propClassLevelTwoInOne;

}


set

{


_propClassLevelTwoInOne =

value;

}


}


}


internal class ClassLevelTwo
{
private ClassLevelThree _classLevelThreeInTwo;
public ClassLevelThree ClassLevelThreeInTwo
{
get
{
return _classLevelThreeInTwo;
}
set
{
_classLevelThreeInTwo =
value;
}
}
}
internal class ClassLevelThree
{
}
}
_________________

WPF: Баг проекта WPF в Visual Studio при работе с ресурсными файлами.

Речь о проекте WPF в Visual Studio.

 

Есть файлы которые компилируются в сборку. Ресурсные файлы.

У них в свойствах в Build Action стоит Resource.

С ними нужно быть осторожным, т.к. при удалении такого файла из проекта или при изменении Build Action на None ничего не меняется.

Грубо говоря этот файл останется у вас в ресурсе. Возможно если вы подмените этот файл, то новый файл не подхватиться (не пробовал).

 

Для решения этой проблемы, после каждого изменения с ресурсными файлами, выполните очистку проекта или всего солюшена - Clean из контекстного меню в Solution Explorer.

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

 

Видел это в VS 2008, в 2010 не пробовал.

Я думаю это относится не только к проектам WPF.

четверг, 22 апреля 2010 г.

Silverlight: The "ValidateXaml" task failed unexpectedly.


Ошибка возникает при компиляции солюшена с проектом Silverlight в Visual Stusio.

Такая ошибка связана с тем, что в вашем GAC появилась сборка из Silverlight или из Silverlight Toolkit.

Удаляйте эту сборку из GAC и все заработает. Гугл тоже согласен с таким решением.

Обычно это сборки с версией 2.0.5.0.

Имейте ввиду, что в GAC может быть совсем не та сборка, которая указана в ошибке. Может произойти так: В GAC уже лежат сборки, относящиеся к Slverlight, которые ссылаются на другие сборки, которых в GAC нет.

 

Полный текст ошибки, который был у меня:

Error 1 The "ValidateXaml" task failed unexpectedly.
System.IO.FileNotFoundException: Could not load file or assembly 'System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e' or one of its dependencies. Не удается найти указанный файл.
File name: 'System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e'
   at System.ModuleHandle.ResolveType(Int32 typeToken, RuntimeTypeHandle* typeInstArgs, Int32 typeInstCount, RuntimeTypeHandle* methodInstArgs, Int32 methodInstCount)
   at System.ModuleHandle.ResolveTypeHandle(Int32 typeToken, RuntimeTypeHandle[] typeInstantiationContext, RuntimeTypeHandle[] methodInstantiationContext)
   at System.Reflection.Module.ResolveType(Int32 metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
   at System.Reflection.CustomAttribute.FilterCustomAttributeRecord(CustomAttributeRecord caRecord, MetadataImport scope, Assembly& lastAptcaOkAssembly, Module decoratedModule, MetadataToken decoratedToken, RuntimeType attributeFilterType, Boolean mustBeInheritable, Object[] attributes, IList derivedAttributes, RuntimeType& attributeType, RuntimeMethodHandle& ctor, Boolean& ctorHasParameters, Boolean& isVarArg)
   at System.Reflection.CustomAttribute.GetCustomAttributes(Module decoratedModule, Int32 decoratedMetadataToken, Int32 pcaCount, RuntimeType attributeFilterType, Boolean mustBeInheritable, IList derivedAttributes)
   at System.Reflection.CustomAttribute.GetCustomAttributes(Assembly assembly, RuntimeType caType)
   at System.Reflection.Assembly.GetCustomAttributes(Type attributeType, Boolean inherit)
   at System.Attribute.GetCustomAttributes(Assembly element, Type attributeType, Boolean inherit)
   at MS.Internal.Xaml.MS.Impl.XamlSystemBinding.AddPairsFromAssembly(XamlSchemaContext schemaContext, Assembly asm, String uri, List`1 pairs)
   at MS.Internal.Xaml.MS.Impl.XamlSystemBinding.SearchForXamlNamespace(XamlSchemaContext schemaContext, String uriString, IEnumerable`1 referenceAssemblies)
   at MS.Internal.Xaml.XamlSchemaContext.GetXamlNamespace(String xmlns, Assembly localAssembly)
   at MS.Internal.Xaml.XamlSchemaContext.GetXamlNamespace(String xmlns)
   at MS.MarkupCompiler.ValidationPass.ValidateXaml(String fileName, Assembly[] assemblies, Assembly callingAssembly, TaskLoggingHelper log, Boolean shouldThrow)
   at Microsoft.Silverlight.Build.Tasks.ValidateXaml.XamlValidator.Execute()
   at Microsoft.Silverlight.Build.Tasks.ValidateXaml.XamlValidator.Execute()
   at Microsoft.Silverlight.Build.Tasks.ValidateXaml.Execute()
   at Microsoft.Build.BuildEngine.TaskEngine.ExecuteInstantiatedTask(EngineProxy engineProxy, ItemBucket bucket, TaskExecutionMode howToExecuteTask, ITask task, Boolean& taskResult)

 

понедельник, 12 апреля 2010 г.

Как добавить сайт в Bing.

Для добавления в Bing вы можете воспользоваться следующей страницей:


Учтите, только что если вы авторизуетесь с этой страницы с помощью вашего Live ID, то эта страница средиректит на http://www.bing.com/webmaster/WebmasterManageSitesPage.aspx, для регистрации Web-мастера сайта.

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

вторник, 30 марта 2010 г.

Error message: cannot access non-static method in static context.

Вот одна из причин этого сообщения:

Инициализация поля происходит вне конструктора, причем при инициализации требуется нестатический метод класса.

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

В этом случае и возникнет эта ошибка.

Нужно инициализацию таймера просто перенести в конструктор класса.

Следующий код не даст скомпилироваться:

private readonly Timer _timer = new Timer(state => MyMethod(MyParam), SomeState, SomeInterval, SomeInterval);


В этом случае нужно переписать так:

private readonly Timer _timer;

public MyClass()
{
    _timer = new Timer(state => MyMethod(MyParam), SomeState, SomeInterval, SomeInterval);
}

.

четверг, 11 марта 2010 г.

Silverlight: Как определить активно ли приложение / окно Silverlight, имеет ли оно фокус.

Silverlight 3.

У меня был некий перерыв в работе с Silveright и что-то я не вспомнил, как определить, что окно / приложение Silverlight активно или нет. И сделать это нужно вне зависимости, браузерное это приложение Silverlight или это "Out Of Brouser", всю страницу в браузере это занимает или нет.

 

Проблема в том, что события LostFocus и GotFocus не дают возможности определить, что приложение активно или нет.

 

Пока я это сделал через отслеживание событий на корневом элементе - Application.Current.RootVisual.

 

Если вы мне подсажете / напомните, как это определять более красиво, то буду вам очень благодарен.

 

Конечно я это не тестировал на всех вариантах работы Silverlight, но полагаю, что это должно работать.

 

Идея следующая, например, для определения того, что приложение не активно: Если после события потери фокуса происходит событие MouseLeave, то значит приложение перестало быть активным.

Любое же событие получение фокуса говорит о том, что приложени стало активным.

среда, 10 марта 2010 г.

Silverlight: Популярный вариант утечки памяти связанный с динамическиизменяемым деревом элементов приложения Silverlight.

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

Вы создали элемент. (Все, забудьте в WPF / Silverlight слово "контрол" Улыбка ).
Вы добавляете этот элемент динамически в дерево элементов приложения Silverlight.
По действию пользователя вы заменяете этот элемент его новым инстансом (экземпляром).

Все красиво работает, все заменяется и потом удаляется сборщиком мусора, но до тех пор, пока вы не привяжете методы экземпляра вашего элемента, как обработчики событий элементов, постоянно находящихся в иерерхии элементов вашего Silverlight приложения.

Например, очень часто нужно реагировать на события Application.Current.RootVisual.

! Будте внимательны. Как только вы начинаете использовать элемент, как динамически добавляемый / заменяемый / удаляемый, то вы больше не может (не имеете права) привязывать методы его экземпляра к событиям элементов постоянно находящихся в иерархии приложения Silverlight, т.к. в этом случае удаленные / замененные экземпляры вашего элемента не будут уничтожатся сборщиком мусора благодаря механизму событий в .NET Framework.

Вариантов обхода этого ограничения много (Prism: Event Aggregator), поэтому используйте нужный вам по обстоятельствам.

Или используйте слабую ссылку - WeakReference

Чтобы копнуть глубже есть статья Слабые события в C#.

четверг, 4 марта 2010 г.

Silverlight: "Тонкий" баг в TreeView при снятии выделения со всехэлементов.

Silverlight 3.0, TreeView from Toolkit October 2009.

Задача: Если снять выделение со всех элементов TreeView, то ранее выделенный элемент опять станет выделенным, если окно Silverlight тут же потеряет фокус а потом получит опять.

Решение: Недостаточно просто снять выделение с элемента TreeView, нужно так же снять с него фокус.

Вот код, который обходит эту проблему.


public static void UnseslectAllTreeViewItems(TreeView treeView)
{
    //treeView.SetSelectedContainer(null);    var selectedContainer = treeView.GetSelectedContainer();     if (selectedContainer != null    {
        selectedContainer.IsSelected = false    }
    // Bug resolving
    var focusedElement = FocusManager.GetFocusedElement();    if (focusedElement != null
        && focusedElement == selectedContainer)
    {
        treeView.Focus();
    }
}

Silverlight: TreeView Unselect All Items (v.2).



Silverlight 3.0, TreeView from Toolkit October 2009.

Задача: В элементе TreeView у которого есть выбранный дочерний ItemTreeView сделать так, чтоб не один элемент не был выбран. Простая задача, но что если у вас она не работает!

Решение: Есть!

Предположим вы используете следующий код:
var selectedContainer = VerticalMenuTreeView.GetSelectedContainer();
if (selectedContainer != null)
{
    selectedContainer.IsSelected = false;
}

или такой:
OrgTreeView.SetSelectedContainer(null);
но он не дает никакого результата.

Скорее всего вы прибиндили SelectedValue вашего TreeView к какому-то элемненту и забыли в привязке указать Mode=OneWay.

Вот правильный XAML:
DataContext="{Binding SelectedValue, ElementName=OrgTreeView, Mode=OneWay}"

А вот XAML приводящий к багу:
DataContext="{Binding SelectedValue, ElementName=OrgTreeView}"

Главное не забудте указать Mode=OneWay во всех привязках!

Когда вы пытаетесь в коде первым или вторым способом снять выделение в дереве, то вы, фактически, задаете в SelectedValue вашего TreeView значение null и поэтому функционал привязки (binding) без Mode=OneWay отрабатывает, как и положено в этом случае, и передает в SelectedValue прежнее выбранное значение.
И биндингу плевать, что вы то сами не можете из кода задать SelectedValue вашего дерева, т.к. у него нет открытого сеттера (set{}).

Ну чтож, ознакомлен, значит вооружен.

Вот тема из форума Silverlight на этот счет: http://forums.silverlight.net/forums/p/151973/341208.aspx

вторник, 2 марта 2010 г.

WEB-серия. Разделение состояний между вкладками браузера одного сайтадля WEB-сервера

Задача: Нужно разделить состояние сессии, которое обычно подтягивается (извлекается для запроса) по ключу в Cookie.
Так как сессионные коки общие для всех вкладно одного сайта в одном окне (и общие для окон открытых по Контрол-N), то разделить сессионные данные невозможно между разными вкладками одного сайта.
Это особенно критично для корпоративных приложений.
Решение:
На данный момент решение в HTTP только одно – добавить ключк в строку запроса. То есть добавить ключ в QueryString. По этому ключу различать состояния сессий.
Замечания для ASP.NET:
Не используйте для хранения таких данных Session! Используйте Cache.
Проблема: При таком решении обновление страницы (F5) приводит к поторе ее состояний, т.к. трудно отличить открытие новой вкладки и обновление страницы. Хотя, это возможно при помощи JavaScript и Cookie.
Это было сделано более двух лет назад и тогда я перепробоавл много вариантов, но реально рабочий оказался этот.

WPF-серия. Прокрутка окна с замораживанием главного меню и вкладоквверху / внизу страницы

(Этот пост только для меня родного, т.к. боюсь я тут не совсем хорошо объяснил этот трюк из мира WEB)
Не смог найти встроенный стандартный способ фиксации верхнего меню окна / страницы в WPF, так, чтоб весь остальной контент можно было прокручивать.
Немного поколдовал и сделал через биндинг, свойство зависимости и расчет размера (высота страницы минус высота меню и для ширины так же).
Получилось идеально и красиво, но может вы знаете стандартные подходы, как этого добиться.

Офис: Возможно ли вставить в документ Office переключатель (радио-кнопки, Radio Buttons ), флажок ( CheckBox, чекбокс ), чтоб онисохраняли свое состояние.

Задача: Узнать, возможно ли вставлять в документ офис, чекбоксы ( флажки ), радиокнопки (переключатели), чтоб они сохраняли занчение выбора.
Решение: Да возможно. Поищите их в меню и добавте в документ в нужное место. После этого они буду сохранять свое состояние после сохранения и повторного открытия.

Silverlight: TreeView Multi Selection and Multi Drag & Drop.



Silverlight 3.0, TreeView from Toolkit October 2009.
Tags: TreeView MultiSelection and Multi Drag & Drop.

Yes! We do it! :)

Изменено: v.1.2.

Задача: Сделать чтоб в TreeView можно было выбирать мнгого элементов. Также обеспечить для выбранных элементов множественный Drag And Drop.

Решение: Реализовать множественный выбор и Drag Drop в TreeView можно через низлежащий объект данных. А точноее через иерархию этих объектов. Нужно, также, реагировать на нажатие клавиш Контрол и Шифт.
На самом деле, если вы захотите польностью подражать поведению проводника Windows, к примеру, то вам понадобится еще много чего сделать и поковыряться в событийной модели Silverlight. Например определить, когда приложение Silverlight активно, а когда фокус находится в другом окне.

Код я не выкладываю, т.к. это написано для одного приложения. Не могу сейчас тратить время на вынос в красивый самостоятельный функционал, т.к. используется много другого разработанного функционала, например отложенное выделение / развертывание нод в TreeView. Также, я надеюсь, что это появиться в Silverlight 4 или каком-то из последующих Toolkit.

Изначально нужно создать объект данных со свойством IsSelectedLogicaly, например. Настройте стили в разметке XAML (ну или в файле кода) которые будут реагировать на это свойство.

Доработайте этот объект дынных, чтоб через него было удобно работать с иерархией таких объектов. Например получать родителя, родителей, потомков. Или определять, что объект является предком другого объекта иерархии.

Запрограммируйте дополнительно TreeView, чтоб по клику на +/- свойство IsSelectedLogicaly не менялось.

И это не все. Чтоб это работало как часы вместе с Drag & Drop нужно еще, к сожалению, учесть много мелочей.
Например, по аналогии с проводником Windows, мне пришлось определять и реагировать на состояние, когда приложение / окно Silverlight перестает быть активным. Отлавливать попытку всатвки родителя в потомка (это уже было реализовано в виде "игнорирования", но только для единичного выделения).

Ребят, главное, всетаки, чтоб вы знали, что это возможно, хотя за бугром этого, до сих пор, никто не сделал. Покрайней мере отркрыто.

Подробности, если случиться, вы найдете в решении "MTC - Анализатор Счета", меню "Абоненты" от компании iFlex.ru.

Миграция WCF с проекта Web-сайт на проект Web-application в VisualStudio

Решение: Есть.
Задача: Перенести файлы WCF .svc и относящиеся к ним файлы кода из VS 2008 Website в Web Application.
  1. Прочитать http://gurustop.net/blog/2008/08/03/converting-vs-2008-website-to-web-application/
  2. Перенести .svc из Website проекта в Web Application. Из папки App_Code пененести в корень Web Application соответствующий .cs файл.
  3. Соответствующий .cs файл переименовать так: было my.cs стало my.svc.cs.
  4. Исключить .svc.cs из проекта.
  5. Создать произвольный .svc файл для сразвнения.
  6. Открыть через контекстное меню Open With выбрав XML Editor оба .svc файла.
  7. Привести к соответствию перенесенный файл задав в атрибут CodeBehind правильное значение. Для этого удалите “~/App_Code/” и “my.cs” замените на “my.svc.cs”.
  8. Включить в проект .svc.cs. При этом файл кода станет автоматически дочерним для .svc файла.
Писал на скорую руку, если непонятно, связывайтесь.
Если вы добавите или переименуете namespace у файла кода, то должны будете поправить настройки привязок в web.config. Также посмотрите по аналогии с только что созданным .svc файлом.

среда, 3 февраля 2010 г.

Error 1 Metadata fileC:\WINDOWS\assembly\GAC_32\System.EnterpriseServices\2.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dllcould not be found

Эта ошибка лечится переустановкой/восстановлением .NET Framework.
Я переустановил 3.5, но кто-то переставляет 2.0.
Ошибка Наблюдается на Windows XP.
Причина: Видимо кривая установка в следствии чего отсутсвуют некоторые сборки из .NET Framework 2.0. Дополнительно можете погуглить.

пятница, 29 января 2010 г.

HTML/CSS: IE 8: textarea не переносит текст на новую строку при нажатииEnter, а вставляет пробелы (вроде их), если задать для textareaCSS-стиль (переопределить значение по умолчанию) white-space: normal.

Теперь по умолчанию идет “pre” в IE 8 для textarea, если не менять режим отображения на прежние.
Т.е. смотрите, чтоб у вас не было задоно в CSS стилях что-то вроде
textarea { white-space: normal; }
Либо уберите это, либо переопределить на
textarea { white-space: pre; }

Как восстановить MyPage.aspx.designer.cs в проекте ASP.NET Application.

Первое – не париться (не гуглиться) и не искать другого пути.
Второе :
  1. Создать копию для MyPage.aspx и для MyPage.aspx.cs.
  2. Удалить эти страницы.
  3. Воссоздать из VS эту форму - MyPage.aspx.
  4. Скопипастить содержимое из “Копия MyPage.aspx” и “Копия MyPage.aspx.cs” в новые MyPage.aspx и для MyPage.aspx.cs.
  5. Скомпилировать проект.

Live Mesh: Баг в IE 8

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

Решение – изменити мышкой размен окна браузера и отображение удаленного рабочего стола появиться.

Вот так подглючивает Live Mesh ActiveX компонент, но жить можно, если знать.