Skip to content
View 4RH1T3CT0R7's full-sized avatar

Highlights

  • Pro

Block or report 4RH1T3CT0R7

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
4RH1T3CT0R7/README.md
  ARTEM LYTKIN
  ============
  $ whoami
  software engineering student, BMSTU, Moscow

Go Rust Python C C# Lua PostgreSQL Redis Docker

I am a software engineering student at Bauman Moscow State Technical University.

Most of what I do falls into two piles. One is ordinary systems work: a contest platform in Go that ran live tournaments for my university, and eleven patches merged into the Linux staging tree. The other is finding out what a system can be talked into doing when nobody designed it for that, which is how DOOM ended up running on regex substitutions and a raycaster ended up inside a font file.

I also translate games into Russian in my spare time, which turns out to be a surprisingly good way to learn how other people build software.

Projects

stars

DOOM running on nothing but regex find-and-replace. One 96 MB string, 544 rules, byte-identical to native DOOM. Turns out PCRE2 substitution is enough to be a computer, if you are patient.

stars

A 3D raycaster living inside a TrueType font's hinting virtual machine. I wrote a small compiler from a C-like DSL down to TrueType bytecode, and the glyph does the rendering. The whole engine is 6.5 KB.

stars

Balatro in your terminal, running the game's original Lua with no modifications. It is a reimplementation of the LOVE2D engine in Rust, with a software rasteriser and nine shaders emulated on the CPU.

stars

A tournament platform for game theory contests, used in production at Bauman Code Games. Go and React, matches executed in isolated Docker containers, ELO ratings, live standings over WebSocket.

Merged upstream

Project What I changed
Linux Eleven patches in drivers/staging, across most/dim2, sm750fb, nvec, fbtft and media/av7110. Error path fixes, device-based logging, replacing BUG() with proper error returns
GitHub CLI Added a --no-upstream flag to gh repo clone
Docker Made docker cp report both content size and transferred size
Grafana Fixed the active tab indicator on custom datasource config pages
Superset Kept percentage formatting intact for small numbers in tables
Docusaurus Used the category key for generated-index translation lookup
Telegram Restored the expandable quote button in the caption field
Windows Terminal Focused the terminal on click-drag while search is open
Raspberry Pi Seven fixes, mostly around polkit on immutable distros, stale WiFi settings, file dialogs, the localisation grid and a fallback chime for Linux
Bambu Lab Fixed window drag lag on Windows
Flipper Wrote the build and firmware update documentation
bitchat Fixed a crash when opening a private message a second time
PPSSPP Three fixes: the Win32 debugger's breakpoint list refreshes after memcheck changes, its VFPU register view shows values and scrolls, and the folder buttons open again on Linux
Gitea Three fixes: OpenPGP signatures are no longer verified against an SSH instance key, default compare links name the head repository, and co-author trailers that are not RFC 5322 addresses are parsed
Fyne Three fixes: a nil panic when a file dialog is sized before Show(), rasters drawn from the top left of their bounds, and submenus taller than the window now scroll
CircuitPython Three fixes: TimeAlarm validates its epoch time, WaveFile pads 8-bit samples correctly at the end of a file, and the unix port builds on arm64
Wails Plugged a Calloc leak in the v2 Linux and macOS frontends, and dropped the precompiled example binaries from v3
Space Station 14 Defibrillators no longer report on whatever else the patient is strapped to, and the Crewsimov law board is called Crewsimov internally too
Flameshot Fixed the pin size on scaled Windows screens, and added a same-language fallback for locales without their own translation
RetroArch Restored the widget scale override range on console and mobile builds
micro Made the linter plugin compare paths with filepath.Base(), so linter messages stop being dropped
hashcat Fixed the salt length reported by hash mode 3710 with the optimized kernel
Throne Five fixes: a core crash on Remove Invalid, the system proxy clearing itself on exit, stale results from a finished latency sweep, screen-reader names in the hotkey settings, and a routing dialog that grew as wide as the longest profile name
Millennium Dawn 66 merged pull requests in this Hearts of Iron IV mod: the intelligence agency system, several economy exploits, AI behaviour and a number of national focus trees

Across all of this I have opened pull requests against 51 projects that are not mine. Another 53 of them are still open, in 34 projects including Kubernetes, VS Code, Moby, Ollama, Next.js, TensorFlow, Supabase, Tailscale, PowerToys, OBS Studio, Notepad++ and both Arduino IDEs.

