tag:blogger.com,1999:blog-60755789519665639372024-02-03T00:02:53.192+05:00En-Ru translationsАнгло-русские переводы некоторых статейEn-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.comBlogger50125tag:blogger.com,1999:blog-6075578951966563937.post-46662997641469475862022-11-10T14:29:00.001+05:002022-11-10T14:31:29.823+05:00Как сохранить видимость окна, когда пользователь требует показать рабочий стол?<p><span style="font-family: inherit; font-size: medium;">Источник: <span style="background-color: white; color: #333333; text-align: center;"><a href="https://devblogs.microsoft.com/oldnewthing/20110617-00/?p=10403" target="_blank">How do I make a window remain visible even when the user selects Show Desktop?</a><br /></span>Автор: Рэймонд Чен.</span></p><p><span style="font-family: inherit; font-size: medium;"> <span face=""Segoe UI", "Segoe UI Web Regular", "Segoe UI Regular WestEuropean", "Segoe UI", Tahoma, Arial, Roboto, "Helvetica Neue", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"" style="background-color: white; color: #333333;">У клиента был вопрос:</span></span></p><blockquote class="q" style="background-color: #f1f1f1; border-left: 3px solid rgb(51, 153, 238); box-sizing: border-box; color: #333333; padding: 10px 20px;"><p style="box-sizing: border-box; margin-bottom: 1rem; margin-top: 0px; word-break: break-word;"><span style="font-family: inherit; font-size: medium;">Как сохранить видимость окна, даже когда пользователь выбрал команду <i style="box-sizing: border-box;">Показать рабочий стол</i>. Сейчас после команды <i style="box-sizing: border-box;">Показать рабочий стол</i> моё окно закрывается рабочим столом.</span></p></blockquote><p style="background-color: white; box-sizing: border-box; color: #333333; margin-bottom: 1rem; margin-top: 0px; word-break: break-word;"><span style="font-family: inherit; font-size: medium;"></span></p><a name='more'></a><p style="text-align: left;"><span style="font-family: inherit; font-size: medium;">Гм, в этом и заключается цель команды <i style="box-sizing: border-box;">Показать рабочий стол</i>: показать рабочий стол и убрать все окна, которые закрывают его. Окна наподобие вашего. Сожалеем, что Windows не подготовлена для <a href="https://devblogs.microsoft.com/oldnewthing/20100721-00/?p=13373" style="background-color: transparent; box-sizing: border-box; color: #005da6; word-break: break-word;" target="_blank">вашей потрясающей программы</a>, так как нет способа выделить ваше окно, <i style="box-sizing: border-box;">даже если пользователь требует показать рабочий стол вместо этого окна, отменить команду пользователя и всё равно показать окно</i>. (Возможно, <a href="https://devblogs.microsoft.com/oldnewthing/20061101-03/?p=29153" style="background-color: transparent; box-sizing: border-box; color: #005da6; word-break: break-word;" target="_blank">за этим скрывается приятный сюрприз</a>.) В качестве утешения можно создать <a href="http://msdn.microsoft.com/en-us/library/dd834142.aspx" style="background-color: transparent; box-sizing: border-box; color: #005da6; word-break: break-word;" target="_blank">гаджет рабочего стола</a>. Гаджеты - часть рабочего стола и появляются вместе с ним. При дальнейшем обсуждении оказалось, что клиент пытался написать программу-часы — самое то для гаджета. Другой клиент интересовался примерно тем же в замаскированном вопросе:</span></p><p></p><blockquote class="q" style="background-color: #f1f1f1; border-left: 3px solid rgb(51, 153, 238); box-sizing: border-box; color: #333333; padding: 10px 20px;"><p style="box-sizing: border-box; margin-bottom: 1rem; margin-top: 0px; word-break: break-word;"><span style="font-family: inherit; font-size: medium;">Я заметил, что гаджеты остаются на рабочем столе, даже когда пользователь выбирает команду <i style="box-sizing: border-box;">Показать рабочий стол</i>. Как это работает? Каким образом гаджет остаётся на рабочем столе? В чём хитрость?</span></p></blockquote><p style="background-color: white; box-sizing: border-box; color: #333333; margin-bottom: 1rem; margin-top: 0px; word-break: break-word;"><span style="font-family: inherit; font-size: medium;">Это был довольно странный вопрос по каналу клиентов. Возможно, это не было праздным любопытством. Из праздного любопытства не создаётся запрос в техподдержку.</span></p><p style="background-color: white; box-sizing: border-box; color: #333333; margin-bottom: 1rem; margin-top: 0px; word-break: break-word;"><span style="font-family: inherit; font-size: medium;">(Я видел запросы в техподдержку, <i style="box-sizing: border-box;">превратившиеся</i> в праздное любопытство. После получения ответа на свой вопрос клиент решил, что раз уж он обратился в техподдержку, то может задать ещё пару вопросов из праздного любопытства. Это не относится к данному случаю, поскольку клиент <i style="box-sizing: border-box;">начал</i> с вопроса.)</span></p><blockquote class="m" style="background-color: #f1f1f1; border-left: 3px solid rgb(51, 153, 238); box-sizing: border-box; color: #333333; padding: 10px 20px;"><p style="box-sizing: border-box; margin-bottom: 1rem; margin-top: 0px; word-break: break-word;"><span style="font-family: inherit; font-size: medium;">“Хитрость” в том, что гаджеты и рабочий стол знают друг о друге, поэтому когда пользователь выбирает команду <i style="box-sizing: border-box;">Показать рабочий стол</i>, рабочий стол заслоняет все окна и затем размещает гаджеты на своей поверхности.</span></p><p style="box-sizing: border-box; margin-bottom: 1rem; margin-top: 0px; word-break: break-word;"><span style="font-family: inherit; font-size: medium;">Вопрос клиента довольно странный, поскольку звучит следующим образом: “Система работает как X. В чём хитрость X?” Ответ получается тавтологическим: “Система работает как X, потому что цель разработки - X.”</span></p><p style="box-sizing: border-box; margin-bottom: 1rem; margin-top: 0px; word-break: break-word;"><span style="font-family: inherit; font-size: medium;">Предполагаю, что у клиента есть некий секрет. Моё предположение следующее: он хочет написать программу, которая не будет заслоняться рабочим столом, когда пользователь выбирает команду <i style="box-sizing: border-box;">Показать рабочий стол</i>, и думает, что это возможно путём эмуляции поведения гаджетов.</span></p></blockquote><p style="background-color: white; box-sizing: border-box; color: #333333; margin-bottom: 1rem; margin-top: 0px; word-break: break-word;"><span style="font-family: inherit; font-size: medium;">Клиент liaison подтвердил, что именно это пытается сделать клиент, но при обсуждении с liaison также не раскрыл сценарий проблемы, которая внушила ему необходимость программы, которая не заслоняется рабочим столом, когда пользователь выбирает команду <i style="box-sizing: border-box;">Показать рабочий стол</i>. Клиент liaison вернулся с предложением сделать гаджет, чтобы получить специальное поведение, присущее гаджетам.</span></p>En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-56337647738274538532021-03-17T21:34:00.001+05:002021-03-17T21:39:49.472+05:00Что не так с VBA?<p>Автор: Mathieu Guindon<br />Источник: <a href="https://rubberduckvba.wordpress.com/2019/04/10/whats-wrong-with-vba/" target="_blank">What’s Wrong With VBA?</a></p><h2>Самый ужасный язык<br /></h2>
<p style="text-align: justify;">В ежегодном опросе разработчиков на Stack Overflow VBA всегда входил в группу “самых ужасных” языков. В этом году по какой-то причине VB6 и VB.NET нет в списке, но <a href="https://insights.stackoverflow.com/survey/2019?utm_source=so-owned&utm_medium=announcement-banner&utm_campaign=dev-survey-2019#most-loved-dreaded-and-wanted" target="_blank">VBA находится наверху</a>, по мнению 75.2% респондентов.<span></span></p><a name='more'></a><p></p>
<p style="text-align: justify;">VBA - <i>входной</i> язык – во всяком случае, так было для меня. Он решает задачу и выдаёт шаблонный код, о котором вам <i>действительно </i> не стоит беспокоиться, чтобы <i>решить задачу</i>. До некоторой степени этого вполне достаточно. <i>Пока это работает</i>. Код пишется, чтобы выполняться, верно? А если бы мы писали код, чтобы его <i>читали</i>? Код, который легко понять, легче обслуживать и расширять, не "сломав" его. Хорошо организованный код с небольшими повторно используемыми компонентами, которые можно тестировать независимо друг от друга…просто объективно <i>лучше</i>. И <b>VBA не говорит, что так не может быть</b>.</p><p style="text-align: justify;"><span style="text-align: left;">С VBA всё в порядке</span>. Непонятный код со странными именами переменных, запутанный код, который тяжело читать и ещё тяжелее сопровождать, <b>можно написать на любом языке программирования</b>, который есть сегодня или будет придуман в будущем.</p>
<p style="text-align: justify;">VBA - это версия “классического” Visual
Basic (VB5, VB6), встроенная в приложение. Несколько лет Microsoft продавала VBA Software Development Kit (SDK), с помощью которого можно встроить VBA в свой продукт, чтобы писать сценарии с использованием своих COM API / объектной библиотеки: можно написать ERP-систему
(Enterprise Resource Planning), CAD-программу, векторный редактор, что угодно – и обеспечить расширяемость посредством VBA SDK. Это были золотые годы Visual Basic: <i>все</i> знали VB. Я в это время учился в колледже, и курс <i>Programming I</i> включал изучение VB6. Тогда это также был <i>входной язык</i>: “настоящие программисты” писали на C++. </p>
<p style="text-align: justify;">Visual Basic появился через несколько лет после QBasic, который следовал за BASIC. <a href="https://ru.wikiquote.org/wiki/%D0%AD%D0%B4%D1%81%D0%B3%D0%B5%D1%80_%D0%92%D0%B8%D0%B1%D0%B5_%D0%94%D0%B5%D0%B9%D0%BA%D1%81%D1%82%D1%80%D0%B0" target="_blank">Эдсгер Дейкстра</a> сказал о BASIC: </p><blockquote><p style="text-align: justify;"><i>Студентов, ранее изучавших Бейсик, практически невозможно обучить хорошему программированию. Как потенциальные программисты они подверглись необратимой умственной деградации.</i> <br /></p></blockquote>
<p style="text-align: justify;">Прошли годы, а BASIC всё ещё жив благодаря VBA и VB.NET. <b>Плохой код порождается программистом, а не языком</b>. Если вы <i>хотите</i> учиться, то <i>будете</i> учиться: не позволяйте никому убедить себя в обратном. Каждый программист когда-то был новичком, и неважно, пишете ли вы на VBA, Java, C++,
C#, PHP, или модном Javascript; стоит избавиться от фигурных скобок и точек с запятой, как они станут похожи, если на них писал один человек: <b>игнорируйте погромистов</b>, которые <i>думают</i>, что их язык лучше вашего. Вы <i>деградировали</i> не больше, чем они.</p><p style="text-align: justify;">VBA полноценный, зрелый язык программирования, который многократно проверен за последние 20 лет. Это не просто <em>процедурный </em>код: проекты Visual Basic могут определять свои классы и создавать
COM-объекты; объекты, которые могут представлять несколько интерфейсов, генерировать и обрабатывать события, и эти возможности открывают двери, о которых не мечтает ни один игрушечный язык. “Но в нём нет наследования классов! Это не <em>настоящее </em>объектно-ориентированное программирование!” – конечно, есть ограничения; наследование классов это замечательно, однако им часто и легко злоупотребляют. <em>Композиция </em>предпочтительнее наследования по многим причинам, и VBA позволяет <em>компоновать</em> объекты. Наследование хорошо тем, что можно рассматривать производные классы как общий базовый класс, что приводит к <em>полиморфизму</em>: <code>Car</code>, <code>Plane</code>, и <code>Boat</code> могут рассматриваться как <code>Vehicle</code>, и каждый объект может по-своему реализовать метод <code>Move</code>. Код VBA также может сделать это с помощью интерфейсов. В большинстве случаев <strong>вы сами определяете степень ограниченности VBA</strong>.</p><p style="text-align: justify;">Среди полезных вещей, которыми не располагает VBA, мы обнаружим <i>отражение</i>:
возможность писать код, который исследует сам себя – например, найти в библиотеке типов проекта VBA отдельный тип <code>Enum</code> и сохранить имена членов и соответствующих значений в словаре. Отражение возможно в .NET посредством подробной системы типов, которой не располагает VBA: написание соответствующего API для VBA не является невозможным, но требует глубоких знаний о том, как работают пользовательский код и типы VBA, и доступа к внутренним указателям структур данных COM. Отражение - крайне мощное средство, за которое надо платить: обычно его избегают в тех местах, где важна производительность. <br /></p><p>VBA не поддерживает <em>делегаты</em>, и не рассматривает функции как объекты первого класса: нельзя передать <em>функцию</em> в другую процедуру VBA; вместо этого передаётся <em>результат</em> функции. Из-за этого трудно реализовать, к примеру, структуры данных, для которых можно использовать запросы и/или фильтры: для запросов и фильтрации нужны явные циклы,
что делает код более многословным по сравнению с аналогом на C# или
VB.NET, где подобные вещи могут быть выполнены с помощью LINQ или другой современной технологии. Однако <em>лямбда-выражения </em>в Java появились относительно недавно, и популярность Java в их отсутствие не снижалась десятки лет – делегаты .NET невероятно полезный инструмент, но можно прекрасно справиться и без него, хотя код будет чуть более многословным. И знаете что? Модный код LINQ может быть очень элегантным (при правильном использовании… но <em>также</em> может быть кошмарным), однако программисты .NET стараются избегать его в местах, где важна скорость.</p><p>Обработка ошибок VBA связана с глобальным состоянием и операторами <code>On Error</code>, которые по сути задают условные переходы <code>GoTo</code>. В других языках есть <em>исключения</em> и блоки <code>try</code>/<code>catch</code>… которые по сути задают условные переходы <code>GoTo</code>. Конечно, исключения замечательны и <em>могут</em> упростить обработку ошибок. Но это не серебряная пуля, многие “настоящие программисты” используют их для управления потоком выполнения или просто <em>глотают </em>их и двигаются дальше… плохая обработка исключений на любом языке ничем не лучше плохой обработки ошибок на VBA.</p><p>Своей репутацией VBA и VB6 как язык, <em>также</em> и, возможно, <em>главным образом</em>, обязан редактору Visual Basic (VBE). VBE как среда разработки (IDE) просто не поддерживается на должном уровне, и была… практически заброшена. На Stack Overflow есть закрытый <a href="https://stackoverflow.com/q/12725195/1188513" target="_blank">вопрос </a> о наличии <em>средств рефакторинга</em> для VBA. Самый популярный ответ-пинок старому редактору сообщал, что единственным известным рефакторингом является поиск/замена (Ctrl+H). Кажется, что <em>сам</em> <em>редактор </em>активно <em>препятствует</em> написанию полноценного объектно-ориентированного кода VBA, или просто хорошо читаемого кода: все классы валяются в единственной папке “Class Modules” с алфавитной сортировкой… так что вы прибегаете к причудливым схемам именования, чтобы сделать визуальную группировку по функционалу. Возможно, вы уже поиграли с
интерфейсами, но их кодирование (т.е. <em>абстракций</em>, а не конкретных типов; <em>принцип инверсии зависимостей</em>)
делает невозможным переход к фактическому коду, реализующему интерфейс. Нет встроенной поддержки модульных тестов и фиктивной реализации, нет рефакторинга, нет статического анализа кода, метрик кода, …список можно продолжать бесконечно. <br /></p>
<p>У языка <em>есть </em>мелкие раздражающие недостатки (как и у всех языков), у некоторых повсеместно используемых библиотек типов (наподобие Excel) <em style="box-sizing: inherit;">есть</em> свои раздражающие моменты – но это не повод обвинять VBA <em style="box-sizing: inherit;">как язык</em> за особенности некоторых библиотек типов, даже разработанных Microsoft.</p>
<p>С VBA всё в порядке. <span style="box-sizing: inherit; font-weight: 700;">А вот с редактором Visual Basic нет</span>. Если бы только была надстройка VBIDE, которая сделала бы работу с VBA приятнее…</p>En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-74772024591182999652020-04-07T16:41:00.000+05:002020-04-07T16:41:14.082+05:00Работа из дома<div dir="ltr" style="text-align: left;" trbidi="on">
Автор: Эрик Липперт.<br />
Источник: <a href="https://ericlippert.com/2020/03/20/working-from-home/" target="_blank">Working from home</a><br />
<br />
<div data-adtags-visited="true">
Всем пятничный привет и добро пожаловать на выпуск FAIC, посвящённый работе из дома и тщательному мытью рук!</div>
<div data-adtags-visited="true">
Я пишу сегодня из своей недавно оборудованной комнаты, которая превратилась в мой офис. Scott Hanselman начал <a href="https://twitter.com/shanselman/status/1240481950357315584" target="_blank">в Twitter замечательную демонстрацию домашних рабочих мест</a>; вот мой скромный вклад.<a name='more'></a><br />
<div data-adtags-visited="true">
<img alt="20200320_113545.jpg" class="alignnone size-full wp-image-6763" data-attachment-id="6763" data-comments-opened="1" data-image-description="" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="20200320_113545" data-large-file="https://ericlippert.files.wordpress.com/2020/03/20200320_113545.jpg?w=584" data-medium-file="https://ericlippert.files.wordpress.com/2020/03/20200320_113545.jpg?w=300" data-orig-file="https://ericlippert.files.wordpress.com/2020/03/20200320_113545.jpg" data-orig-size="679,509" data-permalink="https://ericlippert.com/2020/03/20/working-from-home/20200320_113545/" sizes="(max-width: 584px) 100vw, 584px" src="https://ericlippert.files.wordpress.com/2020/03/20200320_113545.jpg?w=584" srcset="https://ericlippert.files.wordpress.com/2020/03/20200320_113545.jpg?w=584 584w, https://ericlippert.files.wordpress.com/2020/03/20200320_113545.jpg?w=150 150w, https://ericlippert.files.wordpress.com/2020/03/20200320_113545.jpg?w=300 300w, https://ericlippert.files.wordpress.com/2020/03/20200320_113545.jpg 679w" /></div>
<div data-adtags-visited="true">
Здесь мой рабочий Mac, соединённый с двумя небольшими мониторами HP, один из которых достался мне всего за $20 в магазине недорогой техники. Под столом игровой компьютер с Windows. Можно заметить, что я наконец нашёл применение своей книге о VSTO 2007. Клавиатура новое издание Microsoft Natural; первоначальная клавиатура Natural осталась на работе и сейчас недоступна.</div>
<div data-adtags-visited="true">
Особенно приятно то, как появился этот стол. Для его изготовления я использовал доски забора из 110-летнего кедра. Когда я купил свой дом в 1997 г., в заднем дворе был упавший забор. Я разобрал его, убрал гвозди, высушил доски, обстрогал их и, как обычно делаю, придал им форму. Из этих досок я мастерил разные вещи, а этот проект был последним.</div>
<div data-adtags-visited="true">
Вот улучшенный снимок стола.</div>
<div data-adtags-visited="true">
<img alt="IMG_9633" class="alignnone size-full wp-image-6794" data-attachment-id="6794" data-comments-opened="1" data-image-description="" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="IMG_9633" data-large-file="https://ericlippert.files.wordpress.com/2020/03/img_9633-e1585072991175.jpg?w=584" data-medium-file="https://ericlippert.files.wordpress.com/2020/03/img_9633-e1585072991175.jpg?w=300" data-orig-file="https://ericlippert.files.wordpress.com/2020/03/img_9633-e1585072991175.jpg" data-orig-size="4648,3960" data-permalink="https://ericlippert.com/2020/03/20/working-from-home/img_9633/" sizes="(max-width: 584px) 100vw, 584px" src="https://ericlippert.files.wordpress.com/2020/03/img_9633-e1585072991175.jpg?w=584" srcset="https://ericlippert.files.wordpress.com/2020/03/img_9633-e1585072991175.jpg?w=584 584w, https://ericlippert.files.wordpress.com/2020/03/img_9633-e1585072991175.jpg?w=1168 1168w, https://ericlippert.files.wordpress.com/2020/03/img_9633-e1585072991175.jpg?w=150 150w, https://ericlippert.files.wordpress.com/2020/03/img_9633-e1585072991175.jpg?w=300 300w, https://ericlippert.files.wordpress.com/2020/03/img_9633-e1585072991175.jpg?w=768 768w, https://ericlippert.files.wordpress.com/2020/03/img_9633-e1585072991175.jpg?w=1024 1024w" /></div>
<div data-adtags-visited="true">
Конструкция моя собственная: это просто стол для конкретной миссии. Все соединения выполнены посредством шкантов и клея; из металлических деталей только два винта, которыми крепятся ручки двух выдвижных ящиков. Отделка: датское масло с добавлением льняного масла.</div>
<div data-adtags-visited="true">
Справа маленький письменный стол:</div>
<div data-adtags-visited="true">
<img alt="20200320_123025.jpg" class="alignnone size-full wp-image-6765" data-attachment-id="6765" data-comments-opened="1" data-image-description="" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="20200320_123025" data-large-file="https://ericlippert.files.wordpress.com/2020/03/20200320_123025.jpg?w=584" data-medium-file="https://ericlippert.files.wordpress.com/2020/03/20200320_123025.jpg?w=300" data-orig-file="https://ericlippert.files.wordpress.com/2020/03/20200320_123025.jpg" data-orig-size="679,509" data-permalink="https://ericlippert.com/2020/03/20/working-from-home/20200320_123025/" sizes="(max-width: 584px) 100vw, 584px" src="https://ericlippert.files.wordpress.com/2020/03/20200320_123025.jpg?w=584" srcset="https://ericlippert.files.wordpress.com/2020/03/20200320_123025.jpg?w=584 584w, https://ericlippert.files.wordpress.com/2020/03/20200320_123025.jpg?w=150 150w, https://ericlippert.files.wordpress.com/2020/03/20200320_123025.jpg?w=300 300w, https://ericlippert.files.wordpress.com/2020/03/20200320_123025.jpg 679w" /></div>
<div data-adtags-visited="true">
Возможно, вы догадались, что это швейная машина Kenmore Zigzag 1954 г.:</div>
<div data-adtags-visited="true">
<img alt="20200320_113944.jpg" class="alignnone size-full wp-image-6760" data-attachment-id="6760" data-comments-opened="1" data-image-description="" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="20200320_113944" data-large-file="https://ericlippert.files.wordpress.com/2020/03/20200320_113944.jpg?w=584" data-medium-file="https://ericlippert.files.wordpress.com/2020/03/20200320_113944.jpg?w=300" data-orig-file="https://ericlippert.files.wordpress.com/2020/03/20200320_113944.jpg" data-orig-size="744,558" data-permalink="https://ericlippert.com/2020/03/20/working-from-home/20200320_113944/" sizes="(max-width: 584px) 100vw, 584px" src="https://ericlippert.files.wordpress.com/2020/03/20200320_113944.jpg?w=584" srcset="https://ericlippert.files.wordpress.com/2020/03/20200320_113944.jpg?w=584 584w, https://ericlippert.files.wordpress.com/2020/03/20200320_113944.jpg?w=150 150w, https://ericlippert.files.wordpress.com/2020/03/20200320_113944.jpg?w=300 300w, https://ericlippert.files.wordpress.com/2020/03/20200320_113944.jpg 744w" /></div>
<div data-adtags-visited="true">
Раньше я шил на ней воздушных змеев и могу вернуться к этому занятию.</div>
<div data-adtags-visited="true">
Руководство к этой машине непреднамеренно весёлое, но это хорошая тема для другого раза.</div>
<div data-adtags-visited="true">
За кадром остались детали уюта: софа и растения.</div>
<div data-adtags-visited="true">
Будьте здоровы и не переключайтесь.</div>
</div>
</div>
En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-42938524674131774792018-08-19T22:31:00.001+05:002018-08-20T14:55:34.104+05:00У меня 24-ядерный процессор, но я не могу написать письмо. Часть первая<div dir="ltr" style="text-align: left;" trbidi="on">
Автор: Брюс Доусон.<br />
Источник: <a href="https://randomascii.wordpress.com/2018/08/16/24-core-cpu-and-i-cant-type-an-email-part-one/" rel="bookmark" target="_blank">24-core CPU and I can’t type an email (part one)</a>.<br />
<br />
Я не искал неприятность. Я не пытался собирать Chrome <a href="https://randomascii.wordpress.com/2017/07/09/24-core-cpu-and-i-cant-move-my-mouse/">тысячи раз в неделю</a>, а просто занимался самой обычной задачей 21 века, писал электронное письмо в 10:30. Внезапно gmail "повис". Я продолжал печатать, но несколько секунд на экране не появлялось никаких символов. Затем gmail "ожил", и я продолжил писать <em>очень важное</em> письмо. Потом это повторилось, только в этот раз gmail не подавал признаков жизни дольше. <a href="https://quoteinvestigator.com/2015/03/02/eureka-funny/">Это забавно</a>…<br />
<a name='more'></a><br />
Мне трудно устоять перед хорошей загадкой производительности, но в этом случае тяга к расследованию была особенно сильной. Я работаю над Chrome для Windows с прицелом на производительность. Расследование этого зависания и было моей <em>работой</em>. После множества фальстартов и значительных усилий я выяснил, как Chrome, gmail, Windows и наше IT-подразделение вместе не давали мне набирать текст письма, а также нашёл способ сэкономить существеный объём памяти для некоторых веб-страниц в Chrome.<br />
<span id="more-2858"></span><br />
В этом расследовании было столько кроличьих нор, что я приберегу некоторые отступления для следующей записи, а сейчас я сосредоточусь исключительно на зависаниях.<br />
<br />
Как обычно, у меня фоново работал <a href="https://randomascii.wordpress.com/2015/09/01/xperf-basics-recording-a-trace-the-ultimate-easy-way/">UIforETW</a> с записью в циклические буферы, поэтому мне понадобилось только нажать Ctrl+Win+R, чтобы данные за последние тридцать секунд активности системы были сохранены на диск. Я загрузил их в <a href="https://randomascii.wordpress.com/2012/06/19/wpaxperf-trace-analysis-reimagined/">Windows Performance Analyzer</a> (WPA), однако не мог найти зависание.<br />
<br />
Когда программа для Windows перестаёт обрабатывать сообщения, ETW создаёт события, указывающие, <a href="https://randomascii.wordpress.com/2012/05/05/xperf-wait-analysisfinding-idle-time/">где именно это произошло</a>, так что подобные зависания найти легко. Но Chrome продолжал обрабатывать сообщения. Я искал момент времени, в который ключевые потоки Chrome были заняты или бездействовали, но не нашёл ничего убедительного. Было несколько моментов, когда Chrome <em>главным образом</em> бездействовал, но даже тогда все ключевые потоки продолжали работать, поэтому не было определённости с местом зависания – Chrome бездействовал, потому что ничего не происходило:<br />
<br />
<a href="https://randomascii.files.wordpress.com/2018/08/image.png"><img alt="image" border="0" height="182" src="https://randomascii.files.wordpress.com/2018/08/image_thumb.png?w=624&h=182" style="background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="624" /></a><br />
<a href="https://randomascii.files.wordpress.com/2018/08/image1.png"><img align="right" alt="image" border="0" height="202" src="https://randomascii.files.wordpress.com/2018/08/image_thumb1.png?w=163&h=202" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 3px 3px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="163" /></a><br />
UIforETW располагает встроенным средством отслеживания нажатий клавиш, что полезно при определении ключевых моментов. Тем не менее, в целях безопасности по умолчанию каждая цифра заменяется на ‘1’, а каждая буква - на ‘A’. Это осложнило поиск точного момента времени зависания, поэтому я поменял режим отслеживания ввода с “Private” на “Full” и ждал зависания. На следующий день около 10:30 зависание повторилось. Я сохранил содержимое буферов и вставил данные в UIforETW:<br />
<blockquote>
Я набирал текст “defer to those with more scuba experience”, и gmail "завис" в конце слова “those” и частично "очнулся" к слову “experience”. Вкладка gmail с PID 27368.</blockquote>
Обычное обсуждение <a href="https://randomascii.wordpress.com/2017/05/01/commute-challenge-2017/">способов добираться</a> на работу, гораздо важнее то, что теперь можно найти зависание в трассировке ETW. Я загрузил трассировку, посмотрел на клавиатурные данные в поле Generic Events (события генерируются UIforETW, каждому из них соответствует пурпурный ромб на иллюстрации ниже) и смог точно увидеть, где было зависание, это на 100% коррелировало с провалом в использовании процессора:<br />
<br />
<a href="https://randomascii.files.wordpress.com/2018/08/image2.png"><img alt="image" border="0" height="460" src="https://randomascii.files.wordpress.com/2018/08/image_thumb2.png?w=635&h=460" style="background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="635" /></a><br />
<br />
Хорошо, но почему Chrome прекратил работать? На иллюстрациях не видно, что в этот момент <a href="https://docs.microsoft.com/en-us/windows/desktop/wmisdk/wmi-start-page">WmiPrvSE.exe</a> занимал целый поток процессора. Но это не должно иметь значения. У моей машины 24 ядра/48 потоков, так что в случае использования одного потока она простаивает на 98%.<br />
<br />
Затем я сделал детализацию периода, когда Chrome бездействовал, и обратил внимание на CrRendererMain в chrome.exe (27368), процессе вкладки gmail.<br />
<blockquote>
Я хочу поблагодарить <a href="https://randomascii.wordpress.com/2015/10/26/thread-naming-in-windows-time-for-something-better/">себя за то, что в 2015 году</a> попросил Microsoft улучшить механизмы именования потоков, поблагодарить Microsoft за выполнение всех моих пожеланий – имена потоков в WPA <em>великолепны</em>!</blockquote>
Ситуация прояснилась. Во время зависания длительностью 2,81 с этот поток был запланирован и выполнялся 440 раз. Обычно выполнения с интервалом 6 мс достаточно, чтобы сделать программу отзывчивой, но по какой-то причине это не помогло. Я заметил, что при каждом пробуждении стек не менялся. Упрощённо это выглядело так:<br />
<blockquote>
chrome_child.dll (stack base)<br />
KernelBase.dll!VirtualAlloc<br />
ntoskrnl.exe!MiCommitVadCfgBits<br />
ntoskrnl.exe!MiPopulateCfgBitMap<br />
ntoskrnl.exe!ExAcquirePushLockExclusiveEx<br />
ntoskrnl.exe!KeWaitForSingleObject (stack leaf)</blockquote>
Chrome вызывает функцию VirtualAlloc, которая пытается обновить некие “CfgBits” и получить блокировку. Сначала я предположил, что Chrome вызывал VirtualAlloc 440 раз; это выглядело странно, но в действительности всё было более странным. Chrome вызвал VirtualAlloc один раз и должен был получить блокировку. Chrome получил уведомление о доступности блокировки, но – 439 раз подряд – когда Chrome пробуждался и пытался получить её, она была недоступна. Блокировка был получена процессом, который только что освободил её.<br />
<br />
Это связано с тем, что блокировки Windows спроектированы <a href="http://joeduffyblog.com/2006/12/14/anticonvoy-locks-in-windows-server-2003-sp1-and-windows-vista/">недостаточно чисто</a>, и если поток освобождает блокировку и затем сразу пытается получить её, то он может, как в данном случае, благополучно получать её каждый раз. Голод. Подробнее в следующий раз.<br />
<br />
В <em>каждом</em> случае процессом, который уведомил Chrome о доступности блокировки, был WmiPrvSE.exe:<br />
<blockquote>
ntoskrnl.exe!KiSystemServiceCopyEnd (stack base)<br />
ntoskrnl.exe!NtQueryVirtualMemory<br />
ntoskrnl.exe!MmQueryVirtualMemory<br />
ntoskrnl.exe!MiUnlockAndDereferenceVad<br />
ntoskrnl.exe!ExfTryToWakePushLock (stack leaf)</blockquote>
WMI сбил меня с толку (подробнее об этом в следующий раз), но в конечном счёте я написал программу, чтобы воспроизвести поведение WMI. У меня был набор данных, который показал, на что тратил своё время процесс WmiPrvSE.exe (с небольшими правками и упрощениями):<br />
<blockquote>
WmiPerfClass.dll!EnumSelectCounterObjects (stack base)<br />
WmiPerfClass.dll!ConvertCounterPath<br />
pdh.dll!PdhiTranslateCounter<br />
pdh.dll!GetSystemPerfData<br />
KernelBase.dll!blah-blah-blah<br />
advapi32.dll!blah-blah-blah<br />
perfproc.dll!blah-blah-blah<br />
perfproc.dll!GetProcessVaData<br />
ntdll.dll!NtQueryVirtualMemory<br />
ntoskrnl.exe!NtQueryVirtualMemory<br />
ntoskrnl.exe!MmQueryVirtualMemory<br />
ntoskrnl.exe!MiQueryAddressSpan<br />
ntoskrnl.exe!MiQueryAddressState<br />
ntoskrnl.exe!MiGetNextPageTable (stack leaf)</blockquote>
Воспроизвести медленное сканирование по набору данных оказалось довольно легко. Интересной частью вышеприведённого стека является функция <em>NtQueryVirtualMemory</em>, которая используется для сканирования памяти процесса и вызывается функцией с говорящим именем <em>GetProcessVaData</em>, где <em>Va</em>, вероятно означает<em> Virtual Address</em>. Моя программа VirtualScan просто циклически вызывала <em>NtQueryVirtualMemory</em>, чтобы сканировать адресное пространство заданного процесса, код работал, сканирование процесса gmail действительно затянулось (10-15 секунд) и спровоцировало зависание. Но почему?<br />
<br />
Преимущество в написании собственной программы было в том, что я мог начать генерировать статистические данные. <a href="https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/ntifs/nf-ntifs-ntqueryvirtualmemory"><em>NtQueryVirtualMemory</em></a> возвращает данные о каждом диапазоне адресного пространства с указанными атрибутами (все зарезервированные, все выделенные с конкретными настройками безопасности и т.д.). Процессу gmail принадлежало около 26 000 блоков, но я нашёл другой процесс (как оказалось, <a href="https://randomascii.wordpress.com/2012/06/19/wpaxperf-trace-analysis-reimagined/">WPA</a>), у которого было 16 000 блоков памяти, которые сканировались очень быстро.<br />
<br />
В какой-то момент я посмотрел на процесс gmail в программе <a href="https://docs.microsoft.com/en-us/sysinternals/downloads/vmmap">vmmap</a> и заметил, что у него значительное количество памяти (361 836 КБ) и множество отдельных блоков (49 719) в категории Shareable – резерв размером 2 147 483 648 КБ, т.е. 2 ТБ. Что?<br />
<br />
<a href="https://randomascii.files.wordpress.com/2018/08/image4.png"><img alt="image" border="0" height="225" src="https://randomascii.files.wordpress.com/2018/08/image_thumb4.png?w=585&h=225" style="background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="585" /></a><br />
<br />
Я случайно знал, что 2 ТБ резервируется для <a href="http://www.alex-ionescu.com/?p=246">защиты потока управления</a> (CFG) и вспомнил, что “CFG” встречалось в стеке вызовов, когда процесс gmail Chrome был в состоянии ожидания – <em>MiCommitVadCfgBits</em>. Может, проблема в большом количестве блоков в области CFG!<br />
<br />
Защита потока управления (CFG) используется для борьбы с эксплойтами. Резерв размером 2 ТБ - это разреженный битовый массив, который показывает, какие адреса (в 128 ТБ адресного пространства пользовательского режима) являются допустимыми целями косвенных вызовов. Я добавил в свой сканер виртуальной памяти подсчёт блоков области CFG (простой поиск 2 зарезервированных ТБ) и блоков исполняемой памяти. Поскольку память CFG используется для <em>описания</em> исполняемой памяти, то я ожидал увидеть по одному блоку памяти CFG для каждого блока исполняемой памяти процесса. Вместо этого я увидел 98 блоков исполняемой памяти и <em>24 866</em> блоков выделенной памяти CFG. Значительное расхождение:<br />
<br />
<span style="font-family: "courier new";"> Scan time, Committed, page tables, committed blocks<br /> Total: 41.763s, 1457.7 MiB, 67.7 MiB, 32112, 98 code blocks<br /> CFG: 41.759s, 353.3 MiB, 59.2 MiB, 24866</span><br />
<blockquote>
vmmap показывает зарезервированную и выделенную память как блоки, а мой сканирующий инструмент считает лишь выделенные блоки, поэтому vmmap показывает 49 684 блока, а моя программа - 24 866</blockquote>
В ретроспективе это очевидно, но что если битовый массив CFG никогда не очищается? Что если память CFG выделяется при выделении исполняемой памяти, но не освобождается при освобождении исполняемой памяти. Это могло бы объяснить такое поведение.<br />
<h2>
Воспроизведение от и до</h2>
Следующим шагом стало написание программы VAllocStress, которая выделяет и освобождает тысячи блоков исполняемой памяти со случайными адресами. Эта программа должна быть 64-разрядной и поддерживать CFG. После выделения и освобождения множества блоков исполняемой памяти эта программа должна в цикле пытаться выделить/освободить дополнительную исполняемую память и заметить, когда это делается медленно. Вот мой алгоритм для VAllocStress:<br />
<ol>
<li>Много раз в цикле: <ol>
<li>Выделить посредством VirtualAlloc некоторый объём исполняемой памяти со случайным адресом </li>
<li>Освободить память</li>
</ol>
</li>
<li>Затем в бесконечном цикле: <ol>
<li>"Поспать" 500 мс (не хочу "объедать" процессор)</li>
<li>Выделить посредством VirtualAlloc исполняемую память с постоянным адресом</li>
<li>Напечатать сообщение, если вызов VirtualAlloc занимает более 500 мс</li>
<li>Освободить память</li>
</ol>
</li>
</ol>
Вот и всё. Это очень просто. Работа программы дала огромное удовлетворение. Я просканировал процесс VAllocStress программой VirtualScan. Я быстро получил подтверждение ужасной фрагментации блока CFG, и сканирование продолжалось <em>долго</em>. Моя программа VAllocStress "висела" во время сканирования!<br />
<br />
К этому моменту я сымитировал фрагментацию CFG, длительное сканирование и зависание. Ура!<br />
<h2>
Первопричина</h2>
Оказалось, что у v8 (движок JavaScript в Chrome) есть объекты CodeRange для управления кодогенерацией, и каждый объект CodeRange ограничен <a href="https://cs.chromium.org/chromium/src/v8/src/globals.h?q=kMaximalCodeRangeSize&dr=CSs&l=182">диапазоном адресов в 128 МБ</a>. Он должен быть небольшим во избежание безудержного выделения памяти CFG.<br />
<br />
Но что если у вас много объектов CodeRange, для которых выделяется и затем освобождается память со случайными адресами? Я сделал конструктор CodeRange, оставил gmail запущенным, и нашёл дымящийся пистолет. Каждую пару минут создавался (и разрушался) новый объект CodeRange. В отладчике было легко найти, что эти объекты выделяет WorkerThread::Start, и вдруг всё стало ясно:<br />
<ol>
<li>gmail использует <a href="https://developers.google.com/web/fundamentals/codelabs/offline/">служебные сценарии</a>, возможно, для режима офлайн</li>
<li>Они появляются и исчезают с интервалом в несколько минут, потому что так работают служебные сценарии</li>
<li>Каждый рабочий поток получает временный объект CodeRange, который выделяет для откомпилированного кода JavaScript несколько исполняемых страниц в случайном месте 47-разрядного адресного пространства</li>
<li>2 ТБ памяти, зарезервированной для CFG, получает несколько записей при каждом выделении страниц для кода</li>
<li>Память, выделенная для CFG, не освобождается</li>
<li>NtQueryVirtualMemory <em>мучительно</em> медленно сканирует память CFG (около 1 мс на блок) по непонятным причинам</li>
</ol>
Медленное сканирование памяти CFG устранено в Windows 10 RS4 (April 2018 Update), что заставило меня предположить, не было ли расследование бессмысленным. Не было.<br />
<h2>
Память</h2>
Резерв CFG начинается с резервирования адресов – память не выделяется. По мере того как выделяются исполняемые страницы, части резерва CFG превращаются в выделенную память, используя действительные страницы памяти. Эти страницы не освобождаются. При выделении и освобождении блоков исполняемой памяти со случайным расположением область CFG вырастет до произвольного размера! Это не совсем так. Блок памяти CFG лучше представлять себе как кэш ограниченного размера. Однако это мало утешает, когда его размер составляет <a href="https://twitter.com/BruceDawson0xB/status/1029433717670871040">2 ТБ на процесс</a>!<br />
<br />
Худшее, из того, что я видел: вкладка gmail была открыта восемь дней и накопила 353,3 МБ памяти CFG и 59,2 МБ страничных таблиц для проецирования памяти, в сумме потеряно 400 МБ. По некоторым причинам большинство людей, в отличие от меня, сталкиваются с более слабыми симптомами либо не видят их.<br />
<h2>
Решение</h2>
Команда v8 (движок JavaScript в Chrome) теперь <a href="https://chromium-review.googlesource.com/c/v8/v8/+/1174837" target="_blank">повторно использует адреса для объектов CodeRange</a>, что позволит обойти эту проблему. Microsoft уже решила свои проблемы производительности при сканировании памяти CFG. Может, когда-нибудь Microsoft будет освобождать области CFG при освобождении исполняемой памяти, по крайней мере в простых случаях, когда освобождаются большие диапазоны адресов. Было сообщено об ошибке vmmap.<br />
<br />
Большинство моих коллег и наших пользователей не сталкивалось с проблемой. Я заметил её только по следующим причинам:<br />
<ul>
<li>Я использовал gmail офлайн</li>
<li>У меня была старая версия Windows 10</li>
<li>Наше IT-подразделение регулярно сканирует компьютеры средствами WMI</li>
<li>Я обратил внимание</li>
<li>Мне повезло</li>
</ul>
Кажется маловероятным то, что как один из наиболее квалифицированных людей для диагностирования проблемы, я первым заметил её. Если бы не были выполнены какие-либо из вышеприведённых условий, то я бы не столкнулся с зависанием, и не были бы обнаружены связанные с этим потери памяти.<br />
<br />
Кстати, зависание происходило в 10:30, потому что именно в это время наше IT-подразделение запускает сканирование с целью инвентаризации. Для запуска сканирования вручную надо нажать кнопку "Run Now" здесь: Control Panel | Configuration Manager | Actions | Select ‘Hardware Inventory Cycle’.<br />
<br />
<a href="https://randomascii.files.wordpress.com/2018/08/clip_image002.png"><img alt="clip_image002" border="0" height="331" src="https://randomascii.files.wordpress.com/2018/08/clip_image002_thumb.png?w=546&h=331" style="background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image002" width="546" /></a><br />
<h2>
Исходный код</h2>
Если вы хотите поиграться самостоятельно, то можете воспользоваться <a href="https://github.com/randomascii/blogstuff/tree/master/cfg">исходным кодом VAllocStress и VirtualScan</a>.<br />
<h2>
Кроличьи норы</h2>
Расследование включало <em>множество</em> кроличьих нор. Одни были важными (страничные таблицы), другие - поучительными (блокировки), а третьи были напрасной тратой времени (WMI). Мы поговорим об этом, а также об ошибке vmmap, в следующей записи. Если вам нужны кровавые подробности – некоторые из них оказались неверными или не относящимися к делу – полное расследование находится на <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=870054" target="_blank">crbug.com/870054</a>.<br />
<br />
<a href="https://news.ycombinator.com/item?id=17780127" target="_blank">Обсуждение на Hacker news</a><br />
<br />
<a href="https://www.reddit.com/r/programming/comments/97zy08/24core_cpu_and_i_cant_type_an_email_part_one/" target="_blank">Обсуждение на Reddit</a></div>
En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-2515721497457304112018-01-08T14:21:00.000+05:002018-08-20T14:55:11.379+05:00Новый ноутбук<div dir="ltr" style="text-align: left;" trbidi="on">
Автор: Брюс Доусон.<br />
Источник: <a href="https://randomascii.wordpress.com/2017/06/26/the-spoils-of-law-moores-law-a-new-laptop/" rel="bookmark">The Spoils of Law (Moore’s Law)–a New Laptop</a><br />
<br />
Я только что получил новый ноутбук (Lenovo P51, четыре ядра, 8 потоков, 32 ГБ ОЗУ, поддержка нескольких дисков). Моей старой машине более шести лет, так что, возможно, она устарела. Я хотел описать некоторые причины обновления, и сам процесс,.<br />
<a name='more'></a><br />
<br />
Можно подумать, что главной причиной обновления шестилетнего ноутбука стало оборудование. Больше, быстрее и т.д., но оказалось, что больше повлияло программное обеспечение.<br />
<br />
<br />
DVD-привод сломался (но я никогда не пользовался им), устройство чтения карт SD сломалось (так что я купил адаптер), а батарея стала слабовата (я уже менял её и мог бы заменить повторно). Пожалуй, самой большой аппаратной проблемой был максимальный объём ОЗУ 8 ГБ, которого на сегодня маловато.<br />
<br />
<br />
Между тем, на программной стороне… Я обновился с Windows 7 до Windows 10, потому что мне как разработчику нужна последняя версия операционной системы. К несчастью, адаптер Wi-Fi от Intel не был совместим с Windows 10. Когда я сообщил о пятисекундных "подвисаниях" <a href="https://twitter.com/BruceDawson0xB/status/841725129956577280">в Intel, они сказали "неизлечимо"</a>. Несовместимость гибридного набора GPU с Windows 10 привела к мерцанию и <a href="https://www.youtube.com/watch?v=ZyyEOKOFqQg">случайным эпилептическим припадкам</a>. Мне до сих пор непонятно, почему "Помощник по обновлению" не предупредил меня об этих проблемах. Неудивительно, что у многих пользователей появились проблемы после обновления.<br />
<br />
У моего ноутбука также была давняя ошибка драйвера, из-за которой <i>иногда</i> при закрытии крышки не выполнялся переход в спящий режим. Если я замечал это и открывал, затем закрывал крышку снова, тогда он успешно отправлялся спать. Если я не замечал этого, драйвер по истечении таймаута выключал машину. Я так и не выяснил, какой драйвер был виновником – просто жил с этим шесть лет.<br />
<br />
Обновление до Windows 10 на старом ноутбуке также привнесло несколько мелких дефектов. Сочетание клавиш Ctrl+Backspace не работало в командной строке, Windows Live Photo gallery валилась при вызове контекстного меню, если было выделено несколько изображений, таймаут экрана блокировки нельзя было настроить отдельно от периода отключения экрана и т.д. Повторю – процесс обновления до Windows 10 был сделан плохо, особенно для тех вещей, которые касались множества членов моей семьи.<br />
<br />
Покупка нового ноутбука решила аппаратно-программные вопросы и дала мне шесть лет "железного" прогресса, хотя не такого волнующего, как я ожидал. <br />
<h4>
Улучшения "железа"?</h4>
Самый большой выигрыш был в переходе от 8 до 32 ГБ ОЗУ, а при необходимости можно увеличить объём памяти до 64 ГБ. Ура!<br />
<br />
<a href="https://randomascii.files.wordpress.com/2017/06/image1.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="264" data-original-width="398" height="212" src="https://randomascii.files.wordpress.com/2017/06/image1.png" width="320" /></a>Но я думал, закон Мура мог бы сделать для меня больше. Мой новый процессор быстрее (более высокая частота и лучшая микроархитектура, возможно, вдвое быстрее?), но не столь заметно. В то время как я надеялся, что за это время количество ядер увеличится, в действительности это был борьба за то, чтобы не уменьшать их! Я купил 4-ядерный ноутбук с Hyper-Threading в 2011 г., а теперь, похоже, это сделать <i>гораздо</i> сложнее. 2-ядерных ноутбуков недостаточно (вам понадобится одно ядро для антивируса, другое для драйвера GPU и хотя бы ещё одно для игрушек), поэтому я опечален тем, что это до сих пор типичная конфигурация. Так что ядра стали быстрее, но их количество то же, что и шесть лет назад. <br />
<br />
<br />
Частью обновления стали 2 новеньких диска SATA SSD по 2 ТБ – вдвое больше прежнего. Я - "хомяк" и люблю, когда все мои файлы под рукой. Обновление SSD было одним из самых больших препятствиий, потому что многие ноутбуки теперь поддерживают лишь диски M.2. Найти диск диск M.2 на 1 ТБ проблема, про 2 ТБ забудьте. Я знаю, что для большинства людей объёма дисков M.2 более чем достаточно, они компактнее, предположительно быстрее, так что я <i>купил его</i>, но это было так печально. В итоге я пришёл к ноутбуку, который может работать с <i>двумя</i> дисками SATA и диском M.2, так что я мог бы заполучить 9 ТБ SSD при желании потратить на это $3400. <br />
<br />
Разрешение экрана осталось тем же (мои глаза не так хороши, чтобы оправдать более 1080p на экране ноутбука), экран стал немного меньше (17-дюймовые ноутбуки редкость, а 15.6” выглядит прилично), и у меня больше нет клавиатуры с подсветкой.<br />
<br />
Эй, он почти на килограмм легче (2,7 кг вместо 3,6 кг) предыдущего "кирпича", так что <i>это</i> конкретный прогресс.<br />
<br />
Поиск новой машины со слотом SATA, с поддержкой большого объёма памяти, с приличным размером экрана, с 4-ядерным процессором был <i>действительно</i> трудным. У меня длинный список ноутбуков, у которых есть всё, кроме чего-то одного (или всё, но с отвратными клавиатурой или экраном), и всего несколько из них удовлетворяют мои потребности. Я полагаю, что у меня странные потребности, но, клянусь, шесть лет назад выбирать ноутбук было легче. <br />
<h4>
Новые драйверные глюки</h4>
Было бы не совсем точно сказать, что покупка нового ноутбука решила проблемы ПО. Я заметил, что Chrome иногда подвисает при выходе из спящего режима. Windows Update не нашёл новых драйверов, поэтому по трассировке событий ETW я определил, что <a href="https://twitter.com/BruceDawson0xB/status/873963749824053249">виновником был драйвер адаптера Wi-Fi от Intel</a> (да, я тоже в шоке). Снимок WPA ниже (с использованием <a href="https://randomascii.wordpress.com/2012/05/05/xperf-wait-analysisfinding-idle-time/">анализа ожидания средствами ETW</a>) показывает, что поток <i>chrome.dll</i>, вызвавший <i>closesocket</i>, завис на 27,852 с. Он возобновил свою работу после получения ответа от стека Wi-Fi (“readied it” в терминах Windows).<br />
<br />
<a href="https://randomascii.files.wordpress.com/2017/06/image3.png"><img alt="image" border="0" src="https://randomascii.files.wordpress.com/2017/06/image_thumb3.png?w=627&h=432" style="background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" /></a><br />
<br />
Я уже знал, что у меня беспроводный адаптер Intel, это же показала и подпись драйвера. Я использовал "Диспетчер устройств" для обновления драйверов Intel, что вызывает некоторые вопросы:<br />
<ul>
<li>Почему Windows Update не нашёл новый драйвер? </li>
<li>Почему Lenovo выпускает ноутбук без последней версии драйвера (появившейся 3 месяцами ранее)? </li>
<li>Какого чёрта этим занимаются <i>обычные</i> люди? Я думал, подобные опыты годятся только для пользователей Linux. </li>
<li>Почему Intel не может сделать нормальное ПО? Как минимум, два глючных драйвера, и неработающий Intel Power Gadget.</li>
</ul>
По крайней мере, мой драйвер Intel не <a href="https://blogs.technet.microsoft.com/markrussinovich/2008/12/30/the-case-of-the-crashed-phone-call/">приводит к "синему экрану",</a> как в некоторых случаях. <br />
<h4>
Настройка</h4>
Новая машина восхитительна, но то ещё "развлечение". Я не смог купить ноутбук с нужным диском SSD, поэтому использовать новинку было нельзя до переноса операционной системы на новый диск (возможно, следовало сделать чистую установку ОС, но это могло оказаться затруднительным). Затем я начал переустанавливать ПО. Только в такой момент осознаёшь, как много ПО используешь регулярно. Некоторые инсталляторы больше не существуют (к счастью, я нашёл архивную копию Windows Live, а Garmin Training Center можно установить посредством xcopy).Большинство из программы были на странных “оптических дисках”, поэтому я воспользовался последним оставшимся приводом DVD, чтобы скопировать их (и архивировать для потомков). Вот список всего ПО, без которого я не могу жить, примерно в том порядке, как я его устанавливал: <br />
<ul>
<li>Chrome </li>
<li>Office 2010 – без необходимости усложнённый процесс миграции Outlook, который всё равно теряет все настройки </li>
<li>VS 2017 – и набор инструментов VS 2015 </li>
<li>Perforce – такой ужас обновлять БД, нет поддержки VS 2017, зато бесплатно </li>
<li><a href="https://github.com/google/UIforETW">UIforETW</a> </li>
<li>Windows Live Photo gallery </li>
<li><a href="https://www.chromium.org/developers/how-tos/get-the-code">Исходники Chromium</a> </li>
<li>SyncToy – для фотографий между домашними компьютерами </li>
<li>Обновление драйвера Wi-Fi </li>
<li>Принтер</li>
<li>WinMerge (Microsoft больше не выпускает WinDiff) </li>
<li>Google drive </li>
<li>Adobe Premiere Elements </li>
<li>Adobe Photoshop Elements </li>
<li>Adobe Lightroom </li>
<li>Удалил Adobe Creative Cloud, чтобы <a href="https://twitter.com/BruceDawson0xB/status/873564442083991552">избавиться от ~11 процессов Adobe</a> </li>
<li><a href="http://www.cygnus-software.com/">Fractal eXtreme</a> </li>
<li>Garmin Training Center – без инсталлятора, xcopy со старой машины </li>
<li>Encarta – мне нравится оффлайн-энциклопедия, не осуждайте! </li>
<li>Visio </li>
<li><a href="https://earth.google.com/download-earth.html">Google Earth Desktop</a> </li>
<li>Google Photos Auto upload (учётная запись, отличная от Google drive) </li>
<li>Family Tree Maker</li>
<li>Удалил Lenovo Companion, OneDrive (несколько), прочий мусор</li>
<li>Обновил Lenovo Settings </li>
<li>Удалил Lenovo Settings</li>
<li>Intel Power Gadget (не работает)</li>
<li>Github Desktop</li>
<li>VsChromium</li>
<li>Camtasia 8</li>
</ul>
Найти все инсталляторы было трудно, зато теперь я заархивировал большинство из них для следующего раза.<br />
<h4>
Самое лучшее</h4>
Я ещё не заморачивался с настройкой распознавателя отпечатков пальцев – не уверен, что доверяю Windows <a href="https://randomascii.files.wordpress.com/2017/06/image5.png"><img align="right" alt="image" border="0" height="155" src="https://randomascii.files.wordpress.com/2017/06/image_thumb5.png?w=247&h=155" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 2px 0px 3px 4px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="247" /></a>Hello и PIN. Мне бы хотелось другое расположение клавиш "home/end/левый ctrl", но клавиатура достаточно хороша.<br />
Куча гигабайт доступной и кэшированной памяти в "Диспетчере задач" делает меня счастливым.<br />
Самое лучшее - время работы батареи. Моя новая игрушка может не такая <a href="https://randomascii.files.wordpress.com/2017/06/image6.png"><img align="left" alt="image" border="0" height="52" src="https://randomascii.files.wordpress.com/2017/06/image_thumb6.png?w=239&h=52" style="background-image: none; border-width: 0px; display: inline; float: left; margin: 3px 3px 0px 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="239" /></a>быстрая, как мечталось, но переход от ~1.5 ч автономной работы к 8-10 ч просто великолепен.<br />
<h4>
Наименее приятное</h4>
Lenovo злоупотребляет функцией UserHardErrorEx для отображения <a href="https://twitter.com/BruceDawson0xB/status/877708743122731008">диалогов с предложениями обновления</a>.<br />
<a href="https://randomascii.files.wordpress.com/2017/06/image7.png"><img align="right" alt="image" border="0" height="89" src="https://randomascii.files.wordpress.com/2017/06/image_thumb7.png?w=271&h=89" style="background-image: none; border-width: 0px; display: inline; float: right; margin: 0px 0px 3px 3px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="271" /></a>По таинственным причинам, которые всё ещё исследуются, у нового ноутбука скорость скачивания по WiFi обычно меняется <a href="https://twitter.com/BruceDawson0xB/status/878139045187997696">от посредственной до ужасной</a>. Lenovo (и, в меньшей степени, Intel) пытаются помочь, но до сих пор это были вариации типа “поменяйте эту настройку или обновите драйвер.” Мне действительно нужен инструмент, который скажет, <i>что не так</i>, чтобы поиск решения был более научным. Я ненавижу ситуации, в которых ETW не очень полезен. По какой-то причине исходящая скорость однообразно хороша и обычно выше входящей скорости!<br />
<br /></div>
En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-4892714769591118872016-07-31T19:51:00.001+05:002016-07-31T19:51:14.679+05:00Почему средствами Windows файл сжимается хуже, чем программой WinZip?<div dir="ltr" style="text-align: left;" trbidi="on">
Автор: Рэймонд Чен.<br />
Оригинал статьи: <a href="https://blogs.msdn.microsoft.com/oldnewthing/20160718-00/?p=93895" target="_blank">When I tell Windows to compress a file, the compression is far worse than I get if I ask WinZip to compress the file; why is that?</a><br />
<br />
Пользователь заметил, что при установке флажка "Сжимать содержимое для экономии места на диске" для очень большого (множество гигабайт) файла сжатие составило 25%. Затем ему понадобилось скопировать файл на USB-накопитель, и он использовал старую копию WinZip для сжатия файла, в результате объём архива составил половину размера исходного файла.<br />
<a name='more'></a><br />
Почему программа 10-летней давности может сжать файлы лучше, чем встроенное сжатие диска Windows 2012? Неужели в команде сжатия NTFS одни ленивые бездельники?<br />
<br />
К прозрачному сжатия файлов NTFS предъявляются совсем другие требования, чем к программе-архиватору WinZip.<br />
<br />
У программ наподобие WinZip нет ограничений по времени: они могут довольно долго анализировать данные, чтобы обеспечить высокую степень сжатия. Кроме того, такие программы выполняют лишь операции вида "Сжать файл полностью" и "Распаковать файл полностью". Если вы хотите прочитать последний байт файла, вам придётся распаковать и выкинуть всё, кроме последнего байта. Если вы хотите перезаписать байт в середине файла, вам надо распаковать его, перезаписать байт, затем сжать всё снова.<br />
<br />
С другой стороны, прозрачное сжатие файлов должно работать в реальном времени. Программы ожидают, что можно считать байт в произвольной позиции файла; они также предполагают, что можно записать байт в произвольной позиции, оставив другие байты неизменёнными. Эти действия должны выполняться за время, близкое к <var>O</var>(1).<br />
<br />
На практике это означает, что исходный файл разбит на части, а каждая из частей сжимается отдельно по алгоритму, балансирующему между скоростью и степенью сжатия. Независимое сжатие каждой части означает, что вы можете распаковывать произвольную часть файла без распаковки других частей. Но, поскольку эти части независимы, нет преимущества избыточности. (Например, если две части одинаковы, они всё равно должны сжиматься отдельно; вторая часть не может сказать: "Я - копия той части.")<br />
<br />
Всё это означает, что прозрачное сжатие файлов должно пожертвовать степенью сжатия ради скорости. Именно поэтому такое сжатие выглядит неважно в сравнении с программой-архиватором, для которой не предъявляются требования к скорости.</div>
En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-70250719744934959372016-07-30T19:39:00.000+05:002016-07-30T19:39:33.043+05:00Существует ли Windows API для IntelliSense?<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="mso-fareast-language: RU;">Автор</span><span lang="EN-US" style="mso-ansi-language: EN-US; mso-fareast-language: RU;">: </span><span style="mso-fareast-language: RU;">Рэймонд</span><span style="mso-ansi-language: EN-US; mso-fareast-language: RU;"> </span><span style="mso-fareast-language: RU;">Чен</span><span lang="EN-US" style="mso-ansi-language: EN-US; mso-fareast-language: RU;">.</span><br />
<div class="MsoNormal">
<span style="mso-fareast-language: RU;">Оригинал</span><span style="mso-ansi-language: EN-US; mso-fareast-language: RU;"> </span><span style="mso-fareast-language: RU;">статьи</span><span lang="EN-US" style="mso-ansi-language: EN-US; mso-fareast-language: RU;">: <a href="https://blogs.msdn.microsoft.com/oldnewthing/20160725-00/?p=93945" target="_blank">Is there a Windows API for IntelliSense?</a></span><br />
</div>
В группу операционных систем поступил вопрос. <br />
<br />
"Мой клиент разрабатывает <a href="https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8" target="_blank">IDE</a> и хочет сделать в ней <a href="https://ru.wikipedia.org/wiki/IntelliSense" target="_blank">IntelliSense</a>. Мы не нашли документации, объясняющей, как это сделать. Есть ли соответствующее API или SDK сторонних производителей?"<br />
<a name='more'></a><br />
IntelliSense не является особенностью операционной системы. Это разновидность вещей, которые называются "бизнес-логикой": часть программы, посвящённая выполнению того, о чём знает лишь сама программа. Операционная система не знает, как работает ваша бизнес-логика; это контролирует сам разработчик<br />
<br />
Windows действительно ничего не знает о синтаксисе C++, Python, Java и любого языка, которые пытается поддерживать ваша IDE. Вашей IDE надо <a href="https://github.com/dotnet/roslyn">обработать языковые конструкции</a> и выяснить типы объектов, а затем предложить соответствующие дополнения. (Это может быть особенно сложно, потому что надо предлагать варианты для кода, который, возможно, ещё синтаксически не корректен.)<br />
<br />
"Как надо поступить при получении заказа на разработку IntelliSense?"<br />
<br />
Давайте посмотрим, как я понимаю это.<br />
<br />
Клиент подписал контракт на разработку IntelliSense, но не имеет представления, с чего начать, и просит Microsoft предоставить API или найти кого-нибудь с готовым решением. <br />
<br />
Видимо, так и получается, когда люди, выросшие на StackOverflow, получают работу.<br />
<br />
Клиенту надо взять чистый лист бумаги и приступить к разработке программного обеспечения.</div>
En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-52851124327406141792015-10-06T21:34:00.000+05:002015-10-06T21:34:18.027+05:00Почему нельзя создать файл, занимающий всё свободное место на диске?<div dir="ltr" style="text-align: left;" trbidi="on">
<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]--><br />
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>RU</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
LatentStyleCount="267">
<w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" Priority="39" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" Name="toc 9"/>
<w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" Priority="10" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" Priority="11" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" Priority="22" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" Priority="59" SemiHidden="false"
UnhideWhenUsed="false" Name="Table Grid"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Обычная таблица";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin-top:0cm;
mso-para-margin-right:0cm;
mso-para-margin-bottom:10.0pt;
mso-para-margin-left:0cm;
line-height:115%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-fareast-language:EN-US;}
</style>
<![endif]-->
<br />
<div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; mso-outline-level: 4;">
<b><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: RU;"></span></b></div>
<div class="MsoNormal">
<span style="mso-fareast-language: RU;">Автор</span><span lang="EN-US" style="mso-ansi-language: EN-US; mso-fareast-language: RU;">: </span><span style="mso-fareast-language: RU;">Рэймонд</span><span style="mso-ansi-language: EN-US; mso-fareast-language: RU;"> </span><span style="mso-fareast-language: RU;">Чен</span><span lang="EN-US" style="mso-ansi-language: EN-US; mso-fareast-language: RU;">.</span></div>
<div class="MsoNormal">
<span style="mso-fareast-language: RU;">Оригинал</span><span style="mso-ansi-language: EN-US; mso-fareast-language: RU;"> </span><span style="mso-fareast-language: RU;">статьи</span><span lang="EN-US" style="mso-ansi-language: EN-US; mso-fareast-language: RU;">: </span><span style="mso-fareast-language: RU;"><a href="http://blogs.msdn.com/b/oldnewthing/archive/2015/09/30/10644697.aspx"><span lang="EN-US" style="mso-ansi-language: EN-US;">Why can't I create a file equal to
the available disk space?</span></a></span></div>
<div class="MsoNormal">
<span lang="EN-US" style="mso-ansi-language: EN-US; mso-fareast-language: RU;"></span></div>
<br />
Пользователь пытался отработать некоторые предельные случаи в своём приложении,
один из них моделировал ситуацию "закончилось место на диске". Это делалось
очень просто: вызвать <code><span lang="EN-US" style="font-size: 10.0pt; mso-ansi-language: EN-US;">Get</span></code><code><span style="font-size: 10.0pt;"></span></code><code><span lang="EN-US" style="font-size: 10.0pt; mso-ansi-language: EN-US;">Disk</span></code><code><span style="font-size: 10.0pt;"></span></code><code><span lang="EN-US" style="font-size: 10.0pt; mso-ansi-language: EN-US;">Free</span></code><code><span style="font-size: 10.0pt;"></span></code><code><span lang="EN-US" style="font-size: 10.0pt; mso-ansi-language: EN-US;">Space</span></code><code><span style="font-size: 10.0pt;"></span></code><code><span lang="EN-US" style="font-size: 10.0pt; mso-ansi-language: EN-US;">Ex</span></code>, чтобы узнать
доступный объём дискового пространства, затем создать файл соответствующего
размера. На одних томах это работало, на других сопровождалось ошибкой "Недостаточно
места на диске." Ошибка появлялась даже в тех случаях, когда другие
программы не работали с диском. Почему<span lang="EN-US" style="mso-ansi-language: EN-US;">? </span><br />
<a name='more'></a><br />
Объём<span style="mso-ansi-language: EN-US;"> </span>дискового<span style="mso-ansi-language: EN-US;"> </span>пространства<span lang="EN-US" style="mso-ansi-language: EN-US;">, </span>необходимый<span style="mso-ansi-language: EN-US;"> </span>для<span style="mso-ansi-language: EN-US;"> </span>создания<span style="mso-ansi-language: EN-US;"> </span>файла<span style="mso-ansi-language: EN-US;"> </span>заданного<span style="mso-ansi-language: EN-US;"> </span>размера<span lang="EN-US" style="mso-ansi-language: EN-US;">, </span>не<span style="mso-ansi-language: EN-US;"> </span>равен<span style="mso-ansi-language: EN-US;"> </span>точному<span style="mso-ansi-language: EN-US;"> </span>количеству<span style="mso-ansi-language: EN-US;"> </span>байт<span style="mso-ansi-language: EN-US;"> </span>в<span style="mso-ansi-language: EN-US;"> </span>файле<span lang="EN-US" style="mso-ansi-language: EN-US;">. </span>Файловой системе надо хранить имя файла, атрибуты безопасности,
различные метки времени, а также сведения о местонахождении всех байт файла на диске.
Есть ещё менее очевидные вещи наподобие изменения записей журнала при создании
файла и <a href="http://blogs.msdn.com/b/oldnewthing/archive/2011/08/16/10195932.aspx">записей
отслеживания объектов для отслеживания ссылок</a>. <br />
Наличие<span style="mso-ansi-language: EN-US;"> </span>на<span style="mso-ansi-language: EN-US;"> </span>томе<span style="mso-ansi-language: EN-US;"> <span lang="EN-US">X </span></span>свободных<span style="mso-ansi-language: EN-US;"> </span>байт<span style="mso-ansi-language: EN-US;"> </span>не<span style="mso-ansi-language: EN-US;"> </span>означает<span lang="EN-US" style="mso-ansi-language: EN-US;">, </span>что<span style="mso-ansi-language: EN-US;"> </span>можно<span style="mso-ansi-language: EN-US;"> </span>создать<span style="mso-ansi-language: EN-US;"> </span>файл<span style="mso-ansi-language: EN-US;"> </span>размером<span style="mso-ansi-language: EN-US;"> <span lang="EN-US">X,
</span></span>потому<span style="mso-ansi-language: EN-US;"> </span>что<span style="mso-ansi-language: EN-US;"> </span>для<span style="mso-ansi-language: EN-US;">
</span>хранения<span style="mso-ansi-language: EN-US;"> </span>метаданных<span style="mso-ansi-language: EN-US;"> </span>нужно<span style="mso-ansi-language: EN-US;"> </span>дополнительное<span style="mso-ansi-language: EN-US;"> </span>место<span style="mso-ansi-language: EN-US;"> </span>на<span style="mso-ansi-language: EN-US;">
</span>диске<span lang="EN-US" style="mso-ansi-language: EN-US;">. </span>Если вы хотите
заполнить диск до конца, можно сначала заполнить его почти до конца, затем увеличивать
файл до получения ошибки "Недостаточно места на диске." Для
разнообразия можно увеличивать файл большими кусками, а потом перейти на
заполнение уменьшающимися порциями. Также можно использовать функцию <code><span lang="EN-US" style="font-size: 10.0pt; mso-ansi-language: EN-US;">Set</span></code><code><span style="font-size: 10.0pt;"></span></code><code><span lang="EN-US" style="font-size: 10.0pt; mso-ansi-language: EN-US;">File</span></code><code><span style="font-size: 10.0pt;"></span></code><code><span lang="EN-US" style="font-size: 10.0pt; mso-ansi-language: EN-US;">Valid</span></code><code><span style="font-size: 10.0pt;"></span></code><code><span lang="EN-US" style="font-size: 10.0pt; mso-ansi-language: EN-US;">Data</span></code>, чтобы не
тратить время на заполнение всех секторов нулями. <br />
</div>
En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-15566176618873215282014-10-31T19:44:00.002+05:002014-10-31T19:44:51.111+05:00Почему драйвер FAT называется FASTFAT.SYS?<div dir="ltr" style="text-align: left;" trbidi="on">
Автор: Рэймонд Чен.<br />
<br />
Источник: <a href="http://blogs.msdn.com/b/oldnewthing/archive/2014/10/30/10568552.aspx" target="_blank">Why is the FAT driver called FASTFAT? Why would anybody ever write SLOWFAT?</a><br />
<br />
Anon интересуется, <a href="http://blogs.msdn.com/b/oldnewthing/archive/2012/12/18/10378851.aspx#10379941">почему драйвер FAT называется FASTFAT.SYS</a> ("быстрый" FAT).
"Раньше был медленный драйвер FAT? Что было сделано неправильно в предыдущей реализации FAT?<br />
<a name='more'></a><br />
<br />
У старого драйвера FAT, возможно, было более скучное имя наподобие FAT.SYS. В некоторый момент кто-то решил написать новый, более быстрый, драйвер и назвал его FASTFAT.<br />
<br />
Теперь о возможной неправильной реализации FAT, которую понадобилось улучшить.
Помните, что обстоятельства меняются с течением времени. Конструкция, хорошо работающая в одних условиях, может не годиться в других условиях. Старая реализация не была неправильной: изменились условия, а в новых условия лучше новая реализация<br />
<br />
К примеру, раньше было три версии FAT: FAT8, FAT12 и FAT16. Для маленьких дисков прекрасно работали простые алгоритмы. Простые алгоритмы предпочтительнее, потому что легче обеспечить их правильную работу, их также легче отлаживать. Обычно для них требуется меньше места, а память раньше была в дефиците. Алгоритм <var>O</var>(<var>n</var>) приемлем, если <var>n</var> не становится слишком большим, и константы малы. Поскольку FAT16 содержала не более 65535 кластеров на диск, имелось встроенное ограничение на величину <var>n</var>. Если в каталоге пара десятков файлов, линейный поиск работает великолепно.<br />
<br />
Это естественно - выбирать алгоритмы, которые напрямую привязаны к структурам данных на диске.
(Помните, что структуры данных определяют алгоритмы.)
Каталоги FAT - это просто несортированные массивы имён файлов, так что простая функция поиска читает по одной записи до тех пор, пока не найдёт нужный файл. Поиск свободного кластера - это просто поиск нуля в таблице размещения. Принцип управления памятью был прост: не мешай работать кэшу диска.<br />
<br />
Эти простые алгоритмы прекрасно работали, пока не появилась FAT32 и не задрала планку <var>n</var>. К счастью, в то время компьютеры также стали быстрее и располагали большим объёмом памяти, поэтому появилось больше возможностей.<br />
<br />
Значительные улучшения FASTFAT обусловлены сменой алгоритмов. Например, структуры данных на диске преобразуются в более эффективные структуры данных в памяти и кэшируются. При первом обращении к каталогу надо выполнить линейный поиск, чтобы получить имена всех файлов. Если кэшировать их в более быстрой структуре данных
(скажем, в хэш-таблице), последующие обращения станут выполняться гораздо быстрее. Объём памяти современных компьютеров даёт возможность повсеместно кэшировать записи каталогов в отличие от прошлых времён, когда с памятью и большим кэшем было туго.<br />
<br />
(Интересно, выполняет ли какой-либо сторонний драйвер FAT подобную оптимизацию или просто использует дисковые структуры данных в качестве структур данных в памяти.)<br />
<br />
Первоначальный драйвер FAT очень хорошо решал поставленную задачу с учётом имеющихся ограничений. Со временем задача изменилась, и старые решения стали не очень хороши. Полагаю, "неправильность" старого драйвера зависит от интерпретации. Если детская кроватка стала мала вашему ребёнку, означает ли это, что вы совершили ужасную ошибку с кроваткой?
</div>
En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-52682873331643539282014-09-25T19:34:00.001+06:002014-09-25T19:36:35.112+06:00Почему в Outlook сочетание клавиш Ctrl+F пересылает письмо вместо выполнения поиска?<div dir="ltr" style="text-align: left;" trbidi="on">
Автор: Рэймонд Чен.<br />
Источник: <a href="http://blogs.msdn.com/b/oldnewthing/archive/2014/07/15/10542285.aspx" target="_blank">Why does Outlook map Ctrl+F to Forward instead of Find, like all right-thinking programs?</a><br />
<br />
Общепринято, что сочетание клавиш <kbd>Ctrl</kbd>+<kbd>F</kbd> запускает операцию поиска (Find). Так делают Word, Excel, Wordpad, <em>Блокнот</em>, Internet Explorer, но не Outlook. Почему Outlook ведёт себя по-другому? Вернёмся в 1995 год.<br />
<a name='more'></a><br />
Коллектив разработчиков усердно трудился над почтовым клиентом под названием Exchange (кодовое имя Capone, в соответствии с тогдашней модой на кодовые имена а-ля <a href="https://ru.wikipedia.org/wiki/Windows_95" target="_blank">Chicago</a>). В те дни сочетание клавиш <kbd>Ctrl</kbd>+<kbd>F</kbd> действительно вызывало окно поиска согласно общепринятому обычаю. <br />
Однако пришло сообщение от бета-тестера, который хотел, чтобы сочетание клавиш <kbd>Ctrl</kbd>+<kbd>F</kbd> пересылало письмо (Forward), а не начинало поиск, потому что он привык так делать в другой почтовой программе, которой пользовался до Exchange. <br />
Этим бета-тестером был Билл Гейтс.</div>
En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-44164609484918462522014-09-21T15:43:00.000+06:002014-09-21T15:46:36.510+06:00Почему метка времени файла, скопированного на флэшку, увеличивается на 2 секунды?<div dir="ltr" style="text-align: left;" trbidi="on">
Автор: Рэймонд Чен.<br />
Оригинал статьи: <a href="http://blogs.msdn.com/b/oldnewthing/archive/2014/09/03/10554551.aspx" target="_blank">Why does the timestamp of a file increase by up to 2 seconds when I copy it to a USB thumb drive?</a><br />
<br />
Некоторое время назад мы узнали, что
<a href="http://blogs.msdn.com/b/oldnewthing/archive/2004/02/26/80492.aspx" target="_blank">файловая система FAT записывает метки времени в местном времени с двухсекундным разрешением</a>. Это значит, что копирование файла на устройство с файловой системой FAT
(обычно это дискета или флэшка) <a href="http://support.microsoft.com/kb/127830">может увеличить метку времени файла на 2 секунды</a>. И даже после копирования метка времени непостоянна. Метка времени меняется в зависимости от часового пояса, установленного на компьютере, который обращается к устройству. Если вы находитесь в местности с переходом на зимнее/летнее время, метка времени файла весной смещается на час в одну сторону, а осенью - в другую
(часы переводятся дважды в год).
<br />
<a name='more'></a><br />
Хорошо, но почему метка времени всегда <i>увеличивается</i>? Почему бы не округлять её до <i>ближайшего</i> двухсекундного интервала? В этом случае метка времени менялась бы не более, чем на секунду.
<br />
Потому что округление в сторону ближайшего интервала означает, что файл может "путешествовать" в прошлое, а это создаёт свои проблемы.
<br />
Представьте, что вы регулярно копируете файлы с диска C: с файловой системой NTFS на флэшку (диск F:) следующей командой:
<br />
<pre>xcopy /D C:\Files\* F:\Files\*
</pre>
Если метки времени округляются до ближайшего двухсекундного интервала, в среднем у половины файлов на флэшке метки времени будут меньше, чем у файлов на диске C:. Это значит, что при повторном выполнении команды примерно половина файлов будет скопирована <i>снова</i>. С точки зрения пользователя команда <code>xcopy</code> <i>никогда на заканчивает работу</i>, потому что каждый раз вы просите: "Выполни добавочное копирование", и она всегда находит что-то для копирования. Она никогда не говорит: "Все файлы актуальны, можно идти домой."
<br />
Во избежание такого бесконечного цикла округление всегда делается <i>ввверх</i>, чтобы копия файла не была старше оригинала.
</div>
En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-51765606394434095412014-07-03T16:56:00.002+06:002014-07-03T16:56:29.708+06:00Почему Visual Basic 6 до сих пор процветает<div dir="ltr" style="text-align: left;" trbidi="on">
Автор: Дэвид Платт.<br />
Оригинал статьи: <a href="http://msdn.microsoft.com/ru-ru/magazine/jj133828%28en-us%29.aspx" target="_blank">The Silent Majority: </a><a href="https://www.blogger.com/null" target="_blank">Why Visual Basic 6 Still Thrives</a>.<br />
<br />
Microsoft недавно продлила поддержку приложений Visual
Basic 6 на период жизни Windows 8 (см. колонку редактора, “<a href="http://msdn.microsoft.com/ru-ru/magazine/jj133813%28en-us%29.aspx" target="_blank">Old Soldiers Never Die</a>”). Visual Basic 6 появился в 1998 г., так что приложения на этом языке поддерживаются как минимум 24 года. Сравните это с Microsoft .NET Framework 1.0 (2002 г.), которая несовместима с Windows 7 (2009 г.). <br />
<a name='more'></a><br />
<br />
Мой студент Эрик однажды в шутку назвал Visual Basic 6 “неубиваемым тараканом” экосистемы Windows. Эта аналогия глубже, чем вы думаете. Тараканы успешны благодаря своей простоте.Они делают лишь то, что необходимо в их экологической нише, и ничего больше. Visual Basic 6 делал в своей рыночной нише то, что подразумевали его создатели: обеспечивал быструю разработку ограниченных программ программистами с небольшим опытом. Он никогда не предназначался для опытных программистов, разрабатывающих сложные приложения.<br />
<br />
Visual Basic 6 достигал своих целей посредством абстрагирования от сложности операционной системы Windows. Простые вещи выполнить было легко. С другой стороны, сложные задачи, наподобие работы с потоками, были невыполнимы. Моё правило для Visual Basic 6 было таким: если я не смог сделать это за 10 минут, я не смогу сделать этого вовсе.<br />
<br />
Другой причиной успеха Visual Basic 6 был более короткая кривая обучения, обусловленная ограниченным набором возможностей. Научиться водить автобус можно быстрее, чем стать лётчиком-истребителем. Стать хорошим программистом Visual Basic 6 было проще, чем стать хорошим программистом
C++, основное отличие во времени.<br />
<br />
Когда Microsoft сделала Visual Basic .NET “полноценным языком”, компания наполнила его мощью и сопутствующей сложностью языка C# — потоками, фоновыми операциями и наследованием и многим другим. Следовательно, она потребовала тех же навыков, что и для программирования на C#, той же кривой обучения и такого же опыта.<br />
<br />
Люди из Microsoft сделали так, думая, что они услышали потребности сообщества Visual Basic 6. Но программисты Visual Basic 6 представляют собой “молчаливое большинство” (термин, популяризированный президентом США Ричардом Никсоном в 1969 г. для описания людей, не выступавших с протестами и не одобрявших контркультуру в неспокойные годы). Почти все программисты
Visual Basic 6 были удовлетворены тем, что делал Visual Basic 6. Они были счастливы водить автобусы: уходить из офиса в 5 часов вечера (или в
4:30 в хорошие дни) вместо работы до полуночи; играть с семьёй на выходных вместо того, чтобы тащиться в офис; спать с супругами вместо того, чтобы кодировать всю ночь и есть холодную пиццу на завтрак. Они не жаловались на отсутствие перегрузки операторов и полиморфизма в Visual Basic 6, они не говорили много.<br />
<br />
Голоса, которые услышали в Microsoft, принадлежали 3 процентам водителей автобусов
Visual Basic 6, очень хотевшим стать лётчиками. Эти парни тратили время на посещение конференций, на размещение вопросов на форумах
CompuServe, на ответы к статьям. Им было мало просто мечтать о стрельбе ракетами (Sidewinder) из выхлопной трубы, чтобы вырваться из пробки; они потребовали, чтобы Microsoft установила на их автобусы форсажные камеры вместе с вооружением, контрмерами плюс индикаторами на лобовом стекле. И Microsoft выполнила их требования <br />
<br />
Однако преподнесение языка Visual Basic .NET сообществу Visual Basic 6 было похоже на выращивание койота в качестве домашней собаки и последующий выпуск его в леса с криком: “Добывай обед на охоте, как предназначено богом, прекрасное, дикое существо!” Большинство сказало: “Да чёрт с ним. Я остаюсь на свой подушке у огня до тех пор, пока у тебя есть баночки с кормом.” И Visual
Basic 6 остался.<br />
<br />
Visual Basic 6, конечно, был не без недостатков. OnError Resume Next? Если что-то накрылось, продолжайте и посмотрите, что будет? Возможно, не самая лучшая идея. Однако быстрая (следовательно, дешёвая) разработка ограниченных (значит, дешёвых) приложений менее опытным (следовательно, менее оплачиваемым) персоналом - важное решение очень большого класса задач. <br />
<br />
Как минимум, спустя десятилетие, LightSwitch сейчас пытается заполнить эту нишу (<a href="http://bit.ly/n9crJj" id="ctl00_MTContentSelector1_mainContentContainer_ctl02">bit.ly/n9crJj</a>).<br />
<br />
Вещи, которые делал Visual Basic 6, до сих пор нужны. Пока
Microsoft не выпустит другой инструмент, делающий эти вещи, Visual Basic 6 будет продолжать своё шествие. Спорю на пиво, что Microsoft продлит поддержку Visual Basic 6 в Windows 9 и 10.</div>
En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-50366296455634414752013-03-30T22:28:00.000+06:002013-03-30T22:28:09.647+06:00Визуальные эффекты с наилучшим быстродействием<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<span style="font-family: "Calibri","sans-serif";">Автор</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">:
</span><span style="font-family: "Calibri","sans-serif";">Рэймонд</span><span style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;"> </span><span style="font-family: "Calibri","sans-serif";">Чен</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">.<br />
</span><span style="font-family: "Calibri","sans-serif";">Оригинал</span><span style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;"> </span><span style="font-family: "Calibri","sans-serif";">статьи</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">: </span><a href="http://blogs.msdn.com/b/oldnewthing/archive/2013/03/27/10405554.aspx"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;"><span style="color: blue;">"Adjust
visual effects for best performance" should really be called "Adjust
visual effects for crappiest appearance"</span></span></a><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;"><o:p></o:p></span><br />
<br />
<span style="font-family: "Calibri","sans-serif";">В окне <i>Параметры быстродействия</i>
Панели управления, на вкладке <i>Визуальные эффекты</i> есть переключатель <i>Обеспечить
наилучшее быстродействие</i>. Если выбрать его, то все визуальные эффекты будут
отключены.</span><br />
<a name='more'></a><o:p></o:p><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ50zYq1QcMHvcuubtjXWhT6XtP5PI-XiBGVwx677Sr6K8Hf2gq6cFIxnuivoPx60uH8ULJpprWddp-yIBrI12mUpH8bQXxGOakvSr-FRYoQF1gRRF4dKnmWUBFFtR2HhB1leoN8MDRdiZ/s1600/VisualEffects-Vista.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ50zYq1QcMHvcuubtjXWhT6XtP5PI-XiBGVwx677Sr6K8Hf2gq6cFIxnuivoPx60uH8ULJpprWddp-yIBrI12mUpH8bQXxGOakvSr-FRYoQF1gRRF4dKnmWUBFFtR2HhB1leoN8MDRdiZ/s320/VisualEffects-Vista.png" width="216" /></a></div>
<span style="font-family: "Calibri","sans-serif";"></span><br />
<span style="font-family: "Calibri","sans-serif";"></span><br />
<span style="font-family: "Calibri","sans-serif";">Долгое время название этого
переключателя было неверным. На самом деле он не выбирает визуальные эффекты с
наилучшим быстродействием. Он всего лишь обеспечивает наихудший вид.<o:p></o:p></span><br />
<br />
<span style="font-family: "Calibri","sans-serif";">Начиная с </span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">Windows</span><span lang="EN-US" style="font-family: "Calibri","sans-serif";"> </span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">Vista</span><span style="font-family: "Calibri","sans-serif";">, обеспечение множества визуальных эффектов
возлагается на видеокарту. Следовательно, их влияние на производительность системы
незначительно, а иногда отключение эффектов заставляет систему работать <i>медленнее</i>,
потому что </span><a href="http://blogs.msdn.com/b/oldnewthing/archive/2011/12/06/10244432.aspx#10244673"><span style="font-family: "Calibri","sans-serif";"><span style="color: blue;">отключение аппаратного ускорения</span></span></a><span style="font-family: "Calibri","sans-serif";"> приводит к выполнению действий
программным путём.<o:p></o:p></span><br />
<br />
<span style="font-family: "Calibri","sans-serif";">Например, если включена композиция
рабочего стола, копия всего содержимого окна хранится в видеопамяти, даже если окно
закрыто другими окнами. Без композиции рабочего стола диспетчер рабочего стола использует
классическую модель, следующую принципу «</span><a href="http://blogs.msdn.com/b/oldnewthing/archive/2004/12/20/327369.aspx"><span style="font-family: "Calibri","sans-serif";"><span style="color: blue;">не хранить то, что можно пересчитать</span></span></a><span class="MsoHyperlink"><span style="font-family: "Calibri","sans-serif";"><u><span style="color: blue;">»</span></u></span></span><span style="font-family: "Calibri","sans-serif";">: содержимое перекрытого окна </span><a href="http://blogs.msdn.com/b/oldnewthing/archive/2005/06/24/432229.aspx"><span style="font-family: "Calibri","sans-serif";"><span style="color: blue;">нигде не сохранено</span></span></a><span style="font-family: "Calibri","sans-serif";">, и когда оно становится видимым, получает
сообщение </span><code><span lang="EN-US" style="font-size: 10pt; mso-ansi-language: EN-US;">WM</span></code><code><span style="font-size: 10pt;">_</span></code><code><span lang="EN-US" style="font-size: 10pt; mso-ansi-language: EN-US;">PAINT</span></code><code><span style="font-size: 10pt;">,</span></code><span style="font-family: "Calibri","sans-serif";">
чтобы восстановить своё содержимое.<o:p></o:p></span><br />
<br />
<span style="font-family: "Calibri","sans-serif";">Это значит, что, когда вы
убираете одно окно с экрана и делаете видимым другое окно, диспетчер рабочего
стола может показать содержимое другого окна сразу же, потому что видеопамять содержит
актуальную копию окна. Если вы отключили композицию рабочего стола, то будете таращиться
на пустое окно и ожидать его перерисовки.<o:p></o:p></span><br />
<br />
<span style="font-family: "Calibri","sans-serif";">Поздравляю: отключив композицию
рабочего стола, вы замедлили процесс восстановления окна. (То же самое вас ждёт
при переключени между развёрнутыми окнами.)<o:p></o:p></span><br />
<br />
<span style="font-family: "Calibri","sans-serif";">Ладно, если отключение визуальных
эффектов незначительно улучшает, а иногда и ухудшает производительность, почему
Панель управления до сих пор позволяет сделать это?<o:p></o:p></span><br />
<br />
<span style="font-family: "Calibri","sans-serif";">Потому что энтузиасты, считающие
себя очень умными, любят отключать всё, что делает компьютер привлекательным, так
как они убеждены, что за привлекательность надо непременно расплачиваться быстродействием.
Они заметили, что после отключения визуальных эффектов их машина работает быстрее,
но это бесконтрольный эксперимент, поскольку они не проверили, как быстро
работает компьютер со включёнными визуальными эффектами. (Точно так же </span><a href="http://ru.wikipedia.org/wiki/%D0%92%D0%BB%D0%B0%D1%81_%D0%B8_%D0%95%D0%BD%D0%B8%D0%BA#.D0.9F.D1.80.D0.B8.D0.BC.D0.B5.D1.80_.D1.8E.D0.BC.D0.BE.D1.80.D0.B0"><span style="font-family: "Calibri","sans-serif";"><span style="color: blue;">бананы в ушах отпугивают крокодилов</span></span></a><span style="font-family: "Calibri","sans-serif";">.)<o:p></o:p></span><br />
<br />
<span style="font-family: "Calibri","sans-serif";">Есть люди, которые думают, что
материнская плата с комплектующими на столе работает быстрее, чем компьютер в
привлекательном корпусе. Даже если вы докажете им обратное, они всё равно
оставят свой «компьютер» в полуразобранном состоянии, потому что это выглядит
круто.<o:p></o:p></span><br />
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 0pt;">
<span style="font-family: "Calibri","sans-serif";">Страница
настроек <i>Визуальные эффекты</i> превратилась в непреднамеренный психологический
эксперимент.</span><o:p></o:p></div>
</div>
En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-3750586024696764412013-02-14T08:20:00.000+06:002013-02-14T08:20:04.647+06:00А что это за файл onestop.mid в каталоге Media?<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Calibri","sans-serif";"><strong>Автор</strong></span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;"><strong>:</strong>
</span><span style="font-family: "Calibri","sans-serif";">Рэймонд</span><span style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;"> </span><span style="font-family: "Calibri","sans-serif";">Чен</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">.<br />
</span><strong><span style="font-family: "Calibri","sans-serif";">Оригинал</span><span style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;"> </span><span style="font-family: "Calibri","sans-serif";">статьи</span></strong><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;"><strong>:</strong> </span><a href="http://blogs.msdn.com/b/oldnewthing/archive/2013/02/12/10392805.aspx"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;"><span style="color: blue;">What's
the story of the onestop.mid file in the Media directory?</span></span></a><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;"><o:p></o:p></span><br />
<br />
<span style="font-family: "Calibri","sans-serif";">Если вы заглянете в папку «</span><code><span lang="EN-US" style="font-size: 10pt; mso-ansi-language: EN-US;">C</span></code><code><span style="font-size: 10pt;">:\</span></code><code><span lang="EN-US" style="font-size: 10pt; mso-ansi-language: EN-US;">Windows</span></code><code><span style="font-size: 10pt;">\</span></code><code><span lang="EN-US" style="font-size: 10pt; mso-ansi-language: EN-US;">Media</span></code><code><span style="font-size: 10pt;">»</span></code><span style="font-family: "Calibri","sans-serif";">,
то найдёте там </span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">MIDI</span><span style="font-family: "Calibri","sans-serif";">-файл
</span><code><span lang="EN-US" style="font-size: 10pt; mso-ansi-language: EN-US;">onestop</span></code><span style="font-family: "Calibri","sans-serif";">. Откуда</span><span style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;"> </span><span style="font-family: "Calibri","sans-serif";">здесь</span><span style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;"> </span><span style="font-family: "Calibri","sans-serif";">этот</span><span style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;"> </span><span style="font-family: "Calibri","sans-serif";">странный</span><span style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;"> </span><span style="font-family: "Calibri","sans-serif";">маленький</span><span style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;"> <span lang="EN-US">MIDI-</span></span><span style="font-family: "Calibri","sans-serif";">файл</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">?
</span><a href="http://blogs.msdn.com/b/aaron_margosis/"><span style="color: blue;"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">Aaron</span><span lang="EN-US" style="font-family: "Calibri","sans-serif";"> </span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">Margosis</span></span></a><span lang="EN-US" style="font-family: "Calibri","sans-serif";"> </span><span style="font-family: "Calibri","sans-serif";">рассматривает его как угрозу безопасности,
потому что "воспроизведение этого файла причинит окружающим длительную душевную
боль и страдания".<o:p></o:p></span><br />
<a name='more'></a><br />
<span style="font-family: "Calibri","sans-serif";">Вопреки сведениям Википедии,
этот файл не является «пасхальным яйцом». Файл был добавлен в </span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">Windows</span><span lang="EN-US" style="font-family: "Calibri","sans-serif";"> </span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">XP</span><span lang="EN-US" style="font-family: "Calibri","sans-serif";"> </span><span style="font-family: "Calibri","sans-serif";">с комментарием "Добавлены прикольные
</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">MIDI</span><span lang="EN-US" style="font-family: "Calibri","sans-serif";"> </span><span style="font-family: "Calibri","sans-serif";">вместо плохих старых." Если файл
</span><code><span lang="EN-US" style="font-size: 10pt; mso-ansi-language: EN-US;">onestop</span></code><span lang="EN-US" style="font-family: "Calibri","sans-serif";"> </span><span style="font-family: "Calibri","sans-serif";">так плох, то старые файлы должны
быть ещё хуже! <o:p></o:p></span><br />
<br />
<span style="font-family: "Calibri","sans-serif";">Но зачем они был добавлены?
<o:p></o:p></span><br />
<br />
<span style="font-family: "Calibri","sans-serif";">Для</span><span style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;"> </span><span style="font-family: "Calibri","sans-serif";">поддержки</span><span style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;"> </span><span style="font-family: "Calibri","sans-serif";">продукта</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">. <o:p></o:p></span><br />
<br />
<span style="font-family: "Calibri","sans-serif";">Команде поддержки нужен хотя
бы один </span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">MIDI</span><span style="font-family: "Calibri","sans-serif";">-файл
для разрешения проблем. Тогда пользователю не придётся скачивать файл </span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">c</span><span lang="EN-US" style="font-family: "Calibri","sans-serif";"> </span><span style="font-family: "Calibri","sans-serif";">веб-сайта для диагностики проблем с воспроизведением
</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">MIDI</span><span lang="EN-US" style="font-family: "Calibri","sans-serif";"> </span><span style="font-family: "Calibri","sans-serif";">файлов. На вопрос, почему мелодия так
ужасна, разработчик, добавивший файл, ответил: "Верите или нет, но «</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">OneStop</span><span style="font-family: "Calibri","sans-serif";">» не так плох по сравнению с
предыдущими файлами. </span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">(<i>Dance of the Sugar Plum Fairy</i> </span><span style="font-family: "Calibri","sans-serif";">и</span><span style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;"> </span><span style="font-family: "Calibri","sans-serif";">др</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">.)". </span><span style="font-family: "Calibri","sans-serif";">Другое
обоснование замены старых </span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">MIDI</span><span style="font-family: "Calibri","sans-serif";">-файлов
– в новом файле используется больше инструментов. <o:p></o:p></span><br />
<br />
<span style="font-family: "Calibri","sans-serif";">Автор этой мелодии – </span><a href="http://yackley.com/"><span style="color: blue;"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">David</span><span lang="EN-US" style="font-family: "Calibri","sans-serif";">
</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;">Yackley</span></span></a><span style="font-family: "Calibri","sans-serif";">.</span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; mso-ansi-language: EN-US;"><o:p></o:p></span><br />
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 0pt;">
<span style="font-family: "Calibri","sans-serif";">С другой
стороны, мы потеряли файл </span><a href="http://blogs.msdn.com/b/oldnewthing/archive/2004/09/20/231739.aspx"><code><span lang="EN-US" style="color: windowtext; font-size: 10pt; mso-ansi-language: EN-US; text-decoration: none; text-underline: none;">clock</span></code><code><span style="color: windowtext; font-size: 10pt; text-decoration: none; text-underline: none;">.</span></code><code><span lang="EN-US" style="color: windowtext; font-size: 10pt; mso-ansi-language: EN-US; text-decoration: none; text-underline: none;">avi</span></code></a><span style="font-family: "Calibri","sans-serif";">.</span><span lang="EN-US" style="mso-ansi-language: EN-US;"><o:p></o:p></span></div>
</div>
En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-61658273671448556522012-12-20T09:38:00.000+06:002012-12-20T09:38:47.997+06:00Шутер от первого лица<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt;">
<span style="font-family: Calibri;">Автор: Чарльз Петцольд.<br />
Оригинал статьи: </span><a href="http://www.charlespetzold.com/blog/2012/12/First-Person-Shooter.html"><span style="color: blue;"><span style="font-family: Calibri;"><span lang="EN-US" style="mso-ansi-language: EN-US;">First</span>-<span lang="EN-US" style="mso-ansi-language: EN-US;">Person</span><span lang="EN-US"> </span><span lang="EN-US" style="mso-ansi-language: EN-US;">Shooter</span></span></span></a><span style="font-family: Calibri;">.<o:p></o:p></span></div>
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;">
<span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">Это было примерно 20 лет назад. Я был у друга в гостях, и он
показал мне новую видеоигру «</span><i><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: EN-US; mso-fareast-font-family: "Times New Roman";">Wolfenstein</span></i><i><span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">
3</span></i><i><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: EN-US; mso-fareast-font-family: "Times New Roman";">D</span></i><i><span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">»</span></i><span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">. Мой друг наслаждался динамикой игры,
которая включала — насколько я помню — вид от лица солдата, преследующего и
убивающего людей.</span><a name='more'></a><o:p></o:p><br />
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;">
<span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">Я был, скорее, в смятении, чем в восторге. Идея стрельбы и убийства
людей — даже в воображении — для меня противна и ужасна. Так вот для чего предназначалась
компьютерная революция? “Это нацисткие мутанты,” – возразил мой друг, полагаю,
в предположении, что если кто-то должен быть уничтожен, то это нацистский мутант.
<o:p></o:p></span></div>
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;">
<span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-bidi-font-style: italic; mso-fareast-font-family: "Times New Roman";">Игра «</span><i><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: EN-US; mso-fareast-font-family: "Times New Roman";">Wolfenstein</span></i><i><span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";"> 3</span></i><i><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: EN-US; mso-fareast-font-family: "Times New Roman";">D</span></i><i><span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">»</span></i><span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";"> теперь известна как прародитель целого жанра компьютерных игр,
которые являются частью сегодняшней культуры.<o:p></o:p></span></div>
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;">
<span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">Я никогда не играл ни в одну из этих игр. Я не знаю, зачем я
говорю об этом здесь. В самом деле, мы с женой, наверное, одна из немногочисленных
семей компьютерщиков, у которых нет </span><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: EN-US; mso-fareast-font-family: "Times New Roman";">Xbox</span><span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">, </span><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: EN-US; mso-fareast-font-family: "Times New Roman";">PS</span><span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">3, </span><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: EN-US; mso-fareast-font-family: "Times New Roman";">Wii</span><span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">, а также
игр поинтереснее «Сапера», «Солитера» или «</span><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: EN-US; mso-fareast-font-family: "Times New Roman";">Bejeweled</span><span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">». <o:p></o:p></span></div>
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;">
<span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">Я выгляжу старомодным, и, возможно, не могу сказать ничего
полезного по этой теме. Пускай будет так. <o:p></o:p></span></div>
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;">
<span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">Я был ребёнком и знаю, что дети бегали с палками и “стреляли”
друг в друга. Кажется, эволюция запечатлела в наших мозгах нечто располагающее
к такой игре. Однако эта игра прекращалась по мере взросления. Лишь в последние
десятилетия можно видеть подростков и молодых взрослых, продолжающих игры со стрельбой
в других людей (или компьютерные образы других людей) в пейнтболе и шутерах от
первого лица. <o:p></o:p></span></div>
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;">
<span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">За два десятилетия после «</span><i><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: EN-US; mso-fareast-font-family: "Times New Roman";">Wolfenstein</span></i><i><span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";"> 3</span></i><i><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: EN-US; mso-fareast-font-family: "Times New Roman";">D</span></i><i><span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">»</span></i><span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";"> шутеры от первого лица стали более реалистичными и — во
многих смыслах — более убийственными. Теперь психология и мышечная память игроков
содержит навыки войны без взятия пленных: быстрые рефлексы, стремительные
повороты, стратегия максимизации убийств, и, что более важно — умение испытывать
наслаждение, а не отвращение от вида брызгающей крови.<o:p></o:p></span></div>
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;">
<span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">Я не знаю, есть ли очевидные причина-следствие в умах детей и
молодёжи, которые играют в такие игры и живут другой жизнью. Но теперь выросло целое
поколение, которое усвоило искусство нападения и разбиения наголову — игроки, которые
могут отчётливо представить себе массовые убийства в торговом центре, колледже,
кинотеатре, на работе или в школе. <o:p></o:p></span></div>
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;">
<span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">Я не предлагаю объявить шутеры от первого лица вне закона. Лучше
бы наши законодатели сосредоточились на более важной проблеме ограничения
доступности личного оружия и обеспечении охраны умственного и телесного
здоровья.<o:p></o:p></span></div>
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;">
<span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">Вместо запрета подобных игр я бы хотел, чтобы мы в качестве
упражнения самодисциплины не покупали подобные игры и не играли в них — в
сущности, <i>остерегались</i> этих игр, как чего-то нездорового и противного, представляющего
неверные мышление и стиль жизни, которые мы (как цивилизованные люди) категорически
отвергаем. <o:p></o:p></span></div>
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;">
<span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">Мы, программисты, обязаны использовать наши силы во имя
добра. Мы должны не только отказываться от работы с программированием оружия или
жестокости, но также отвергать работу, которая содействует психически
нездоровому торжеству насилия.<o:p></o:p></span></div>
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;">
<span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">Нам, программистам, следует попытаться разрабатывать компьютерные
игры, которые обучают навыкам, полезным в современной жизни — дискуссия, компромисс
и разрешение конфликтов. Очевидно, это более сложная задача, чем создание игр с
массовыми убийствами, но я не сомневаюсь, что мы, программисты, достаточно
умны, чтобы хотя бы попытаться это сделать. <o:p></o:p></span></div>
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;">
<span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">Книга «</span><i><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: EN-US; mso-fareast-font-family: "Times New Roman";">The</span></i><i><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">
</span></i><i><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: EN-US; mso-fareast-font-family: "Times New Roman";">Better</span></i><i><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";"> </span></i><i><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: EN-US; mso-fareast-font-family: "Times New Roman";">Angels</span></i><i><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";"> </span></i><i><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: EN-US; mso-fareast-font-family: "Times New Roman";">of</span></i><i><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";"> </span></i><i><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: EN-US; mso-fareast-font-family: "Times New Roman";">Our</span></i><i><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">
</span></i><i><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: EN-US; mso-fareast-font-family: "Times New Roman";">Nature</span></i><i><span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";">»</span></i><span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-fareast-font-family: "Times New Roman";"> Стивена Пинкера ясно показывает, что
жестокость не является неотъемлемой частью людей. За последние века и тысячелетия
жестокость пошла на убыль. Мы постоянно, хотя и медленно, становимся лучше. <o:p></o:p></span></div>
<span style="font-family: "Times New Roman","serif"; font-size: 12pt; mso-ansi-language: RU; mso-bidi-language: AR-SA; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: RU;">Эту тенденцию необходимо сохранить. Нам следует сделать всё возможное,
чтобы усилить её. Мы должны приложить совместные усилия для ослабления
жестокости в нашей жизни, в развлечениях и на экранах компьютеров.</span></div>
</div>
En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-43052160939053966522012-11-28T23:59:00.000+06:002012-11-28T23:59:59.023+06:00Почему есть две программы, FIND и FINDSTR, с разными возможностями?<div dir="ltr" style="text-align: left;" trbidi="on">
<span xmlns=""></span><br />
<span xmlns="">Автор: Рэймонд Чен.<br />
Оригинал статьи: <a href="http://blogs.msdn.com/b/oldnewthing/archive/2012/11/28/10372436.aspx">Why are there both FIND and FINDSTR programs, with unrelated feature sets?</a><br /> <br />
Джонатан интересуется, <a href="http://blogs.msdn.com/b/oldnewthing/archive/2011/08/25/10200026.aspx">почему у нас есть две программы, <span style="color: blue;"><span style="font-family: Courier New; font-size: 10pt; text-decoration: underline;">find</span> и <span style="font-family: Courier New; font-size: 10pt; text-decoration: underline;">findstr</span></span></a>, с такими разными возможностями. Программа <span style="font-family: Courier New; font-size: 10pt;">find</span> поддерживает UTF-16, <span style="font-family: Courier New; font-size: 10pt;">findstr</span> – нет; программа <span style="font-family: Courier New; font-size: 10pt;">findstr</span> работает с регулярными выражениями, а программа <span style="font-family: Courier New; font-size: 10pt;">find</span> – нет. <a name='more'></a><br />
Возможности этих программ разные, потому что эти программы не связаны между собой. <br />
Сначала появилась программа <span style="font-family: Courier New; font-size: 10pt;">find</span>. Как я писал ранее, <a href="http://blogs.msdn.com/b/oldnewthing/archive/2011/08/25/10200026.aspx">программа <span style="color: blue;"><span style="font-family: Courier New; font-size: 10pt; text-decoration: underline;">find</span> была написана в 1982 г</span></a>. При переносе на Windows NT в ней была добавлена поддержка Unicode, но никто не позаботился о добавлении новых возможностей. Она была точной копией старой программы для MS-DOS.<br />
В то время одному из моих коллег в команде MS-DOS не хватало программы <span style="font-family: Courier New; font-size: 10pt;">grep</span>, поэтому он написал свою собственную программу. Разработчики часто пишут маленькие программы для облегчения своей жизни. Это был самостоятельный проект, не принадлежавший какой-либо версии MS-DOS или Windows. Когда он перешёл в команду Windows 95, то захватил с собой набор своих программ. В свободное время он портировал некоторые из них под Win32, потому что именно этим и занимаются программисты. (Это было в те дни, когда программисты любили в свободное время <em>что-нибудь</em> программировать.) <br />
Так продолжалось довольно долго. Официальная программа <span style="font-family: Courier New; font-size: 10pt;">find</span> просто искала строки, но зато поддерживала Unicode. В то же время маленький сторонний проект моего коллеги умел работать с регулярными выражениями, но не поддерживал Unicode.<br />
Однажды команда Windows 2000 Resource Kit сказала: "У вас есть прикольная программа. Не возражаете, если мы включим её в Resource Kit?"<br />
"Конечно, нет", – ответил мой коллега. –"Она полезна для меня, может, пригодится кому-то ещё." <br />
<a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17657">Программа была включена</a> под именем <span style="font-family: Courier New; font-size: 10pt;">qgrep</span>.<br />
Потом парни из команды Windows Resource Kit сказали: "Нас раздражает, что надо устанавливать Resource Kit только для того, чтобы получить несколько полезных программ. Было бы здорово включить самые полезные программы в состав Windows." Я не знаю, какой сорт лести понадобился для этого, но они убедили команду Windows добавить часть программ из Resource Kit в состав Windows. Попутно название программы <span style="font-family: Courier New; font-size: 10pt;">qgrep</span> поменялось на <span style="font-family: Courier New; font-size: 10pt;">findstr</span>. (Другие программы из Resource Kit, например, <span style="font-family: Courier New; font-size: 10pt;">where</span> и <span style="font-family: Courier New; font-size: 10pt;">diskraid,</span> сохранили свои названия.) <br />
Вот так это было. Можете рассматривать <span style="font-family: Courier New; font-size: 10pt;">find</span> и <span style="font-family: Courier New; font-size: 10pt;">findstr</span> как пример параллельного развития программ.</span><br /></div>
En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-37699079636598585792012-11-02T09:33:00.001+06:002012-11-02T10:26:39.703+06:00Неделя Сэнди<div dir="ltr" style="text-align: left;" trbidi="on">
<span xmlns=""></span><br />
<span xmlns="">Автор: Чарльз Петцольд.<br />
Оригинал статьи: <a href="http://www.charlespetzold.com/blog/2012/10/My-Ongoing-Week-with-Sandy.html">My (Ongoing) Week with Sandy</a>.<br />
В понедельник утром я собирался лететь на конференцию Microsoft Build, предвкушая четырёхдневное погружение в мир Windows 8 и Windows Phone 8, но ураган Сэнди распорядился по-другому. В воскресенье мой рейс был отменён, аэропорты закрылись, и я никуда не поехал.<br />
Я живу в нижней части Манхэттена, несколькими кварталами южнее 14 улицы, и немного восточнее 5 авеню. Электричество в моём районе отключилось около 8:30 вечера в понедельник. Оно так и не появилось спустя 40 часов.<br />
В 5- и 6-этажные здания вода поступает в квартиры под вертикальным давлением. В зданиях повыше — я живу на 10 этаже – вода подаётся наверх насосами, затем поступает в квартиры под действием силы тяжести. Такая система может выдержать лишь кратковременное отключение. Вода перестала поступать вчера утром, так что у нас нет воды уже 30 часов. Лифты, конечно, тоже не работают. В моей квартире работает лишь один из двух моих сотовых телефонов, и передача данных выполняется чрезвычайно нестабильно.<br />
Вчера (во вторник) мы с Дейдрой хорошо провели время на улице. Повреждения в нашем районе в основном ограничивались упавшими ветками, перевёрнутыми урнами, беспорядком на строительных площадках и (восточнее) несколькими машинами, уплывшими с места парковки.<br />
Мы прошли вверх по 25 улице и попали в страну электричества. Лишь немногие магазины и рестораны были открыты.<br />
Со времени последнего крупного отключения в Нью-Йорке количество мобильных компьютеров и устройств увеличилось, но мы стали ещё больше, чем когда-либо, привязаны к электросети. Мы встретили друга в ресторане-баре на углу 8 авеню и 30 улицы, и здесь, наверно, никогда не было так тесно во вторник днём. В то время как одни посетители были заняты гамбургерами и пивом, другие просто заряжали свои устройства и ноутбуки. Аналогичную картину – мириады молодых людей, оккупировавших розетки, – мы наблюдали в аптеке «Duane Reade».<br />
Большинство кофеен «Starbucks» были закрыты, но Дейдра заметила, что перед каждой кофейней «Starbucks» собрались люди с ноутбуками. Хотя «Starbucks» не продавала кофе, она продолжала раздавать WiFi.<br />
Сегодня мы прошли 60 кварталов на север к другу (спасибо, Терри!), чтобы принять душ, зарядить устройства, закончить работу, и, конечно, написать в блоге. Вскоре мы пошли домой через 25 улицу в страну потемневших зданий и мрачных перекрёстков.</span><br /></div>
En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-8991770245137011722012-06-12T23:34:00.000+06:002012-11-15T00:07:09.107+06:00Почему нельзя сразу перезапустить сбойное приложение?<div dir="ltr" style="text-align: left;" trbidi="on">
<span xmlns=""></span><br />
<span xmlns="">Автор: Рэймонд Чен.<br />Оригинал статьи: <a href="http://blogs.msdn.com/b/oldnewthing/archive/2012/06/11/10318139.aspx">Why do you have to wait for Windows Error Reporting to check for solutions before it restarts the application?</a><br /> <br />
Leo Davidson интересуется, <a href="http://blogs.msdn.com/b/oldnewthing/archive/2010/07/20/10040074.aspx">почему перезапуск приложения возможен только после поиска решений проблемы</a>. Почему нельзя одновременно выполнять две задачи? <br />
Во-первых, перезапускаемое приложение может сойти с ума, если увидит свою мёртвую копию. Я бы точно сошёл с ума, если бы проснулся утром и увидел рядом своё мёртвое тело. <br />
</span><br />
<span xmlns=""><a name='more'></a><br />
Во время поиска решения службе регистрации ошибок Windows доступен каркас зависшего приложения, потому что ей могут понадобиться дополнительные сведения для ответа серверу. ("Была ли загружена процессом библиотека PI.DLL версии 3.14 в момент сбоя? Если да, то у меня есть представление о том, что пошло не так.") И если требуется отправить отчёт в Microsoft, должна быть возможность получить сведения для генерации отчёта об ошибке. <br />
Теперь представьте, что вы сразу запускаете новую копию приложения. Если приложение работает лишь в одном экземпляре, оно будет искать свою копию и найдёт своё безжизненное тело посреди процесса вскрытия. Затем оно попытается отправлять мёртвой программе сообщения вида "Пользователь хочет открыть документ X; сделай, пожалуйста". Ответа не будет, поскольку программа мертва. Она никогда не ответит. <br />
Некоторые программы даже не пытаются передавать какую-либо информацию. Они просто находят существующую копию программы и вызывают функцию <span style="font-family: Courier New; font-size: 10pt;">SetForegroundWindow</span>, переключаясь на её главное окно. Разумеется, они пытаются переключиться на зависшую программу.<br />
Всё может быть хуже, когда вторая копия программы пытается <a href="http://blogs.msdn.com/b/oldnewthing/archive/2004/06/15/156022.aspx">получить информацию от своей существующей копии</a>. Если существующая копия зависла, скорее всего, сбой был вызван повреждением внутренних структур данных программы. Когда вторая копия пытается извлечь повреждённые данные, она сама можеть потерпеть крах. Простой перезапуск приведёт к быстрорастущей куче мёртвых программ, и ваш экран будет завален сообщениями службы регистрации ошибок Windows раньше, чем вы успеет нажать кнопку «OK». <br />
Сбойная программа фактически организовала <a href="http://blogs.msdn.com/b/oldnewthing/archive/2006/06/20/639479.aspx">против себя атаку типа «отказ в обслуживании»</a>. <br />
Перед повторным запуском программы Windows должна надлежащим образом похоронить её предыдущую копию, потому что немногие программы готовы встретиться со своим трупом. <br />
<strong>Дополнение.</strong> Другой распространённый случай: сбой программы при запуске. Автоматический перезапуск программы всего лишь создаёт ещё одну копию, которая сразу же потерпит крах. Мы снова ежесекундно получаем дюжину копий программы, каждая из которых аварийно завершает свою работу.</span><br /></div>
En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-29732566588947551632012-05-02T18:39:00.000+06:002012-05-02T18:39:25.080+06:00GUID. Часть вторая<div dir="ltr" style="text-align: left;" trbidi="on">
<span xmlns=""></span><br />
<span xmlns="">Автор: Эрик Липперт.<br />
Оригинал статьи: <a href="http://blogs.msdn.com/b/ericlippert/archive/2012/04/30/guid-guide-part-two.aspx">GUID guide, part two</a>.<br />
<br />
Как же обеспечивается уникальность GUID без центрального органа управления наподобие системы ISBN?<br />
Для начала обратите внимание на то, что количество возможных GUID <em>гораздо</em> больше, чем количество возможных ISBN. Поскольку последняя из тринадцати цифр содержит контрольную сумму, остаётся лишь 10<sup>12</sup> возможных ISBN. Это порядка сотни уникальных ISBN на каждого жителя Земли. Это примерно 2<sup>40</sup>, то есть ISBN можно представить 40-разрядным числом (без контрольной суммы). Количество возможных GUID составляет 2<sup>128</sup>; это примерно 40 миллиардов миллиардов миллиардов уникальных GUID на каждого жителя Земли. Это даёт нам основание полагать, что конфликтов не будет; ведь у нас целая <em>куча</em> GUID-ов для выбора!<br />
<a name='more'></a><br />
Существует несколько стратегий уникальности GUID, фактически сведения об используемой стратегии закодированы в первых четырёх битах третьей "группы"; почти каждый GUID имеет вид {xxxxxxxx-xxxx-<span style="background-color: yellow;">1xxx</span>-xxxx-xxxxxxxxxxxx} или {xxxxxxxx-xxxx-<span style="background-color: yellow;">4xxx</span>-xxxx-xxxxxxxxxxxx}. <br />
<br />
Если эта группа начинается с единицы, алгоритм обеспечения уникальности по существу является разновидностью стратегии ISBN. Уникальность GUID-а "в пространстве" обеспечивается путём выбора нескольких битов MAC-адреса сетевой карты компьютера. Мудреная задача уникальности MAC-адреса сетевой карты <a href="http://ru.wikipedia.org/wiki/%D0%A3%D0%BD%D0%B8%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B8%D0%B4%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8">как-то решается кем-то другим</a>; как именно, нас не заботит. Стоимость решения оплачивает потребитель при покупке сетевой карты.<br />
<br />
Мы знаем, что можем положиться на это как на источник уникальности в пространстве. Большинство оставшихся битов представляют собой метку времени высокого разрешения. Следовательно, каждый сгенерированный GUID уникален в пространстве и времени, и, соответственно, уникален глобально. <br />
<br />
На практике данная система имеет пару слабых мест. Самое очевидное заключается в том, она не работает как следует, если у компьютера нет сетевой карты! GUID первой версии, сгенерированный на компьютерах без сетевой карты, может не быть уникальным. Менее очевидное состоит в том, что существует незначительная вероятность генерации двух GUID-ов " одновременно". Два генератора GUID могут быть одновременно запущены на двух процессорах одного компьютера. Или после генерации GUID часы компьютера могут быть сознательно "переведены назад", и повторно будет сгенерирован тот же самый GUID. GUID содержит несколько "дополнительных" битов для предотвращения проблем со временем, так что на практике они не встречаются.<br />
<br />
Есть несколько интересных следствий данного алгоритма.<br />
<br />
1. GUID практически полностью <em>неслучайное </em>число. Похоже, многие люди ошибочно полагают, что GUID – источник <em>случайности</em>, хотя на деле это источник <em>уникальности</em>.<br />
<br />
2. GUID-ы, сгенерированные по данному алгоритму на одном компьютере, могут быть <em>монотонно возрастающими</em>. Это действительно хорошее свойство GUID; GUID-ы часто используются в качестве первичного ключа базы данных, намного легче вставить большое количество строк в таблицу с первичным ключом-индексом, если строки уже отсортированы и вставляются <em>после</em> предыдущих записей. Это доказывает ужасность идеи с использованием последовательности GUID-ов в качестве последовательности случайных 128-разрядных чисел; случайные числа обычно не возрастают монотонно!<br />
<br />
3. Программный код или документы, содержащие GUID, сгенерированный по первому алгоритму, <strong>однозначно идентифицируют компьютер, использовавшийся для создания GUID</strong>. Искушенный читатель может узнать интересные сведения о книге по её ISBN. Если тринадцатая цифра GUID – единица, опытный человек также может определить, когда и где был сгенерирован GUID. Этот факт использовался при поиске автора знаменитого вируса <a href="http://www.securelist.com/ru/descriptions/old29310">Melissa</a>. Мы подробно обсудим это следствие в следующий раз.<br />
<br />
4. <strong>Ни одна из частичных последовательностей битов GUID-а не обладает свойством уникальности</strong> (<a href="http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx">об этом писал Рэймонд Чен в 2008 г.</a>). В самом деле, у нас нет причины полагать, что меньший набор битов будет обладать теми же свойствами, что и больший набор битов! Вы ведь не считаете, что половина самолета будет летать подобно целому самолету.<br />
<br />
<strong>В следующий раз</strong> мы поговорим о GUID-ах, у которых тринадцатая цифра – четверка; у них уникальность обеспечивается совсем по-другому.</span></div>En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-20619393265878658622012-05-01T19:09:00.001+06:002012-05-01T19:16:17.013+06:00GUID. Часть первая<div dir="ltr" style="text-align: left;" trbidi="on">
<span xmlns=""></span><br />
<span xmlns="">Автор: Эрик Липперт.<br />
Оригинал статьи: <a href="http://blogs.msdn.com/b/ericlippert/archive/2012/04/24/guid-guide-part-one.aspx">GUID Guide, part one</a>.</span><br />
<span xmlns=""><br />
Что такое GUID? Это сокращение расшифровывается как "globally unique identifier" (глобально уникальный идентификатор); GUID также называют UUID ("universally unique identifier" – повсеместно уникальный индентификатор). Непонятно, зачем нужны два практически одинаковых названия для одного и того же, тем не менее они есть. GUID – это 128-разрядное целое число. Удобная для человека форма представляет собой шестнадцатиричный шаблон вида {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.</span><br />
<span xmlns=""></span><br />
<span xmlns=""><a name='more'></a><br />
Назначение GUID – <em>однозначно идентифицировать</em> что-то, так чтобы мы могли ссылаться на что-то посредством идентификатора и быть уверены, что всем понятно, на что мы ссылаемся. Рассмотрим эту проблему на примере книг. Ссылаться на книгу посредством <em>цитирования всего её содержимого при каждом упоминании книги</em> обременительно. Вместо этого в качестве идентификатора мы даём каждой книге название. С таким индентификатором есть проблема: множество разных книг могут иметь одинаковое название. У меня на столе три разных книги с названием "<span style="text-decoration: underline;">Язык программирования C#</span>"; чтобы сослаться на одну из них, мне надо указать номер издания. Однако любой издатель может опубликовать книгу "Язык программирования C#, четвёртое издание", отличную от других. <br />
Издатели решили данную проблему созданием уникального идентификатора для каждой книги – <a href="http://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B6%D0%B4%D1%83%D0%BD%D0%B0%D1%80%D0%BE%D0%B4%D0%BD%D1%8B%D0%B9_%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BD%D0%B8%D0%B6%D0%BD%D1%8B%D0%B9_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80">международного стандартного книжного номера</a>, или ISBN (International Standard Book Number). Это 13-значный десятичный код, имеющийся в виде штрих-кода почти на каждой книге*. Как издатели присваивают уникальный номер каждой из миллионов книг? Они разделяют и властвуют; каждая цифра ISBN имеет собственное значение. Каждой стране назначается определённый диапазон номеров ISBN; затем каждому издательству выделяется своё подмножество номеров. Издатели сами решают, как присваивать номера своим книгам. У моих книг по C# такие ISBN: 978-0-321-15491-6, 978-0-321-56299-9 и 978-0-321-74176-9. Вы заметите, что первые семь цифр совпадают; они обозначают, что это издательская отрасль (978), что книга издана в анлоязычном регионе (0) издательством «Addison-Wesley» (321). Следующие пять цифр выбраны по усмотрению издательства, последняя цифра – контрольная сумма. Если я захочу однозначно идентифицировать четвёртое издание спецификации C#, мне не нужно указывать полное название; я могу просто указать номер книги, 978-0-321-74176-9, и кто угодно может точно определить, о какой книге я говорю.<br />
Важная и легко заметная особенность системы уникальности ISBN заключается в том, что <strong>она работает лишь, когда все используют её добросовестно</strong>. Если недобросовестный издатель решит сознательно издавать книги с номерами ISBN существующих книг, идентификатор станет бесполезным, потому что он больше не идентифицирует книгу однозначным образом. Номера ISBN и GUID – это не <em>система безопасности</em>; <strong>ISBN и GUID предотвращают <em>случайные</em> конфликты</strong>. Аналогично, светофор лишь предотвращает случайные столкновения, <em>если все соблюдают правила дорожного движения</em>; если кто-то решит ехать на красный свет, возможны аварии. Светофор не может остановить тех, кто сознательно пытается устроить столкновение. <br />
Приятная особенность системы ISBN состоит в том, что можно "расшифровать" ISBN и кое-что узнать о книге прямо по её номеру. Но есть и серьёзный недостаток: <em>слишком дорогое управление</em>. Должно быть международное соглашение о форме идентификатора и о том, что обозначают коды отрасли и языка. В каждой стране должна быть организация (правительственный орган или частные компании, заключившие договор с правительством) для назначения номеров издателям. Получение уникального ISBN может стоить сотни долларов.<br />
Для GUID проблема стоимости отсутствует; GUID бесплатен и не требует управления уникальностью. GUID – это число, которое можно сгенерировать самостоятельно, при этом будет уверенность, что никто в мире не сгенерирует точно такое же число. Похоже на волшебство. Как это работает? В следующий раз мы посмотрим, как достигается эта волшебная особенность.<br />
* Внимательный читатель отметит, что в США на книгах <em>два</em> штрих-кода. Первый – это ISBN; второй – это цифра 5 и 4-значное число, которое представляет собой рекомендуемую издателем цену книги в центах.
</span></div>En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-73231127152952974182012-04-26T08:15:00.000+06:002012-04-26T08:15:34.474+06:00Как запретить открытие файлов TIF?<div dir="ltr" style="text-align: left;" trbidi="on">
<span xmlns=""></span><br />
<span xmlns="">Автор: Рэймонд Чен.<br />
Оригинал статьи: <a href="http://blogs.msdn.com/b/oldnewthing/archive/2012/04/25/10297385.aspx">How do I prevent users from opening TIF files?</a><br /> <br />
У одного клиента был вопрос по Windows XP. (Это было несколько лет назад, поэтому важным здесь является не столько подробное описание проблемы, сколько возможность прокомментировать ситуацию.)<br />
<a name='more'></a><br />
Клиент хотел удалить все файловые ассоциации для файлов TIFF. Сначала он попытался удалить разделы реестра <span style="font-family: Courier New; font-size: 10pt;">HKEY_CLASSES_ROOT\.tif</span> и <span style="font-family: Courier New; font-size: 10pt;">HKEY_CLASSES_ROOT\.tiff</span>. После этого файлы TIFF стали отображаться с общим значком файла, однако при двойном щелчке регистрация восстанавливалась, и файл открывался в «Программе просмотра изображений и факсов».<br />
В компании была странная политика безопасности, которая требовала, чтобы файлы TIFF не были связаны ни с одной программой. Я не знаю причины, но требовалось лишь блокировать файловые ассоциации по умолчанию. Политика не запрещала явное создание новой файловой ассоциации посредством диалога «Открыть с помощью…».<br />
Удаление регистрации не работало, потому что Windows XP автоматически восстанавливала определённые файловые ассоциации, в т.ч. для файлов TIFF. Если регистрация файлов TIFF повреждена, и пользователь принадлежит группе «Администраторы», Windows XP восстанавливает файловую ассоциацию по умолчанию. (Если пользователь не входит в состав группы «Администраторы», появляется сообщение "Windows не может открыть файл".)<br />
Поэтому решение странной проблемы заключается не в удалении регистрации файлов TIFF (после чего она будет считаться поврежденной), а в задании нового обработчика для файлов TIFF, который просто отображает сообщение. Это может быть программа из одной строки с использованием Windows Script Host:<br />
<code>WScript.Echo("Открытие файлов TIFF запрещено.")</code><br />
<code></code>Внимательный читатель, наверное, уже заметил серьезную проблему в настройке системы. Автовосстановление регистрации файлов TIFF означает, что служащие компании работают с привилегиями администратора. Так называемое "требование политики безопасности" похоже на беспокойство по поводу проникновении в здание через вентиляционную решетку, в то время как у всех есть ключ от парадного входа.</span></div>En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-27893734720711663702012-03-12T20:01:00.000+06:002012-03-12T20:02:03.120+06:00Почему программы устанавливаются в каталог «Program Files»?<div dir="ltr" style="text-align: left;" trbidi="on">
<span xmlns=""></span><br />
<span xmlns="">Автор: Рэймонд Чен.<br />
Источник: <a href="http://blogs.msdn.com/b/oldnewthing/archive/2012/03/07/10278793.aspx">Why do program files go into the Program Files directory?</a><br /> <br />
Некоторые программы сертификации Microsoft (например, Windows Logo) требуют, чтобы приложения в качестве места установки по умолчанию выбирали каталог «Program Files». По какой причине выдвинуто данное требование?</span><br />
<span xmlns=""><a name='more'></a><br />
Техническая причина: каталог получает соответствующий дескриптор безопасности по умолчанию. Однако каталог «Program Files» появился в операционной системе Windows 95, в которой не было дескрипторов безопасности, так что это не может полностью объяснить все.<br />
Вернёмся во времена Windows 3.1. Microsoft не давала рекомендации относительно места установки приложений по умолчанию. В результате они устанавливались <em>повсюду</em>. Некоторые устанавливались в корне диска C:, другие – в каталог «<span style="font-family: Courier New; font-size: 10pt;">C:\LitWare</span>», третьи – в каталог Windows. Это был совершенный беспорядок.<br />
Каталог «Program Files» появился в попытке привнести порядок. Считайте это аналогией разметки на автопарковке.<br />
<strong>Дополнение.</strong> Я вспоминаю об исследовании совместимости приложений во времена Windows 95. После установки одна из программ не запускалась. Это была серьёзная проблема с популярной коммерческой программой. В конечном счёте был обнаружен источник проблемы: при установке программы вы <em>должны были выбрать место установки по умолчанию</em>. Если вы пытались установить программу в другое место, она не запускалась. Windows 95 не была источником проблемы; такая же проблема возникала под Windows 3.1 при установке программы за пределы каталога по умолчанию.</span></div>En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-60735452887984184332012-03-06T09:47:00.000+06:002012-03-06T09:47:10.813+06:00Почему кнопка «Развернуть» не разворачивает окно на все мониторы?<div dir="ltr" style="text-align: left;" trbidi="on">
<span xmlns="">Автор: Рэймонд Чен.</span><br />
Источник: <a href="http://blogs.msdn.com/b/oldnewthing/archive/2012/03/05/10277439.aspx" target="_blank">Why doesn't the Maximize button maximize across all monitors?</a><br />
<br />
<span xmlns="">Cheong интересуется, <a href="http://blogs.msdn.com/b/oldnewthing/archive/2010/07/20/10040074.aspx">почему кнопка «Развернуть» не разворачивает окно на все мониторы</a>.<br />
Вначале мы пытались сделать это, но вскоре обнаружили, что это плохая идея.<br />
<a name='more'></a><br />
Представление нескольких мониторов в качестве одного гигантского экрана создаёт ряд проблем, потому что вертикальная линия в центре делит всё, что проходит через неё. Всё, что с одной стороны этой линии, находится на одном мониторе, а всё по другую сторону линии – на другом мониторе. (Добавьте сюда ещё несколько раздражающих линий, если у вас больше двух мониторов.) Если эта линия пересекает текст, то слова разрублены на две части, поэтому вам нужно мысленно склеить их, чтобы прочитать текст.<br />
Ещё хуже то, что разрубленный текст появляется чаще, чем вы ожидаете, потому что многие программы любят располагать по центру свои диалоговые окна. В результате почти каждое диалоговое окно делится раздражающей линией. Диалоговые окна появляются в <em>наихудшем месте</em>.<br />
Ситуация становится хуже, если у вас два монитора с разным размером пикселя (шагом точки): невозможно расположить мониторы так, чтобы выровнять все строки текста. Если вы расположите мониторы так, чтобы совпадали первые строки текста, то убедитесь, что не совпадают последние. Теперь глазам помимо горизонтального разрыва между мониторами приходится преодолевать вертикальный разрыв, возникший из-за разной плотности пикселей. Это усугубляется ещё и тем, что вертикальный разрыв <em>меняется от строки к строке</em>.<br />
Это всё равно что <a href="http://library.thinkquest.org/27066/lightrays/nlrefraction.html">поставить карандаш в стакан с водой и смотреть на него со стороны</a>. Представьте себе стакан, заполненный карандашами, при этом каждый карандаш преломляется <em>по-разному</em>. А теперь представьте, что каждый карандаш – это строка текста, который вы пытаетесь прочитать.<br />
Подождите, я ещё не закончил. Всё становится хуже, если у двух мониторов разный размер. В этом случае виртуальный экран больше видимой области. Например, у меня один монитор слева с альбомной ориентацией, а другой монитор справа с книжной ориентацией, нижние края мониторов расположены на одной линии.<br />
Если окно развернуть на виртуальный экран, содержимое верхней левой части окна будет невидимо! <br />
В определённых случаях может понадобиться развернуть окно на виртуальном экране, и если программа хочет сделать это, она, конечно, может сделать это по-своему. Но даже в программе просмотра изображений разворачивать окно на виртуальном экране не очень здорово: на фотографиях люди часто находятся в центре, в результате чья-нибудь голова может быть разрезана пополам.</span></div>En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-53012369162064897662012-01-26T21:39:00.001+06:002012-01-26T21:56:11.268+06:00Перетащил, и готово<div dir="ltr" style="text-align: left;" trbidi="on">
<span xmlns=""></span><br />
<span xmlns="">Автор: Visio Team.<br />
Источник: <a href="http://blogs.msdn.com/b/visio/archive/2006/05/26/606632.aspx">Drag, Drop, Done</a>.<br />
Мы планируем разбавить блог циклом записей о важнейших особенностях Visio, которые делают эту программу популярной. В каждой теме мы рассмотрим основы с точки зрения пользователя, а затем будем погружаться в технические детали.<br />
<strong>Важнейшая особенность: перетаскивание</strong><br />
Пятнадцать лет назад рынок был поражен новым продуктом с революционным способом создания диаграмм. Вместо конструирования на основе геометрических примитивов наподобие линий и дуг в программе Visio предлагалось перетаскивать заготовки фигур. Visio можно описать фразой «Перетащил, и готово». Создание диаграмм Visio больше похоже на сборку, чем на рисование, и этот механизм сделал сам процесс доступным для многих людей.<br />
Как же на самом деле работает перетаскивание?<br />
<a name='more'></a><br />
Заготовки фигур называются <em>образцами</em>. Образцы находятся в <em>наборах элементов</em>. Наборы элементов отображаются по левую сторону области рисования в окне «Фигуры». Чтобы добавить фигуру, надо перетащить один из образцов из набора элементов на страницу документа.<br />
За кадром Visio делает большой объем работ, чтобы поместить фигуру на страницу. Набор элементов не связан с документом, поэтому Visio сначала надо скопировать образец из набора элементов в документ. (Обычно это действие выполняется незаметно для пользователя. Если вы хотите увидеть список образцов в документе, воспользуйтесь командой File > Shapes > Show Document Stencil.) Затем Visio создает экземпляр образца фигуры и помещает его на страницу документа.<br />
Если снова перетащить тот же самый образец фигуры, Visio проверит наличие копии образца в документе. Если образец уже есть, Visio не копирует его и создает другой экземпляр фигуры для размещения на странице документа. Для сравнения двух образцов Visio использует свойство UniqueID. Значение UniqueID меняется после редактирования образца. Два образца могут иметь одинаковые имена, однако Visio может отличить их по значению свойства UniqueID.<br />
Свойство UniqueID позволяет Visio различать два образца с одинаковыми именами, но пользователям сложнее отличить их. Поэтому Visio обеспечивает уникальность имен образцов в пределах документа. Когда вы добавляете в документ другой образец с тем же именем, Visio автоматически переименовывает его, добавляя точку и номер, например, Person.1 . Для того, чтобы Visio считал идентичными образцы с одинаковыми именами, у образца есть свойство "Match master by name on drop".<br />
Для чего нужны все эти шаги при перетаскивании фигуры на страницу? Для обеспечения переносимости документов Visio. В документе Visio нет внешних ссылок на образцы, поэтому обмеиваться документами без опасения о недостающей информации.</span></div>En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0tag:blogger.com,1999:blog-6075578951966563937.post-89165533544386982472011-10-10T21:59:00.000+06:002011-10-10T21:59:29.604+06:00В некоторых случаях файл автоматической установки – единственная возможность настройки Windows<div dir="ltr" style="text-align: left;" trbidi="on"><span xmlns=""></span><br />
<span xmlns="">Автор: Рэймонд Чен.<br />
<br />
Оригинал статьи: <a href="http://blogs.msdn.com/b/oldnewthing/archive/2011/10/05/10220088.aspx">The unattend file lets you configure Windows while it's installing, and in some cases it's your only chance</a>.<br />
<br />
Некоторые настройки Windows могут быть заданы только в процессе установки. Это делается с помощью так называемого <em>файла автоматической установки</em>. Файл автоматической установки ранних версий Windows был INI-файлом. Windows Vista перепрыгнула в XML-вагон, и формат файла автоматической установки сменился. Использование формата XML позволяет опубликовать схему, чтобы люди могли проверить свой файл автоматической установки, а не запускать тестовую установку (через 20 минут которой обнаружится, что из-за опечатки пропущен целый раздел файла).<br />
<a name='more'></a><br />
<br />
Если настройка компьютеров отнимает у вас много времени, вы можете использовать файл автоматической установки для ответов на вопросы программы установки ("введите ключ продукта" и т.п.). Всё, что надо сделать – это набрать команду "setup /unattend:myconfiguration.xml" и пойти на обед. Когда вы вернётесь, установка будет закончена. <br />
<br />
Две из распространённых настроек должны быть заданы во время установки:<br />
<br />
<ul><li><a href="http://technet.microsoft.com/en-us/library/cc749506(WS.10).aspx">CustomDefaultThemeFile</a> - задаёт тему и обои по умолчанию. <br />
</li>
<li><a href="http://technet.microsoft.com/en-us/library/cc749305(WS.10).aspx">FolderLocations</a> - перемещает каталоги «C:\Users» и «C:\ProgramData», например, на другой диск. <br />
</li>
</ul>Множество других распространённых настроек можно изменить после установки, но эти две настройки можно задать только в файле автоматической установки.<br />
<br />
Кстати, «<span style="font-family: Courier New; font-size: 10pt;">C:\Program Files»</span> не входит в список каталогов, для которых можно изменить путь. О причине я расскажу в следующий раз.</span></div>En-Ru translationshttp://www.blogger.com/profile/12535017358103770859noreply@blogger.com0