Итоги 2025

20 minutes
Reflection Year in review
Table of Contents

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

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

Повторное знакомство 🏳️‍⚧️

Привет! Позвольте мне представиться ещё раз. Меня зовут Рей (произносится «Рэй»), и мои местоимения — она/они.

Летом 2024 года я поняла что я предпочитаю иметь женственный внешний вид в повседневной жизни. Через год я поняла что я довольна своим выбором и что я готова на следующие шаги. Ну а сегодня — день анонса 😸

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

And I thought to myself
fuck it we ball.

Это решение сделало меня намного, намного счастливее. Я буквально ценю каждое изменение и заново открываю для себя столько всего! 10/10, сделала бы это снова.

Ключевые события 2025 года

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

Событие года: Factorio LAN-пати

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

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

Для самой игры мы задали несколько общих целей, но в целом старались просто следить за тем, чтобы никто не чувствовал себя потерянным. Мы играли с DLC Space Age и к концу третьего дня вышли в космос.

Чтобы сделать игру ещё интереснее, мы написали мод для Factorio, который экспортирует статистику из игры в Prometheus. Мод основан на graftorio2, но содержит уникальные метрики и баги. Одна из уникальных метрик — «Area Paved»; все мы знаем, что это не мегабаза, если нет бетона. Во время игры мы проецировали дашборд Grafana с игровой статистикой на стену, и один из гостей даже написал кастомный CSS, чтобы придать ему атмосферу вечеринки.

Я записала таймлапс игры — если хотите посмотреть:

Grafana с Factorio, спроецированная на стену в моей гостиной

Grafana с Factorio, спроецированная на стену в моей гостиной

Событие года: Переезд

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

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

Звёзды на потолке с УФ-реакцией, подсвеченные УФ-гирляндами

Звёзды на потолке с УФ-реакцией, подсвеченные УФ-гирляндами

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

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

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

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

Так что, учитывая, сколько всего я узнала, возможно, в 2026 году я снова перееду :)

Проект года: Donut renderer

Летом я решила заняться разработкой видеоигры рендеринг-движка. Я использовала Rust и wgpu.rs, чтобы сделать нечто, вдохновлённое Towerfall. Помимо желания поработать с этими инструментами, у меня было ещё несколько целей:

Я не чувствую, что довела этот проект до логического завершения, но я очень довольна тем, что сделала, и тем, чему научилась. Проект называется donut, потому что, как и Towerfall, он топологически эквивалентен тору 2.

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

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

Мне очень понравилось писать рендеринговую часть движка. Обучающие материалы по wgpu смогли ответить на мои вопросы, и (к моему удивлению) мне доставляло большое удовольствие в свободное время читать WebGPU Reference и WebGPU Shading Language (WGSL) Reference. Многое из того, что я узнала в прошлых экспериментах с OpenGL и Vulkan, тоже довольно хорошо перенеслось на WebGPU.

Подробнее о подходе к рендерингу

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

Подборка видео с разных этапов разработки

Проект года: клавиатура Cryptodancer

В начале года мне захотелось улучшить опыт моего взаимодействия с цифровыми устройствами. Так как мне также было интересно научиться проектировать печатные платы и изготовить PCB без использования химии, я решила сделать ещё одну кастомную клавиатуру. Я назвала её Cryptodancer — по мотивам названия игры «Crypt of the NecroDancer» (связи между ними нет).

Клавиатура, подсвеченная УФ-лампой

Клавиатура, подсвеченная УФ-лампой

Я начала с выбора компонентов и проектирования платы в KiCad. Также нужно было решить, как именно я буду её изготавливать, и я решила фрезеровать её на ЧПУ-станке, который уже использовала при работе над своей прошлой клавиатурой в Edinburgh Hacklab.

Когда дизайн был готов, я попробовала использовать несколько инструментов CAM (Computer-aided manufacturing) для генерации G-code для ЧПУ. В прошлом году я использовала Autodesk Fusion, но в последнее время у меня всё сильнее аллергия на Windows и облачно-ориентированный софт. По какой-то причине ни один из CAM-инструментов, которые я попробовала, не заработал у меня на Linux, так что, разумеется, я решила реализовать генерацию G-code сама: ftvkyo/svg2gcode на GitHub.

Подробнее о генераторе G-code

