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

Этот сайт — моя персональная записная книжка. Интересны мне, по большей части, программирование, история и события из моей жизни.

Спортинвентарь в отелях

В отелях меня каждый раз удивляет наплевательское отношение к спортивному инвентарю. Особенно почему-то это заметно на примере ракеток для пинг-понга. Это уже просто какое-то правило: даже в самых хороших отелях ракетки для пинг-понга ободранные и облупленные.

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

Попробовал «Кодекс»

Так исторически сложилось, что серьёзно программировать с нейросетями я начал с «Курсора». До сих пор его использую, и планов куда-то переходить у меня не появлялось.

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

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

Не обманул: позже я убедился, что в рамках подписки за двести долларов можно работать почти с любой интенсивностью. Там, где в «Курсоре» легко тратились двести долларов в день, тут я, заплатив один раз, больше ничего не плачу́.

Объяснение простое: «Курсор» в основном перепродаёт токены чужих нейросетей, зарабатывая на разнице, а «Кодекс» продаёт токены нейросетей той компании, которая его делает.

При этом с «Курсором» мне работать приятнее. Не из-за эффекта утёнка, а из-за двух вещей, которые в «Кодексе» сделаны плохо.

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

Я часто вижу, как «Кодекс» принимает часть моих указаний, на которые он уже отвечал, за сигнал к действию и начинает выполнять задачи, которыми уже занимался. В «Курсоре» я такого не видел ни разу.

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

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

В отпуске я очень много использую «Кодекс» — каждый день для развлечения пишу язык высокого уровня для калькулятора «Электроника МК-61», и у меня постоянно в стеке команд вереница фраз «делай дальше и коммить». Они подставляются по одной, когда сеть останавливается.

Выводы.

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

Бюджет «Курсора» буду тратить на работе. Во-первых, это позволит мне программировать для себя и компании в один и тот же день: раньше я разделял их, чтобы чётче понимать, сколько денег мне надо вернуть; во-вторых, затраты на управление для меня дороже в рабочее время, у меня очень высокая загрузка, и всё время дёргаться и смотреть, что там сделала сеть, для меня не вариант.

Случайно удалил аккаунт в «Телеграме»

Никогда бы не поверил, что такое в принципе бывает и тем более что это случится со мной. Случайно удалил свой аккаунт в «Телеграме»: сказался сильный недосып из-за совпадения нескольких факторов. Как следствие, поторопился, невнимательно прочитал, что написано в интерфейсе на сайте, и удалил. Удалилось всё — история переписки с друзьями, рабочие чаты и группы. Восстановить, как я понимаю, нельзя. Пока сижу в полном раздрае, не могу поверить, что я своими руками это сделал.

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

Дополнил подробностями:

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

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

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

Написал в поддержку, но, думаю, пользы мало.

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

Даже описать не могу насколько я расстроен этим случаем.

Хаки в «Электронике МК-61»

Очень интересно разбирать хаки, которые разные люди изобретали, чтобы уместить свои программы в 105 байт памяти калькулятора «Электроники МК-61». Их там действительно просто нереальное количество, они разной сложности, но один из них показателен в своей простоте.

В коде программы «Рембо-III» есть несколько похожих мест (я буду приводить код на языке «МК-Про» для наглядности):

fn lost() {
  halt("ЕГГОГ")
}

fn front_stop() {
    …
    if cells[7] < 0 {
      lost()
    }
    …
}

Если некое проверяемое значение меньше нуля (в двух остальных местах — меньше или равно нулю), то пишем на экране «ЕГГОГ» — слово «error», это одно из немногих слов, которое калькулятор способен отобразить, так как у него есть специальная логика для отображения некоторых букв, поэтому его часто используют для обозначения проигрыша.

Мой оптимизатор умеет заменять halt("ЕГГОГ") одним опкодом, потому что это «встроенное» в калькулятор слово, но тут он пишет относительно много кода — проверка условия и вызов, тогда как проверку и вывод «еррора» можно объединить в один опкод — F √ или F lg в зависимости от условия.

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

В «Рембо-III» это сокращает программу на четыре байта. Это существенно, когда у доступно так мало памяти.

Людно во Вьетнаме

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

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

Погода в этот сезон сошла с ума: вдруг начались дожди, хотя для этой местности это необычно в конце мая. Одно радует — всегда тепло и иногда выходит солнышко. Говорят, прогнозу тут верить не надо. И это радует, потому что в прогнозе ничего хорошего.

Зато-о-о, зато! Прошла голова. Я только на второй день понял, что она у меня не болит. Видимо, действительно сказывался сильный стресс на работе в последнее время.

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

Записались на пару экскурсий. Тут всё самое интересное далеко, так что выбрали то, что поближе: обезьяны, аквапарк, аттракционы, плавание в маске — достаточно традиционно. Ну и конечно, несмотря на дождь, всё же тут тепло, беззаботно, рядом море, бассейны и очень вкусно кормят.

Надеюсь прийти в норму.

Язык высокого уровня для «МК-61»

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

Программирую вайбкодингом, разумеется, лучшими нейросетями из доступных — «Опусом 4.8» и «ГПТ 5.5». Вручную это проект на годы, без сеток я бы его даже не начинал.

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

Калькулятор «Электроника МК-61» по версии сети «Нанабанана-2»

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

