понедельник, 31 мая 2010 г.

Закупка целого магазина программ Egghead

Это перевод Buying an entire Egghead Software store. Автор: Реймонд Чен.

Во время разработки Windows 95 (которая была выпущена 10 лет назад) совместимость приложений была, конечно же, очень важной вещью. Чтобы убедиться, что покрытие существующих программ было настолько широким, как только это было возможным, менеджер разработки Windows 95 взял свой грузовичок и смотался в местный магазин программ Egghead (тогда ещё существовали магазины Egghead) и купил по одной коробке каждой программы, доступной в магазине.

Я лучше буду называть его разделителем пути

Это перевод I'd rather call it the path separator. Автор: Майкл Каплан.

Я говорю об обратном слэше, U+005c (также известным для некоторых как бэк-слэш).

Он также известен как "тук" (whack) для других (когда эти люди говорят о UNC путях, они говорят 'тук-тук servername', когда они имеют ввиду \\servername).

Я уверен, что вы знаете и другие имена.

Хотя, если вы сидите в Windows с корейской локалью, то у вас есть другое имя для него - символ Won (я говорил об этом тут).

И если вы сидите в Windows с японской локалью, то у вас есть и другое имя для него - символ Yen (а об этом я говорил тут).

Причина?

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

Show me the [small]money!

Это перевод Show me the [small]money! Автор: Майкл Каплан.

У типов данных currency SQL Server-а есть несколько интересных интернациональных возможностей. А некоторые сложности этих функций приводят к ряду интересных последствий. Я думаю, что я мог бы рассказать о некоторых из них...

суббота, 29 мая 2010 г.

Почему в DOS разделителем пути стал "\"?

Это перевод Why is the DOS path character "\"? Автор: Ларри Остерман.

Много, много месяцев назад Declan Eardly спросил, почему символ '\' был выбран в качестве файлового разделителя пути (path separator).

Ответ на этот вопрос идёт из времён до меня, но я помню исходные причины.

пятница, 28 мая 2010 г.

Когда бэк-слэш - это не бэк-слэш?

Это перевод When is a backslash not a backslash? Автор: Майкл Каплан.

Символ сегодняшнего поста - это U+005c, REVERSE SOLIDUS, также известный как обратный слэш, бэк-слэш или просто '\'. Он служит в качестве разделителя пути в Windows, и кодируется в #$5C во всех кодовых страницах.

Поскольку файловые разделители очень важны, то заголовок этого поста может быть довольно пугающ - как он может быть не бэк-слэшем?

четверг, 27 мая 2010 г.

А что тогда у нас там с японской (unicode) сортировкой?

Это перевод And what about the Japanese (Unicode) sort? Автор: Майкл Каплан.

Хотя я не получил публичных комментариев об этом, но несколько разных людей связались со мной в частном порядке (по электронной почте или через ссылку "Contact") и спросили меня, какой ответ на вопрос Андреа о японской сортировке.

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

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

Что там у нас с корейской (unicode) сортировкой?

Это перевод Whats up with the Korean (Unicode) sort? Автор: Майкл Каплан.

Этот разговор был у меня чуть более двух лет назад в Нидерландах, в конце последнего дня на конференции. Быть может, он повторён не слово в слово, хотя я действительно думаю, что он очень близок (я не записывал его). Печеньки были Pepperidge Farm Mint Milanos, но я не люблю мяту (я люблю сорта без мяты, и я не уверен, откуда они тогда у меня взялись - возможно, было ошибкой упоминать, что они мне не нравятся).

Ох, и имя женщины, с которой я говорил, в действительности не Андреа; мне просто нравится это имя...

понедельник, 24 мая 2010 г.

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

Регулирование потребления ресурсов распределением задач

Это перевод Controlling resource consumption by meting out work items. Автор: Реймонд Чен.

На PDC один человек подошёл ко мне за советом о проблеме управления ресурсами, с которой они столкнулись. Грубо говоря, их система генерировала дюжины задач, каждая из которых требовала значительных ресурсов для обработки. Для простоты изложения, пусть каждая такая задача была однопоточной операцией, которая интенсивно использовала процессор и требовала 180 Мб памяти. А целевая машина была, скажем, четырёхпроцессорной машиной с 1 Гб памяти (это была автономная система, так что других работающих программ на ней не было).

Их первая попытка реализации включала создание потока для каждой задачи и отпускание их всех в борьбе за ресурсы. Это сработало не слишком-то хорошо, потому что все задачи дрались за четыре процессора и требовали в несколько раз больше памяти, чем было доступно на машине, приводя к стрессу (thrashing) как планировщика (готовых выполняться поток больше, чем свободных CPU), так и менеджера памяти (суммарная песочница (working set) больше свободной памяти). Результат был просто ужасен.

