вторник, 31 августа 2010 г.

Важность указания флага WT_EXECUTELONGFUNCTION в QueueUserWorkItem

Это перевод The importance of passing the WT_EXECUTELONGFUNCTION flag to QueueUserWorkItem. Автор: Реймонд Чен.

Одним из флагом функции QueueUserWorkItem является WT_EXECUTELONGFUNCTION. Документация для этого флага говорит:
Функция обратного вызова может выполняться длительное время. Этот флаг помогает системе решить, надо ли ей создавать новый поток.

понедельник, 30 августа 2010 г.

FindFirstFile не является SQL-запросом

Это перевод FindFirstFile is not a SQL query. Автор: Реймонд Чен.

Функция FindFirstFile - это вам не SQL-запрос. Это очень простой перечислитель содержимого каталога. У вас есть чуть более навороченная версия, называемая FindFirstFileEx, но даже эта функция не делает много больше, чем фильтрация каталогов или устройств.

воскресенье, 29 августа 2010 г.

Почему FindFirstFile находит короткие имена файлов?

Это перевод Why does FindFirstFile find short names? Автор: Реймонд Чен.

Функция FindFirstFile находит соответствия среди коротких и длинных имён. Это может давать вам несколько неожиданные результаты. К примеру, если вы просите "*.htm", то эта маска вернёт вам файл "x.html", потому что его короткое имя - "X~1.HTM".

Почему функция смотрит на короткие имена файлов? Разве не должна она смотреть только на длинные имена? В конце концов, только старые 16-ти битные программы должны использовать короткие имена.

суббота, 28 августа 2010 г.

Что там у нас с флагом ES_OEMCONVERT?

Это перевод What is the deal with the ES_OEMCONVERT flag? Автор: Реймонд Чен.

Стиль элемента управления ES_OEMCONVERT является пережитком прошлого 16-ти битных Windows. Эта старинная статья MSDN из SDK Windows 3.1 описывает этот флаг так:
ES_OEMCONVERT приводит к тому, что текст, вводимый в элемент управления edit будет конвертироваться из ANSI в OEM, а затем обратно в ANSI. Это гарантирует корректную конвертацию символов, когда приложение вызывает функцию AnsiToOem, чтобы перевести строку из edit в OEM символы. ES_OEMCONVERT особенно полезна для элементов управления для ввода имён файлов.
Заведите свою машину времени на, скажем, 31-е января 1992-го - дату, когда была написана эта статья.

пятница, 27 августа 2010 г.

Если InitCommonControls ничего не делает - зачем же мне её вызывать?

Это перевод If InitCommonControls doesn't do anything, why do you have to call it? Автор: Реймонд Чен.

Одной из проблем, с которыми встречаются новички, когда они начинают использовать общие элементы управления оболочки (shell common controls), является забывание про вызов функции InitCommonControls. Но если вы дизассемблеризируете саму функцию InitCommonControls, то вы увидите, что она, как и функция FlushInstructionCache, ничего не делает.

Тогда зачем вам её вызывать?

четверг, 26 августа 2010 г.

Апокрифичная история туннелинга файловой системы

Это перевод The apocryphal history of file system tunnelling. Автор: Реймонд Чен.

Одной из возможностей файловой системы, которая может вас изумить, является туннелинг - это когда дата-время создания файла и его короткие/длинные имена берутся из файла, который существовал в этой папке раньше. Другими словами, если вы удалите какой-то файл "File with long name.txt", а потом создадите новый файл с тем же именем, то новый файл будет иметь те же дату создания и короткое имя, что и уже удалённый первый файл. Вы можете прочитать эту статью KB, чтобы узнать, какие операции чувствительны к туннельному эффекту.

Почему туннелинг вообще существует?

среда, 25 августа 2010 г.

Слухи славы

Это перевод Rumours of Glory Автор: Danny Glasser.

