воскресенье, 12 декабря 2010 г.

Сводки с полей...

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

Номер раз. Съездил в столицу нашей славной родины на одно из самых значимых событий в области ИТ - Платформу  2011. Ощущения на «горячую голову» высказывать не стал, а теперь уже достаточно поздно о них говорить. Может еще выложу материал, только скорей свое видение, а не отчет о конференции.

Номер два. Сдал на этой же самой платформе экзамен на статус MCTS по WCF 4. Тут интересней, поскольку к экзамену практически не готовился и сдавал его по принципу «авось пронесет». Чувствую что повезло только раз, так что к следующим буду готовиться основательно.

Номер три. Читаю «Чистый код» Роберта Мартина (спасибо коллеге за бумажный вариант). Постигаю умные мысли, ругаюсь, протестую, в общем пропускаю текст сквозь призму собственного сознания.

Posted via email from Комуникликабельность

вторник, 9 ноября 2010 г.

Расширения для chrome

Когда Chrome только появился, и поразил меня своей скоростью, я как то не задумывался о том, нужны ли мне расширения. Браузер меня полностью устраивал (ну за исключением того, что я не мог его поставить через проксю). Со временем ситуация не изменилась, браузер меня полностью устраивает. Поэтому собственно я не понимаю как меня занесло на страничку с расширениями. Последний раз  заходил туда наверное с год назад. Даже устанавливать тогда расширения было достаточно непросто.

Сейчас, зайдя в галерею, удивился обилию расширений. Сразу же поставил себе несколько (не буду говорить какие, дабы лишний раз не рекламировать, если хотите знать – спрашивайте лично). Что меня поразило, что chrome стал очень хорошо поддерживать расширения. Это касается и их установки и их работы. В принципе, я покрыл несколько своих потребностей, которые были у меня на работе, например, уведомлялку о почте на Gmail или отображение RSS лент. Помимо этого, нашел плагин, который хотел было уже писать сам – iReader (черт, все таки получилась реклама), который для некоторых статей, блогов и прочего может отображать основную статью крупно, без всякой рекламы и т.д. (привет версиям для печати) читать такую статью становится невероятно приятно.

Posted via email from Комуникликабельность

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

Примеры использования технологий MS

В блоге J.D. Meier's Blog появились коллекции примеров кода  а также сценариев применения для различных технологий MS: ADO.NET, ASP.NET, Silverlight, WCF, Windows Azure, Windows Phone. Примеры кода ссылаются на MSDN. Очень удобная штука, если нужно быстро применить какой то типовой сценарий использования технологии, да и выбрать технологию по области ее применения, а не как обычно «да в принципе подойдет».

Для меня интересной показалась коллекция ссылок на примеры кода по WCF. В принципе есть все что нужно для быстрой разработки «более сложного» функционала сервисов, как то прикручивание безопасности или транзакционности.

Posted via email from Комуникликабельность

четверг, 21 октября 2010 г.

WCF и Streamed

Прихожу постепенно к мысли, что WCF просто напросто не предназначен для того, чтобы передавать большие куски данных. А Streamed, который в нем реализован – это просто костыль, который покрывает часть задач, но не ложится в общую идею WCF. Вообще, иногда складывается впечатление, что в WCF все построено по «кусочному принципу». Функционал реализован мелкими кусками, как будто разработчики пытались «растянуть» архитектуру на как можно больший пласт задач, а она (архитектура) в силу технических ограничений никак не позволяла это сделать. Вот пример, того, что WCF не покрывает ряд задач аутентификации при Streamed режиме. Я кстати об этом же писал недавно.

Какие варианты потокового доступа к данным и раздачи контента есть еще?..

Posted via email from Комуникликабельность

среда, 20 октября 2010 г.

Прикольные 404 страницы

Сегодня случайно ткнул куда то не туда, и нарвался на вот такую веселую 404 страничку.

Сразу вспомнил 404 страницу с каким то скриптом, который печатал фразы. Создавалось впечатление что веб-сервер разговаривает с тобой. Кто еще помнит прикольные 404 ошибки?

Posted via email from Комуникликабельность

воскресенье, 17 октября 2010 г.

Ищем ошибки WCF сервиса

Последнее время стал отслеживать всякие форумы и другие хранилища знаний в области WCF, вроде такой http://www.gotdotnet.ru/forums/19/. Удивился тому, что люди просто напросто не знают как выяснить какая ошибка мешает работе WCF сервиса. Причем проблема скорей не в том, что люди не хотят выяснить ошибку, они просто не знают как это сделать. Поэтому сейчас я буду играть в детектива, говорить «элементарно, Ватсон», пуская круги дыма из трубки … В общем сейчас расскажу простые вещи, которые можно сделать, чтобы выяснить в чем ошибка.

Включаем отображение ошибок для IIS

Для asp.net разработчиков, да и для всех более менее адекватных разработчиков дело привычное и вроде бы понятно что делать – включить отображение ошибок. Значит добавляем в web.config следующие строчки:

<customErrors mode="RemoteOnly" />

Или

<customErrors mode="Off" />

И сразу все становится понятно:

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

Включаем трассировку WCF

Подробней о трассировке WCF можете посмотреть тут. Как правило, долго сидеть с конфигураций не хочется. Прописывать здоровый кусок конфига дело неблагодарное. Благо, есть такая интереная утилитка, как WCF Service Configuration Editor. Вызывается она либо из меню Tools студии, либо из контекстного меню Solution Explorer на конфиге. Утилитка работает и вне контекста студии, так что можно использовать и там, где установить студию нельзя. Нас в данной утилите интересует раздел Diagnostics и его подраздел - Tracing.