Сейчас я, например, разбираюсь с упаковкой нескольких переменных в один регистр. Идея простая, но позволяет иногда экономить очень много: если у нас есть три переменные и каждая принимает значение от нуля до десяти, то можно хранить их в одном регистре поразрядно от «00.0» до «99.9».

Так, например, переписывается в текущем синтаксисе игра «Охота на лис» из блога Дениса Монатко:

program FoxHuntMK61 {
  field: board(0..9, 0..9)

  state {
    cell: coord(field)
    foxes: coord_list(field, 9) = random_unique()
    bearing: counter 0..9 = 0
  }

  loop {
    cell = read()

    if cell in foxes {
      found_fox()
    }

    scan_from_cell()
    show("--", cell:02, "--", bearing)
  }

  fn found_fox() {
    show(-20)
  }

  fn scan_from_cell() {
    bearing = line_count(foxes, cell)
  }
}

Это один из более чем двадцати примеров, где оптимизатор справляется лучше или на уровне опытного программиста на этом калькуляторе.

Отпуск начался

Ну всё, дожил до отпуска. Осталось его пережить.

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

Во Вьетнаме пасмурно и дождь. Такое мы видели и на родине. Правда, тепло — около 30°, в Казани сейчас, наверное, вдвое холоднее.

Очень хочется спать, но негде — номер ещё не готов.

ИИ и системное администрирование

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

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

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

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

На скриншоте — одна из первых ласточек: Линукс от «Селектела» со встроенным «системным администратором»; в его качестве выступает нейросеть «Квен 3.5» с весьма скромными по нынешним временам характеристиками. Она превращает задачу пользователя в команды в консоли сервера.

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

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

Книги: «Космонавт — мотоциклетный мастер»

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

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

Книжку я купил, получил и с удовольствием прочитал дочке. Я почему-то не ожидал, что ей понравится, но она осталась в полном восторге.

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

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

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

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

Дочка и соревнования

У дочки на этой неделе расстройство — в первый раз пришла на соревнованиях по плаванию первой, но медаль не дали. Плыла два раза, двумя стилями — на спине и кролем. На спине заняла второе место, а кролем пришла первой, но оказалось, что заплыв был разбит на два, и она в тройку не вошла.

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

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

Но были на этой неделе и радостные события.

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

Учёба кончится, улетим в отпуск. Я уже живу только этой идеей. Голова нескончаемо болит каждый день уже которую неделю. Надеюсь, от стресса, а не от чего-то более серьёзного. Болит не очень сильно, но зато постоянно.

Дочкина медаль и художественный беспорядок на её столе

Программирование на двух GPU

Две карты Nvidia H100, вынутые из нашего сервера

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

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

  1. deepseek-ai/DeepSeek-V4-Flash
  2. QuantTrio/MiniMax-M2.7-AWQ

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

Ребятам больше всех пока понравился «Квен-Кодер» из предыдущего эксперимента, хотя я уверен, что они ещё просто не распробовали новые модели.

Надо понимать, что серьёзным облачным моделям эти модели в подмётки не годятся: они мощнее примерно на порядок, и оборудование, которое позволяет их запустить, стоит совершенно других денег.

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

Manchester Baby: что за компьютер

Вчера я писал про Манчестерскую малую экспериментальную машину по прозвищу «Малышка», но не написал, что этот компьютер из себя представлял.

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

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

Машина запустила первую в мире сохранённую программу примерно в 11:00 утра в понедельник, 21 июня 1948 года. Программа вычисляла наибольший собственный делитель числа 218, перебирая все числа от 218 в обратном порядке.

Программа состояла из семнадцати инструкций и выполнялась около 52 минут, пока не выдала правильный ответ — 131 072. За это время компьютер выполнил около 3,5 миллиона операций.

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

Назначение почти всех трубок самоочевидно, а «аккумулятор» должен быть знаком каждому, кто знает слово «ассемблер».

Ввод был устроен тоже просто: 32 кнопки, позволяющие выставить 32 бита в текущем слове, кнопки прохода по памяти, «запуск», переключение режима дисплея и так далее.

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

Реплика Манчестерской малой экспериментальной машины

Manchester Baby

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

Я уже начал лениться. Я тут недавно писал про «компьютерную шею» в фильме про Швейка 1957 года, а сегодня прочитал про эмулятор компьютера 1948 года — Манчестерской малой экспериментальной машины. Я о ней никогда не слышал и не то, чтобы это что-то меняло в моём восприятии фильма про Швейка, но стало интересно — что там вообще можно было на ней запрограммировать в 1948 году.

Я знаю только о компьютерах Конрада Цузе того же времени, на этом мои познания заканчиваются, но о его работе никто и не знал — война помешала, а тут что-то более мейнстримовое.

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

Оказалось, что устройство ввода компьютера того времени не вполне совместимо с моим терпением, тыкаться в эмуляторе ДОСа быстро наскучило. И вот тут проявилась та лень, о которой я пишу: вместо того, чтобы поискать новый эмулятор, я просто попросил нейросеть адаптировать мне то что есть для моей операционной системы.

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

Программа, выводящая слово «BOLK»

Клим С.

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

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

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

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

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

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

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

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

Память во сне

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

Сегодня мне снился сон-продолжение, где моя карьера пошла совершенно по другому пути. Например, в нём я после переезда из Москвы ещё раз пришёл поработать в «Яндекс».

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

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

Ранее Ctrl + ↓