Я обычно не привлекаю трафик историями о работе, как это делают ребята А, Л и Р - но публичный релиз Rumor City на прошлой неделе напомнил мне одну из моих любимых историй: как моя супруга стала одним из самых известных игроков в игре Червы.

вторник, 24 августа 2010 г.

Windows 95 - меньший отстой

Это перевод Windows 95: It sucks less. Автор: Реймонд Чен.

Сегодня исполняется 15 лет со дня выпуска Windows 95.

понедельник, 23 августа 2010 г.

Что такое SYSTEM_FONT и DEFAULT_GUI_FONT?

Это перевод What are SYSTEM_FONT and DEFAULT_GUI_FONT? Автор: Реймонд Чен.

Среди других вещей, которые вы можете запросить с помощью функции GetStockObject, есть два шрифта, называемые SYSTEM_FONT и DEFAULT_GUI_FONT. Что это такое?

воскресенье, 22 августа 2010 г.

Используем скрипт, чтобы получить информацию из окна Проводника

Это перевод Using script to query information from Internet Explorer windows. Автор: Реймонд Чен.

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

суббота, 21 августа 2010 г.

11/97: Кодируйте на языке предметной области

Это перевод Code in the Language of the Domain. Автор: Dan North.

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

Представьте себе два исходных кода. В первом вы видите что-то подобное:
if (portfolioIdsByTraderId.get(trader.getId())
  .containsKey(portfolio.getId())) {...}
Вы чешете затылок, пытаясь догадаться, что может делать этот код. Выглядит как взятие ID из объекта trader и использование его для получения другого ID, после чего – поиск еще одного ID из объекта portfolio... Почесывание затылка почему-то не помогает. Вы ищете определение portfolioIdsByTraderId и находите следующее:
Map<int, Map<int, int>> portfolioIdsByTraderId;
Постепенно вы выясняете, что этот код делает что-то похожее на выяснение того, имеет ли трейдер доступ к портфелю акций. И конечно же, этот (или похожий на него) фрагмент кода будет повторяться везде, где будет требоваться выяснить, есть ли у трейдера доступ к портфелю.

А в другом исходном коде вы находите вот такую строчку:
if (trader.canView(portfolio)) {...}
И никакого почесывания затылка не требуется. Вам не нужно знать подробности, что у этой функции внутри. Вероятнее всего, там будет подобное приведенному выше фрагменту, но это уже дело trader, а не ваше.

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

пятница, 20 августа 2010 г.

10/97: Внимательно выбирайте инструменты

Это перевод Choose Your Tools with Care. Автор: Giovanni Asproni.

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

Современные приложения очень редко пишутся с нуля. Скорее, они собираются с помощью существующих инструментов — компонентов, библиотек и framework-ов — по нескольким хорошим причинам:
  • Приложения становятся больше и сложнее, хотя доступное время на их разработку уменьшается. Становится выгоднее тратить время разработчиков и их способности на написание бизнес кода в проблемной области, чем кода инфраструктуры.
  • Широко используемые компоненты и библиотеки вероятнее всего имеют меньше ошибок, чем разработанные "в домашних условиях".
  • В сети доступно много бесплатного высококачественного кода и программ, что означает снижение стоимости разработки и большую вероятность найти разработчика с необходимыми интересами и умениями.
  • Производство программ и обслуживание стоят дорого - поэтому покупка готовых частей может быть дешевле, чем их разработка.
Однако, выбор верного сочетания инструментов для вашего приложения может быть нетривиальной вещью, требующей обдумывания.

четверг, 19 августа 2010 г.

9/97: Сначала проверьте свой код, а уж потом вините других

Это перевод Check Your Code First before Looking to Blame Others. Автор: Allan Kelly.

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

Разработчики (все из нас!) часто не верят, что их код не работает. Это просто настолько невероятно, что на этот раз это, должно быть, баг в компиляторе.

среда, 18 августа 2010 г.

8/97: Правило бойскаутов

