Разработка 3D-редактора волейбольных стратегий в полете | 2026-01-01T21:21:21

Чем я занимался в самолете в/из отпуска и иногда между и после: 3D-визуализация и редактор волейбольных схем для Нади (она — тренер). Этот корт на приложенном изображении свободно вращается, на нем могут быть поставлены игроки, и указан путь мяча и игрока — все в 3D.

Траектория мяча рассчитывается так, чтобы мяч не пересекал сетку при движении из A в B (формула Безье). Игроки могут принимать несколько поз — прямо сейчас есть наспех сделанные позы serve, attack, block, pass/receive. Кстати, из интересного в коде: пришлось прописать немного «волейбольных мозгов». Система сама считает траекторию мяча через кривые Безье так, чтобы он всегда проходил над сеткой. Причем высота вылета зависит от типа действия: для атаки мяч «вылетает» с более высокой точки, чем а для паса. Еще добавил авто-разворот: 3D-моделька сама поворачивается лицом туда, куда она по схеме должна пасовать или бежать.

Дольше и сложнее всего было сделать 3D-модель волейболистки. Для генерации реалистичной волейболистки я использовал сервис tripo3D. Он мне выдал модель в нейтральной позе (бесплатно выдал). Теоретически дальше с помощью Blender и плагина Rigify можно прицепить к ней armature и двигать руки-ноги, за которыми будет пересчитываться модель.

Однако в реальности такой подход не срабатывает: сгенерированная ИИ модель содержит большое количество геометрических ошибок, которые прощает рендер, но не прощает Rigify. Их можно условно разделить на два вида — неверные нормали полигонов и проблемы с немногообразной (non-manifold) геометрией, которые исправлять значительно сложнее. Внутри корпуса могут «плавать» невидимые кластеры полигонов или пересекающиеся поверхности. Когда Rigify пытается рассчитать веса (какая кость на какую часть кожи влияет), этот внутренний шум сбивает алгоритм с толку, и в итоге веса распределяются хаотично (например, движение руки может начать тянуть за собой сетку на животе). Плюс модель немного не симметрична.

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

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

Дальше привязываем арматуру к «суставам», и через часа три разбирательств, почему все работает не так, как должно, оно все-таки заработало. Я сделал четыре позы, и теперь каждому кружочку (игроку) можно указывать в какой позе он стоит.

Еще нужно будет сделать динамическую смену раскраски формы — это не должно быть сложно. Есть еще идея переносить позу с фотографии — это посложнее, но в целом реалистично. С помощью MediaPipe/AlphaPose можно детектировать ключевые точки в 2D, затем с помощью каких-нибудь моделей типа HMR/HybrIK можно «поднять» плоские координаты в 3D-пространство, выдавая относительные углы поворота суставов. Полученные данные можно попробовать спроецировать на Rigify-скелет. Поскольку пропорции сгенерированной волейболистки и человека на фото могут не совпадать, как раз и используется Inverse Kinematics (IK). Это довольно сложная часть, но в целом она уже не очень обязательная — просто интересно разобраться и сделать что-то работающее.

Видео в комментах

Робомассаж Aescape: массаж будущего? | 2025-12-19T21:26:58

Сходили с Надей на робомассаж Aescape. Ну так, мне интересно было посмотреть на техническую сторону всего этого. В целом довольно интересно, но ехать 45 минут на машине вместо 15 и получать робота, пусть даже чуть дешевле.. ну так.. не уверен, что имеет смысл ходить туда регулярно. Другое дело, если ты уже там в зале занимаешься, и хочешь массаж прямо сейчас, без записи — это такой заменитель массажного кресла «на максималках». Да, в этом случае прям самое то.

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

Превращение морозильника в холодильник: юный инженер и простой адаптер | 2025-12-19T00:56:58

Сегодня продал холодильник. У него есть история. Заключается она в том, что это не холодильник, хоть и выглядит как холодильник. Это морозильник. И морозит он в среднем до минус 18. А я его с рук покупал, и думал, что это холодильник. Покупатель сегодня тоже кстати приехала, думая, что это холодильник.

