Евгений Степанищев

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

«Chomp!»

Игрушка «Chomp!», входящая в состав плеера Cosmo VRML Player — вы играете за акулу, поедающую разное

Где-то в конце девяностых, копаясь в папках популярного тогда браузера компании «Нетскейп», я натолкнулся на игрушку, написанную с использованием VRML — языка для демонстрации трёхмерной интерактивной графики. Сейчас он практически забыт, а в те годы активно пытался завоевать популярность.

С тех пор, в те редкие моменты, когда кто-то из собеседников вспоминал VRML, я рассказывал про ту игру. Всё, что я о ней помнил — играть надо за акулу, которая плавает и что-то там поедает. За все эти годы мне не встретился ни один человек, который бы понимал о чём я говорю.

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

Вчера решил предпринял очередную попытку, гуглил до изнеможения, пока не нашёл где-то упоминание, что компания «Нетскейп» когда-то распространяла свой браузер с вместе с «Cosmo VRML Player».

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

У меня на ноутбуке уже есть виртуализация — «Parallels Desktop» какой-то бородатой версии, так что я просто скачал в интернете первую попавшуюся загрузочную дискету ДОС с поддержкой сидирома, образ «Виндоуз 95» и всё установил.

Потом поставил внутрь «Нетскейп Навигатор 4.04», «Космо Плеер 2.1», «DCOM95», «DirectX 8.0a» и универсальный видеодрайвер. Именно с таким набором ПО всё завелось и довольно шустро заработало.

Файлы передавал через образы, монтируя их в виртуальной среде как сидиром. Оказалось «Дисковая утилита» «Мака» умеет такие образы создавать (только надо выбирать гибридный формат без сжатия).

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

10 декабря   netscape   айрхеология

Внутренности советской ёлочной звезды

Внутри советской звезды на ёлку — пять резисторов и пять лампочек

Новый год всё ближе, надо уже думать что делать со звездой, которую мы купили на барахолке. Сегодня интереса её разобрал — внутри пять непонятных лампочек (не видел такие раньше) и пять резисторов на 22 килоома.

Напряжение, подаваемое на вход — 220 вольт, звезду с таким напряжением постоянно включенной на сухом дереве не оставишь. Если успею, переделаю. Только на что бы заменить лампочки, чтобы не испортить?

8 декабря  

99 бутылок: Ассемблер 6502 для Apple I

66. Ассемблер 6502 для «Эпл I». 6502 — восьмибитный микропроцессор, выпускавшийся в 1975 году компанией «МОС Текноложи».

У процессора всего 56 команд (не считая недокументированные), доступны три регистра — A, X и Y. Очень необычно устроена адресация — первые 256 байт памяти доступны через восьмибитную адресацию, всё остальное пространство — через шестнадцатибитную.

Мнемоники трёхбуквенные, в основном — смысловые сокращения или акронимы, запоминаются легко. Например, LDY — LoaD Y, ASL — Arithmetic Shift Left, JSR — Jump to SubRoutine и так далее.

Процессор использовался в первом персональном компьютере «Эпл», для него я и написал «песню про пиво», использовав для печати на экран куцее встроенное АПИ.

Очень помогло, что в наборе команд есть десятичный режим — в этом режиме после прибавления единицы к «09h» получается «10h», а не «0Ah» (надо только помнить, что в этом режиме работают всего две команды — ADC и SBC). «Бутылки» в этом режиме считать значительно легче.

.ORG    00280h
            .CPU    6502

ECHO        =       $FFEF
PRBYTE      =       $FFDC
PRHEX       =       $FFE5
MONITOR     =       $FF1F

            SED
            LDA     #$99
LOOP_:
            PHA
            JSR     BOTTLES
            JSR     B_OF_T_WALL
            LDX     #(ENDPASSSTR - STRS - 2) ; ", "
            LDY     #2
            JSR     PRINT
            PLA
            PHA
            JSR     BOTTLES
            JSR     OF_BEER
            JSR     DOT_CR
            JSR     TAKE_ONE_DOWN
            PLA

            SEC
            SBC     #1

            PHA
            JSR     BOTTLES
            JSR     B_OF_T_WALL

            JSR     DOT_CR

            PLA

            CMP     #0
            BNE     LOOP_

            JSR     NO_MORE

            JMP     MONITOR

PRINTNUMBER:         ; in A (number), use A
            CMP     #$F
            BCS     $+5
            JMP     PRHEX
            JMP     PRBYTE