Это перевод The Boy Scout Rule. Автор: Uncle Bob.

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

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

Что, если мы будем следовать похожему правилу в нашем коде: "Всегда делайте код для commit чище, чем он был, когда вы брали его из репозитория". Не важно, кто был автором этого кода, что если мы всегда будем вкладывать немного усилий, не важно, насколько малых, в улучшение модуля: что мы получим в результате?

вторник, 17 августа 2010 г.

7/97: Опасайтесь повторного использования кода

Это перевод Beware the Share. Автор: Udi Dahan.

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

Это было моим первым проектом в компании. Я только что закончил своё обучение и жаждал проявить себя, оставаясь поздно ночью, чтобы копаться в коде. Когда я работал с первой порученной мне возможностью, я уделил много внимания всему, что я научился: комментирование, логгинг, повторное использование кода и т.д. Проверки кода (code review), к которым я чувствовал себя так готовым, пришли как горькое разочарование - они ругались на моё повторное использование кода!

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

Оказалось, что я упустил из виду критически важный компонент.

понедельник, 16 августа 2010 г.

6/97: Прежде, чем вы приступите к рефакторингу

Это перевод Before You Refactor. Автор: Rajith Attapattu.

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

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

воскресенье, 15 августа 2010 г.

Объяснение диалога Региональные и языковые настройки в Windows XP/2003

Это перевод Explaining the Windows XP/Server 2003 Regional and Language Options Dialog. Автор: Майкл Каплан.

Disclaimer: эта страница не санкционирована официально Microsoft. Если бы она была санкционирована, то, очевидно, она была бы более вежлива :-)

суббота, 14 августа 2010 г.

Объяснение диалога региональных настроек в Windows 2000

Это перевод Explaining the Windows 2000 Regional Options Dialog. Автор: Майкл Каплан.

Disclaimer: эта страница не одобрена официально Microsoft. С учетом сказанного, несколько сотрудников Microsoft признались, что получили дозу хорошего смеха из этого поста, и никто не нашел его техническим неточным. Поэтому, возможно, это просто немного грубее, чем они бы выбрали, вот и все! :-)

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

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

пятница, 13 августа 2010 г.

Буквы в языке...

Это перевод The letters in a language... Автор: Майкл Каплан.

Сегодня я получил вопрос от кого-то, кто читает блог Jeppe. Вопрос заключался в том, существует ли метод, API или ресурс, который позволял бы получить все буквы в языке?

четверг, 12 августа 2010 г.

Что, чёрт возьми, такое LCID?

Это перевод What the heck is an LCID? Автор: Майкл Каплан.

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

среда, 11 августа 2010 г.

Волшебная сборка, часть 2

Это перевод A Magical Gathering – Part 2. Автор: Uwe Raabe.

Из части 1:
возьмите энумератор, подмешайте к нему класс-хэлпер и полейте этим invokeable custom вариант
Вот, снова. О чём это он говорит?

вторник, 10 августа 2010 г.

Волшебная сборка, часть 1

Это перевод A Magical Gathering – Part 1. Автор: Uwe Raabe.

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

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

Рецепт очень прост: возьмите энумератор, подмешайте к нему класс-хэлпер и полейте этим invokeable custom вариант.

Чего?

Окей, забудьте это - давайте начнём с начала.

понедельник, 9 августа 2010 г.

Как мне, #$%, получить имя клавиатуры?

Это перевод How do I get the @!#$% name of the keyboard? Автор: Майкл Каплан.

Я сделал намёк на проблемы с концепцией HKL в моём словарике клавиатурных терминов. Но у меня есть несколько бывших подружек, которые объединены одним общим фактом: они все считают, что я не умею делать тонкие намёки, и вообще мне пора это прекратить. Поэтому: вот вам формальное обсуждение проблем терминологии и значения HKL в Windows.

воскресенье, 8 августа 2010 г.

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

Это перевод Larry's rules of software engineering, part 1: Every software engineer should know roughly what assembly language their code generates. Автор: Ларри Остерман.