Нас в большинстве случаев интересует две настройки:

1.       Непосредственно включение Tracing.

2.       Log file – файл, куда будет писаться лог.

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

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

Отладка

Если перечисленные выше простые способы не помогают, приходится использовать тяжелую артиллерию, в данном случае – отладку. Однако и она не всегда помогает. Пример тому – ошибка в недрах WCF, когда просто напросто невозможно подхватить ошибку отладчиком. Такое случается как правило, когда переписываются стандартная инфраструктура WCF, как то свой сериализатор, или система аутентификации. В данных случаях бывает полезным включение трейсов.

В итоге

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

Удачной отладки!!! ;)

Posted via email from Комуникликабельность

воскресенье, 10 октября 2010 г.

Windows Live Essentials 2011

Попробовал поставить Windows Live Essentials. Изменений нашел достаточно немного.

Что я увидел после установки:

1.       Messenger научился работать с Facebook и другими социалками (Linked In и т.д.).

2.       Добавили SkyDrive, вроде раньше не было в базовом пакете.

3.       Writer получил наконец то Ribbon, стало красиво и функционально.

4.       Writer нормально без проблем из коробки настраивается на Wordpress блог.

В итоге, не нашел причин, чтобы переходить на использование Windows Live.

1.       Writer я давно и успешно заменил постингом по почте. Писать как в outlook, так и в writer одинаково.

2.       Пока Live Mail не научится работать с Mobile Center для синхронизации календаря, задач и почты переходить на него для меня бессмысленно.

3.       Переходить на альбомы смысла нет, поскольку Picassa покрывает все мои необходимости.

4.       Остальные приложения пакета для мне пока что не нужны.

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

Posted via email from Комуникликабельность

среда, 6 октября 2010 г.

WCF transfer large DataSet or DataTable - Part 2

Продолжение размышлений, которые я начал в прошлой статье WCF transfer large DataSet or DataTable.

Начал реализовывать свою версию chunked коллекции. Вот на какие вопросы сразу же наткнулся:

1.       Интероперабельность. Написание клиентов для не WCF платформы, или нового WCF клиента с нуля становится нетривиальной задачкой без кода непосредственно подгружающего данные порциями.

2.       Серверная логика. Если на сервере крутится 2 независимых сервиса, то для произвольных данных нужно либо уметь выбирать данные порциями, либо сохранять /кешировать результат запроса, для того, чтобы не вытаскивать кучу раз кучу данных (а именно в ситуации с кучей данных нужны такие извращения). Да и хранение такого количества данных накладно.

3.       Клиентская логика. Коллекцию нужно уметь сливать. Для примера: я гружу коллекцию в трех потоках 1-100 записи, 100-200 записи и 200-300 записи. Первым отрабатывает поток, который отдаст 100-200 записей, соотвественно мне как то надо при получение остальных порций данных слить все в одну коллекцию. При рассмотрении произвольных данных ситуация ухудшается.

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

Попробую все же добить эти вопросы и написать нормальную реализацию для коллекций. На 1 вопрос придется видимо просто забить, тут ничего не поделаешь, идеологически не прокатит. Вопрос 2 и 4 оставлю видимо на усмотрение разработчика сервиса, поскольку большие зависимости от того, какие передаются данные.

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

Posted via email from Комуникликабельность

вторник, 5 октября 2010 г.

Порой версия для печати лучше оригинальной

Сравните две версии. Оригинальная версия на сайте. Ее версия на том же сайте для печати.

Вот тот же пример второй части той же статьи, только ресурс почему то оказался другой. Оригинальная версии. Версия для печати.

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

Posted via email from Комуникликабельность

WCF transfer large DataSet or DataTable

В WCF достаточно проблемно организована работа с большими объемами данных. Например, передача большого DataSet упирается в: сериализацию, ограничения на размер буфера и размер пакета и т.д.

Если у вас гоняются через WCF сервис действительно большие таблицы, то вам может понадобится решение «Transfer gigantic DataTables over WCF / .Net Remoting» которое лежит на Codeplex.

Суть его достаточно проста и понятна. Вместо того, чтобы в один запрос сериализовать весь DataTable, сервис создает и открывает еще один хост отдельного сервиса с одной операцией получения части таблицы данных и возвращает легковесный объект, который содержит описание подключения к этому сервису и некоторые простые служебные переменные таблицы, например, размер. Далее по этому объекту на клиенте можно легко вытягивать данные. 

Такой подход принципиально можно применять для коллекций и потоков (например, в случае невозможности включения Streamed режима) и т.д.

Авторы утверждают что:

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

2.       Улучшает пропускную способность до 75% (WCF с передачей DataTable может передавать со скоростью 3154 Кб/с, а такое решение – 12245 Кб/с).

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

Меня сметили в реализации следующие вещи:

1.       Открытие дополнительного ServiceHost выглядит не очень. Скорей тут нужно публиковать отдельный сервис, который будет висеть постоянно. Так можно будет не привязываться к хостам, которыми в ряде случаев (например при хостинге на IIS мы не управляем).

2.       Регулировать размер возвращаемых данных нужно относительно того, какие квоты выставлены для сервиса.

3.       Использовать не только Binary сериализацию, и не только net.tcp. Все таки для инета это тоже может очень хорошо работать.

В итоге: идея жизнеспособная, но решение надо прорабатывать под конкретные нужды.

Posted via email from Комуникликабельность

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

