Сайт CDEK Forward
На днях выбирал с помощью нейросети кронштейн для монитора жены. Нашёл хороший вариант, но возникла проблема: в России он не продаётся. Можно было бы поискать другой, но я уже закусил удила — хочется именно этот.
Обычно в таких случаях меня выручает «Бандеролька» — сервис пересылки посылок, которым я пользуюсь уже много лет. Но тут незадача: ни один из её адресов не подошёл.
Попросил нейросеть найти мне ещё
С этого момента начался ад, с которым нейросеть не справилась. Пришлось два раза обращаться в поддержку.
Помогла техподдержка. Оказалось, что нужно указать в профиле адрес электронной почты и ФИО. Я логинился через единый вход «СДЭК» — у меня там есть учётка, но
Ок, пошел заполнять, и тут меня ждало
Пришлось снова писать в поддержку. Там пояснили, что данные профиля надо править не в профиле, а в меню «Виртуальный адрес». Кто бы мог подумать?
После всех этих приключений у меня всё получилось. Мне выделили сотрудницу, которая попробует выкупить для меня товар, но сначала выяснит, нет ли в Великобритании экспортных ограничений на кронштейны. В списке ограничений их нет, но сотрудница пояснила, что правила часто меняются, придётся подождать пару дней.
В общем, сайт делала ключница с
Сайт JELJAPAN
Ну и чтобы два раза не вставать, как говорится. Критика других — самый примитивный жанр, стараюсь таким не увлекаться, но раз уж начал, проработаю до конца.
До «СДЕКа» у меня был вариант заказать кронштейн из Японии. Неплохой вариант, там даже дешевле, чем везти из Великобритании. Заказать пытался через сайт «JELJAPAN». Сам сайт доверия не вызывает — похоже сделали его ещё в
Но решил попробовать. Оставил заявку, которая несколько дней повисела, а потом отменилась безо всякой видимой причины. При этом даже никакого уведомления не пришло. Людям, очевидно, не нужны мои деньги, у них и так всё хорошо.
Тем не менее, решил дать сайту ещё один шанс — написал сообщение, спросил что с моей заявкой не так. В ответ у меня спросили «скакова» я региона страны. И это как раз тот случай, который я описывал в заметке про прескриптивизм и дескриптивизм. Ощущение, что со мной общаются не профессионалы. «Скакова», серьёзно? «С» и «какова»?
Тут прослеживается чёткая тенденция — сайт сделан халтурно, заявку закрыли без уточняющего вопроса, да ещё и вопрос задают с детскими ошибками.
Понесу ли я сюда деньги? Конечно нет.

«MK-61s»: самомодифицирующиеся программы
У меня была давно идея попробовать сделать самомодифицирующуюся программу на программируемом калькуляторе «Электроника
Своей цели я ещё не достиг, хоть и продолжаю пытаться, а пока экспериментирую с командами доступа в область Ms — это недоделанные команды, которые я разблокировал в ретроконсоли «
Там всего две команды — одна обменивает Ms с содержимым памяти, вторая с регистрами. Таким образом вырисовывается путь — меняем
Выглядит просто, но есть особенности — калькулятор хранит числа в особом формате и при переносе в программную память этот формат создаёт проблемы. Байтами команд становятся не только цифры числа, но и его знак и порядок. Поэтому записать в регистр
Например, число 690050,68 после такого переноса даёт последовательность кодов 68 50 00 69 50 00. Для калькулятора это уже программа: прочитать регистр 8, остановиться, ввести ноль, прочитать регистр 9, снова остановиться и ввести ноль. Кроме этих шести байтов у каждого блока есть ещё один служебный байт, который команда обмена с регистрами не меняет. Его можно заранее заполнить нужной командой.
Теперь самое интересное: если вычесть из этого число 10000,01, получим 680050,67, а в памяти — 67 50 00 68 50 00. Команды остались прежними, но оба номера регистров уменьшились на единицу. Продолжая вычитать ту же константу, можно получить целую серию похожих участков программы.
Я решил попробовать использовать это для программы, которая не просто сама себя модифицирует, а, в идеале, сама себя распаковывает, то есть занимает меньше команд при вводе, чем в памяти.
Для этого я взял игру «The Land of Psycho Lamers» и переставил её код так, чтобы повторяющиеся участки укладывались в вышеупомянутый шаблон. Получился распаковщик длиной всего двадцать байт: он берёт начальное число и шаг, заполняет девять регистров, а затем двумя обменами переносит результат в программную память. Так восстанавливаются 63 байта команд.
Правда, тут надо честно посчитать всё остальное: исходные числа, заранее расставленные служебные байты и код подготовки. С учётом этого выигрыш получился скромным — 75 загружаемых байт против 80 у исходной игры. Это если в обоих случаях не загружать нули. Сам текстовый файл стал даже больше, да и занимаемый диапазон программной памяти вырос. Так что до практичного архиватора далеко, но работающая игра, которая сама собирает часть своего кода из чисел, уже получилась.
Ниже можно пройти распаковку по шагам. Хорошо видно, как сначала исходные данные уходят в Ms, затем из чисел строятся будущие команды, а в конце они одним обменом появляются в основной памяти.
Ms
Движок сайта: редактор
Самым сложным в собственном движке блога оказался, как ни странно, редактор. Я сразу нацелился на визуальное редактирование, но с нужными мне особенностями — например, изображения автоматически сжимаются до оптимального формата и описываются через нейросеть, чтобы потом легче было искать.
Каждый день я дорабатываю движок, и большинство коммитов касается именно редактора. Почти каждый день я пишу свои заметки на сайт и почти каждый раз
Интересно, что похожие баги встречаются и в телеграмном редакторе, которым я недавно начал пользоваться для публикаций в своём канале. Может они имманентно возникают при написании своего редактора с нуля?
Как бы то ни было, движок приобретает свои очертания. Только теперь они вырисовываются из опыта использования. Я был прав, когда решил начать им пользоваться на сайте, без этого ещё долго пришлось бы вылавливать все ошибки и неудобства.
Затычка в ванне
Минутка быта.
У нас дома в ванне
Поискал сначала отдельно сливную пробку, но там слишком много, побоялся ошибиться. Подумал, что может есть
На «Озоне» нашёл «универсальную силиконовую уплотнительную манжету белую для сифона раковины и ванны». Пришло четыре штуки. Разобрал сливную пробку, она элементарно развинчивается, надел два кольца на широкую часть, по обеим сторонам чёрной родной резинки, собрал и протестировал — набрал полную ванну и оставил на день.
Не ушло ни сантиметра! Тест считаю пройденным. Если у вас та же проблема, рекомендую сначала попробовать этот способ, прежде чем покупать новую сливную пробку.