Это первая часть в будущей серии (другими словами, как только мне придут в голову ещё правила, я напишу ещё постов).

Этот пост был написан под вдохновением от поста Реймонда, где в комментариях человек спросил: “Ты считаешь, что я обязан знать ассемблер, чтобы делать мою работу?”.

Мой ответ этому человеку: “Да, лично я ожидаю знания ассемблера от каждого”. Потому что если вы не знаете его - вы просто не понимаете, что делает ваш код.

суббота, 7 августа 2010 г.

Один на миллион - redux

Это перевод One in a million redux. Автор: Ларри Остерман.

Я упомянул свой пост "Один на миллион - это в следующий вторник" в разговоре с женой на следующий день, и она спросила меня: "Так что, ты рассказал там про часы в персоналках"?

И меня озарило, что я этого не сказал. Чёрт! Поэтому: вот этот рассказ. На самом деле, это довольно любопытно.

пятница, 6 августа 2010 г.

Один на миллион - это в следующий вторник

Это перевод One in a million is next Tuesday. Автор: Ларри Остерман.

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

четверг, 5 августа 2010 г.

В чём разница между MS-DOS и PC-DOS?

Это перевод What's the difference between MS-DOS and PC-DOS? Автор: Ларри Остерман.

В комментарии к предыдущему сообщению Louis Parks спросил, не была ли MS-DOS/PC-DOS частью совместного соглашения с IBM.

Вообще-то, ответ на этот вопрос несколько сложнее из-за того, как рынок компьютеров работал в 80-е.

среда, 4 августа 2010 г.

Знали ли вы, что OS/2 не была первой многозадачной не-Unix ОС от Microsoft?

Это перевод Did you know that OS/2 wasn't Microsoft's first non Unix multi-tasking operating system? Автор: Ларри Остерман.

Большинство людей знают о таких продуктах Microsoft:
  1. Xenix - первая операционная система Microsoft, которая была версией UNIX для микропроцессоров.
  2. MS-DOS/PC-DOS - 16-ти битная ОС для процессора 8086.
  3. Windows - не являлась в действительности ОС, но она принадлежит этой шкале времени.
  4. OS/2 - 16-ти битная ОС, написанная при сотрудничестве с IBM.
  5. Windows NT - 32-х битная ОС для процессоров Intel i386, Mips R8800 и DEC Alpha.

вторник, 3 августа 2010 г.

Почему Ctrl+C не прекращает работу NET USE?

Это перевод Why doesn't CTRL-C stop NET USE? Автор: Ларри Остерман.

John Vert пристаёт ко мне с этой проблемой вот уже, буквально, 14 лет.

Когда я делаю NET USE * \\MYSERVER\SERVERSSHARE из CMD.EXE и консоль подвисает - я нажимаю Ctrl+C, но сколько бы раз я это ни делал, это не помогает: приложение отвисает только когда оно сдаётся само.

Ну почему это так? Почему я просто не могу нажать Ctrl+C для остановки приложения?

понедельник, 2 августа 2010 г.

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

Это перевод Things not to do when writing software. Автор: Ларри Остерман.

Я решил начать со старой боевой истории. ДЕЙСТВИТЕЛЬНО старой истории. Из далёких дней Windows 1.0. Что-то такое, что никогда не случится в эти дни.

Примерно 2 месяца до выхода Windows 1.0 в свет (так что сейчас на дворе август/сентябрь 1985-го). Microsoft объявила о Windows за 18 месяцев до этой точки, и мы попали в тиски прессы о vaporware. Поэтому команда разработчиков была под огромным давлением, чтобы выпустить Windows так быстро, как это вообще возможно в человеческих силах и с максимальным набором функций.

воскресенье, 1 августа 2010 г.

5/97: Красота заключается в простоте

Это перевод Beauty Is in Simplicity. Автор: Jørn Ølmheim.

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

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