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

Решение одной проблемы созданием большей проблемы

Это перевод Solving one problem by creating a bigger problem. Автор: Реймонд Чен.

Часто люди даже не осознают, что их решение проблемы просто заменяет одну проблему другой. Остроумная шутка, приписываемая Jamie Zawinski, демонстрирует это:
Некоторые люди, встречаясь с проблемой, думают: "Я знаю: я использую регулярные выражения". Теперь у них две проблемы.
Например, в комментариях к постам вроде "Как мне написать .bat файл, который..." некоторые люди написали: "Во-первых, установите <perl|bash|monad|...>". Это не решает проблему; это заменяет одну проблему другой.

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

Почему Windows File Protection не использует ACL для защиты файлов?

Это перевод Why doesn't Windows File Protection use ACLs to protect files? Автор: Реймонд Чен.

Windows File Protection работает заменой файлов после их перезаписи. Почему Windows просто не используют ACL для изначального блокирования перезаписи файлов?

Мы пробовали этот подход. И он не сработал.

воскресенье, 29 мая 2011 г.

Основные негласные правила программирования: параметры функций

Это перевод Basic ground rules for programming - function parameters and how they are used. Автор: Реймонд Чен.

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

суббота, 28 мая 2011 г.

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

Это перевод You never know until you test it with real users. Автор: Реймонд Чен.

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

пятница, 27 мая 2011 г.

Почему версия 6 библиотеки общих элементов управления не использует фоновый поток для анимации?

Это перевод Why does the version 6 animation control not use a background thread? Автор: Реймонд Чен.

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

четверг, 26 мая 2011 г.

Почему не существует сообщения для отключения кнопки Отмена в мастерах?

Это перевод Why is there no message for disabling the Cancel button on a wizard? Автор: Реймонд Чен.

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

среда, 25 мая 2011 г.

Настройка ForceAutoLogon не делает то, чего от неё ожидает большинство людей

Это перевод The ForceAutoLogon setting doesn't do what most people think. Автор: Реймонд Чен.

Ребята из команды входа (logon team) попросили меня напомнить вам, что включение опции ForceAutoLogon делает больше, чем просто автовход вашей учётной записи. Им приходится иметь дело с кучей людей, которые включают эту опцию, не понимая, что она делает - и все они сталкиваются с проблемами, потому что опция работает не так, как они ожидают.

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

И другие вещи, которые люди делают с бета-версиями ОС...

Это перевод ther things people do with beta versions of the operating system. Автор: Реймонд Чен.

Несколько запоздало я наткнулся на обсуждение бомбы с часовым механизмом в бета-версии продуктов Microsfot. Оно напомнило мне один случай с крупнейшим производителем ПК, который, видимо, не мог дождаться Windows 95 RTM.

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

Понимание вещей в контексте вопроса: Dispatch-интерфейсы

Это перевод Understanding what things mean in context: Dispatch interfaces. Автор: Реймонд Чен.

Запомните, что вам нужно понимать, что означают вещи в контексте вопроса. К примеру, у интерфейса IActiveMovie3 есть метод get_MediaPlayer. Если вы посмотрите на этот метод в сферическом вакууме (без принятия во внимание контекста), то вы будете ожидать, что метод вернёт вам интерфейс IMediaPlayer, но в заголовочнике вы увидите, что вместо этого метод возвращает интерфейс IDispatch. Если вы посмотрите на общую картину, то вы увидите, почему это имеет смысл.

воскресенье, 22 мая 2011 г.

Цена излишних усилий: строковый поиск

Это перевод The cost of trying too hard: String searching. Автор: Реймонд Чен.

Есть много алгоритмов быстрого поиска строк, но работа строкового поиска, по сути, O(n), где n - это длина строки, в которой ищут: если m - длина образца (который я называю "целевой строкой"), то любой алгоритм, который проверяет менее n/m элементов, оставляет "дырку" в m непроверенных элементов, что является достаточным местом, чтобы спрятать там строку.

суббота, 21 мая 2011 г.

Цена излишних усилий: расширяющиеся деревья

Это перевод The cost of trying too hard: Splay trees. Автор: Реймонд Чен.

Часто, быть умным - это игра, которая не стоит свеч. К примеру, в 1980-х, мне сказали, что группа файловых систем работала над тем, какие структуры данных в памяти будут представлять содержимое каталогов, так что поиск файлового имени был бы быстрым. Одним из экспериментов, который они попробовали, заключался в использовании расширяющихся деревьев (splay tree). Расширяющиеся деревья были изобретены в Робертом Тарьяном и Даниелем Слейтором в 1985 г. как вид само-балансирующегося дерева, которое даёт амортизационную стоимость O(log n) для операции поиска элемента в дереве, где n - число узлов в дереве (амортизированная стоимость грубо означает, что стоимость M операций равна O(M log n). Стоимость одной операции - O(log n) в среднем, но индивидуальная операция может быть очень "дорогой")

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

пятница, 20 мая 2011 г.

Почему слова, начинающиеся с "home", трактуются как URL?

Это перевод Why do words beginning with "home" get treated as URLs? Автор: Реймонд Чен.

Vitaly спросил в Suggestion Box (исправлена грамматика):
А ты можешь объяснить, почему Windows запускает web-браузер, если имя файла, который ты передаёшь в ShellExecute, начинается с "home"?

четверг, 19 мая 2011 г.

Конвертируем между LCID и кодами языков RFC 1766

Это перевод Converting between LCIDs and RFC 1766 language codes. Автор: Реймонд Чен.