И вот я понимаю, что минус 18 мне совсем не надо.

Ну что, я ж Solution Architect. Лезть внутрь я не хотел, я просто поехал в Lowe’s и купил простенькую мигалку. Она по расписанию включает и выключает то, что в нее воткнуто. Сунул внутрь радиотермометр (у меня был), и подобрал частоту «мигания» (20 минут), чтобы внутренняя температура была в среднем +4 градусов. Радиотермометр показал, что флуктуации температуры совсем маленькие — условно плюс-минус 0.5 градуса от +4, даже меньше. И так он у меня работал сколько-то там месяцев, пока я понял, что он мне просто не нужен.

Сегодня продал с адаптером. Ушло в народ.

Переход с Mac на Arch Linux: Моя история адаптации | 2025-12-12T16:24:51

Две недели на Linux, дико доволен. После мака. У меня конкретно сетап ArchLinux+KDE/Plasma 6.5. Здесь кастомизируется вообще все. Например, я за полчаса (не вру, получаса) сделал с нуля с помощью Gemini программку, которая при нажатии ScrollLock переводит выделенный текст на английский или корректирует ошибки, если выделенный текст и так английский. Приложения есть на все случаи жизни, кажется, ну как минимум в моей области. Все летает (хотя это Intel i9 285K/64Gb). Я просто захожу в папку, в которой 470 тысяч файлов, и она просто мгновенно открывается. Я такого еще нигде не видел. Я запускаю IntelliJ Idea, и задежки после нажатия на иконку и готового редактора с загруженным проектом практически нет. Все устройства прекрасно подключились, в отличие от мака, для которого на мой принтер HP LaserJet 1018 просто нет драйверов и нужно шаманить.

Теперь изредка перехожу на маки, и меня дико бесит то, что там другие hotkeys. Конечно их можно перенастроить под мак, и наверное я так и сделаю. Мышечная память нарабатывается, и переключаться быстро не получается. Немного не хватает iMessage — я привык писать сообщения и отвечать на них с компа. Apple iMusic работает, через браузер.

В общем, пока впечатление очень хорошее.

Превосходная мощь NVIDIA RTX 5090: архитектурные горизонты и digital art | 2025-12-01T01:39:52

Nvidia RTX 5090 32Gb! довольный как слон. Поставил ArchLinux и CUDA. Планирую скоро поумнеть в теме прокачки трансформерных глубоких нейросеток и есть масса идей по digital art на иных идеях, чем диффузионные модели.

Производительность: Запустил сейчас тест, модель GPT_OSS_20b_UD_Q4_K_XL при контексте 131072 токенов генерит 350 токенов в секунду. То есть это условно страницу А4 за несколько секунд. Gemma3 27B — 55 токенов в секунду. Qwen3_30B_A3B_Q6_K — 259 токенов в секунду.

Яхты техномагнатов: Moonrise и Dragonfly в порту | 2025-11-29T18:14:41

Две яхты подряд стоят — первая, Moonrise, принадлежит основателю WhatsApp Ян Куму, вторая — яхта Dragonfly — принадлежит Сергею Брину, основателю Google.

Механизмы старого телефона: удивительная простота и гениальность | 2025-11-25T00:59:46

Когда я был маленький, я много раз разбирал старые телефоны, и вот только сейчас, к седым годам понял, что никогда не задавался вопросом, как они работали. А работало все очень интересно.

Начнем с номеронабирателя. Телефон подключен к сети двумя проводами. Номеронабиратель — дисковый. Когда вы взводите диск, контакты блокируются, а когда отпускаете — диск возвращается назад и выдает в линию серию прерываний/импульсов. Но как сделали так, чтобы он возвращался с постоянной скоростью (это 10 импульсов в секунду)?

