понедельник, 31 января 2011 г.

Честно предупредим перед включением своего компьютера

Это перевод Giving fair warning before plugging in your computer. Автор: Реймонд Чен. Входит в книгу The Old New Thing.

Мой коллега (тот самый, который получил CD от AOL вместе с мега-сервером) позже получил прототип машины на процессоре Itanium для тестирования. Ранние Itaniums были просто бегемотами. Они весили тонну, звучали как газонокосилка и выделяли достаточно тепла, чтобы не дать вам замёрзнуть зимой (если вы бы открыли один из них, то увидели бы несколько блоков пенопласта специальной формы с метками "Не вынимать! Технический пенопласт!". Я никогда не думал, что вообще увижу фразу "технический пенопласт", используемую не для шутки).

Разве кто-то читает все предупреждения о безопасности в инструкции прежде чем включить новую игрушку? Мой коллега просто взял двойные сверхмощные кабели и воткнул их в обычную настенную розетку. И включил выключатель.

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

Вам не спастись от этих компакт-дисков AOL

Это перевод You can't escape those AOL CDs. Автор: Реймонд Чен. Входит в книгу The Old New Thing.

Один из моих коллег распаковывал супер-сервер - ну, один из этих серверов, дороже $30'000, четыре процессора, больше-памяти-чем-вы-знаете-что-с-ней-делать. Тип машин, который требует своей собственной электрической подстанции.

И к нему прилагался AOL CD.

суббота, 29 января 2011 г.

пятница, 28 января 2011 г.

Двойной-Ctrl+Alt+Del - это ляп

Это перевод The double-Ctrl+Alt+Del feature is really a kludge. Автор: Реймонд Чен.

Большинство людей, которых волнуют такие вещи, знают, что вы можете дважды нажать Ctrl+Alt+Del на экране приветствия и иногда вам покажут классический экран входа (примечание: "иногда". Это работает только если последняя операция была перезагрузкой или log-off-ом - из-за сложных технических причин, которые не важны для этого обсуждения).

Способность дважды нажать Ctrl+Alt+Del была добавлена в качестве запасного варианта на случай, если бы нашлись некоторые важные сценарии входа в систему, которые новый экран приветствия пока не охватывывал, а дизайнеры не принял их во внимание просто по недосмотру. Сценарии вроде смарт-карт или сканера отпечатков пальцев.

Другими словами, это ляп.

четверг, 27 января 2011 г.

Об объектах с нулевым счётчиком ссылок

Это перевод On objects with a reference count of zero. Автор: Реймонд Чен. Примечание: этот пост сильно отличается от оригинала.

В обсуждении предыдущего поста один комментатор заявил:
Когда объект создаётся первый раз, его счётчик ссылок должен быть равен 0, а _AddRef должна вызываться позже в какой-то момент (наверное, через QueryInterface).
(прим.пер.: это не так в Delphi; счётчик ссылок равен 1 во время создания объекта - он становится равен 0 лишь в самом конце, когда вы сохраняете ссылку в объект, а не интерфейс)

среда, 26 января 2011 г.

Избегаем двойного освобождения объекта

Это перевод Avoiding double-destruction when an object is released. Автор: Реймонд Чен. Примечание: код этого поста сильно отличается от оригинала.

Как мы видели в прошлый раз, попытка делать слишком много в деструкторе COM-объекта может привести к двойному вызову его деструктора. Стандартным способом избежать этого является ведение искусственного счётчика во время работы деструктора.

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

Деструкторы COM объектов являются очень хрупкими функциями

Это перевод COM object destructors are very sensitive functions. Автор: Реймонд Чен.

Если вы попробуете делать там слишком много - у вас могут быть неприятности.

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

Но у меня Visual Basic Professional!

Это перевод But I have Visual Basic Professional. Автор: Реймонд Чен. Входит в книгу The Old New Thing.

Когда-то давно в 1995-м: я был участником в чат-комнате в MSN, посвящённой теме разработке драйверов в Windows. Один человек задал вопрос: "Я могу писать драйвер устройства на Visual Basic?"

суббота, 22 января 2011 г.

Почему не существует всеохватывающей редакции Windows?

Это перевод Why is there no all-encompassing superset version of Windows? Автор: Реймонд Чен.