Время от времени я вижу, как кто-то спрашивает функцию, которая конвертирует LCID (это такие штуки вроде $0409 для English-US) в языковые идентификаторы RFC 1766 (а это - "en-us") и наоборот. Ну, тут есть простое правило: если то, о чём вы спрашиваете, - это языковая штука, которая требуется web-браузеру, то вам нужно начать поиски с библиотеки MLang. В нашем случае нас будет интересовать метод IMultiLanguage.GetRfc1766FromLcid.

среда, 18 мая 2011 г.

UTF-8 всё ещё не является вариантом по умолчанию в Блокноте

Это перевод UTF-8 default isn't in the latest Notepad, either. Автор: Майкл Каплан.

Да, это правда: часто я начинаю посты с "простых вопросов", которые в итоге имеют сложные ответы.

А когда ответы просты, то они оказываются простыми в плохом смысле: вроде слова НЕТ.

И это один из таких постов...

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

The game is over, people!

Это перевод The game is over, people! Автор: Майкл Каплан.

Блокнот добавляет BOM (Byte Order Mark), когда вы сохраняете файл в кодировке UTF-8.

Всегда1.

Если вы подумаете, что Блокнот Windows делал это на протяжении 319680000 секунд2, и что общее время использования Windows 20003, Windows XP, Windows Server 2003, Windows XP 64-bit, Vista, Windows Server 2008, Windows 7 и Windows Server 2008 R2 настолько велико, что взорвёт вам мозг, если вы попробуете его сосчитать - то можно подумать, что люди уже научились с этим жить.

Но нет.

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

Почему вообще Shell-скрипты UNIX в UTF-8 создают или редактируют в Блокноте Windows?

Это перевод Why are UTF-8 encoded Unix shell scripts *ever* written or edited in Notepad? Автор: Майкл Каплан.

Все ненавидят Microsoft.

Ну, не совсем все.

Но ругание Microsoft кажется весьма популярным занятием...

воскресенье, 15 мая 2011 г.

unicodeFFFE... Microsoft рехнулась?

Это перевод unicodeFFFE... is Microsoft off its rocker? Автор: Майкл Каплан.

Это вопрос, который был открыт какое-то время.

Тогда в феврале (боже, я действительно писал в блог целый год?) я объяснил разницу между Big Endian и Little Endian Unicode. В январе я также говорил про Byte Order Mark.

Но этот пост не про это.

Этот пост - про Preferred Charset Label для web-страниц, которые кодируются в Big Endian Unicode (или 'Unicode (Big Endian)', как любит называть его Блокнот).

Это на самом деле unicodeFFFE.

суббота, 14 мая 2011 г.

В чём разница между Big Endian и Little Endian?

Это перевод What is the difference between Big Endian and Little Endian Unicode? Автор: Майкл Каплан.

Очень часто возникающий вопрос, который связан со значением суффиксов в UTF-16LE и UTF-16BE.

пятница, 13 мая 2011 г.

четверг, 12 мая 2011 г.

Изобретательность раздражающих людей

Это перевод The Resourcefulness of Annoying People. Автор: Реймонд Чен.

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

Программное обеспечение значительно изменилось со временем. Теперь в Windows есть части пользовательского интерфейса, которые не могут управляться программно - даже с помощью политик. Это печально, но это так. И это тот урок, что достался нам тяжёлым путём.

среда, 11 мая 2011 г.

Злоупотребление свойствами

Это перевод On the abuse of properties. Автор: Реймонд Чен.

Одна из вещей, которыми, как я вижу, злоупотребляют, - это синтаксис свойств. Многие языки поддерживают т.н. "свойства" (property), которые синтаксически выглядят как обычные поля, но внутренне они трактуются как пара методов ("Get" и "Set").

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

Одна сертификация - хорошо, а две - ещё лучше?

Это перевод If one certification is good, more must be better. Автор: Реймонд Чен.

В обсуждении подписывания драйверов комментатор ATZ Man предложил:
Далее, Microsoft нужно разрешить организациям, которые участвуют в WHQL, сертифицировать драйверы, и позволить драйверам получать сертификаты от любой организации или набора организаций на их выбор. Со временем пользователи узнают, какие организации предоставляют лучшие проверки.
Неужели?

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

Вызов функции - это нечто большее, чем просто заставить типы параметров совпасть

Это перевод There's more to calling a function than just getting the types to match. Автор: Реймонд Чен.

Вот классическая ошибка новичка. Предположим, вы хотите вызвать функцию, скажем CreateFontIndirectEx, прототип которой:
function CreateFontIndirectEx(const p1: PEnumLogFontExDV): HFONT; stdcall;
Вы пишите:
procedure Sample;
begin
  Font := CreateFontIndirectEx(???);
  ...
end;
А что же нам написать вместо вопросительных знаков? Ну, компилятор говорит, что он там хочет видеть PEnumLogFontExDVW - так что давайте дадим ему, что он хочет.
procedure Sample;
begin
  Font := CreateFontIndirectEx(PEnumLogFontExDVW(nil));
  ...
end;

воскресенье, 8 мая 2011 г.

Почему у элемента управления up-down стрелочки инвертированы?

Это перевод Why do up-down controls have the arrows backwards? Автор: Реймонд Чен.

Когда вы создаёте элемент управления up-down (некоторые люди называют его "spinner"-ом), то в его конфигурации по умолчанию стрелка вверх уменьшает значение, а стрелка вниз - увеличивает его. Большинство людей ожидает, что стрелка вверх будет увеличивать, а стрелка вниз - уменьшать. Почему же он работает наоборот?