Он работал на основе центробежного фрикционного регулятора. Механика (редуктор) разгоняла ось регулятора до тысяч оборотов в минуту. На оси сидели два грузика с фрикционными накладками (считай тормозами). Центробежная сила прижимала их к неподвижному барабану, создавая тормозное усилие. Это прямой наследник центробежного регулятора Уатта, позволявший механизму работать стабильно независимо от того, как резко вы отпустили диск.

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

Я вот быстро ответить не смог. Пошел гуглить. Так вот, оказывается, за это отвечал специальный дифференциальный трансформатор. Там ток от микрофона разветвляется: часть идет в линию к другу, а часть — в «балансный контур» (цепочку из резистора и конденсатора внутри телефона), имитирующую сопротивление линии. Обмотки трансформатора намотаны встречно: магнитные потоки от тока в линию и тока в балансный контур взаимно уничтожаются в той обмотке, что идет к динамику. Инженеры специально настраивали баланс не идеально, оставляя «местный эффект» — тихий звук собственного голоса, чтобы телефон не казался «мертвым». А вот входящий сигнал от друга разбалансировать нечем (с вашей стороны тишина), поэтому он свободно проходит на динамик.

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

А вот динамик был нормальный, электромагнитный. Хотя не совсем. Если бы внутри был просто электромагнит (без постоянного магнита), телефон бы безбожно искажал голос. Электромагнит притягивает железо независимо от полярности тока. Если подать синусоиду (голос), то мембрана притягивалась бы и на положительной полуволне, и на отрицательной. Результат: частота звука удвоилась бы, и вы слышали бы не голос друга, а непонятное высокочастотное жужжание. Постоянный магнит решает эту проблему: Он создает «преднатяг». Мембрана всегда притянута к магниту со средней силой. Когда приходит «плюс» сигнала, магнитное поле усиливается и мембрана прогибается сильнее. Когда приходит «минус» сигнала, поле ослабевает и мембрана отпружинивает назад.

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

Интересно, что принцип старых электромагнитных капсюлей (мембрана из металла + «якорь») используется сейчас в самых дорогих внутриканальных наушниках — гуглите «арматурные наушники» (цена там 500 баксов где-то).

Напряжение в телефонной сети было отрицательное — минус 48/60 вольт. Плюс заземлен, а «живой» провод — это минус. Зачем? Оказывается, это защита от электрохимической коррозии. Кабели лежат в сырой земле. Если бы на жиле был «плюс» (анод), при повреждении изоляции медь растворялась бы (электролиз) и кабель сгнивал. С «минусом» (катод) ионы металла, наоборот, стремятся осесть на провод из почвы, что продлевало жизнь кабеля на десятилетия.

Интерактивная визуализация алгоритмов рекомендаций в новом open source приложении | 2025-11-11T05:23:46

У меня вышло электронное open source приложение к моей книжке Recommender Algorithms! Это «песочница», где можно «погонять» различные алгоритмы рекомендаций с разными настройками, и по каждому алгоритму посмотреть специфичную ему визуализацию, помогающую понять как он работает. Например, для таких алгоритмов как ItemKNN, SLIM или EASE ключевой визуализацией является heatmap, выученной матрицы схожести (item-item similarity matrix). Это позволяет увидеть, какие именно пары товаров модель считает «похожими» (или «влияющими» друг на друга). Для SLIM, например, полезна «Sparsity Plot» , показывающая, что матрица схожести действительно получилась разреженной. Для алгоритмов ассоциативных правил (Apriori, FP-Growth, Eclat) визуализация — это вообще не график, а интерактивные таблицы с найденными «Частотными наборами» (Frequent Itemsets) и сгенерированными «Правилами» (Association Rules) , которые можно фильтровать и сортировать.