User Group Support Services

MS открыла ресурс, который видимо будет объединять Community всех стран, в том числе и User Groups и MCP Clubs.

www.technicalcommunity.com

Похоже что ресурс сделан на Sharepoint 2010. Выглядит симпатично. Поддержки русского я пока не нашел, может быть впоследствии появится. Обнадеживает что ресурс официальный, а значит должен хорошо поддерживаться MS.

Сразу же нашел MCP Club Izhevsk. К сожалению User Group пока нет, но думаю что она скоро там появится.

Posted via email from Комуникликабельность

суббота, 2 октября 2010 г.

Локальный SVN

Сегодня решил несколько организовать свое рабочее пространство: поставить локальный сервак SVN и складывать туда проекты. Для чего это хочу сделать? Для того, чтобы все проекты были в одном месте, для того, чтобы они не потерялись, если чтото слетит, для того, чтобы была версионность, для того … ну в общем, мне это показалось клеевой идеей J.

В итоге, для начала я решил поднять самый простой сервак. Проще, чем VisualSVN Server не нашел … наверное потому что не искал, или наверное потому что нашел его самым первым и сразу поставил, он меня полностью удовлетворил своими возможностями. Так как у меня уже стоял TortoiseSVN, то и сразу же залил туда все проекты. Интеграции с IDE не было, поэтому я поднял и ее. Тут пришлось порыться в инетах, в итоге нашлось бесплатное средство, интегрирующееся с VS AnkhSVN. Visual SVN поставил и сразу снес, потому что он платный J.

После того, как попробовал заливать и менять проекты, захотелось чтобы репозиторий «случайно» не потерялся, как это часто бывает, если у вас что то слетает. Да и хочется, в случае необходимости иметь доступ к репозиторию с другого компа. Так что попробовал сохранить его в репозиторию DropBox.

В итоге, хочу использовать для двух целей:

1. Хранение локальных проектов.

2. Хранение документов.

Посмотрим что из этого получится…

Posted via email from Комуникликабельность

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

Материалы с прошедшей UserGroup

Как и обещал, выкладываю материалы со своего выступления на сегодняшней User Group в Ижевске. Надеюсь что всем понравился мой рассказ про WCF REST Services и Windows 7 Federated Search. Лично я получил ни с чем не сравнимое удовольствие.

Конструктивная критика принимается в комментариях J.

Download now or preview on posterous
WCF.ppt (1539 KB)

Click here to download:
DemoService.zip (45 KB)

Posted via email from Комуникликабельность

Пожалуй излишества...

Смотрю на список зарегистрированных на 11 встречу User Group  в Ижевске. У всех, кроме меня личная страничка пустая. Возникает вопрос, зачем? Зачем ребята, которые поддерживают ресурс сделали для каждого свой узел? Лишний ресурс, куда они будут публиковать свои записи, вроде бы никому не нужен. RSS репостинг  конечно дело хорошее, но зачем тратить ресурсы на поддержку кучи пустых сайтов, на которых ничего нет?

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

В общем, не понимаю я …

Posted via email from Комуникликабельность

вторник, 28 сентября 2010 г.

Не ищите меня больше на 38 параллели, я перепрятался

Дорогие дети. Не ищите меня больше на 38 параллели, я перепрятался.

Купите ещё ящик таких бутылок, как я вам прислал, и бросьте обратно в море.

Ваш отец, капитан Грант.

Собственно сабж говорит сам за себя. Меня достал «необыкновенно удобный» хостинг, называемый ayola.net. Хоть и бесплатный, но жутко неудобный как с точки зрения пользователя, так и с точки зрения технической. Поддерживать свой вариант wordpress на нем, уже не очень хочется. Кроме того, после последнего обновления, оказалось что версия PHP на которой работает последний WP и версия на хостинге несколько отличны. В связи с этим, там возникли значительные косяки с кодировками, которые мне разрешить так и не удалось.

Еще сегодня проскочила новость, что MS решила закрыть блоги Live Spaces, предлагая пользователям безболезненно перейти на wordpress.com. Я попробовал настроить там блог под себя, мне понравилось. Wordpress.com стал действительно удобным сервисом для размещения своих записей. Думаю что проблем с хостингом от автора продукта должно быть значительно меньше (хотябы обновления ставить не надо руками). В той же новости говорится, что Live Writer будет теперь ориентироваться на wordpress, что на самом деле не может не нравится. Я не буду обсуждать решение MS, может это шаг в сторону PHP, может это просто экономия денег на неприбыльном продукте, это в конечном счете не важно.

В итоге, блог heeepi.zx6.ru я постепенно закрою, сейчас настроил там редирект на новый блог, так что не ругайтесь, если вас перебросит на heeepi.wordpress.com.

Я не капитан Грант, поэтому оставлю несколько ссылок, где меня искать.

http://heeepi.wordpress.com/ - Это собственно новый блог на основе wordpress.

http://heeepi.livejournal.com/ - Это моя уютная ЖЖшка.

http://heeepi.blogspot.com/ - Это блог на blogspot. Мало ли, кто-нибудь и там пишет и читает J

http://heeepi.posterous.com/ - Это блог на posterous.com, откуда собственно рассылаются все записи.

http://11035.ineta.ru/blogs/default.aspx - Это кростпост на ineta.ru.

Posted via email from Комуникликабельность

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

Путь офисного самурая

Фразы про жизнь самурая.