Иногда меня спрашивают, почему нет ни одной версии Windows, которая бы содержала все возможности. Вместо этого, поднимаясь выше по лестнице, скажем, от Windows XP Professional до Windows Server 2003, вы получаете серверные возможности, но теряете возможности клиентской станции. Зачем нужно убирать возможности?

пятница, 21 января 2011 г.

Чтение вывода командного файла

Это перевод Reading the output of a command from batch. Автор: Реймонд Чен.

Команда FOR превратилась в команду циклов в языке командных файлов. Если вы запросите справку по команде через FOR /? - вы увидите множество способов, которыми эта команда была перегружена. К примеру, вы можете прочитать вывод команды, используя такую конструкцию:
FOR /F "tokens=*" %i IN ('ver') DO echo %i
Переключатель /F вместе со строкой в апострофах указывает, что нужно запустить команду в апострофах, а её вывод нужно распарсить и возвратить в указанной переменной (или переменных). Опция "tokens=*" говорит, что нужно брать всю строку. Есть несколько других опций, которые контролируют синтаксический разбор - но я оставляю их вам.

Неуклюжий язык командных файлов стал ещё неуклюжее. Почему язык командных файлов имеет такой грамматический беспорядок?

четверг, 20 января 2011 г.

Понимание последствий WAIT_ABANDONED

Это перевод Understanding the consequences of WAIT_ABANDONED. Автор: Реймонд Чен.

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

Но если это произошло - то у вас большие проблемы.

среда, 19 января 2011 г.

Почему существует функция WSASetLastError?

Это перевод Why does the function WSASetLastError exist? Автор: Реймонд Чен.

Почему существует функция WSASetLastError, если у нас уже есть отличная функция SetLastError?

Вообще-то, вы уже знаете ответ - если вы сядете и подумаете об этом.

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

Почему low-level hook не внедряются в процессы?

Это перевод Why aren't low-level hooks injected? Автор: Реймонд Чен.

Когда я описывал, для чего нужен параметр HINSTANCE в функции SetWindowsHookEx, я не стал пояснять, почему он не нужен для низкоуровневых (low-level) hook-ов.

Но это должно быть очевидно.

понедельник, 17 января 2011 г.

Для чего нужен параметр HINSTANCE у SetWindowsHookEx?

Это перевод What is the HINSTANCE passed to SetWindowsHookEx used for? Автор: Реймонд Чен.

Функция SetWindowsHookEx принимает параметр HINSTANCE. Документация поясняет, что это описатель DLL, содержащей процедуру ловушки. Зачем оконному менеджеру нужен этот описатель?

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

Windows Server 2003 может перенести вас назад во времени

Это перевод Windows Server 2003 can take you back in time. Автор: Реймонд Чен.

Если вы работаете в Windows Server 2003, то ради самого себя вы обязаны включить службу "Теневого Копирования Тома" (Volume Shadow Copy) (прим.пер.: её не следует путать с "теневыми копии общих папок" - "shadow copies of shared folders"; хотя эта же служба есть и в Windows XP (в отличие от "shadow copies of shared folders"), но она предназначена для доступа к теневым копиям, создаваемым в других системах). Служба теневого копирования периодически (в соответствии с заданным вами расписанием) делает снимок (snapshot) указанных вами файлов на диске, так что они могут быть восстановлены позже (в Vista и выше снимки называются "точками восстановления" или "предыдущими версиями"). Копирование - ленивое. Т.е. если файл не изменялся, то он не будет копироваться. В БД снимков может хранится до 64 копий одного файла. Имейте это в виду, когда вы настраиваете расписание. Если вы делаете снимок дважды в день - то вы гарантируете себе месяц отката. Но если вы делаете снимок каждую минуту, то гарантировано можете откатиться лишь на час. Это компромисс между качеством и количеством.

суббота, 15 января 2011 г.

Пасьянс "Паук" свергает господствующего чемпиона

Это перевод Spider Solitaire unseats the reigning champion. Автор: Реймонд Чен. Входит в книгу The Old New Thing.

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

пятница, 14 января 2011 г.

Как WinAPI сообщает об ошибках

Это перевод The Way WinAPI Shows Errors. Автор: Christian Wimmer.