Russian game localizations

Four games that never got an official Russian release, or got a bad one.

  • Suzerain is the big one. Published in December 2022 and still updated today, with 11k readers and 693 people keeping it in their favourites. Done with a team of translators over about three years.
  • Night Call covers 5,371 dialogue passages, 789 interface keys and every passenger name, through a BepInEx plugin with generated Cyrillic SDF atlases.
  • Interrogation covers all 60 localization files and 30 or so interrogations, plus 23 Cyrillic fonts including the system one.
  • Not Tonight covers the base game and the One Love DLC, roughly 8,000 keys.

Stack

languages    Go, Python, Rust, C, C#, Lua
backend      PostgreSQL, Redis, Chi, REST, WebSocket, gRPC
infra        Docker, Prometheus, Grafana, Loki, Linux
ml           TensorFlow, PyTorch
low level    TrueType hinting VM, Lua VM, Sixel, terminal rendering

Background

Studying software engineering at BMSTU, department IU7, second year. Before that, an engineering class with a gold medal, and a 70 percent scholarship to Central University.

Winner of the BMSTU "Step into the Future" olympiad in computer science, winner of the "Engineers of the Future" conference with a neural network project, and a prize winner at the Moscow School Olympiad and the regional stage of the All-Russian Olympiad.

I write about my projects too. There is an article on Habr about how ttf-doom works, and a piece in Xakep on running code inside the TrueType virtual machine.

Outside code

Video games as an art form, which is most of why I translate them. 3D printing. Engineering that has no practical reason to exist. Music, more or less constantly.

Contact

Telegram Email


  АРТЁМ ЛЫТКИН
  ============
  $ whoami
  студент программной инженерии, МГТУ им. Баумана, Москва

Я учусь на программной инженерии в МГТУ имени Баумана.

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

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

Проекты

stars

DOOM, работающий на одних заменах по регулярным выражениям. Одна строка на 96 МБ, 544 правила, результат побайтово совпадает с оригинальным DOOM. Оказалось, замены PCRE2 достаточно, чтобы быть компьютером, если не торопиться.

stars

Трёхмерный рейкастер внутри виртуальной машины хинтинга шрифта TrueType. Я написал небольшой компилятор из C-подобного языка в байт-код TrueType, и рендерингом занимается сам глиф. Весь движок весит 6.5 КБ.

stars

Balatro в терминале, запускающая оригинальный Lua-код игры без единой правки. Это переписанный на Rust движок LOVE2D с программным растеризатором и девятью шейдерами, которые считаются на процессоре.

stars

Турнирная платформа для соревнований по теории игр, работала в проде на Bauman Code Games. Go и React, матчи исполняются в изолированных контейнерах, рейтинг по ELO, таблица обновляется в реальном времени через WebSocket.

Принятые правки в чужие проекты

Проект Что сделал
Linux Одиннадцать патчей в drivers/staging: most/dim2, sm750fb, nvec, fbtft и media/av7110. Обработка ошибок, логирование через устройство, замена BUG() на нормальный возврат ошибки
GitHub CLI Добавил флаг --no-upstream в gh repo clone
Docker Научил docker cp показывать и размер содержимого, и размер переданного
Grafana Починил индикатор активной вкладки на страницах настройки источников данных
Superset Сохранил процентный формат для малых чисел в таблицах
Docusaurus Поправил поиск перевода для сгенерированного оглавления категории
Telegram Вернул кнопку разворачивания цитаты в поле подписи
Windows Terminal Сделал так, чтобы терминал получал фокус при выделении мышью с открытым поиском
Raspberry Pi Семь правок: polkit на неизменяемых дистрибутивах, залипавшие настройки WiFi, файловые диалоги, сетка полей локализации и запасной звук для систем без freedesktop-звуков
Bambu Lab Убрал лаг перетаскивания окна в Windows
Flipper Написал документацию по сборке и прошивке
bitchat Починил падение при повторном открытии личной переписки
PPSSPP Три правки: список точек останова в отладчике Win32 обновляется после изменения memcheck, регистры VFPU показывают значения и прокручиваются, кнопки открытия папок снова работают на Linux
Gitea Три правки: подписи OpenPGP больше не проверяются ключом SSH-инстанса, ссылки сравнения по умолчанию называют head-репозиторий, трейлеры соавторов не по RFC 5322 разбираются
Fyne Три правки: падение по nil при изменении размера файлового диалога до Show(), растр рисуется от левого верхнего угла своих границ, подменю выше окна прокручиваются
CircuitPython Три правки: TimeAlarm проверяет тип времени, WaveFile правильно дополняет 8-битные сэмплы в конце файла, unix-порт собирается на arm64
Wails Убрал утечку Calloc во фронтендах v2 для Linux и macOS и выкинул скомпилированные бинарники примеров из v3
Space Station 14 Дефибриллятор больше не отчитывается о том, к чему пристёгнут пациент, а плата законов Crewsimov теперь и внутри называется Crewsimov
Flameshot Починил размер закреплённого снимка на масштабированных экранах Windows и добавил фолбэк на перевод того же языка
RetroArch Вернул диапазон настройки масштаба виджетов на консольных и мобильных сборках
micro Научил плагин линтера сравнивать пути через filepath.Base(), чтобы сообщения линтера не терялись
hashcat Исправил длину соли, которую режим 3710 сообщает для оптимизированного ядра
Throne Пять правок: падение ядра на Remove Invalid, системный прокси не сбрасывался при выходе, устаревшие результаты завершённой проверки задержек, имена полей в настройках хоткеев для экранных дикторов и диалог маршрутов, растягивавшийся по самому длинному имени профиля
Millennium Dawn 66 принятых пул-реквестов в мод для Hearts of Iron IV: система разведки, несколько экономических эксплойтов, поведение ИИ и целый ряд древ национальных фокусов