суббота, 22 мая 2010 г.

Поток, ожидающий объекта синхронизации, может просто его проспать

Это перевод A thread waiting on a synchronization object could be caught napping. Автор: Реймонд Чен.

Если у вас есть объект синхронизации, например, семафор, и 2 потока, ожидающих этот семафор, и если потом вы отпускаете два токена семафора в единственном вызове ReleaseSemaphore, то вы ожидаете, что каждый из ожидающих потоков проснётся, каждый поток получит по одному токену. И, действительно, большую часть времени именно так и бывает.

пятница, 21 мая 2010 г.

У семафоров нет владельцев

Это перевод Semaphores don't have owners. Автор: Реймонд Чен.

В отличие от мьютексов и критических секций, семафоры не имеют владельцев. У них есть только счётчики.

четверг, 20 мая 2010 г.

Почему размер combo-box-а включает в себя размер его выпадающего списка?

Это перевод Why does the size of a combo box include the size of the drop-down? Автор: Реймонд Чен.

Многие люди удивляются, обнаружив, что когда вы создаёте элемент управления выпадающий список - combo-box (либо через явный вызов CreateWindow, либо неявно, описывая его в шаблоне диалога), то размер, который вы укажете при этом, будет описывать размер combo-box-а, включая выпадающий list-box, даже хотя сам выпадающий список при этом на экране не виден.

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

Если вы просите окно с заголовком, то вы также получаете границу окна

Это перевод If you ask for a window caption, you also get a border. Автор: Реймонд Чен.

Некоторые люди заметили, что WS_CAPTION определён как комбинация WS_BORDER и WS_DLGFRAME:
const 
  WS_CAPTION          = $00C00000;     // WS_BORDER or WS_DLGFRAME  
  WS_BORDER           = $00800000;
  WS_DLGFRAME         = $00400000;
Поскольку WS_CAPTION включает в себя WS_BORDER, то создать окно с заголовком без рамки невозможно.

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

Последствия обновления нулевого окна

Это перевод The consequences of invalidating the null window. Автор: Реймонд Чен.

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

понедельник, 17 мая 2010 г.

Переформулирование очевидностей о сообщении WM_COMMAND

Это перевод Restating the obvious about the WM_COMMAND message. Автор: Реймонд Чен.

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

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

Не спускайте глаз с кодовой страницы - практический экзамен

Это перевод Keep your eye on the code page, practical exam. Автор: Реймонд Чен.

Инструкция, которая прилагалась к моему монитору, написана на нескольких языках. Один из них - польский, ну или, хотя бы, он должен быть польским, если бы... ну, смотрите сами.
UWAGA: Szczegó³owe informacje dla u¿ytkownika znajduj¹ siê na do³¹czonej p³ycie CD.
Это тарабарщина. На самом деле, они хотели написать:
UWAGA: Szczegółowe informacje dla użytkownika znajdują się na dołączonej płycie CD.
(что означает: "Примечание: подробная информация для пользователя включена на CD")

Что же пошло не так? Почему все символы со штрихами, кроме одного, оказались испорченными?

[Верхний] регистр турецкой İ (или: регистр, часть вторая)

Это перевод The [Upper]Case of the Turkish İ (or: Casing, the 2nd). Автор: Майкл Каплан.

Я думаю, что турки всё сделали верно.

пятница, 14 мая 2010 г.

Отстаньте от моего [нижнего] регистра! (или: регистр, часть первая)

Это перевод Get off my [lower] case! (or: Casing, the 1st). Автор: Майкл Каплан.

"Trying a case the second time is like eating yesterday morning’s oatmeal." -- Lloyd Paul Stryker
Конечно же, когда Stryker сказал это, он имел ввиду правовую юриспруденцию. Но, верите вы мне или нет, эта цитата также может быть применена к алфавитным операциям с регистром!

четверг, 13 мая 2010 г.

Пересекая DIGITal divide...

Это перевод Crossing the DIGITal divide.... Автор: Майкл Каплан.

Цифры работают в Windows уже какое-то время. Начиная с древнего LCTYPE для GetLocaleInfo и SetLocaleInfo (LOCALE_SNATIVEDIGITS/LOCALE_IDIGITSUBSTITUTION) и их сумасшедше странной поддержке в региональных настройках панели управления до (также древнего) проецирования типов в FoldString для свёртки многочисленных способов представления цифр в простые 0 .. 9 (MAP_FOLDDIGITS) - да, поддержка цифр в Windows уже была какое-то время.

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

Изменение оконного класса влияет на все окна этого класса

Это перевод Changing a window class affects all windows which belong to that class. Автор: Реймонд Чен.

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

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

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

Эффект от SetCursor длится только до следующего вызова SetCursor