Я увидел интересный ответ в обсуждении на форуме, в котором я участвовал. Вопрос был не на тему этого поста, но ответ с кодом был достаточно интересным, чтобы написать эту статью. Код был написан на Delphi, но, очевидно, писался в стиле простого C (даже с использованием goto!).

Однако сейчас я хочу поговорить о том, как WinAPI обычно возвращает ошибки, и почему код в ответе - не самый удачный способ.

четверг, 13 января 2011 г.

30/97: Не повторяйтесь

Это перевод Don't Repeat Yourself. Автор: Steve Smith.

Из "97-ми вещей, которые должен знать каждый программист".

Из всех принципов программирования "Не повторяйтесь" (DRY - Don't Repeat Yourself), возможно, один из самых фундаментальных. Принцип был сформулирован Энди Хантом и Дэйвом Томасом в книге The Pragmatic Programmer и лег в основу множества известных программистских практик и шаблонов проектирования. Разработчик, умеющий находить повторения и понимающий как их избежать при помощи соответствующих практик или абстракций, может писать гораздо более аккуратный код по сравнению с тем, кто постоянно загрязняет приложение ненужными повторами.

среда, 12 января 2011 г.

29/97: Не надейтесь на "А тут происходит волшебство"

Это перевод Don't Rely on "Magic Happens Here". Автор: Alan Griffiths.

Из "97-ми вещей, которые должен знать каждый программист".

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

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

28/97: Позвольте трупу упасть

Это перевод Don't Nail Your Program into the Upright Position. Автор: Verity Stob.

Из "97-ми вещей, которые должен знать каждый программист".

Однажды я написал шутливую программку на С++, в которой я с некоторой долей сатиры реализовал следующую концепцию: при помощи множества конструкций try...except по всему коду не дать программе аварийно завершиться. Результат мы назвали "труп, не падающий потому, что он прибит гвоздями к стене".

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

понедельник, 10 января 2011 г.

27/97: Не просто изучите язык, а поймите его культуру

Это перевод Don't Just Learn the Language, Understand its Culture. Автор: Anders Norås.

Из "97-ми вещей, которые должен знать каждый программист".

В университете мне пришлось изучать иностранный язык. Тогда я думал, что английского мне будет вполне достаточно, и поэтому предпочитал регулярно спать на занятиях французского все три года. Спустя несколько лет я поехал в отпуск в Тунис. Официальный язык там – арабский, а из-за французского колониального прошлого широко распространен также и французский. На английском говорят лишь в туристических местах. Из-за незнания языка я проводил много времени у бассейна, читая "Поминки по Финнегану" Джеймса Джойса, мастерскую игру слова и формы. Его игра со смешением более чем сорока языков оказалась удивительной, хотя и изнуряющей вещью. Понимание того, как переплетения иностранных слов и фраз давала автору новые возможности для самовыражения – то, что я вынес и применяю в своей программистской карьере.

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

26/97: Не игнорируй эту ошибку!

Это перевод Don't Ignore that Error! Автор: Pete Goodliffe.

Из "97-ми вещей, которые должен знать каждый программист".

Однажды вечером я шел по улице на встречу с друзьями в баре. Мы уже давно не встречались попить пива, поэтому я спешил на встречу. И в спешке я не смотрел под ноги. А зря. Тогда бы я вовремя заметил бордюрный камень, так некстати подвернувшийся мне под ногу.

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

Но ведь я же спешил на встречу с друзьями! И когда я добрался до бара, боль стала невыносимой. Я не получил никакого удовольствия из-за боли. А когда утром я пошел к врачу, оказалось, что у меня сложный перелом голени. Остановись я сразу, как только почувствовал боль, проблем было бы гораздо меньше – ходьба на сломанной ноге ни к чему хорошему не приводит. Возможно, это было худшим утром в моей жизни.

суббота, 8 января 2011 г.

25/97: Не выделывайтесь в ваших тестовых данных

Это перевод Don't Be Cute with Your Test Data. Автор: Rod Begbie.

Из "97-ми вещей, которые должен знать каждый программист".

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

В качестве имен пользователей я внес имена членов группы The Clash. Названия фирм? Для них подойдут названия песен группы Sex Pistols. Для идентификаторов биржевых аппаратов нужно было ввести четырехбуквенные слова в верхнем регистре.

Я использовал те самые четыре буквы (аналог трёх букв в русском - прим.пер.).

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

А на следующее утро менеджер проекта сделал несколько скриншотов для презентации.

пятница, 7 января 2011 г.

24/97: Не бойтесь сломать программу

Это перевод Don't Be Afraid to Break Things. Автор: Mike Lewis.

Из "97-ми вещей, которые должен знать каждый программист".

Каждому, работающему в ИТ, приходилось работать на проекте, чей код был, мягко говоря, ненадежным. Любое изменение приводило к отказу в какой-нибудь другой, вообще независимой, части. Каждый раз при добавлении чего-нибудь основной целью было внести как можно меньше изменений, каждый раз затаив дыхание. Работать с таким ПО – все равно что играть в Дженгу в настоящем небоскребе, вытаскивая из конструкции несущие балки – рано или поздно такая игра закончится катастрофой.

четверг, 6 января 2011 г.

23/97: Языки предметной области

Это перевод Domain-Specific Languages. Автор: Michael Hunger.

Когда бы вы не вслушались в разговор экспертов в какой-либо предметной области, будь то шахматисты, работники детского сада или страховые агенты, вы всегда заметите, что они используют слова, отличающиеся от обычных, используемых повседневно. Это то, что называется "язык предметной области" (Domain-Specific Language, DSL) – набор слов и выражений, описывающий вещи, характерные для данной предметной области.

среда, 5 января 2011 г.

22/97: Много занимайтесь осознанной практикой

Это перевод Do Lots of Deliberate Practice. Автор: Jon Jagger.

Из "97-ми вещей, которые должен знать каждый программист".

"Осознанная практика" – это не просто выполнение работы. Если вы спросите себя "Для чего я решаю эту задачу?", а ответом будет "Чтобы ее решить" - то вы не занимаетесь осознанной практикой.

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

21/97: Отделяйте бизнес-исключения от технических

Это перевод Distinguish Business Exceptions from Technical. Автор: Dan Bergh Johnsson.

Из "97-ми вещей, которые должен знать каждый программист".

Есть две причины, почему при выполнении программы возникают ошибки: технические проблемы, которые не дают нам использовать приложение, и бизнес-логика, которая не даёт нам неверно использовать приложение. Большинство современных языков вроде LISP, Java, Smalltalk, Delphi и C# используют исключения для сообщения об обоих классах проблем. Однако эти ситуации настолько различны, что они должны аккуратно быть разделены. Представление их в одной иерархии, не говоря уже про единого предка, является потенциальным источником путаницы.

понедельник, 3 января 2011 г.

Существует реализация WM_SETREDRAW по умолчанию, но вы можете сделать и лучше

Это перевод There's a default implementation for WM_SETREDRAW, but you might be able to do better. Автор: Реймонд Чен.

Если ваше окно не имеет обработчика для сообщения WM_SET­REDRAW, то Def­Window­Proc даст вам поведение по умолчанию, которое подавляет сообщения WM_PAINT для вашего окна, пока перерисовка отключена, и начинает пропускать WM_PAINT (плюс вызывает полное обновление), когда перерисовка снова включается (внутренне это реализуется, делая окно псевдо-невидимым, но это деталь реализации, на которую вам не нужно ориентироваться).

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

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

Насчёт LockWindowUpdate: блокировка Панели задач

Это перевод On LockWindowUpdate: Locking the taskbar. Автор: Реймонд Чен.

Andy Visser отправил в Suggestion Box сообщение, не являющееся предложением, а скорее комментарием к записи - вероятно как обходной путь из-за того, что комментарии к исходной записи были заблокированы:
Я обнаружил, что панель Пуск иногда начинает вести себя как если бы она неверно использовала бы этот вызов. Я располагаю мою панель Пуск в левой части экрана. Когда я пытаюсь изменить размер панели (перетаскивая границу влево-вправо), то системный трей динамически двигает иконки (в зависимости от ширины трея) - что не учитывает блокировку. Остальная часть панели ждёт отпускания кнопки мыши для перерисовки.

суббота, 1 января 2011 г.

Не используйте глобальное состояние для управления локальной проблемой

Это перевод Don't use global state to manage a local problem. Автор: Реймонд Чен.

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