воскресенье, 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 Комуникликабельность