Всего я открывал пул-реквесты в 51 чужой проект. Ещё 53 из них сейчас открыты, в 34 проектах, среди которых Kubernetes, VS Code, Moby, Ollama, Next.js, TensorFlow, Supabase, Tailscale, PowerToys, OBS Studio, Notepad++ и обе среды Arduino.

Русские локализации игр

Четыре игры, у которых официального русского не было вовсе или он был плохим.

  • Suzerain это самый большой проект. Опубликован в декабре 2022 и обновляется до сих пор, 11 тысяч читателей и 693 человека держат его в избранном. Делали командой переводчиков примерно три года.
  • Night Call это 5371 диалоговый пассаж, 789 ключей интерфейса и все имена пассажиров, через плагин BepInEx со сгенерированными кириллическими SDF-атласами.
  • Interrogation это все 60 файлов локализации, три десятка допросов и 23 кириллических шрифта, включая системный.
  • Not Tonight это базовая игра плюс дополнение One Love, около восьми тысяч ключей.

Стек

языки          Go, Python, Rust, C, C#, Lua
бэкенд         PostgreSQL, Redis, Chi, REST, WebSocket, gRPC
инфраструктура Docker, Prometheus, Grafana, Loki, Linux
ml             TensorFlow, PyTorch
низкий уровень TrueType hinting VM, Lua VM, Sixel, отрисовка в терминале

Образование и награды

Программная инженерия в МГТУ имени Баумана, кафедра ИУ7, второй курс. До этого инженерный класс с золотой медалью и грант на обучение в Центральном университете на 70 процентов.

Победитель олимпиады МГТУ «Шаг в будущее» по информатике, победитель конференции «Инженеры будущего» с проектом по нейронным сетям, призёр Московской олимпиады школьников и регионального этапа Всероссийской олимпиады.

Про свои проекты я иногда пишу. Есть статья на Хабре о том, как устроен ttf-doom, и материал в «Хакере» про запуск кода внутри виртуальной машины TrueType.

Вне кода

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

Связь

Telegram Email


Pinned Loading

  1. doom-regex doom-regex Public

    DOOM running on nothing but regex find-and-replace. One 96 MB string, 544 rules, byte-identical to native DOOM

    Python 128 5

  2. balatro-port-tui balatro-port-tui Public

    Balatro in your terminal!

    Rust 60

  3. ttf-doom ttf-doom Public

    A 3D raycasting engine running inside a TrueType font's hinting virtual machine

    Python 70 1

  4. russian-localisation-night-call russian-localisation-night-call Public

    Русская локализация (русификатор) для игры Night Call

    C# 2

  5. TJudge TJudge Public

    Контест система по теории игр для Bauman Code Games

    Go

  6. MillenniumDawn/Millennium-Dawn MillenniumDawn/Millennium-Dawn Public

    Millennium Dawn and it's codebase.

    Python 126 95