Pull to refresh
468
0.4
Artyom Skrobov @tyomitch

Пользователь

Send message

Логика разрыва ссылки на три части (при сочетании LTR и RTL)

Reading time1 min
Views1.9K
k_s интересуется: «Я один не догнал логику разрыва ссылки на три части?»

Для ясности, вместо арабских букв в примерах будем пользоваться транслитерацией.

Текст той ссылки в HTML-коде записан так:
Например, wayawm baṣal эта ссылка yawm ʿasal выглядит разорванной

Браузер отображает арабский текст справа налево:
Например, laṣab mwayaw эта ссылка lasaʿ mway выглядит разорванной

Теперь обозначим в HTML-коде саму ссылку:
Например, wayawm baṣal эта ссылка yawm ʿasal выглядит разорванной

Браузер отображает арабский текст в прежних местах, причём части ссылки так и остаются частями ссылки:
Например, laṣab mwayaw эта ссылка lasaʿ mway выглядит разорванной

Упражнение: ткните мышью перед ссылкой, и, нажимая Shift+вправо, расширяйте выделение по одному символу. Так проще разобраться в соответствии между логическим и визуальным порядком символов.
Например, ويوم بصل эта ссылка يوم عسل выглядит разорванной



Арабская пословица «yawm ʿasal wayawm baṣal» означает «День — как мёд, а день — как лук.»
Total votes 75: ↑59 and ↓16+43
Comments21

Как выглядит арабская клавиатура

Reading time8 min
Views22K
В комментариях к блестящему топику «Как выглядит китайская клавиатура» высказали интересную идею: рассказать про набор текста в разных языках с необычной письменностью.

Арабам относительно повезло: у них лишь 28 букв — даже меньше, чем в русском. Каждой букве можно назначить отдельную клавишу, и ещё останутся свободные. Зато с их письменностью возникают свои сложности, неведомые китайцам.
Читать дальше →
Total votes 176: ↑169 and ↓7+162
Comments233

Смерть OS/2

Reading time3 min
Views8.6K
В обсуждении Windows 3.1 на прошлой неделе danSamara упомянул:
Ваша сложная и многогранная система работала у меня в виртуальной машине из под OS/2, которая уже тогда была по настоящему 32-разрядной и многозадачной, а ваша суровая многогранная правда выглядела убого и неказисто.

Как же так вышло, что убогая и неказистая Windows задушила мощную и совершенную OS/2?
Рассказывают разработчики:

Рэймонд Чен: «убойной прогой» для Windows 1.0 — той, ради которой люди готовы были купить новую ОС, — был Adobe PageMaker. Потом появился ещё и Excel.

Ларри Остерман: на самом деле, Pagemaker и Excel были «убойными прогами» для MacIntosh; уже впоследствии их выпустили и для Windows.

Насколько я помню, под Windows вообще не было «убойных прог». Windows 1.0 и 1.1 продавались скромными тиражами по паре тысяч копий в месяц. Windows 386 (версия 2.0) продавалась лучше, потому что позволяла запускать одновременно несколько DOS-приложений. Не любые приложения можно было запускать одновременно; фактически, едва ли можно было запустить что-то более сложное, чем несколько копий GWBasic.

Всё поменялось, когда вышла Windows 3.0.
Читать дальше →
Total votes 119: ↑110 and ↓9+101
Comments133

Компиляция. 10: компиляция в ELF

Reading time13 min
Views6.8K
В прошлый раз мы ограничились компиляцией джей-скрипа в файл в нашем собственном формате, которому требовался специальный загрузчик. Кроме того, мы задумали было пару оптимизаций исполнимого кода, требующих анализа соседних команд.

Далее в посте:

  1. Оптимизация «в глазок»
  2. Стандартные функции
  3. Вывод в ELF
  4. Как это работает?
  5. Что получилось?
Читать дальше →
Total votes 57: ↑55 and ↓2+53
Comments9

Почему бAARDак не убрали в релизе?

Reading time4 min
Views1K
В бета-версиях Windows 3.1 был скрытый и зашифрованный код, который при запуске на DR-DOS выдавал непонятное сообщение о вымышленной ошибке.

В релизе решили подобными фокусами не заниматься, но код проверок и само сообщение не убрали: они так и остались внутри WIN.COM, и достаточно изменить один байт, чтобы AARD-код снова выполнялся при каждом запуске.

Зачем его оставили? Неужели Microsoft рассчитывала однажды в будущем разблокировать эти сомнительные проверки?
Конечно же, нет. Даже сообщение в релизе осталось неизменённое: «Please contact Windows 3.1 beta support.» Если бы сообщение действительно предназначалось для показа, после окончания бета-тестирования его бы обновили.