Кроме этого, там есть параметрический механизм создания «игрового датасета» — Dataset Wizard. Работает он так — есть шаблонные датасеты, которые описывают items через характеристики. Например, рецепты через вкусы. Или фильмы через жанры. Система генерирует случайных пользователей со случайным набором характеристик из того же набора — причем там много ползунков, позволяющих это распределение сделать более контрастным или сложным. Далее создается уже матрица оценок пользователями айтемов — условно если совпадают характеристики пользователя и айтема, то оценка будет выше, так как «совпадают вкусы» и наоборот, если различаются, то оценка будет ниже. Тут тоже ползунки, добавляющие шум и scarcity — рандомно удаляется часть матрицы. На вход алгоритму рекомендаций характеристики товаров и пользователей не подаются, они скрыты, но они используются для визуализации результатов.

Третьим компонентом приложения является подбор гиперпараметров. По сути, это автоконфигуратор под конкретный датасет. Там используется итеративный подход, который намного эффективнее, чем полный перебор (Grid Search) или случайный поиск (Random Search). Если говорить кратко, система анализирует историю прошлых запусков (trials) и строит вероятностную «карту» (суррогатную модель) того, какие параметры, скорее всего, дадут лучший результат. Затем она использует эту карту, чтобы по-умному выбрать следующую комбинацию для проверки. Этот метод называется Последовательная оптимизация на основе суррогатных моделей (SMBO).

Код свободный, будет еще дополняться новыми алгоритмами и новыми визуализациями.

Ссылочка на код в комментариях.

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

Албанский вирус: как работает новая киберугроза | 2025-11-07T14:21:14

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

Вот вам версия из 2025. Строчку, которую они просят вставить в терминал — echo «<…>» | base64 -d | bash

Эта строчка содержит curl, указывающий на 217.119.139.117 результат которого передается в `nohup bash`. А с этого адреса грузится скрипт, разумеется obfuscated.

Разумеется, ни одна LLM из доступных расшифровывать его не соглашается. Но Qwen оказался не против.

Скрипт при запуске собирает информацию из Chrome, Brave, Edge, Firefox и других, извлекая куки-файлы, историю автозаполнения форм и данные для входа в системы, собирает криптокошельки Electrum, Coinomi, Exodus, Atomic, Wasabi, Ledger Live и др., собирает содержимое приложения «Заметки» macOS с прикрепленными медиафайлами, данные из Keychain (пароли), а также сканирует рабочий стол и документы в поиске файлов определенных расширений. Собранные данные архивируются и отправляются на удаленный сервер с IP-адресом 217.119.139.117.

Для обеспечения постоянного доступа скрипт создает скрытые службы запуска (LaunchDaemons) со случайными именами, что затрудняет его обнаружение. Он может загружать и заменять легитимное приложение Ledger Live на модифицированную версию.

Вот такой албанский вирус)

SingleFile: решение проблем с сохранением и обменом веб-страницами | 2025-11-05T17:45:42

Нашел полезный экстеншн к Chrome — SingleFile. Решает вот такую задачу — нужно поделиться страницей из браузера, которая не публичная, например, по iMessage или Telegram. Это не так тривиально сделать. Например, модно записать из браузера на лэптопе файл .mhtml, и его отправить, но открыть его не смогут только получатели на айфоне. Записать в обычный .html тоже не вариант, так как там не сохраняются картинки и стили. Сделать скриншот — попадет только небольшой фрагмент. Поставить экстеншн, который делает длинный большой PNG со всей страницей — этот PNG нельзя открыть на айфоне из телеграмма как минимум, отрисовывается только верх. Печать в PDF тоже не выход — результат очень плохой и очень зависящий от желания разработчиков делать print-friendly version.

SingleFile позволяет создать снэпшот страницы из браузера, обычный .html, который открывается где угодно, со встроенными стилями и изображениями. Но что особенно удобно, перед экспортом можно через WebInspector поудалять все, чем делиться не хочешь, и оно не попадет в финальный .html. У экстеншена свободный код на github, и он никуда ничего не отправляет. Судя по всему, если на странице была динамическая подгрузка через JS, то сохраняется не JS, а результат подгрузки, а JS вырезается.

В общем, удобно, хорошая штука, пользуйтесь.

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