Возможно некоторые идеи вы возьмете себе на «вооружение».

  • Поиски Истины могут продолжаться всю жизнь. Поиск Смысла Жизни идет бесконечно. Самурай никогда не думает, что нужный документ будет легче найти, если назвать его Doc36.doc.
  • Бесконечна река времени. Стремителен бег ее вдоль берегов жизни. И только с понедельника по пятницу ей совершенно некуда спешить.
  • Фотографии в почте радуют Самурая и уносят в Страну Воспоминаний. В Стране Воспоминаний живут также Пароли Самурая. Изгони Пароли из Страны Воспоминаний и твои Фотографии уйдут вместе с ними. Возможно уйдут радовать кого-то другого.
  • Самурай в поклоне являет свою доблесть и плюет на свою гордость. Если не поклониться в ответ Самураю - он плюнет и на толерантность.
  • Строгие кимоно хорошо говорят не только о Самурае, но и об Императоре Самурая. Дождись пятницы и приди в удобном кимоно, не оскорбляющем глаз Императора и других самураев.
  • В авральном режиме доблесть Самурая в том, чтобы идти на проблему без страха и нытья, жертвуя сном, если нужно. Поступай так, и награда Императора будет весомой. Признательность Императора – весомая награда.
  • Если Император ругает Самурая за опоздание, Самурай может объяснить причину так, что Императору станет стыдно за потерю лица.
  • Самурай говорит твердо и уверенно, когда есть, что сказать. Когда нечего сказать - Самурай пишет объяснительную.
  • На путь Самурая становятся, пройдя путь Вассала. Цени своих Вассалов – и, возможно, они не обгонят тебя на твоем пути к креслу Императора.
  • На корпоративном праздновании, посвященном годовщине Империи, Самурай не теряет лица до ухода Императора или утери лица Императором.
  • Обманчивы внешние проявления. Самурай не тратит времени впустую – пасьянс обоснован. Самурай не пьет кофе – он думает о работе. Самурай не отдыхает – он восстанавливает силы перед работой.
  • Не сдаются крепости и в этом их гордость. Не сдаются квартиры в глуши и это в силу объективных причин. Отчеты гордо сдадутся Самураем вовремя. И не вовремя в силу объективных причин. Иначе хаос и выговор.
  • Слабые со стонами катятся по карьерной лестнице вниз. Сильные с криками, в напряжении взбираются вверх. И только настоящий офисный самурай спокойно курит на карьерной лестнице с чашкой кофе в руках, решая куда ему пойти – вверх или вниз.
  • Нет ничего превыше внутренней процедуры. Богато содержание ее, строги предписания ее. Никто не смеет нарушить процедуру. И только офисный самурай умеет нарушать ее, согласно другой внутренней процедуре.
  • Счастлив человек, наблюдающий плоды трудов своих, ибо плоды уже есть. Счастлив человек, наблюдающий незаконченность трудов своих, ибо плоды уже спеют. Самурай не забывает сохраняться почаще.
  • Нуждающийся в совете Самурай легко найдет его у ненуждающегося в советах. Ибо тому советуют чаще и по делу.
  • Галстук офисного самурая подобен мечу, выбранному со вкусом. Белая рубашка самурая - символ чистоты и непорочности. Черные штаны самурая свидетельствуют о чем-то другом.
  • Путь офисного самурая ровней дороги, по которой он идет. Путь к файлам самурая логичнее самого самурая.
  • Если файл по ошибке совершил харакири, самурай отыщет его в корзине. Если файл по ошибке совершил SHIFT+харакири, поиск самурая бессмыслен.
  • Если предложить самураю выбор между увольнением и выговором – он выберет что-то другое. Например, премию.
  • Ответ Самурая на входящую корреспонденцию - молниеносен, как удар мечом. Если молния не сверкнула - письмо не дошло.
  • Сотрудники. Кричит обманутый, плачет обиженный, смеется уверенный, жалуется подлый, требует сильный, просит слабый. И только самурай тверд и целеустремлен. Он слушает сердце, инструкцию и музыку в наушниках своих.
  • Офисный самурай благороднее Робинзона. Он не только ждет пятницу – он радуется ей. У настоящего Мастера – семь пятниц в неделю. У Великого Мастера – тридцать дней зарплаты в месяц.
  • Император строг, объективен и вездесущ. Вид незанятого Самурая нервирует выше- и нижестоящих. Не убирай руки далеко от ALT+TAB.
  • Цифры сухи и конкретны. Буквы цветасты и велеречивы. Настоящий Самурай способен кружевными узорами разноцветных букв скрасить убогость итоговых цифр.
  • Файлы помогают самураю идти по пути его. Если файлы не помогают самураю – у самурая появятся другие файлы. Если другие файлы не появятся – у файлов появится другой самурай.
  • CTRL+иероглиф, SHIFT+иероглиф, ALT+иероглиф – разящее оружие самурая. Различна степень владения оружием. И только великий Мастер на протяжении лет сохраняет мышь нетронутой.
  • Самурай знает, что он хочет сказать другим самураям. Если самурай разослал почту всем самураям из списка – значит, так и надо было, а не по недомыслию.
  • Сокол не спрашивает дорогу у птиц. Так и самурай, нажимая F1, не показывает своей некомпетентности.
  • Если во сне Самурай слышит имя своего Императора, он должен немедленно проснуться, поднять голову с клавиатуры и принять вид занятого человека.
  • Самурай всегда готов к самому неприятному. К концу пути, к встрече Императора, к уменьшению количества Вассалов. И только окончание обеденного перерыва всегда приходит неожиданно.