Изначальная идея генератора G-code заключалась в реализации целой библиотеки для булевых операций над многоугольниками — я не могла подвести «мозгового червя», который поселился во мне в конце 2024 года. Спустя некоторое время я поняла, что у меня нет времени реализовывать все сложные алгоритмы, и поэтому обратилась к экосистеме geo. Вот что делает генератор:

  1. Читает конфигурацию задания, включая:
    • SVG-файл
    • Тип операции: гравировка, резка, сверление или растачивание
    • Размер и форму фрезы
    • Фильтры, например минимальный и максимальный радиусы окружностей для операций сверления и растачивания
  2. Читает входной SVG и извлекает все окружности и прямые линии (а также прямые сегменты путей), которые соответствуют фильтру задания. Да, всё остальное игнорируется.
  3. Расширяет штрих прямых сегментов, придавая им толщину и превращая их в многоугольники. Также превращает окружности в многоугольники.
    • При резке или гравировке контуров расширяет (дилатирует) все многоугольники на величину, зависящую от размера и формы фрезы
  4. Проходит по всем сегментам и отправляет команды перемещения энкодеру, который проверяет корректность этих перемещений (например, запрещает быстрые перемещения, когда фреза задействована)
  5. Экспортирует итоговый G-code из энкодера

После получения G-code я смогла отфрезеровать плату, как и планировала. Всего я сделала три платы, постепенно дорабатывая некоторые дорожки и параметры фрезеровки. Фрезеровка была односторонней, поэтому мне пришлось припаять много перемычек из ножек диодов 🙈

Дорожки на третьей плате

Дорожки на третьей плате

Сама клавиатура имеет column-staggered раскладку, а микроконтроллер расположен между двумя половинами, расположенными под углом. В каждой половине по 30 клавиш, организованных в матрицы 6×5, и в каждой половине также есть линейный энкодер в блоке под большой палец.

Я реализовала проклятое кастомное поведение энкодеров в QMK. Я сделала так, что энкодеры притворяются стрелками или мышью (как Etch A Sketch!) в зависимости от режима. Кроме того, я добавила для них ускорение: если они регистрируют, что их крутят быстрее определённого порога, они отправляют несколько команд стрелок или перемещения мыши за один тик. Было интересно сочетать это с шумом от пьезо-зуммера — это заметно улучшило опыт использования энкодеров.

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

Например, она подтолкнула меня наконец перейти на Colemak Mod-DH (ortho-версию), которой я теперь пользуюсь постоянно. Хотя сейчас я печатаю всего 70 слов в минуту, мне очень нравится этот опыт, так что я буду продолжать (и ускоряться). Правда теперь QWERTY, да и вообще column-staggered клавиатуры, ощущаются куда более болезненными.

Клавиатура также привела к знакомству с несколькими потрясающими людьми, так что это ещё один её приятный бонус :)

Проект года: аудиосистема 5.1

В апреле 2025 года, через друга из лаборатории, я приобрела центральный блок / усилитель от системы объёмного звука Logitech® Z906.

Стандартная комплектация Logitech® Z906

Я хотела использовать этот усилитель, но без пульта управления он был неуправляем, а пульта у меня не было. Зато у меня была печатная плата, изготовленная тем же другом, которая позволяла подключить ESP32-S3 к порту пульта на центральном блоке. Он также поделился несколькими полезными ресурсами:

Опираясь на всё это, я написала собственную прошивку для ESP32-S3: ftvkyo/ggroohauga-rs на GitHub. Я использовала Rust с esp-idf-hal и реализовала следующие возможности:

Пример вывода ggroohauga-rs через MQTT

Пример вывода ggroohauga-rs через MQTT

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

Про аудиопайплайн

Одна из программных задач — поддержка переключения между воспроизведением 2-канального и 6-канального звука. Акустика подключена к моему ПК тремя AUX-кабелями (каждый передаёт два канала), и у неё есть несколько режимов маппинга каналов:

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

Для апмикса я использовала CamillaDSP, который порекомендовал ещё один друг из лаборатории. Сначала я создала виртуальный 2-канальный PulseAudio Sink с помощью PipeWire, затем настроила CamillaDSP так, чтобы он слушал этот sink, обрабатывал звук и выводил его в 6-канальное ALSA-устройство. Я выложила свой конфиг в виде GitHub gist.

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

Другие события и проекты

Я организовала воркшоп «OpenSCAD для начинающих» в Edinburgh Hacklab. Слайды можно найти на GitHub: ftvkyo/openscad-workshop. На воркшоп в Эдинбург приехали несколько моих коллег, и я была очень рада их видеть.

Я много занималась 3D-моделированием и 3D-печатью и прокачала свои OpenSCAD-заклинания (с особым упором на кривые). Кульминацией моего OpenSCAD-пути в 2025 году стал набор кейкапов, совместимых с Cherry MX. Их оболочка генерируется путём интерполяции между по-разному расположенными сквирклами. Большинство смещений и размеров настраиваются, а сама интерполяция управляется набором функций сглаживания.

Я напечатала кейкапы из PLA на своём Ender 3V3 SE с соплом 0,25 мм и высотой слоя 0,075 мм. Исходник лежит здесь: keycaps/mx_v4.scad в репозитории ftvkyo/openscad на GitHub.

Те самые кейкапы.

Те самые кейкапы.

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