Так зачем оставлять в релизе бессмысленный код, который никогда не выполняется?
Читать дальше →
Total votes 131: ↑122 and ↓9+113
Comments61

бAARDак в Windows

Reading time6 min
Views1.9K
Неоднозначную реакцию вызвал рассказ Рэймонда Чена о том, сколько усилий прикладывает Microsoft, чтобы обеспечить совместимость новых версий Windows с чужими программами.

Известен и обратный случай: когда Microsoft намеренно добивалась несовместимости Windows с «неблагонадёжными» клонами MS-DOS. Из выпуска Dr. Dobb's Journal за сентябрь 1993 г.:

Код обнаружения AARD в Windows


Если вы участвовали в бета-тестировании Windows 3.1, и на вашем компьютере стояла DR-DOS, то наверняка вы сталкивались с этим необычным сообщением об ошибке:
Non-Fatal error detected: error #2726
Please contact Windows 3.1 beta support
Press ENTER to exit or C to continue

Хотя это «нефатальная ошибка», и нажатие C продолжает запуск Windows, действие «по умолчанию» — отмена запуска.
Уже подозрительно: если ошибка нефатальная, и Windows способна работать, несмотря на неё, — зачем вообще докладывать о ней пользователю?

Такое сообщение выдавалось программами WIN.COM, SETUP.EXE, HIMEM.SYS, SMARTDRV.EXE и MSD.EXE в нескольких предрелизных выпусках Windows 3.1.
Окончательная версия Windows 3.1 по-прежнему содержит код, выводящий это сообщение. Этот код «выключен», но достаточно изменить один байт в WIN.COM, чтобы его «включить».

Самое интересное в этом сообщении — что оно выводится на всех версиях DR-DOS, включая бета-версию Novell DOS 7, но не выводится ни на MS-DOS, ни на PC-DOS. О чём же это сообщение сообщает?
Читать дальше →
Total votes 180: ↑167 and ↓13+154
Comments66

Байки о несовместимых приложениях

Reading time7 min
Views11K
Это отрывки из бесплатной главы из бумажной книги «The Old New Thing». Они ничему не пытаются научить; это просто короткие забавные эпизоды из будней борцов за совместимость новых версий Windows со старыми приложениями.

Изменяем номер версии Windows


Изменить номер версии, который Windows сообщает программам, не просто, как кажется. Например, некоторые программы проверяют номер версии так:
UINT Ver = GetVersion();
UINT MajorVersion = LOBYTE(uVer);
UINT MinorVersion = HIBYTE(uVer);
if (MajorVersion < 3 || MinorVersion < 10) {
    Error("This program requires Windows 3.1");
}

Представьте себе, как этот код отработает на Windows 95, у которой номер версии 4.0. Вторая проверка срабатывает из-за того, что 0 меньше 10.
И ладно бы программа просто выводила сообщение об ошибке и завершалась. Многие рушились: очевидно было, что их поведение на «неподдерживаемых» версиях Windows никогда не тестировалось.

Таких программ оказалось настолько много, что мы перестали исправлять их по одной, и просто изменили возвращаемый номер версии с 4.0 на 3.95.

Программы для MS-DOS тоже не все гладко реагировали на изменение версии ОС. Это удивительно потому, что к тому времени у MS-DOS уже были десятки выпущенных версий и под-версий, и разработчикам пора было бы уже научиться проверять номер версии. Но например, один пакет программ использовал номер версии DOS как индекс в таблице функций: по собственной функции для каждой вышедшей версии. В таблице было пять функций: от MS-DOS 1.x до 5.x. Когда программа запускалась под MS-DOS 6.0, она вызывала адрес за пределами таблицы, и рушилась.

Изменить номер версии, который Windows сообщает программам, — необходимый, но очень тяжёлый шаг. Пара нажатых клавиш, и падают сотни приложений, отлично работавших до сих пор; теперь отделу совместимости придётся потратить на вылавливание чужих багов лишнюю тысячу человеко-часов.

Читать дальше →
Total votes 147: ↑140 and ↓7+133
Comments144

Компиляция. 9: исполняемый код

Reading time19 min
Views6.1K
Напоминаю, что мы пишем компилятор для игрушечного языка джей-скрип. Начали с компиляции в п-код, потратили немало сил на его оптимизацию, и приготовились к заключительному этапу компиляции — к выводу машинно-зависимого выполнимого кода.
Никаких замысловатых алгоритмов тут уже нет: по большому счёту, только замена одной системы команд на другую.

Далее в посте:

  1. Выбор кода
  2. Загрузчик
  3. Изменения в п-коде
  4. Генерация
  5. Что получилось?
Читать дальше →
Total votes 53: ↑52 and ↓1+51
Comments10

Компиляция. 8: оптимизация

