Hungry Mind , Blog about everything in IT - C#, Java, C++, .NET, Windows, WinAPI, ...

Новая должность в софтверных компаниях

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

High-Resolution Timer = Time Stamp Counter = RDTSC

Некоторые приложения очень требовательны к точности измерения времени. Им нужен таймер, который сможет отразить дельту времени даже двух последовательных операторов. Intel в своей архитектуре IA-32 реализовала подобный таймер и добавило в instruction set соответствующую инструкцию RDTSC для его использования. Эта инструкция сохраняет число тиков (64-битное значение) от старта процессора в регистрах EDX:EAX.

Реализация на C#.
  1. Прототип функции, которая возвращает текущее значение RDTSC.
    Прототип функции, которая возвращает текущее значение RDTSC.
  2. x86 байт код, который выполняет инструкцию RDTSC и соответствует конвенции вызова делегата с типом RdtscCallback.
    x86 байт код, который выполняет инструкцию RDTSC и соответствует конвенции вызова делегата с типом RdtscCallback.
  3. Создание екземпляра делегата с типом RdtscCallback, который выполняет эти инструкции.
    Создание екземпляра делегата с типом RdtscCallback, который выполняет эти инструкции.

RDTSC не лишен проблем, описанных в этом документе.

Магия с Nullable-типами в .NET

Nullable<T> - классное нововведение (или, с учетом времени, - старовведение) CLR 2.0 как минимум в контексте работы с базой данных. Не хочу приводить список проблем, которые решают Nullable-типы, речь не о них. Хочу рассказать, как это работает.

Пример 1.
В результате на консоли - False. Стоп! А должен быть NullReferenceException, ведь i равна null! А равна ли? Ответ на этот вопрос в сгенерированном компилятором IL-коде, который выглядит приблизительно вот так:
Компилятор нас обманул, оператор i = null; превращается в i = new Nullable<Int32>();