Я сходила на 20 parkrun и организовала кучу настольных игр, видеоигр и кинопросмотров. Я много рисовала, немного занималась кожевенным делом и делала ещё множество разных мелких вещей!

Путешествия и отпуск

Мы с друзьями арендовали узкую лодку (narrowboat) и за четыре дня проплыли на ней от Фолкерка до марины Уинчберга и обратно. Это было очень весёлое приключение, в которое вошли два прохода через Фолкеркское колесо, находка овечьего черепа, исследование нескольких городков, спасение утонувшего дрона и даже заказ такси через звонок в их диспетчерскую!

Вид с узкой лодки

Вид с узкой лодки

В Лондоне я была дважды, в общей сложности 13 дней. Я увидела Yoasobi на Wembley Arena, побывала на Thames Traditional Boat Festival в Хенли-он-Темз и прокатилась на (миниатюрной) Great Cockcrow Railway.

На Great Cockcrow Railway

На Great Cockcrow Railway

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

Перед тем как она уехала из страны, я увиделась с подругой детства в Шеффилде. Я исследовала Ливерпуль и побывала там на сете Pendulum.

Рабочие дела

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

Наш продукт, SCALE, получил множество обновлений и продвинулся с версии v1.2.0 до v1.5.0. Я написала пост о том, как использовать SCALE для сборки и запуска GOMC. Компания Spectral Compute привлекла $6 миллионов, выступила на нескольких конференциях и даже попала в Business Insider!

Я горжусь тем, что являюсь частью всего этого!

Размышления

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

Тревожность — отстой!

ПРЕДУПРЕЖДЕНИЕ: сомнения в себе.

Угадайте, какие мысли посещали меня, пока я писала этот пост?! Попробую резюмировать:

К счастью, независимо от того, насколько это правда, у меня есть масса контраргументов, которые делают всё это стоящим:

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

Есть прогресс

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

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

Однако мне кажется, что я довольно далеко продвинулась. Я заметно лучше справляюсь с балансом между нуждами и радостями, хоть и есть аспекты моего «организованного хаоса» что стоит улучшить. Я также думаю, что объём того, что я сделала в 2025 году, немного пугает. Почти как будто я проходила «спидран по бытию счастливой» 😅

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

Ещё несколько вещей, над которыми я хочу поработать:

Воссоединение с собой

ПРЕДУПРЕЖДЕНИЕ: эмоции, травмы детства.

Есть песня Madilyn Mei под названием «What’s Going On?!», которая очень точно отражает моё текущее состояние. Полный текст доступен на Genius, но вот как она начинается:

I am an alien
My rocketship is human bone and skin
I’m something smaller
Staring out the skull
With a panel of wire
And buttons I don’t understand
Spamming every one of them
So does being human mean
Pretending to know what’s going on?

Вольный перевод:

Я — инопланетянка(ин)
Мой космический корабль — человеческиe кости и кожа
Я что-то меньшее
Смотрю из черепа
С панелью проводов
И кнопками, которых не понимаю
Давлю каждую из них
Так значит быть человеком —
Притворяться, что понимаешь, что происходит?

Я жила в самых разных условиях — сначала девять лет в шести разных школах, два года в профессиональном училище, два года в университете и вокруг него, затем я уехала из России и провела два года между Филиппинами и Гонконгом, и наконец, четыре года в Эдинбурге. Естественно, я сталкивалась с множеством жизненных ситуаций с разных сторон.

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

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

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

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

Плакать в одиночестве тоже казалось контрпродуктивным. Я много плакала, когда застряла одна в гостиничном номере на Филиппинах полгода во время COVID-19, и выгорела от этого, потому что чувствовала, что ничего не могу изменить.

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

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

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

Цели

В конце 2024 года я поставила кучу целей на 2025 год. Мне не удалось выполнить их все на 100%, но я думаю, что это нормально. Я довольно довольна тем, как прошёл 2025 год, поэтому не буду подробно разбирать каждую цель.

На 2026 год мои «функциональные» цели:

Некоторые мои «развлекательные» цели на 2026 год:

Спасибо

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

Спасибо, мама, Алла и Олег.

Спасибо Ariadne, Artem, Ashley, Blake, Callen, Chris, Cicely & Colin, Dan F, Dylan, Emily K, Eugene & Maria, François, Giulio, Gregor, Ilya & Maria, Ivan, Jared, Jon, Julia, Justine, Lamis, Mary & Max, Matthew, Matt & Mel, Michael, Miron, Natalia K, Nicholas, Nina, River, Rocket, Ross, Sam, Sapphire, Sean, Simon, Solomon, Sophia, Taylor, Vanessa, Vera, Yara, Yasha.

Спасибо, коллеги из Spectral Compute и участники Edinburgh Hacklab.

Вы сделали мой год. Всего наилучшего в 2026 году!


  1. Википедия: Трансгендерный переход ↩︎

  2. Wikipedia: Wraparound ↩︎