Не мое, взято отсюда http://office.microsoft.com/ru-ru/help/HA010336218.aspx

Posted via email from Комуникликабельность

WCF. Надежные проксики и работа с потоками.

Столкнулся с интересной ситуацией при работе с потоками в WCF. И как всегда спешу поделиться J.

Для некоторых ошибок WCF, например, ошибке MessageSecurityException реконмендуется пересоздавать клиентский проксик. При этом, существует несколько реализаций надежных прокси-классов, которые пересоздают и открывают заново коммуникационный канал. Ситуация вроде бы очевидная и имеет простое решение:

1.       Обернуть прокси-класс с помощью еще одного проксика или другой обертки (я использую Spring.NET для этого), которая будет управлять временем жизни и состоянием клиентского проксика (есть еще вариант с работой непосредственно с каналом без использования автогенерируемого прокси-класса).

2.       Соответственно при выполнении метода отлавливать нужные типы ошибок, пересоздавать реальный класс проксика и вызывать метод повторно с теми же аргументами.

Если пункт 1 в принципе понятен, то в пункте 2 могут быть проблемы связанные с аргументами метода.

В момент второго обращения аргументы могут стать невалидными. Пример таких аргументов – потоки. При первой отправке сообщения поток читается для сериализации. Так как поток сериализуется, начиная с текущей позиции, то при втором запросе уйдет пустой поток. Если конечно перед этим не сбросить его Position в 0.

Однако тут придется привязаться к DataContract, поскольку потоки могут не быть непосредственным контрактом данных, а содержаться как поле одного из контрактов. Как еще один вариант решения проблемы – прикручивать свой сериализатор, который сам будет уметь сбрасывать потоки в ноль, а потом отдавать стандартному DataContractSerializer.

Posted via email from Комуникликабельность

воскресенье, 19 сентября 2010 г.

Как исправить слетевшие профили в Windows 7

Сегодня, зайдя в систему я ужаснулся чистому рабочему столу с дефолтными ярлыками. Слетел профиль пользователя. Когда я полез в папку C:\Users\ то обнаружил там папки TEMP и TEMP.<GUID>. На эти папки теперь по видимому Windows ссылалась теперь. Разбираться почему так произошло как то времени не было, поэтому стал сразу искать решение в инете. Как ни странно нашел достаточно быстро вот тут.

Инструкция достаточно простая:

1.       Создаем еще одного администратора компа.

2.       Перегружаем машину, заходим под созданным администратором.

3.       Удаляем/переносим папки C:\Users\<username>

4.       Удаляем папки C:\Users\TEMP и, если есть, C:\Users\TEMP.<GUID>

5.       Открываем Regedit и удаляем в ветке реестра "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\ProfileList" ненужные профили.

6.       Перезагружаемся и заходим от нужного пользователя. Папки C:\Users\<username> восстановятся, в них можно снова закинуть нужную инфу.

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

Posted via email from Комуникликабельность

вторник, 14 сентября 2010 г.

Common Compiler Infrastructure: Metadata API

Тот, кто работал когда-нибудь с Reflection в .NET, тот наверняка мучился, когда вставала задача, к примеру перебора или поиска типов. Нужно подгружать сборку в домен, после чего, вероятно, можно будет перебирать метаданные сборки. Почему «возможно» ? Потому что сборка может быть не загружена в домен, например из-за зависимых сборок, которые должны быть загружены в домен ранее, или расположены где то «рядом» с приложением. Кроме того, говорят что производительность Reflection несколько слабовата. Правда это или нет, другой вопрос, я натыкался только на упоминания о том, что выполнение кода через Reflection медленней в 3-4 раза (отсюда).

А недавно я наткнулся на одно незначительное упоминание о такой штуке, как Common Compiler Infrastructure: Metadata API.

Приведу просто выдержку с главной страницы codeplex, где этот проект лежит в исходниках:

Microsoft Research Common Compiler Infrastructure (CCI) is a set of libraries and an application programming interface (API) that supports some of the functionality that is common to compilers and related programming tools.

The CCI Metadata API allows applications to efficiently analyze or modify .NET assemblies, modules, and debugging (PDB) files. CCI Metadata supports the functionality of the .NET System.Reflection and System.Reflection.Emit APIs, but with much better performance. It also provides additional functionality that is not available in either .NET API.

Если в общем, то это подобие Reflection, только значительно производительней.

В дополнение к нему, есть другой проект на том же Codeplex - Common Compiler Infrastructure: Code Model and AST API.

The Common Compiler Infrastructure (CCI) is a collection of frameworks for working with .NET source code, assemblies, modules, and debug files. In part, CCI supports a more efficient version of the functionality provided by System.Reflection, System.Reflection.Emit, and System.CodeDom. However, CCI goes beyond those components to provide a unified framework for static analysis and rewriting of assembly metadata and code. CCI supports a broad range of scenarios, including:

·         Compilers, which start with source code and transform it to .NET assemblies and modules.

·         Static analysis tools, which analyze the contents of .NET assemblies.

·         Rewriting tools, which add code or metadata to assemblies or modify existing code or metadata.

В кратце, это уже коллекция фреймворков для работы с исходниками, сборками, модулями и отладочной информацией. И вроде бы с их помощью работают такие вещи, как FxCop и Code contracts tool.

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

Итак, задачка:
По списку строк, содержащих имена фалов сборок получить:

1.      Имя сборки.

2.      Все типы, содержащиеся в этой сборке.

3.      Все members типа: свойства, методы.

Вот такой код получился при использовании Cci. Просто и со вкусом