Движок сайта: боты

В «Регистре» (так называется мой новый движок для сайта), меня, помимо редактора, постоянно донимают боты поисковых систем, нейросетей и так далее. Я даже не подозревал сколько их развелось и с какой страшной силой они молотят весь интернет. К сожалению, некоторые из них игнорируют robots.txt и заходят даже туда, куда просишь их не ходить.
Так как у меня на сайте сменилась часть адресов
Поэтому я регулярно захожу в панель администратора, чтобы посмотреть что у меня с нагрузкой и, если замечаю, что она в красной зоне, выгружаю логи и смотрю куда
Кеш у меня, кстати, сейчас устроен довольно сложно — если доступен модуль APC, либо есть /dev/shm, то горячие пути кешируются туда, если недоступно, используется общий кеш на файловой системе. Кеш без необходимости не сбрасывается, за этим я слежу отдельно. Инвалидация делается довольно топорно, надо — сносим, примерно как было в «Эгее», но, с другой стороны, я не делаю высоконагруженный проект, чтобы с этим отдельно заморачиваться.
«MK-61s»: самораспаковка в 105 ячейках
В прошлый раз игра вместе с распаковщиком занимала диапазон в 110 ячеек, включая нестандартные адреса, которые есть только в ретроконсоли. Теперь весь образ помещается в 105 ячеек, нестандартный регистр Rf не используется, а начальные значения регистров устанавливает сама программа.
Больше всего удалось убрать из игровой части. Там были четыре отдельных вывода значений R1, R2, R3 и R9, каждый из двух команд: чтение регистра и остановка. Такие же выводы уже есть в распаковываемой части, нейросеть переназначила клетки карты на них. Это освободило восемь байт.
Сообщения о результате игры — числа 30 и 20 — теперь вводятся командами цифр. Каждый такой вывод стал на одну команду длиннее, зато для самих чисел больше не нужны регистры. Из восьми освобождённых байтов потратил два, после чего неизменяемый хвост игры сократился с 27 до 21 байта.
У распаковщика удалось убрать три команды: 8, x→П0 и X↔Y. Начальное значение счётчика теперь закодировано в первом числовом блоке упакованной программы. При обменах оно само попадает в R0, поэтому вводить и сохранять восьмёрку отдельными командами больше не требуется.
Чтобы отказаться от Rf, пришлось перенести хранившийся в нём шаг распаковки в Rd — регистр, где во время игры хранится здоровье. Во время распаковки здоровье ещё не нужно, а перед запуском игры его устанавливают две команды: 5 и x→Пd. Три команды ушло, две добавилось, в итоге распаковщик сократился с 20 до 19 байт.
Итого из игры и распаковщика удалось убрать семь команд. В новом расположении между распаковываемой частью и игровыми процедурами оставлены две пустые ячейки. Поэтому занимаемый диапазон сократился на пять ячеек: со 110 до 105.
Подготовку регистров удалось поместить в свободные места первых 63 ячеек. С адреса 08 выполняется цикл: в Rc записывается 9, затем значение Rc + 10 косвенно сохраняется в регистр с номером Rc, а счётчик уменьшается. Так R9–R1 получают необходимые для игры числа 19–11. Затем устанавливаются остальные начальные значения и адреса игровых процедур.
Эти значения перед распаковкой уже находятся в регистрах. Первый К ПВ сохраняет значения R0–R8 в Ms, последний возвращает их обратно. R9, Ra и Rb остаются на месте. Отдельных команд сохранения и восстановления не понадобилось. А сам код подготовки стирается при распаковке — его место занимает игра.
Для перехода к распаковщику нейросеть приспособила игровой переход в ячейке 35, заменив его на БП. До распаковки следующий байт содержит адрес 86. После распаковки там оказывается код 65 — П→x5, который для БП служит адресом 65. Поэтому процедура сбора детали теперь размещена именно там, для этого пришлось перед ней оставить две пустые ячейки. Один переход служит сначала подготовке, потом игре.
Для запуска нужно записать в память 79 ненулевых байт кода и данных. Сюда входит и код подготовки игровых регистров. Остальные ячейки должны быть обнулены. После распаковки игра размещается по адресам 00–85, распаковщик — в 86–104. Запуск начинается с 08, а после распаковки управление возвращается в 00. Ниже показано выполнение всего этого варианта.
Осталась одна нерешённая проблема: используется 63 байта Ms, доступных в «
«MK-61s»: SIMD
Было время, когда меня захватила идея реализовать поддержку «Юникода» на «Флиппере Зеро». Я много тогда над этим работал и одна из вещей, которую я тогда делал — пытался ускорить измерение длины строки в кодировке
Тогда я познакомился с расширением DSP SIMD, которое помогает на армовских процессорах параллельно обрабатывать несколько значений одновременно. Вчера мне этот опыт пригодился.
Сейчас я занят ускорением работы встроенных в ретроконсоль «
Чтобы измерять оптимизации я, как это у меня водится, портировал по эту задачу на ретроконсоль очередную игру. На этот раз шахматы Алана Тьюринга и Дэвида Чемперноуна (есть восстановленный алгоритм по мотивам их идей 1948 года). Нейросеть их перевела на Бейсик и это очень хороший тест, так как там очень много вычислений — первая версия делала ход за 162 секунды.