PRINT_PSTR:          ; in X (offset), use A, Y
            LDY     (STRS),X
            INX
PRINT:               ; in X (offset), Y (len), use A
            LDA     (STRS),X
            JSR     ECHO
            INX
            DEY
            BNE     PRINT
            RTS

BOTTLES:             ; in A (quantity), use X, Y
            CMP     #0
            BEQ     NO_
            PHA
            JSR     PRINTNUMBER
            LDX     #3 ; skips len+"NO"
            LDY     #8 ; length of " BOTTLES"
            PLA
            CMP     #1
            BNE     NO_ONE_
            DEY      ; 7 - length of " BOTTLE"
NO_ONE_:
            JMP     PRINT

NO_:
            LDX     #0
            JMP     PRINT_PSTR

B_OF_T_WALL:         ; use X, Y, A
            LDX     #(BEERONTHEWALLSTR - STRS)
            JMP     PRINT_PSTR

OF_BEER:             ; use X, Y, A
            LDX     #(BEERONTHEWALLSTR - STRS + 1) ; skips len
            LDY     #8 ; length of " OF BEER"
            JMP     PRINT

DOT_CR:              ; use X, Y, A
            LDX     #(END - STRS - 2) ; "." + CR
            LDY     #2
            JMP     PRINT

TAKE_ONE_DOWN:       ; use X, Y, A
            LDX     #(PASSSTR - STRS)
            JMP     PRINT_PSTR

NO_MORE:             ; use X, Y, A
            LDX     #(ENDSTR - STRS)
            JMP     PRINT_PSTR

STRS:
            .PSTR   "NO BOTTLES"
BEERONTHEWALLSTR:
            .PSTR   " OF BEER ON THE WALL"
PASSSTR:
            .PSTR   "TAKE ONE DOWN AND PASS IT AROUND, "
ENDPASSSTR:

ENDSTR:
            DB      128,"NO MORE BOTTLES OF BEER ON THE WALL, NO MORE BOTTLES OF BEER.",$8D
            DB      "GO TO THE STORE AND BUY SOME MORE, 99 BOTTLES OF BEER ON THE WALL.",$8D
END:

Для отладки, написания программы и перевода в машинные коды использовался довольно удобный «онлайн-ассемблер Асм80», для исполнения программы — «ОупенЭмулятор».

Сначала программу я вводил в эмулятор вручную, но потом обленился и написал программу для ввода шестнадцатеричного дампа внутрь эмулятора. Выложил на «Гитхаб», если кому-нибудь интересно.

Надеюсь как-нибудь повторно схожу в музей «Эпл» в Москве и введу эту программу в настоящий компьютер.

7 декабря   99   apple

Нищеброд

Начал читать на днях книгу «Зулейха открывает глаза» Гузели Яхиной, она кажется в Татарстане считается скандальной — у местных критиков целый ряд претензий. В суть нападок сильно не вникал, но кажется автора обвиняют в незнании реалий татарского сельского быта.

Книгу так часто ругали в различных краеведческих сообществах, где я состою, что антиреклама сработала, — книгу захотелось прочесть. Поскольку в остальной России «Зулейху…», напротив, хвалили и даже дали пару премий, я подумал — почему бы и нет, поддамся.

Страница из книги «Домашняя бесѣда для народнаго чтенія, издаваемая под редакціей Б. Аскоченскаго», 1858

Дочитал до отрывка:

Зулейха садится на сяке, подставляет разгорячённое лицо порывам ветра из разбитого окна. Это проделки Мансурки-Репья и его нищебродов из ящейки, не иначе.

Слово «ящейки» выделено в оригинале, это «ячейки» с татарским акцентом, на него не смотрите. Лучше обратите внимание на слово «нищеброды».

Как встретил, сразу подумал — понял за что ругают книгу! Действие происходит в 1930-х, а тут «нищеброды»! Анахронизм! Для меня это новояз блондинок с утиными губами. Кажется впервые я его услышал то ли в нулевых, то ли в десятых, не смог вспомнить.

Решил погуглить. Согласно национальному корпусу русского языка, максимальную употребляемость слово имело как раз в 30-е годы, потом оно подзабылось, вернулось в язык в 70-80-е, снова короткое забвение и в 2000-е его опять начинают употреблять.

Вот это поворот.

Поискал по старым книгам. Как минимум встречается с середины 19-го века! На скриншоте скан книги 1858 года. Значение, конечно, было другое — так называли нищих бродяг. Сейчас его смысл тоже дрейфует — от людей с телефонами в кредит на три года, до гендернообязаных, не тянущих абонемент на доступ.