MetadataReaderHost host = new PeReader.DefaultHost();
foreach (string assemblyName in references)
{
         IAssembly assembly = host.LoadUnitFrom(assemblyName) as IAssembly;
         if (assembly == nullcontinue;
         string assname = assembly.Name.Value;
         foreach (INamedTypeDefinition type in assembly.GetAllTypes())
         {
                 if (type == nullcontinue;
                 string s = type.Name.Value;
                 foreach (IMethodDefinition method in type.Methods)
                 {
                          if (method == nullcontinue;
                          string m = method.Name.Value;
                 }
         }
}

В списке references лежат имена файлов сборок по которым идет перебор. Для начала я натравил эту утилиту на примерно 30 сборок самого Cci, но результат в 300 мс, хотя и с небольшим разбросом мне почему то не понравился и я решил натравить на сборки в папке Microsoft.NET\Framework\v4.0.30319. В этой папочке конечно лежат не только .NET сборки, поэтому нормально обработать удалось только 112 сборок.

Мне кажется, что результат в 5 сек для 38 000 типов достаточно хорош. Интересно, каких результатов можно добиться с использованием Reflection?..

Posted via email from Комуникликабельность

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

100000000 день в году

Завтра, 12 сентября 100000000 (256) день в году. А это значит, что завтра профессиональный праздник всех программистов и системных администраторов, ну в общем, то и всех IT-шников. Поэтому:

Поздравляю всех коллег с профессиональным праздником!!!

Я буду праздновать заранее в клубе Авиатор, где уже традиционно пройдет 256 Party. Уже в 4 раз … J

Число 256 = 2^8 — максимальное число количество чисел, которое можно выразить одним байтом. (Впрочем, любому ИТ-шнику это и так известно).

256 Party — это вечеринка, пропитанная настроением ИТ. В 2007 году мы впервые собрались в нашем городе, чтобы официально отпраздновать этот, тогда еще неофициальный, праздник. Праздник программистов, системных администраторов, тестировщиков — короче, всех специалистов в области информационных технологий.

Posted via email from Комуникликабельность

вторник, 7 сентября 2010 г.

Поскрипулькины, булки и лоси.

Ребята на КатаемВместе.ru составили отличную классификацию велосипедистов-любителей.

1. Лось. Высшая ступень достижения велосипедиста. Выше только профики, но это уже не любительский ранг.

2. Булка. Довольно хорошая подготовка, рвёт многих.

3. Тесто (я - тесто). Булки делаются из теста. Толком неоформленный велосипедист, подающий надежды.

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

5. Поскрипулькины. Низшая каста велосипедистов, катаются по-малу, за велосипедом не ухаживают (ещё пока не видят нужды), поэтому он издаёт массу жалобных звуков.

На счёт стать лосем за год из теста - это конечно нереально. В лучшем случае можно стать сильной булкой))

Классифицирую себя как покатушкина. А Вы?

Posted via email from Комуникликабельность

Бритва Хэнлона

Бритва Хэнлона:

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

Never attribute to malice that which can be adequately explained by stupidity

Надо бы попробовать.

Posted via email from Комуникликабельность

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

.NET 4.0. Кешируем данные в памяти.

Ждете что я начну писать про System.Web.Cache? Вы одновременно правы и не правы.

ASP.NET программисты уже давно пользуются очень удобным средством для кэширования данных, из пространства имен System.Web.Cache. Он самостоятельно управляет жизнью объектов в себе, самостоятельно удаляет элементы из кеша по наступлению событий каких бы то ни было зависимостей, например изменении файла, или таблицы базы данных. Тем, кому стало интересно, отправляю к статье на MSDN.

Осталось только сказать об одном его достаточно большом недостатке – этот кеш нельзя использовать вне ASP.NET, потому что все свои данные он хранит в текущем контексте HttpContext.Current. Если у вас не ASP.NET приложение – этот объект будет недоступен.

Однако, сегодня .NET 4 меня удивил – я наткнулся на другой класс, который предназначен решить эту проблему – System.Runtime.Caching.MemoryCache.

Кроме того, что этот кеш больше не зависит от сборки System.Web, можно создавать несколько экземпляров данного класса. Есть и недостатки – не поддерживаются регионы. Хотя они и есть в базовом классе, однако сам кеш в памяти возвращает null для всех вызовов перегруженных методов с указанием параметра regionName.

В MSDN приведен такой пример использования MemoryCache:

ObjectCache cache = MemoryCache.Default;
string fileContents = cache["filecontents"as string;

if (fileContents == null)
{
         CacheItemPolicy policy = new CacheItemPolicy();
 
         List<string> filePaths = new List<string>();
         filePaths.Add("c:\\cache\\example.txt");
 
         policy.ChangeMonitors.Add(new
         HostFileChangeMonitor(filePaths));
 
         // Fetch the file contents.fileContents = 
         File.ReadAllText("c:\\cache\\example.txt");
 
         cache.Set("filecontents", fileContents, policy);
}

Судя по этому куску кода, MemoryCache, как и Web.Cache поддерживает различные события на обновления. Например в этом куске кода создается событие на изменение файла. Из коробки доступны мониторы на изменение данных в самом кеше, изменение в файловой системе, изменений на SQL Server.

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

Posted via email from Комуникликабельность

пятница, 27 августа 2010 г.

WCF. BasicHttpBinding, аутентификация и Streamed режим

Если вы хотите приготовить дрожжевое тесто, а дрожжей у вас нет

… то ни хрена у вас не получится.

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

Исходная задачка была достаточно простой с точки зрения Enterprise приложения: обеспечить для WCF сервиса передачу больших данных с учетом аутентификации.

WCF использует два режима для передачи данных: Buffered и Streamed. Buffered режим соответствует первоначальной сериализации всего пакета данных в память с последующей передачей клиенту. Соответственно передача в Buffered режиме определяет несколько ограничений, как то ограничение на размер передаваемых данных. Buffered режим также не оптимален с точки зрения использования памяти (ну тут все понятно из описания).

Streamed режим предназначен для передачи данных потоком, без занесения всех их в память. Данный режим также накладывает ряд ограничений, но в общем случае это касается контракта данных. Так, тип возвращаемого параметра должен быть Stream или его наследником, тип параметра метода сервиса также должен быть потоком. Данное ограничение можно снять, если использовать контракты сообщений (MessageContracts).

Остальные ограничения Streamed режима можно понять, если учесть одно обстоятельство – ни принимающая, ни отправляющая сторона не знают размер потока. Если учесть этот факт, то понятны ограничении, означенные в статье Large Data and Streaming:

You cannot use a significant number of WCF features when streaming is enabled:

·         Digital signatures for the message body cannot be performed because they require computing a hash over the entire message contents. With streaming, the content is not fully available when the message headers are constructed and sent and, therefore, a digital signature cannot be computed.

·         Encryption depends on digital signatures to verify that the data has been reconstructed correctly.

·         Reliable sessions must buffer sent messages on the client for redelivery if a message gets lost in transfer and must hold messages on the service before handing them to the service implementation to preserve message order in case messages are received out-of-sequence.

Because of these functional constraints, you can use only transport-level security options for streaming and you cannot turn on reliable sessions. Streaming is only available with the following system-defined bindings:

·         BasicHttpBinding

·         NetTcpBinding

·         NetNamedPipeBinding

·         WebHttpBinding


Вы не можете использовать некоторое число возможностей WCF при использовании Streaming режима:

·         Невозможно выполнять цифровую подпись сообщения, поскольку она требует вычисления хеша всего содержимого сообщения. При использовании Streaming режима, содержимое пакета не доступно полностью во время сборки и отправки заголовков сообщения, поэтому вычисление цифровой подписи невозможно.

·         Шифрование связано с цифровой подписью для проверки корректности дешифрации данных.

·         Зависимые сессии должны записывать сообщения в буфер на клиенте для повторения сообщения в случае его потери при передаче и должны сохранять сообщения на сервисе перед тем, как передаст его реализации сервиса для поддержания порядка обработки методов, если запросы приходят непоследовательно.

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

·         BasicHttpBinding

·         NetTcpBinding

·         NetNamedPipeBinding

·         WebHttpBinding

От себя также могу добавить, что ко всему этому добавляется невозможность использования поверх Streaming режима аутентификации на транспортном уровне. У меня не получилось добавить такую возможность для basicHttpBinding поскольку клиент при включении опции потоковой передачи при этом страшно ругался.

PS: Попробую еще поковырять WCF, может быть что то выгорит с кастомными биндингами, но я сомневаюсь.

PSPS: У меня на очереди еще статья на тему WCF, а конкретно о некоторой особенности его поведения при хостинге на IIS.

Posted via email from Комуникликабельность

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

WCF. Расширение OperationContext.

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

WCF предоставляет средства расширения, которые позволяют добавлять свои расширения к некоторым инфраструктурным элементам. Подробнее про расширяемость WCF можно почитать  тут. Расскажу о том, как привязать к OperationContext свой собственный контекст выполнения.

Шаг 1. Реализовываем класс-расширение.

Для реализации класса, который будет хранить наш контекст, необходимо реализовать интерфейс IExtension. Данный интерфейс позволяет расширять возможности некоторых инфраструктурных элементов WCF, например, OperationContext. Реализовать необходимо два метода: Attach и Detach.

1: using System.ServiceModel;

2:

3: namespace ContextExtentionSample

4: {

5: public class ContextExtention : IExtension<OperationContext>

6: {

7: // custom data...

8:

9: #region IExtension<OperationContext> Members

10:

11: public void Attach(OperationContext owner)

12: {

13: // attach to OperationCompleted to destroy context

14: owner.OperationCompleted += new EventHandler(delegate (object sender, EventArgs args)

15: {

16: this.Detach((OperationContext)sender);

17: });

18: }

19:

20: public void Detach(OperationContext owner)

21: {

22: // free context data

23: }

24: #endregion

25: }

26: }

Шаг 2. Реализовываем привязку к OperationContext.

При инициализации вашего контекста необходимо означить контекст для OperationContext.

1:ContextExtention extention;

2:extention = new ContextExtention(user.Id, gropIds);

3:OperationContext.Current.Extensions.Add(extention);

Шаг 3. Использвование контекста.

Получить контекст достаточно просто, для этого необходимо просто обратиться к OperationContext следующим образом:

1:OperationContext.Current.Extensions.Find<ContextExtention >()

В итоге, получится контекст, который можно получить в любом месте выполнения операций сервиса начиная от инициализации этого контекста и заканчивая завершением операции (уничтожением OperationContext).

В следующей статье расскажу как расширять InstanceContext.

Posted via email from Комуникликабельность

пятница, 9 июля 2010 г.

WCF. Custom windows autentication

Недавно столкнулся со следующей задачей: сервис должен аутентифицировать Windows пользователя с учетом списка пользователей прикладного приложения, сохраненного в базе. Простого решения не нашел, поскольку точки расшинрения WCF позволяют подвязывать Custom аутентификацию только к аутентификацию по паролю, поэтому появилось такое решение.

Создаем провайдер аутентификации.

public class AutenticationManager : ServiceAuthenticationManager

{

public override ReadOnlyCollection<IAuthorizationPolicy> Authenticate(ReadOnlyCollection<System.IdentityModel.Policy.IAuthorizationPolicy> authPolicy,

Uri listenUri,

ref System.ServiceModel.Channels.Message message)

{

// autenticate base.

ReadOnlyCollection<IAuthorizationPolicy> res = base .Authenticate(authPolicy, listenUri, ref message);

// custom autentication.

User user = DataSession.GetUserByName(ServiceSecurityContext.Current.PrimaryIdentity.Name);

if (user != null )

// return base autentication.

return res;

else

// return none autentication.

return null ;

}

}

 

Затем подвешиваем его при помощи атрибута или конфигурации. С помощью атрибута можно сделать так:

[AttributeUsage(AttributeTargets.Class)]

public class AutenticationBehaviorAttribute : Attribute, IServiceBehavior

{

#region IServiceBehavior Members

public void AddBindingParameters(ServiceDescription serviceDescription,

System.ServiceModel.ServiceHostBase serviceHostBase,

System.Collections.ObjectModel.Collection <ServiceEndpoint> endpoints,

System.ServiceModel.Channels.BindingParameterCollection bindingParameters) { }

 

public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)

{

serviceHostBase.Authentication.ServiceAuthenticationManager = new AutenticationManager();

}

 

public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) { }

#endregion

}

 

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