Reading time15 min
Views3.2K
После приятного отдыха продолжаем писать компилятор для нашего джей-скрипа.
В предыдущем посте реализовали взятую с потолка эвристику для назначения регистров, и заодно начали оптимизировать код. А ещё перед этим читатели обнаружили баг в реализации присваивания.

Далее в посте:

  1. Починка бага
  2. Чистка копирований
  3. Что получилось?
  4. Сворачивание констант
  5. Реализация
Читать дальше →
Total votes 43: ↑41 and ↓2+39
Comments6

Поведение хабраредактора при неустойчивом соединении

Reading time1 min
Views399
Обнаружены следующие эффекты:
  1. Если при первом нажатии на «черновик» / «предпросмотр» произошёл сбой соединения, то последующие нажатия просто дизаблят кнопки на несколько секунд, но не пытаются отправить топик по-новой. Необходимо перезагружать страницу и копировать в неё текст.
  2. В некоторой ситуации (неполная загрузка редактора?) нажатие любой из кнопок приводило к переходу на короткий XML-документ с содержимым наподобие «запощено успешно», при этом топик фактически постился в блог. Трижды нажал на
    предпросмотр — запостил в блог три копии топика.

Коллеги, будьте бдительны!

Total votes 1: ↑1 and ↓0+1
Comments0

Почему некоторые называют область уведомлений «треем»?

Reading time3 min
Views14K
оригинал опубликован в 2003, и относится к интерфейсу Windows XP

Короткий ответ: потому что заблуждаются.

Длинный ответ: официальное название штуковины снизу экрана — «панель задач» (taskbar). Она состоит из нескольких элементов — кнопка «Пуск», кнопки переключения между задачами, часы, и «область уведомлений» (taskbar notification area).

Распространённая ошибка — называть область уведомлений «треем» (или даже «системным лотком»). Она никогда так не называлась. Если вы встретите в документации упоминание «system tray», можете доложить, что обнаружили ошибку.

Откуда взялось это неверное название?

В ранних версиях Chicago — ещё до того, как проект получил название Windows 95 — панель задач была не панелью задач, а папкой, зафиксированной снизу экрана. Она была всегда на виду, и можно было «бросать» в неё документы и ярлыки для быстрого доступа — аналогично лотку для всякой всячины, который ставят в верхний ящик письменного стола.



Оттуда и взялось название «лоток (tray) рабочего стола». Немного сомнительное продолжение метафоры «рабочего стола на экране» — но всё ещё в пределах здравого смысла. (Вот если бы вместо обоев на стол клали скатерть...)

Читать дальше →
Total votes 208: ↑170 and ↓38+132
Comments148

Любимый «железный» баг

Reading time2 min
Views2.4K

Ларри Остерман: мой любимый баг — тот, что мы обнаружили на ICL PWS-400. Это была новая платформа от ICL (британская компания, куплена Fujitsu в 2002), и нашей задачей было портировать MS-DOS 4.1 на эту платформу. Проектом занимались пятеро — двое от Microsoft и трое от ICL.
Железо у PWS-400 было довольно необычное: например, программы реального режима могли постранично переключать банки памяти — за счёт этого приложения могли выполняться в фоновом режиме, не мешая одно другому.

Нас было пятеро разработчиков, тестировщиков у нас не было; поэтому мы тестировали новую систему всем, что попадётся под руку. Моим любимым «инструментом тестирования» была игра, которую Валори (жена) принесла с учёбы. Я не помню точно, какая это была игра; но каждый раз, когда я в неё играл и доходил до определённого места, машина вдруг перезагружалась.

Мы подключили к машине ICE (внутрисхемный эмулятор — устройство, позволяющее узнать, что происходит внутри и снаружи процессора), и обнаружили, что процессор получает сигнал перезагрузки извне. Так что как минимум, баг был не в коде.

Парни, собиравшие машину, взяли у меня ту игру, и стали разбираться.

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




Мэтт Уильямс: мне запомнилась пара багов, сводивших меня с ума.

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

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

Так в чём же было дело? Оба раза виновато было солнце. У мыши был небольшой зазор между кнопками, и когда солнце светило на неё под определённым углом, свет попадал внутрь на фотопары и вызывал реакцию, как от вращающегося во все стороны шарика. Точно так же, когда солнце попадало сквозь окно в крыше в загрузочную щель магнитолы, — срабатывал датчик вставленного диска, и магнитола его выплёвывала.
Total votes 2: ↑0 and ↓2-2
Comments3

Компиляция. 7: назначение регистров

Reading time18 min
Views5.4K
File names are infinite in length, where infinity is set to 255 characters.
--Peter Collinson: The Unix File System

Итак, у нас есть программа на п-коде, и в её распоряжении неограниченное количество регистров (т.е. 255). Число регистров у реального процессора куда меньше (предположим, четыре). Что будем делать?