Востребованное слово, во всякой эпохе своё применение.

4 декабря   история

Партнёр•01.01

Советская восьмибитная персональная ЭВМ «Партнёр•01.01», выпускалась с середины 1987 года

Давно не приобретал ничего для нашего музея вычислительной техники, а тут совершенно случайно искал на «Авито» советские процессоры и наткнулся на свежее объявление о продаже «Партнёра•01.01» по хорошей цене.

Позвонил продавцу, он сказал, что в шоке от такого интереса — я уже пятый покупатель в очереди, но если я согласен сейчас же забрать, то компьютер мой. Это несколько ломало мои планы, но куда деваться, съездил, забрал.

«Партнёр•01.01» — советская восьмибитная ПЭВМ, выпускалась серийно примерно с середины 1987 года на производственном объединении «САМ» СКБ ВМ в Рязани.

Купленный мною компьютер произведён в июне 1989 года и в своё время стоил 650 рублей.

«Партнёр» является аналогом самодельного компьютера «Радио-86РК» — его схемы печатались в журнале «Радио». На «Радио-86РК», собранном моим дядей, я выучил свой первый ассемблер.

Весит почти четыре килограмма и потребляет 22 ватта. На борту советский аналог процессора i8080A, 64 килобайта ОЗУ, 16 килобайт ПЗУ (внутри — загрузчик, «монитор», редактор, Бейсик), алфавитно-цифровой вывод.

К нему выпускались модули расширения, четыре разъёма под которые хорошо видны на верхней панели. Через эти модули можно было подключать кое-какую периферию, например — дисковод.

3 декабря   айти-музей

Интерфейс Музея тысячелетия Казани

В Музее тысячелетия Казани перед каждой витриной с экспонатами есть валик, на который можно опереться

Сходил сегодня в открытый ещё в 2005-м году Музей тысячелетия Казани. Располагается в НКЦ, в бывшем зале ленинского мемориала. Пиарится как-то слабо, я о его существовании узнал только в этом году из какой-то посторонней статьи.

Музей интересен и сам по себе, но главный хит — когда-то скандальная тема тысячелетия, которая до сих пор иногда выливается в однообразный бокс по переписке в специализированных группах.

Что уж говорить, любопытно поглазеть на реплику того, из-за чего весь сыр-бор — политизированную доказательную базу в виде пары монет и скудного набора артефактов. Специально уточнял, оригиналы хранят в другом месте.

В общем, доволен, что посетил.

Но есть в музее кое-что, что меня поразило сильнее старины. А именно — перед каждой витриной сделан специальный валик, на который можно облокотиться, чтобы лучше рассмотреть экспонаты. Совершенно нелишняя штука, так как некоторую мелочь я разглядывал именно в таком положении, а иногда и вовсе ложился грудью.

Потрясающе удобно! Наверное делать такое очень дорого, а то бы везде было. Спрашивал работниц музея, сказали, что это наследие ещё советских времён, — как я упоминал выше, в этом зале когда-то был мемориал Ленина.

мтДНК по мужской линии

Тут кое-что интересное произошло в генетике. Из статьи «Митохондриальная ДНК может передаваться по отцовской линии» с «Элементов»:

До недавнего времени считалось, что митохондрии наследуются потомками только от матери. Авторы новой статьи в PNAS исследовали пациентов с подозрением на митохондриальные заболевания и обнаружили в их клетках смесь отцовских и материнских митохондрий. Механизмы такого наследования пока неизвестны, но сам факт его существования может оказаться крайне полезным для клинической диагностики.

Факты передачи мтДНК по отцовской линии уже фиксировали, например, у мышей или овец, а тут обнаружилось то же у людей. Правда пока известно всего несколько случаев.

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

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

Интересно, что существует такой метод ЭКО при котором в яйцеклетку матери пересаживают цитоплазму от женщины-донора. Это позволяет избежать некоторых митохондриальных заболеваний (например — наследуемого по материнской линии синдрома сахарного диабета и глухоты). Получается, что у таких детей вполне может оказаться аж тройной набор мтДНК!

1 декабря  

Физическое воплощение TCP-пакета

Физическое воплощение TCP-пакета, обеспечивается гарантированная доставка, надо полагать

В чате бывших сотрудников «Яндекса» сегодня всплыла безвестная картинка с пакетом (на самом деле — сумкой) с принтом в виде TCP-пакета. Каламбур зашёл, местные гики изошли слюной.