Я занялся ускорением, так как по предложению одного из членов нашей команды, Алексея Сугоняева, перевёл интерпретаторы Бейсика и Фокала в трансляторы, формирующие специально разработанный
Все низковисящие плоды в плане оптимизации я уже сорвал, остались довольно сложные вещи, типа
«Юникода» в «
| Программа | Времени на компиляцию меньше |
|---|---|
| Шахматный поиск, Бейсик | 0,47% |
| Вступление High Noon, Бейсик | 1,32% |
| Статистика, Фокал | 1,38% |
К слову, оптимизированная версия Бейсика сейчас делает на холодную первый ход в шахматах за 104 секунды, а при прогретых кешах — за 87,5. Это пока всё равно медленно, но куда лучше 162 секунд, которые были в начале.
Движок сайта: бессерверные боты
Я мало рассказываю о своём движке сайта. Всё обещаю себе, что закончу и тогда напишу большую обзорную статью, но на деле очень страшусь объёма работы: он уже очень многое умеет, а то ли ещё будет — планов громадьё!
Поэтому лучше рассказывать потихоньку.
Со сменой движка многие обратили внимание, что комментарии из моей группы в «Телеграме» теперь транслируются на сайт. Ну как «транслируются» — приходилось руками экспортировать их в клиенте, потом загружать к себе. Конечно, логичнее было бы делать это через бота, да вот незадача — его надо было бы
Выход на самом деле есть — так называемые «бессерверные боты», недавно появившаяся у «Телеграма» возможность. Небольшая цитата из руководства Telegram Serverless:
Telegram Serverless позволяет запускать серверный код бота и
мини-приложения прямо на инфраструктуре «Телеграма» — не нужно настраивать серверы, поддерживать контейнеры в рабочем состоянии и думать о масштабировании.
Одна проблема — доступ пока дают не всем, сначала надо отстоять очередь. Я получил его вчера и сразу с нейросетью сделал бота для переноса комментариев. Теперь буду тестировать на живых обсуждениях.
Технически это набор обычных джаваскриптовых модулей. Для каждого события — свой обработчик: handlers/message.js получает сообщения, handlers/edited_message.js — правки. «Телеграм» вызывает функцию, она выполняет работу и завершается. Код работает в изолированной среде V8; полноценной Node.js со всеми npm-пакетами там нет.
Подключение начинается в
npm create @tgcloud/bot my-bot
cd my-bot
npx tgcloud login
npx tgcloud pushlogin связывает проект с ботом, push загружает код. В комплекте есть SQLite, Bot API и fetch для внешних HTTP-запросов. База сохраняется между вызовами, поэтому можно хранить пользователей, настройки, очередь заданий.
Понятно, что все шаги я описываю поверхностно, чтобы самому не забыть, для подробностей есть документация.
У меня бот сначала сохраняет событие в локальную базу, потом пробует передать его сайту. Если сайт недоступен, запись остаётся для повторной отправки. Если одно сообщение придёт дважды, второй комментарий из него не получится — движок сайта помнит, что уже импортировал.
Связь со статьёй определяется по ссылке в исходном посте канала — я всегда ставлю её в заголовке. Ответы сохраняют структуру обсуждения, а мой Telegram ID связан с моей учётной записью на сайте, чтобы собственные комментарии узнавались как авторские. Так же из комментариев переносятся картинки, видео, стикеры и реакции, включая их снятие.
Приёмник на сайте защищён отдельным секретным ключом, поэтому злоумышленник не может прислать ему команду добавить комментарий. Сам сайт при этом за файлами в «Телеграм» не ходит — бот скачивает их у себя и отправляет вместе с остальными данными.
Вот такая получилась схема. Я пока не знаю удастся ли этим же путём сделать публикацию заметок, но планирую попробовать, если получится, будет здорово.
«Пропьёшь» ли навык программировать?
Не могу согласиться с распространённой поговоркой «мастерство не пропьёшь». Обычно её понимают так: если у человека есть талант или навык, он останется с ним навсегда. Но мой опыт говорит об обратном. Я, можно сказать, «пропил» по меньшей мере одно своё мастерство.
В начале девяностых я учился в Лениногорском нефтяном техникуме, и черчение давалось мне удивительно легко. Настолько легко, что очень скоро стало скучно. Мне казалось странным снова и снова выводить одни и те же элементы, когда я и без того безошибочно представлял деталь в трёх проекциях и разрезе. В голове она возникала объёмной, а на бумагу переносилась почти автоматически.
Думаю со стороны это казалось проявлением то ли лени, то ли наплевательского отношения к предмету.
Именно
Недавно, уже скорее из любопытства, я решил проверить, осталось ли это умение. Оказалось — нет. Тот навык исчез. Сегодня я уже не могу так же отчётливо увидеть предмет в голове сразу в трёх проекциях и мысленно «вращать» его, как делал это
Замечаю, что в последнее время многие программисты задаются вопросом — не исчезнет ли их навык программирования, если они отдадут эту часть работы нейросетям? Думаю, им хочется услышать от как можно большего количества народу
Вопрос только в том зачем нам этот навык? Это как с моим навыком черчения. Что такое должно произойти, чтобы он снова мне пригодился?
Пандора уже открыла свой пифос, нейросети никуда не исчезнут. У нас сейчас переходный период, поэтому всё выглядит зыбко, но
Уже сейчас на двухсотдолларовой подписке при хорошем уровне понимании задачи и контроле, можно за сутки сделать столько, сколько коллектив из нескольких разработчиков хорошего уровня будет делать месяцы! А ведь это ещё не предел — уровень нейросетей всё растёт и из анонсов мы знаем, что каждая из компаний переднего края готовится выпустить свою нейросеть ещё более высокого уровня.
Другое дело, что поменялось всё слишком быстро и никто не понимает толком как перестроить обучение. Дать каждому студенту подписку на нейросети и сразу учить на
Часть людей до сих пор находится на стадии отрицания вайбкодинга. Благо мемы годовой давности, когда код нейросети без ревью даже в домашний проект класть было зазорно, помогают им жить в своём иллюзорном мирке и считать, что они трезво смотрят на мир.
Одно понятно. В переходной стадии программисту надо одновременно развивать оба навыка — программирования и управления программирующими сетями. Руководители разработчиков оказались в чуть более выгодном положении — программировать им необязательно, а управлять программирующими они уже умеют. Ну или должны уметь.
Тёплый октябрь
Я осень не люблю, но в этом году радует и меня — яркая, тёплая, бездождливая. Даже ставшие жёлтыми деревья не угнетают. Обычно в конце года, едва начинают опадать листья, на меня наваливается хандра, но в этом году пока о ней не вспоминаю.
Пока тепло, друг позвал покататься с знакомым ему лесником по лесам одного из отдалённых районов Татарстана. Я не отказался — в такие места без знающего человека не сунешься. Леса там не то чтобы глухие, но заблудиться — раз плюнуть. За всю поездку мы не встретили ни одного человека, впрочем, как и других крупных животных.

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

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

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