Далее навешиваем этот аттрибут на реализацию сервиса:

[AutenticationBehavior()]

public class DataService : IDataService

{

}

В итоге, если пользователь не аутентифицирован вашим кодом, то на клиент уходит сообщение с ошибкой «The Caller was not authenticated by the service».

Информации о менеджере аутентификации к сожалению достаточно мало и как с ним работать пока непонятно до конца. Например непонятно какой результат должен быть у метода Autenticate, если аутентификация не прошла. В принципе нормально отрабатываются ситуации с ошибками, однако это не очень хороший вариант. А при передаче на выход пустой коллекции пользователь считается аутентифицированным.

Если у кого то есть соображения какие значения должен возвращать менеджер или ктото знает способ проверки Windows пользователей лучше и/или правильней – вэлкам. 

 

Posted via email from Комуникликабельность

среда, 12 мая 2010 г.

Интересный факт

Когда Александр Дюма писал «Трёх мушкетёров», в контракте с издателем была оговорена построчная оплата рукописи. Для увеличения гонорара Дюма придумал слугу Атоса по имени Гримо, который говорил и отвечал на все вопросы исключительно односложно, в большинстве случаев «да» или «нет». Продолжение романа под названием «Двадцать лет спустя» оплачивалось уже пословно, и Гримо стал чуть более разговорчивым.