Я тоже заинтересовался — где такую взять и ценой вопроса. С заметным трудом разыскал источник — китайский мономагазин, сумка стоит по-божески — 48¥ ($7), но, судя по всему, на доставку по всему миру автор не рассчитывал.

Видимо не удастся такую получить, разве что найти кого-то в Китае, но я не припомню, чтобы у меня там жили знакомые. Жаль, принт вызывает слюноотделение, да и вещь не бесполезная — молния, внутренний карман, рассчитана на «Макбук Эйр» 13″. Я как раз собирался переходить со своей «прошки» на «Эйр» модели этого года.

Apple I

Моя первая программа в машинных кодах «Эпл I» бесконечно выводит таблицу символов

Заметил позитивную тенденцию — меня снова стали интересовать статьи на «Хабре», вплоть до зуда что-нибудь попробовать самому. В одно время «Хабр» чрезвычайно испортился — в ленте стало столько маркетинговой чуши, что иногда я неделями туда не заходил, всё равно читать нечего.

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

В общем, прочитал недавно там статью про самодельный «Эпл I» и сегодня не спал до двух ночи.

Нет, свой компьютер я не собрал, да и начиналось всё невинно — сначала скачал несколько эмуляторов, попробовал что-то позапускать готовое. Потом почитал про тамошний ассемблер (на борту там процессор 6502) и решил написать что-нибудь простое на нём.

Для этой цели мне очень подошёл «ОупенЭмулятор» и онлайн-компилятор с возможностью отладки «Асм80». Неожиданно удобная штука, кстати, не знаю сколько я бы без неё проваландался.

Программа, выводящая таблицу символов в компиляторе и отладчике «Асм 80»

Первая моя программа умела совсем мало — только бесконечно выводить на экран таблицу символов. Она такая короткая (всего восемь байт), так как для самого сложного — печати на экран, используется вызов ECHO, встроенной в «Эпл I» программы «Woz Monitor», — по всей видимости её писал Возняк, поэтому она так называется.

В ассемблере 6502 особо не развернёшься — три восьмибитных регистра (A, X, Y), 56 команд (не считая нескольких недокументированных), только целые числа, нет деления и умножения. Я совсем не помню свой первый ассемблер (для «Радио-86РК»), но кажется даже он был богаче.

Тем интереснее было написать что-нибудь чуть более серьёзное. Я написал, разумеется, «песню о пиве», в ближайшее время выложу. Машинные коды вбивал сначала руками прямо в «монитор», всё как в детстве, в начале 90-х, но ближе к ночи устал и написал на «Пайтоне» программу, которая hex-файл «Асма80» перебивает в эмулятор, имитируя нажатия на клавиши через «ЭплСкрипт».

Кстати, какое-то время пришлось ещё потратить на то, чтобы понять как работать с «монитором» Возняка — это предельно аскетичная командная строка, в которой без руководства не разобраться, что, учитывая скромные размеры программы, объяснимо. К счастью, в сети есть копия « Apple-I Operation Manual», которую я наскоро проштудировал.

Там всего несколько страничек, вникнуть просто и сейчас (о ужас!) мне даже удобно.

Самый долгий merge в моей жизни

Заметка будет интересна только программистам.

Фотография ниже лежит у меня на ноуте с августа 2013 года. Очень не люблю такое — всё нужное я привык закачивать в интернет, всё ненужное — удалять. Не мог определиться куда деть это фото, решил положить в блог, снабдив небольшим рассказом.

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

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

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

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

Через год попытались слить две ветки воедино и получили конфликты почти во всех основных файлах проекта. Ничего совсем уж неожиданного, конечно, особенно с учётом того, что часть кода была переписана с ПХП на «Твиг», но никогда в ещё в жизни я не видел столько конфликтов. Затронуты были, если мне не изменяет память, несколько сотен файлов.

С одной стороны, других вариантов, кроме как собрать это всё воедино, не рассматривалось, с другой стороны, объём предстоящей работы удручал.

В общем, погрустил я, погрустил, повесил табличку «Не беспокоить» и заперся в кабинете на неделю. Каждый файл с конфликтом распечатывал дважды — из каждой ветки. Потом раскладывал распечатанное на полу, выделял маркером одинаковые места, рисовал стрелками что куда переместилось, шёл к ноутбуку и так или иначе разрешал конфликт.

На фотографии — процесс разрешения конфликтов одного из файлов. Через неделю я был полностью разбит монотонностью работы, но ветки слил.

Ранее Ctrl + ↓