Далее в посте:

  1. Разбор п-кода
  2. Время жизни
  3. Реализация
  4. Простые оптимизации
  5. Расщепление версий
  6. Работа с памятью
  7. Что получилось?
Читать дальше →
Total votes 62: ↑60 and ↓2+58
Comments11

Компиляция. 6: промежуточный код

Reading time17 min
Views11K
Первый этап — разбор синтаксиса нашего джей-скрипа — пройден; подбираемся к генерации кода.

Начнём с генерации п-кода (промежуточного переносимого псевдокода) — нечто вроде «абстрактного машинного языка». Его выбирают так, чтобы
  • его было легко генерировать;
  • его было легко обрабатывать.
Обработка п-кода — это, как правило, его переработка в исполнимый машинно-зависимый код. Тем не менее, можно ограничиться лишь генерацией п-кода, и объявить его готовой скомпилированной программой. Запуск такой программы будет, по сути, интерпретацией п-кода. У этого подхода всё больше и больше сторонников; так что и мы для начала ограничимся компиляцией в п-код.

Далее в посте:

  1. Выбор кода
  2. Компиляция
  3. Выполнение
  4. Backpatching
Читать дальше →
Total votes 53: ↑51 and ↓2+49
Comments14

Предупреждение, что топик сохранён не полностью

Reading time1 min
Views629
Когда топик длиннее некоторого порога, при его сохранении в черновики конец текста необратимо стирается, что безмерно обидно.

Желаю при сохранении слишком длинного текста получать предупреждение — такое же, как при сохранении текста без хабраката.
Total votes 23: ↑22 and ↓1+21
Comments11

Компиляция. 5: нисходящий разбор

Reading time10 min
Views25K
До сих пор занимались восходящим синтаксическим разбором. Какие ещё есть варианты?
Отложим бизона в сторону, и вернёмся к теории.

Далее в посте:

  1. Идея
  2. Воплощение
  3. Холивар
  4. Бэктрекинг
Читать дальше →
Total votes 33: ↑28 and ↓5+23
Comments26

Компиляция. 4: игрушечный ЯП

Reading time18 min
Views19K
С грамматиками калькуляторов поиграли достаточно, переходим к языкам программирования. Бета-тестеры статьи подали идею писать JavaScript-подобный язык: начнём с простейшего скобчатого скелета, и будем его постепенно обращивать наворотами — синтаксическим сахаром, типами данных, поддержкой функций, и т.д.

Чтобы неполноценность нашего языка была понятна уже из названия, назовём его JSkrip.

Далее в посте


  1. Синтаксис
  2. Грамматика
  3. Парсер
  4. Синтаксическое дерево
  5. Pretty-printing

Читать дальше →
Total votes 37: ↑32 and ↓5+27
Comments13

Компиляция. 3: бизон

Reading time13 min
Views47K
Это единственный пост в серии, в центре внимания которого — старообрядный сишный бизон, так надоевший некоторым. Тем, кто пишет не на Си, пост всё равно должен быть интересен, потому что похожие по принципу работы генераторы LR-парсеров существуют для очень многих языков. Тех же, кто идеологически не приемлет LR-парсеры, мне сегодня привлечь нечем.

Далее в посте:

  1. Компиляция грамматики
  2. Двухступенчатый парсер
  3. Что у него внутри?
  4. Конфликты в грамматике
  5. Как это работает?
Читать дальше →
Total votes 73: ↑71 and ↓2+69
Comments15

Компиляция. 2: грамматики

Reading time11 min
Views40K
В предыдущем посте было много кода и, по некоторым мнениям, недостаточно объяснений. Будем чередовать: в этот раз будет много теории, а до практики почти не дойдёт.

Далее в посте:

  1. Магазинный автомат
  2. Формальные грамматики
  3. LR-парсинг
Читать дальше →
Total votes 56: ↑51 and ↓5+46
Comments22

Компиляция. 1: лексер

Reading time7 min
Views91K
Меня всегда завораживало таинство рождения программой программы. К сожалению, российские вузы уделяют мало внимания сей интереснейшей теме. Рассчитываю написать серию постов, в которых поэтапно создадим маленький работоспособный компилятор.

Первые посты серии уже подготовлены, и бета-тестировались в одном маленьком и наглухо закрытом сообществе. Тем не менее, я буду продолжать их править с учётом пожеланий почтенной хабрапублики.

Далее в посте:

  1. С какой стати писать компиляторы?
  2. Общий план
  3. Анализ текста
  4. Практический пример
  5. Как это работает?
Читать дальше →
Total votes 93: ↑89 and ↓4+85
Comments45

Information

Rating
1,662-nd
Works in
Registered
Activity