Пример 2.
В результате на консоли - Int32. Стоп! А должен быть Nullable`Int32, ведь i имеет тип Nullable<Int32>! А имеет ли?... Условный IL-код:
Да, i имеет тип Nullable<Int32>. Теперь интересно, почему у o тип Int32? Ответ - в исходниках CLR (Rotor Shared Source), файл object.cpp, функции Nullable::Box и Nullable::UnBox
Приводить и разбирать тексты функций не хочу, просто обратите внимание на комментарии. Вывод: боксирование типа Nullable<T> выполняется CLR специальным образом - box(Value), если значение есть, и box(null), если значения нет. В результате тип боксированного значения - T, если значение было задано, а если не было - то выяснить его динамический тип невозможно.

Гвоздь в гроб Windows

20 минут назад мне подкинули в аське ссылочку на статью "Гвоздь в гроб Windows". Мне, как человеку, использовавшему UNIX-подобные ОС системы больше 6-ти лет, стало интересно - что нового может быть брошено в эту глупую войну. Вкратце основные пункты статьи:

  • будущее за unix-системами, и уже ясно, что это будет Linux

    А почему Linux? Почему не FreeBSD или OpenBSD или Solaris? Ответ на этот вопрос полностью содержится в статье, только надо поменять Windows на Linux.

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

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

  • Аналоги есть, и по своим характеристикам значительно превосходят Windows.

    По каким характеристикам и в чем превосходят? По количеству статей, которые я должен прочитать, чтобы настроить хоть что-то, что не было настроено при установке? Или по количеству команд, которые я вынужден набрать?

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

    Какие закрытые патентами протоколы? Проблема UNIX в том, что его ПО не соответствует потребностям пользователей. И, что самое плохое, - никто эти потребности выяснять не хочет. А Microsoft тем временем тратит кучу денег на создание удобных интерфейсов и повышение юзабилити.

  • они не заработали этих денег и близко.

    Кто "они"? Билл Гейтс? Свои деньги он заработал, уж поверь. А вот разработчики, написавшие Windows, действительно, своих денег не заработали (точнее, не получили), т.к. зарплата разработчика в MS колеблется от 75 до 150 тысяч в год (ровно, как и зарплата Билл Гейтса не составляет миллиарды). Остальные деньги сотрудники получают с опционов (акций) своей же компании. Чем больше человечек сделал для развития корпорации - тем больше он сможет купить опционов.

    Если кто-то говорит вам, что пользоваться нелицензионным Windows - воровство, то смело отвечайте, что эта корпорация обокрала всех нас, перетянув удавкой горло мировому рынку ПО и продавая задыхающимся пользователям свой пыльный воздух по цене золота.

    Если рынок ПО (в частности, бесплатного ПО) не способен составить конкуренцию платным продуктам, то Microsoft в это не виновата. Ровно, как и любая другая организация не виновата, что ее продукт - лучший. Никто никого не заставляет покупать Windows. Сиди на своем Linux-е, чем ты не доволен? Firefox используют не потому, что он бесплатный, а потому, что он лучше. И, стань он платный, его будут продолжать использовать. Конкуренция рождается, когда продукты взаимозаменяемы. О Windows и Linux этого сказать нельзя.

  • пользуйтесь такой операционной системой, которую дают бесплатно, поскольку деньги создатели зарабатывают не на вас, а на техподдержке

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

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

    Никакой программист не получает миллиарды, откуда эта глупость появилась в твоей голове?

  • Стоимость рекламы товара не входит в его рыночную цену.

    Ошибаешься. Ты платишь за товар, за его рекламу и сам же ее потом смотришь.

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

    Леонид Каганов, а ты сыт от того, что отрекламирован? Или ты все-же ждешь, что твоя реклама когда-то превратится в заказ с кругленькой суммой? Или, может, ты выполнишь заказ бесплатно в пользу еще большей рекламы? До тех пор, пока не умрешь с голоду. Microsoft уже давно прошла этот этап и сейчас рубит заслуженное бабло (при этом нахаляву продолжая себя рекламировать).

  • Этот сыр - бесплатный.

    Для тебя - почти бесплатный. Зато не бесплатный для провайдеров, через оборудование которых прошли байты этой картинки. Бесплатного сыра не бывает. Точней, даже за бесплатный сыр кто-то платит.

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

    Автор, ты абсолютно некомпетентен, чтобы говорить подобное. Windows NT еще с версии 3.51 4.51 сертифицирована по уровню безопасности C2. И было это в 1995 году, а с тех пор много чего изменилось в ядре в лучшую сторону.

  • Интерфейс пользователя намного красивее и удобнее, например, у Макинтоша, откуда MS постоянно тырит решения.

    MS тырит, и правильно делает. А самый красивый и удобный интерфейс у удобной палки, которой можно колотить по пню.

  • быстрее всего исправляются ошибки в системах с открытым кодом.

    Беспочвенное заявление. Их там быстрее всего находят. И чаще находят. И находят порядком больше, чем в системах с закрытым исходным кодом. А Windows Update позволяет тебе быть уверенным, что дырки будут закрыты быстро и автоматически, без ежедневного чтения BugTraq. Да и лучше не исправлять ошибки, а выпускать софт без ошибок, но, оупенсорсу до этого далеко.

  • Да, Windows самая распространенная сегодня. А почему? Ответ прост: как мы уже говорили, это потому, что под Windows работают все программы, игры и любое оборудование. А почему они работают под Windows? Потому что это самая удобная среда для запуска программ и устройств? Напротив: большинство системных протоколов закрыто и нет документации. Программы и драйвера создают под Windows именно потому, что это самая распространенная система. Замкнутый круг.

    Они работают под Windows потому, что ОС представляет собой адекватную среду для разработки таких программ (как и UNIX для программ другого типа - сетевых сервисов). Потому, что аналога DirectX с аппаратной поддержкой видеокартами в UNIX-е нет и не будет. Потому, что графический сервер X11 - тормозящее устарелое убожество. Потому, что нет адекватных инструментальных средств для разработки.

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

    Бред. Производители софта сначала выбирают ОС (и инструментарий), а потом уже создают продукт. А создатели оборудования продают свои спецификации! И правильно делают.

  • пришлось бы бегать к ним в соседний квартал чинить слетевший Windows - страшную штуку в руках деятельного и любопытного новичка.

    Заменить Windows на Linux.

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

    У каждого свои цели при использовании чего-либо. Кто-то любит наблюдать появление строчек в файле /var/log/xxx.log, жуя при этом позавчерашний бутер, найденный в системном блоке. Кто-то вынужден наблюдать за изменением квот на бирже дабы сходить в дорогой ресторан, и ему совершенно наплевать на то, какая идеология у ОС.

  • Все больше программ появляется под Linux. Фактически нет только хорошего Фотошопа, хотя Gimp уже близок.

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

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

В целом, с автором я согласен в том, что Microsoft гребет слишком много денег с пальца. В этом плане мне нравится лицензионная политика Oracle: используешь для зарабатывания денег - плати! Поэтому считаю, что для некоммерческого использования ОС должна быть бесплатной (или условно-бесплатной за 10 баксов). А послевкусие статьи у меня такое: оплачиваться должно создание корпоративного софта.

Мне кажется, что текущее положение вещей в области интеллектуальной собственности вполне рационально и адекватно - она (собственность) бесценна. Так что платим, товарищи. The best software money can buy.

This disc is not rewritable and therefore cannot be erased.

Вот такое сообщение выдавал мне Nero и сама Windows Vista. Какой диск не засуну - писать не получается (This disc is not rewritable and therefore cannot be erased)! Сначала подумал, что опять что-то с системой! Оказалось - Daemon Tools...

Turn off 'Hide CD-R' option

Настройки RDP в Vista

Я пользуюсь домашним компьютером с работы, поэтому разрешаю Remote Desktop. В Vista есть 3 возможные настройки для RDP-доступа:

  1. Don't allow connections to this computer
  2. Allow connections from computers running any version of Remote Desktop (less secure)
  3. Allow connections only from computers running Remote Desktop with Network Level Authentication (more secure)

Естественно, я, как приверженец строжайшей безопасности, выбрал вариант 3, о чем сейчас жалею:

The remote computer requires Network Level Authentication, which your computer does not support. For assistance, contact your system administrator or technical support.

Все предельно просто: The Windows XP SP2 RDP 6.0 client software does not currently support Network Level Authentication. Подходит (пока что, надеюсь) только RDP клиент, встроенный в Windows Vista.

Так что лучше выбирать вариант 3 и не париться.

Для маньяков здесь описаны интересные аспекты настройки RDP.

Мой новый рекорд по количеству установок Windows Vista подряд

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

Недавно мне потребовался IIS и я попытался его поставить. Не получилось, как не получилось поставить даже банальный Telnet Client - в Event Log сыпались ошибки, связанные с Windows Servicing (Windows Servicing failed to complete the process of setting package XXX into YYY(YYY) state). Кроме того, при попытке перемещения\копирования файлов с рабочего стола диалог копирования подвисал, а файл блокировался даже на чтение до перезагрузки. Это то, что меня уж сильно достало (было еще несколько неприятных вещей).

Я записал установочный образ июльской Vista Ultimate от noPE, поставил, при первом старте выполнил привычные действия - изменил рабочую группу и поменял метки\точки монтирования дисковых разделов. При попытке добавить\удалить компоненты системы - та же ошибка Windows Servicing!

Сначала согрешил на какой-то апдейт, встроенный в июльскую сборку. Записал июньскую от ETH0 (с нее я ставил в прошлый раз и помню, что удаление\добавление компонентов работало). Поставил, попытался изменить компоненты - успешно! Выполнил привычные действия, после которых начала вылазить горе-ошибка...

Итак, проблема может быть следствием

  1. изменения рабочей группы по умолчанию;
  2. переразметки букв разделов.

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

Диск был разбит на два первичных раздела и один логический. На primary1 стоит Windows XP, на primary2 - ставлю Windows Vista, logical - хранилище. primary2 получал точку C:\, а primary1 - D:\, причем букву primary1 Disk Management сменить не разрешал (Windows cannot modify the drive letter of your volume. This may happen if your volume is a system or boot volume, or has page files). Переразметку я выполнял с помощью Acronis Disk Director 10, который сумел сменить букву так, как мне надо. В результате - проблемы с Windows Servicing. Бред, конечно, но, что поделаешь.

В результате: 5 переустановок, массивные сдвиги\переносы разделов (раздел с XP переехал на отдельный винт, раздел Vista стал единственным первичным). 7 часов угробил.

Назойливые дефекты Visual Studio 2005/2008

Мучительно неприятно, что некоторые вещи не исправляются даже с выходом новой версии. Не говоря уже о сервис паках! Предыдущий пост, новый дефект:
Окна задочены наверху, включен Auto Hide - списки "Modules" и "Processes" пустые!
Убираю Auto Hide - строчки появляются в обоих окошках.
Ставлю Auto Hide - список "Processes" опять пустой, "Modules" заполнен.
Картинка снята с Visual Studio 2008 B2. В 2005SP1 ситуация аналогичная. А в 2005 без SP1, кажется, все нормально.

Скучно

Программинг подобен чтению хорошего детектива - все проясняется только в самом конце... На работе сейчас полный застой. Что делать - непонятно, как делать - непонятно. Кого спрашивать - непонятно. Сижу, читаю Акунина :)

Visual Studio native debugging

Visual Studio можно использовать в качестве отладчика нативного кода (по большей части интересует возможность прерывания на функциях WinApi). Для этого нужно установить некоторые параметры отладчика:

http://msdl.microsoft.com/download/symbols
Галочка "Search ..." установлена для того, чтобы символы грузились по требованию, а не каждый раз при старте приложения или аттаче к уже запущенному.

Собственно, вот и просьба загрузить символы:

Самое важное - как установить точку останова на функции. Формат функции такой: {,,some.dll}MangledFunctionName. Пример: {,,user32.dll}_MessageBoxW@16

TypeMock.NET

По словам моего сотрудника, человека с приличным опытом, TypeMock.NET - лучшее решение для генерации (точнее сказать - просто решение, но об этом позже) Mock-объектов и использования их в юнит тестах.

Традиционные Mock фреймворки имеют определенные требования к объектной модели, обусловленные принципами функционирования - сабклассинг и динамическая генерация кода. Эти требования нередко заставляют проектировать с учетом необходимости юнит тестирования посредством Mock-объектов, что негативно сказывается на конечном результате и удобстве использования. Некоторые вещи вообще с трудом подлежат юнит тестированию, например, классы, использующие внешние статические методы. Решается либо условной компиляцией (далеко не уйдешь) либо перепрограммированием механизма взаимодействия объектов (порядочное усложнение существующего кода).

Итак, почему же "#1 Mocking Framework"? Лучше всего сразу посмотреть на возможности TypeMock.NET, который доступен в 3-х редакциях - Community (бЭсплатно), Professional и Enterprise (соответсвенно, за денюжку).

Если пройтись по списку фич, можно заметить такие интересные и, на первый взгляд, невозможные вещи, как "mock all types, including sealed and internal classes", "fake any method", "mock third-party types, including types in the .NET framework". Нам заявляют, что TypeMock способен подделать поведение любого объекта, в т.ч. его статических методов!

Банальнейший пример демонстрирует, что sealed класс SqlConnection начинает вести себя так, как ему приказано! Шокирующих примеров хватает.

Досих пор меня мучил главный вопрос - как это работает?! Парочка часов скитаний по сети увенчалась успехом! Итак айнц, цвай, драй. И все стало на свои места.

Хитрое решение - перехватывать события .NET приложения (например, вызов метода) с помощью публично доступного Profiler API (на этом, кстати, построены все профайлеры .NET приложений) и подменять исходное поведение требуемым. Хитрое, но не идеальное, т.к. возникают проблемы с отладкой юнит тестов.

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

Copyright 2007-2011 Chabster