Это перевод The effect of SetCursor lasts only until the next SetCursor. Автор: Реймонд Чен.

Конечно же, эффект от вызова функции SetCursor для потока длится только пока этот поток не сменит курсор на что-то ещё. Любой идиот знает это, верно?

понедельник, 10 мая 2010 г.

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

Это перевод Why can't I disable the Cancel button in a wizard? Автор: Реймонд Чен.

Макрос PropSheet_SetWizButtons позволяет вам управлять многими кнопками мастера (wizard), но кнопка Отмена всегда остаётся доступной. Почему вы не можете отключить кнопку Отмена или кнопку "X"?

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

Стоимость чтения ключа реестра

Это перевод The performance cost of reading a registry key. Автор: Реймонд Чен.

Реестр - это удобное место для записи постоянных меж-процессных данных единообразным и потоко-безопасным способом. Он перемещается вместе с пользователем, если вы храните данные в HKEY_CURRENT_USER, а индивидуальные ключи могут быть защищены (даже на FAT системах, которые не поддерживают безопасность).

Но это не значит, что операции с реестром даются вам за бесплатно.

суббота, 8 мая 2010 г.

Преследуя очередь сообщений...

Это перевод In pursuit of the message queue. Автор: Реймонд Чен.

Каждый поток (или, как его тогда называли, "задача") в 16-ти битной Windows имел очередь сообщений. Конец истории, точка.

пятница, 7 мая 2010 г.

Потому что раньше мы доверяли программистам, часть 2

Это перевод Because programmers were trusted to do the right thing, part 2. Автор: Реймонд Чен.

Недавно я кратко обсудил философию, стоящую за дизайном API, которая доминировала в былые времена. Одним из мест, где она себя проявила, было управление питанием (power management).

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

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

Это перевод Why does my program run faster if I click and hold the caption bar? Автор: Реймонд Чен.

Иногда люди замечают, что долго выполняющаяся задача работает быстрее, если вы зажмёте мышь. Как такое может быть?

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

"Симметричность" в симметричной многопроцессорности действительно означает "симметричность"

Это перевод The "symmetric" in symmetric multiprocessing really means "symmetric". Автор: Реймонд Чен.

Семейство операционных систем Windows NT поддерживает SMP - симметричную многопроцессорность. И "симметричную" здесь означает именно симметричность. Все процессоры обязаны иметь одинаковую скорость, одинаковый множитель и одинакового производителя. Они должны быть идентичными друг другу по всем параметрам. Это логичный вывод из взаимозаменяемости процессоров при переключении потоков с одного процессора на другой.

понедельник, 3 мая 2010 г.

Почему Microsoft добавляет в бета-версии своих продуктов time bomb-ы?

Это перевод Why does Microsoft "time bomb" its beta releases? Автор: Ларри Остерман.

Вот один часто задаваемый нам вопрос: "содержит ли time bomb бета-версия продукта X"?

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

Опасности сна в потоке с выборкой сообщений

Это перевод The dangers of sleeping on a UI thread. Автор: Реймонд Чен.

Если у вас есть поток, который владеет окном, то вам не следует использовать в нём функцию Sleep, потому что это приведёт к тому, что ваш поток перестанет отвечать на сообщения на время засыпания. Это также верно и для коротких задержек, вроде засыпания на несколько секунд, потом проверку чего-то и повторное засыпание. Как мы заметили ранее, опрос плохо влияет на производительность системы, не даёт ОС переходить в режим пониженного электро-потребления, а также плохо работает в сценариях с сервером терминалов. Если вы ждёте (idle) - то ждите. Если вы заняты - то сделайте свою работу, а потом ждите.

К сожалению, я часто вижу код вроде такого:
fQuit := False;
  while not fQuit do
  begin
    Sleep(2000);
    CheckIfSomethingHappened;
    while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
    begin
      if Msg.message = WM_QUIT then
      begin
        fQuit := True;
        Break;
      end;
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
  end;
Заметьте, что этот цикл проводит две секунды без обработки сообщений. Люди ещё не сошли с ума, чтобы вставлять двухсекундные задержки в поток, который отвечает за UI, но они часто так делают в фоновых рабочих потоках, которые создают невидимые окна для упрощения межпроцессного или межпоточного обмена данными. Поскольку у потока нет видимого интерфейса, то задержки в несколько секунд невидимы пользователю.

Вот только это не так.

суббота, 1 мая 2010 г.

Почему INI-файлы устарели и их заменил реестр?

Это перевод Why are INI files deprecated in favor of the registry? Автор: Реймонд Чен.

Добро пожаловать, читатели Slashdot. Напоминаю, что этот web-сайт предназначен только для развлечения.

Почему INI-файлы устарели и их заменил реестр? Потому что у INI-файлов было много проблем.