http://muzey-factov.ru/

Posted via email from Комуникликабельность

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

Upload в Google Chrome

Сегодня увидел вот такую замечательную панельку в Google Chrome. Появляется она в момент подгрузки с клиента на сервер (upload) какого либо файла. Может быть такое же есть и в других браузерах, просто я не замечал, но мне такая штука очень понравилась. Позволяет оценить когда отработается загрузка файлика.

Posted via email from Комуникликабельность

пятница, 2 апреля 2010 г.

Плач математика и ...

«Если хочешь построить корабль, то не собирай людей для того, чтобы валить сосны, распиливать стволы на доски и сколачивать доски вместе… Прежде всего научи людей любить море».

By Вика Придатко - HR-Maverick :)

Начал вчера читать перевод эссе Пола Локхарда «Плач математика» (Paul Lockhart. A Mathematician's Lament) . Каюсь, еще не осилил до конца, а поделиться уже хочется.

Как математику (бывших не бывает, поэтому без приставки) стало интересно. Многие мысли сошлись с моими, многие разошлись. Вообще по жизни встречал два типа математиков (людей): «непризнанный гений» и «прикладной трудяга». Один получается из бунтарей, второй из «смирившихся». Кто лучше – хз. Может и тут нету черного и белого.

Однако одна мысль затронула глубже остальных: «Математическое творчество в школах умирает…».

Posted via email from Комуникликабельность

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

Ляпис Трубецкой - Капитал

Êàïèòàë by Ëÿïèñ Òðóáåöêîé  
Download now or listen on posterous
lyapis_trubeckoy_-_kapital.mp3 (3139 KB)

Я ем на обед золотые слитки

Бриллиантовый десерт, нефтяные сливки

Мне имя Вельзевул - хозяин стратосферы

Я нереальный кул - мой респект без меры

Припев:

В левой руке - “Сникерс”, в правой руке - “Марс”

Мой пиар-менеджер - Карл Маркс

В левой руке - “Сникерс”, в правой руке - “Марс”

Мой пиар-менеджер - Карл Маркс

Капитал! Капитал! Капитал! Капитал!

Я ем города, морями запиваю

Моя борода небо заслоняет

Гром и молнии, туманы и дожди

Мои ботинки лижут министры и вожди

Припев

В левой руке - “Сникерс”, в правой руке - “Марс”

Мой пиар-менеджер - Карл Маркс

Мое лицо - Мадонна, внутри из тухлых груш

Все на колени! Оркестр, туш!

Капитал! Капитал! Капитал! Капитал!

Posted via email from Комуникликабельность