У меня вроде бы день рождения. Надо срочно придумать, что полезного сделать, чтобы задать тон на весь год.
Записи за месяц: August 2008
В доме, где живут кошки
В доме, где живут кошки, единственное нормальное состояние предмета – это “прибит к полу гвоздями”. Потому что иначе, даже если у вас игла в яйце, яйцо в утке, утка в зайце, заяц в сундуке а сундук тот на высоком дубу, кошки всё свалят, выпотрошат, расколотят, иглу закатят куда-нибудь под диван, и сделают вид, будто это так само вышло.
Вот у меня стоял на подоконнике сахар кубиками. На нём повадилась спать кошка! Я её пять раз гонял, но безуспешно: вчера прихожу – весь сахар по полу, а кошка спит на подоконнике в другом месте, как бы не она.
У раковины стоит огромное мусорное ведро. Это охотничьи угодья наших котов. Стоит отвернуться, и они осторожно встают на цыпочки и лезут туда лапой, пытаясь выудить что-нибудь ценное. Например, шкурку от колбасы. И потом гонять её по всей квартире лапами, сшибая от радости всё, что стоит на пути – чёрт возьми, так увлекательно!
Опасно что-либо класть на любые плоские поверхности. На шкафы, холодильники, полки, столы. Коты просто придут туда, утвердят себя ногами промеж хлама и плюхнутся набок. Хлам, вытесненнный телом котом, посыпется со всех сторон на пол. Коты на это даже внимания не обратят, а вернее, они так и задумывали.
Компьютерная история
Ниже изложена крайне увлекательная история моих мытарств ради решения одной любопытной проблемы. Ещё там есть куча полезных ссылок. Под конец будет вопрос ко зрителям.
Если вы не знаете, что такое Windows API, то можете сэкономить время, не читая этой записи. Вот вам пересказ её вкратце: я горжусь собой, поскольку я крутой и бесстрашный
А теперь постановка задачи
Примерно каждый восьмой раз записанная от корки до корки флешка не запускается. Винда вылетает в чёрный экран при загрузке с надписью
File is missing or corrupt – C:\WINDOWS\SYSTEM32\CONFIG\SYSTEM
Это, к сведению, файл с ветвью HKEY_LOCAL_MACHINE системного реестра. Ошибка повторяется при перезагрузках. Указанный файл на диске есть, более того – он читается, и его можно подгрузить в реестр на любой рабочей машине (“File -> Load hive” в regedit, если кто не знает). Теперь сюрприз: чтобы исправить ошибку, достаточно перенести этот файл на другой диск, а затем перенести его обратно. После этого винда с флешки загрузится.
Почему операционная система на другом компьютере читает файл целиком и нормально, а та же операционная система при загрузке не может его прочесть?
Может быть, файл читается не с первой попытки, а на этапе загрузки глупая система не догадывается попробовать снова? Заряжаю procmon – это утилита, перехватывающая обращения к диску и реестру. Нет: в работающей операционной системе все запросы на чтение выполняются без ошибок. Но это мало чего даёт, драйвер может сам бороться с ошибками, не сообщая об этом наружу.
Пишу простое приложение, читающее диск по секторам. Замеряю время отклика: одинаковое для всех секторов. Вряд ли где-то есть повторное чтение. Попутно выясняется ещё одна любопытная вещь: если со сломанного диска снять образ, а потом записать его обратно, то он начнёт грузиться!
Ну что тут поделаешь? Под работающей системой всё безупречно. При загрузке стабильно ошибка. Логики никакой. Будь это пользовательское приложение, я бы его дизассемблировал и отладил, но тут ошибка в режиме ядра. При загрузке системы. Там ещё и графики нет.
Сдаваться?
Чёрта с два.
Приобретаю нуль-модемный кабель – это COM-COM, замкнутый крест-накрест, что-то вроде кроссовера для Ethernet. Соединяю тестовый компьютер с рабочим, на рабочем запускаю WinDbg, а на тестовом – вы уже догадались, к чему дело идёт? – пишу в boot.ini “/DEBUG /PORT=COM1 /BAUDRATE=115200”.
После часа мытарств оно подключается, соединяется, срабатывает брейкпоинт и я уже замахиваюсь руками над клавиатурой – сейчас я буду отлаживать ядро операционки! – , но… фиг вам. Не судьба. Ошибка происходит до инициализации дебаггера. Ошибка происходит вообще до загрузки NTOSKRNL. Ошибка в NTLDR.
Краткий экскурс в сторону. Как загружаются все Windows NT, за исключением Висты и Server 2008.
Вначале работает BIOS. Сделав свои дела, он передаёт управление коду в загрузочном секторе активного раздела диска. Этот код очень маленький, и делает он только одно: находит на диске файл NTLDR, и передаёт управление ему. NTLDR – это загрузчик системы. В него встроены драйвера FAT и NTFS, при помощи которых он читает с диска boot.ini, и предлагает пользователю выбрать систему. Если у вас несколько операционок, вы наверняка видели это меню. Если операционка одна, меню на экране не появляется, но вы всё равно можете в него попасть, долбя по клавише F8 при загрузке.
Если выбранная система – DOS или 9x, NTLDR просто передаёт управление сохранённому в файле загрузочному сектору DOS. Иначе он сам начинает загружать NT: подгружает HAL и пару драйверов, затем читает реестр в память, находит в нём список boot-time драйверов (это первичные драйверы, самые необходимые для загрузки – драйверы жёстких дисков и файловых систем, чипсета, и тому подобного). К слову, в это время драйверы NTFS ещё не загружены! Вообще ничего ещё не загружено! В NTLDR намертво вкомплирован свой собственный драйвер NTFS, которым он и пользуется на первых порах, пока не загрузит boot-time драйверы.
И наконец, когда вся эта пляска закончена, управление передаётся NTOSKRNL.EXE, который и загружает далее операционную систему. Где-то в нём запускается отладчик, позволяющий контролировать загрузку через COM-port.
Лирическое отступление было нужно для того, чтобы вы полностью осознали: в момент, когда грузится реестр, нет ничего. Вообще НИЧЕГО. Это даже не режим ядра, это вообще чистый ассемблерный код, пользующийся только собственными сервисами и биосом.
Сдаёмся?
Ну конечно же, нет.
Поисками в торрентах и по интернетам была найдена отладочная версия ntldr. Эта дикая редкость поставлялась вместе с DDK, причём c XP_DDK, который больше не распространяется, поскольку его заменил 2003_DDK, содержащий всё то же самое, кроме одного. Этой самой отладочной версии ntldr. Можете себе представить, что она нужна максимум паре тысяч человек на планете, и у большинства из них она давно есть.
Был скачан пакет символов для checked-версии XP Rtm. Ни один пакет символов на сайте не подходит к ntldr из XP_DDK, и в самом DDK символов для неё не было (о чём они вообще думали?!), но checked-версия чистой XP подходит более-менее (начала функций прыгают на пару десятков инструкций в стороны, но это уже мелочи).
Дебаггер запустился, подключился и успешно застыл ещё до загрузки HAL. Я ликовал. Но ликование моё было преждевременным.
Убив почти сутки на тупой разбор ассемблерного кода, исписав кипу бумаги адресами и изрисовав блок-схемами, я вычленил виноватых. Во-первых, файл реестра открывался. Во-вторых, он читался до определённой точки. В третьих, очередной кусок файла не читался, причём ошибку возвращала даже не функция Ntfs, а вызываемая ей функция низкоуровневого чтения с диска. То есть, тупо не читается какой-то сектор. Но почему?
Я влез в функцию чтения. Функция чтения была короткой.
push 058h
push 021Ch
retf
Неплохо, да? Учитывая, что ассемблер я учил на ходу, я развеселился. (Вообще, я веселился всё время, пока разбирал код загрузчика. Иногда я веселился так, что мне хотелось биться головой об стол от смеха). Какого чёрта?
А всё просто. До сих пор адресное пространство было flat – и режим уже был защищённым, это постарался загрузчик ещё до того, как запустил дебаггер. А этой функции, чтобы сделать запрос к int 13h, потребовался segemnted-режим. Она запихала в стек оффсет и адрес, и сделала retf, который вытащил оффсет с адресом и перешёл по ним. В следующее мгновение я уже был в сегментной адресации. И там меня ждал сюрприз, плохой. Дебаггер не работал. Единственное, что он мог – это исполнить первую команду. На второй или любой из последующих отлаживаемый компьютер перезагружался.
А мне нужно было отлаживать именно эту функцию. Во всяком случае, я хотел узнать, что передают в int13h, и что она возвращает. Что делать? Ну ясно, что. Я сделал дамп памяти функций, исполняющихся в сегментированном режиме, и стал их разбирать.
Оказалось, в этой несчастной функции вызова int13 всё устроено примерно так:
1. Создать новый стек по фиксированному адресу.
2. Скопировать старый стек в новый.
3. Вызвать функцию, делающуют НЕИЗВЕСТНО_ЧТО в одну сторону (НЕИЗВЕСТНО_ЧТО включало в себя перезапись таблицы прерываний и глобальной таблицы дескрипторов, я подозреваю, какие-то трюки с режимом исполнения. Скорее всего, управляемый real режим под protected).
4. С кучей мытарств подгрузить из стека параметры и вызвать int13.
5. Вызывать функцию, делающую НЕИЗВЕСТНО_ЧТО в обратную сторону.
6. Выгрузить новый стек, восстановить старый.
7. Ну и запихать в стек flat-адрес и сделать нормальный ret.
Теперь-то мне всё кажется простым. Теперь у меня есть карта, с точностью до байта, куда какие параметры попадают, и как с ними обращаются. Тогда это был тихий кошмар – и не забывайте, что всё это делалось на бумажке и в текстовых файлах, а проверить свои предположения я никак не мог, поскольку дебаггер в этой функции не работал вообще.
Ну да ладно.
Я разобрался, какие параметры передаются, и что приходит в ответ. На нормальный набор параметров (и да, я знаю, что блоки памяти должны не пересекать границу сегмента) биос возвращает 8012h. 80 в AH (то есть, это код возврата – “Drive not ready, timeout”), 12 в AL (по документации это число прочитанных секторов, но экспериментально я убедился, что он возвращает 8012 и тогда, когда просто выдёргиваешь флешку ещё до выполнения int13).
Вот теперь я почти в тупике. Ну да, я дизассемблировал всё на свете до самого источника проблемы. Ну да, я знаю, что на нормальный запрос биос возвращает ошибку. Я только не знаю, почему.
Есть какие-нибудь идеи, что делать дальше? Я так подумываю дампнуть биос, лол. Где наша не пропадала! Ещё есть идея загрузиться из под доса, и повторить int13, приводящий к ошибке, вручную – но только что мне это даст, каким бы не был результат?
Ну да, ещё можно вставить флешку в другой компьютер. Тоже мысль. Надо было сразу попробовать. Но хотелось бы не просто найти виноватых (уже ясно, кто они: пара флешка-биос), а ещё и придумать что-нибудь, что спасло бы сотни стоящих в терминалах флешек от апгрейда. Ну например, если я пойму причину ошибки, я смогу переписать прошивальщик так, чтобы он шил только в “безопасные” сектора – те, что биос читает.
Нашёл для себя бесконечный источник смеха. Читать свой дневник через Google Translate.
In such a situation, when Microsoft stops supporting XP, the user, of course, negoduet. “What’s the case, I want obokrast!”
References to the forums, where the Nuba Nuba ask “And I heard, crypt32.dll – is a virus?” And so five pages. In the end, turn tyka method.
How can we tolerate such soplezhuystvo! A guy or not? This is a rhetorical question, no, he did not guy. Shame, the horror.
Какой прекрасный английский! Душа радуется. No, he did not guy. Shame, the horror.
UPD. Плюс в карму тому, кто догадается без подглядывания, что это значило:
Emotions uneven, there is no sharp jumps to the village, nor to the city.
Mai-Otome Zwei
Я тут сел смотреть Mai-Otome Zwei, а поскольку все прошлые Hime и Otome мне нравились, я уже заранее размахнулся написать длинный пост о том, почему продолжения всегда хуже оригиналов. (Потому, что удовольствие от просмотра зависит не только от сериала, но и от настроения в момент просмотра. А настроение со временем меняется).
Так вот, поста не будет. Zwei великолепен, как и все прошлые части
Меня восхищают люди, делающие этот франчайз, поскольку запал его никогда не ослабевает. Начиная смотреть каждый новый сериал (так было и с Химе, и с Отоме), я жду какого-нибудь долгого и скучного действия, а нахожу одно – драйв. С места в карьер. Захватывающее действие под великолепную музыку. Мир, который моментально становится “своим”, без долгих знакомств и вступлений.
Мир нелепый и нереалистичный, в этом я согласен с оппонентами. Но знаете, что? Я пытался найти подходящее сравнение, и ближайшее, что мне напоминают вселенные Химе/Отоме – это Кирандия. Были такие квесты давным-давно, году в 91-м, ещё под досом. Кто не играл – много упустил, найдите эмуляторы и поиграйте. Такой же волшебно-несерьёзный мир, сказка, которая умудряется одновременно шалить, шутить, и вдруг оказываться серьёзной и трогательной. Химе ещё не была такой, но Отоме к этому всё ближе и ближе.
А ещё замечательны мелкие детали. Героиня, разговаривая по телефону, пальцем указывает кому-то, что надо сделать. При смене системы питания костюмов солдаты на миг теряют антиграв и проваливаются на пару метров в воздухе. Мониторчик костюма пишет “спасибо за пользование услугами”, перед тем, как выключиться
.
UPD. Ха-ха, опознал Якумо из скулрамбла. Как я раньше её не замечал?
UPD-2. Как мало!
Меланхолия Харухи Судзумии
Коидзуми в японской версии говорил, как дамский угодник. Причём говорил так со всеми, отчего многие зрители мигом записывали его в голубые. Коидзуми в русской версии говорит, как диктор девятичасовых новостей на первом канале. Амплуа поменялось, но новая роль достаточно интересна и Коидзуми хорошо играет. Поэтому плюс.
Микуру в японской версии была плаксивой фифой. Все её за это звали овцой. В русской озвучке она стала мягкой хрупкой девочкой, которую действительно хочется любвить и защищать. Эдакой младшей сестрёнкой в японском понимании. Именно такой её задумывали, поэтому тут дубляж бесподобен – плюс.
Харухи была гиперактивной, никогда не унывающей оторвой, давившей в себе малейшие признаки тоски кувалдой сумасшествия. Из-за крикливости и вечной весёлости она многим не нравилась. В русской версии Харухи стала капризной плаксой, обиженной на весь мир. Тоску Харухи не давит, а наоборот – холит и лелеет, ноет круглыми днями. Никакого контраста не получается, и сцена на железнодорожном переезде выглядит ещё одной жалобой в бесконечном ряду. Жирный минус.
Кён был скучным материалистом, циником и занудой. Он не рассказывал историю – он её бубнил, перемежая реплики с бесконечными саркастическими комментариями. Поскольку большинство анимешников такие же материалисты и зануды, Кёна все любили и считали своим в доску. Кён в дабе – восторженный школьник, принимающий прописанные доктором пилюли “Пофигистин”. Пока таблетки действуют, Кёну пофигу всё на свете. Как только коробочка заканчивается, Кён срывается и начинает возглашать с таким восторгом, как будто ему, минимум, подарили набор “Юный техник”. Особенно жутко это смотрится в “Меланхолии-шесть”. Там Кёну достался никак не меньше, чем целый самосвал солдатиков. Минус.
Что касается Харухи и Кёна, общая претензия к ним такая: они пытались сыграть больше, чем надо было. Сеттинг, в общем, довольно простой. Каждого персонажа можно описать двумя словами. Такая простота создаёт контрастность, когда персонаж воплощает буквально пару эмоций, но зато на ять. Харухи веселится а Кён брюзжит. В экстренных ситуациях Харухи грустит а Кён лезет целоваться. Всё. Точка. Больше играть ничего не надо было. В дабе же всё вперемешку: настроения у Харухи с Кёном скачут, как козлы по горным тропам.
Нагато была и осталась молчаливой наукой, умеющей много гитик. Плюс.
Ещё плюсы сестрёнке Кёна и коту. Условный плюс Танигути
.
Финальное резюме по скрипту шести серий. Можно было сделать лучше. Логические дырки, как бы не смертельны они не были, ранят в самое сердце. “Вспомни о библиотеке” ранит туда же. Бедная Нагато.
Меланхолия Харухи Судзумии
Смотрю русский дубляж от Reanimedia. (Извольте, полнейший отчёт)
— Отлично:
Коидзуми Ицуки – дополнительный балл за блестящую игру в нулевой серии.
Асахина Микуру – некоторые огрехи компенсируются чудесной работой с интонациями в длинных диалогах.
— Приемлемо:
Нагато Юки – сыграно хорошо, но без изысков.
Кён – сыграно с изысками, но зачастую не так хорошо.
— Терпимо:
Харухи Судзумия – некоторые моменты озвучены гениально, другие откровенно слабо. Эмоции неравномерны, есть резкие скачки ни к селу, ни к городу.
Цуруя – было бы приемлемо, но японская Цуруя знаменита именно своим смехом, а тут смех какой-то не такой.
Танигути – играет неровно, но искренне.
Асакура – интонации японского оригинала переданы плохо, а собственные недостаточно сильны, чтобы их заменить. В итоге – яркий персонаж превратился в “ни рыбу, ни мясо”.
— Плохо:
Куникида – голос со внешностью совершенно не вяжется.
Президент компьютерного кружка.
В принципе, даб нравится. Не так хорошо сделан, как “Девочка, покорившая время”, но тоже приятен. Вся музыка великолепна. Если реани станут так озвучивать каждый релиз, я буду покупать их только за это одно. Пусть хоть одноголосый перевод носом делают, с такой музыкой мне плевать.
Теперь текст. Двоякое ощущение. С одной стороны, перевод хороший, живой. Многие логические цепочки, которые у меня (позор мне) и у большинства сабберов (позор им) затёрлись, здесь восстановлены. В результате изложение прямо на глазах становится связней, происходящее обретает смысл, сцены вытекают одна из другой. Язык богатый (богаче моего, по ощущениям), испортить оригинал авторы не боялись, и допускали, слава богу, вольности – дословный дубляж был бы ужасен.
С другой стороны, кое-где из ткани текста лезут словесные нитки, торчат бессмысленные фразы. Местами плавность рвётся, и диалог превращается в озвучивание своих реплик по очереди. Во многом в этом виноваты Харухи и Кён. Каждый из них разговаривает сам с собой, и когда эти двое сходятся, дубляж едет. Но и сам скрипт не всегда гладок.
Вся терминология решена хорошо. “Клубы” и “кружки” вполне справедливо используют вперемешку (может, перенять это? правы они, согласен – нечего циклиться). Организация Нагато названа “Интегральной мыслеформой”, или как-то так, я им завидую, хорошее название. Единственное, что удивляет – странные ударение во всех именах. Асахина Микуру, Юки Нагато и Ицки Коидзуми. Я как-то привык считать их Асахиной МикурУ, Нагато Юки и Ицки Коидзуми. Мне казалось, что в аниме их достаточно ясно так произносят. Ну или хотя бы Микуру, Нагато и Коидзуми. И не так явно выделять ударения.
Пришло в голову, почему Виста непопулярна. Не потому, что она глючна – Виста не глючнее XP. И не потому, что медленная – XP в своё время тоже подтормаживала на слабом оборудовании. И не потому, что интерфейс перегружен, или UAC надоедает, или совместимости нет. Всё это, во-первых, сильно преувеличено (интерфейс и UAC отключаются, совместимость очень высока), а во-вторых, и с XP было точно то же самое. И про неё тоже говорили “Ой, да в этой новой системе одних только красивостей добавили, а по сути ничего не изменилось”. И её укоряли в плохой совместимости и неудобных нововведениях.
Однако же на XP все перешли быстро и с улыбками на лицах, а Висту до сих пор ставят только на новые компьютеры.
Так в чём же дело? Почему Висту не хотят покупать?
А дело в том, что бизнес-модель Майкрософт исчерпала себя. Вот и всё. Наверное, впервые за свою долгую историю флагманское подразделение Майкрософт пытается, как кино- и звукоиндустрия, остановить время, заставить изменившийся мир плясать под старую, неудобную дудку.
Me вышла в 1999-м. Тогда программы покупали на компакт-дисках в переходах, а ночи проводили у звякающих модемов. XP вышла в 2001-м. Сегодня на дворе 2008-й, и широкополосный интернет есть даже у дедушек с бабушками. Сегодня обновлять систему через интернет – это не просто удобно, это нормальная жизнь для большинства пользователей. Её больше не ставят с дисков, чтобы потом пользоваться в неизменном виде. Сегодня, пока не закачаешь сервис-пак и пару десятков патчей, даже работать толком нельзя.
Раньше ОС могла устаревать. Ясно было видно, что вот компакт-диск, он куплен в 95-м году, а вот этот – в 2001-м. И то, что ставится с первого, оно старое, а на втором – новое. Потому, что шесть лет прошло.
Сейчас операционная система обновляется автоматически. И люди к этому привыкли. Они знают, что раз вылезло окошко “Обновления установлены” – значит, операционная система “подтянулась” до самого последнего уровня. Все ошибки исправились, все глюки устранились. У них на компьютере сегодняшняя операционка.
И тут появляется кто-то, скажем, Гейтс, и предлагает им купить ещё одну.
“А нафига? У меня на компьютере и так новая операционка! Зачем мне ещё одна? Что в ней такого нового? Да как ни посмотри – тот же рабочий стол, те же иконки. Вы мне продаёте то, что у меня уже есть! Только картинки в ней поменяли!”
Иными словами, пользователь не чувствует товара. У него нет больше связи “компакт-диск – ОС” в голове. Его нынешняя операционка больше не “старая”, и покупать новую незачем.
В такой ситуации, когда Майкрософт прекращает поддержку XP, пользователь, разумеется, негодует. “Что за дела, меня хотят обокрасть! У меня была новая операционка, а у меня её отнимают и заставляют покупать ещё одну, ненужную! Сволочи, ворюги!”
Но раньше-то было точно так же. Просто раньше был психологический фактор: пользователь чувствовал необходимость в апгрейде. А теперь этого фактора нет.
И более того: его нет совершенно справедливо. Потому, что ситуация, когда слегка подправленная операционка продаётся заново – это идиотизм, который был простителен лишь по причине отсутствия интернета. Но сегодня, когда интернет есть, когда обновление системы проводится кликом мыши, совершенно непонятно – а с фигу ли некоторые обновления выполняются кликом мыши, а другие – продаются на компакт-дисках по 600 баксов и требуют многочасовой переустановки всего софта? В принципе-то они похожи!
В общем.
Чтобы новые операционные системы продавались, Майкрософт должна:
1. Отказаться от выпуска обновлений такими большими пакетами. Попросту говоря – больше не будет новых операционных систем. Будут только сервис-паки, вносящие небольшие наборы изменений.
2. Ввести постоянную плату за пользование сервисами обновления. Причём подписка должна быть непрерывной. Вначале ты покупаешь за 600 баксов операционку и получаешь, скажем, два года бесплатных апдейтов. А потом ты должен постоянно продлевать подписку за, скажем, 100 баксов в год. Если больше года не продлил – пиши пропало, плати 600 баксов за современную систему, или сиди на своей необновлённой.
3. Для тех, кто регулярно платит, доступно дерево релизов. Сервис-пак 2, и все обновления к нему по выбору. Сервис-пак 3, и обновления к нему. Можно поставить себе любую версию, если хочется обратной совместимости.
Последний пункт, конечно, уже фантазии. Но остальное вполне можно сделать, и это удобнее для конечных пользователей, чем постоянная необходимость переустанавливать систему. Да что там, и для серверов это удобнее. Потому, что никто не мешает поставить последнюю сборку, а затем накатывать только критические обновления.