Hackerman Logic
137 subscribers
31 photos
3 videos
22 links
Когнитивно-искажённые мысли отдельно взятого не особо сферического погромиста в вакууме.
Download Telegram
Forwarded from ai.dot(ufna, dev)
Не знаю почему это не было у меня прикопано здесь, исправляюсь.

Отличное онлайн демо по теням и свету в графике.

https://ciechanow.ski/lights-and-shadows/
👍3🔥3
⚡️ Хочу поделиться текущими событиями. Проект, над которым я работал, завершён: из-за разногласий среди основателей после долгих обсуждений мы перевели его в Open Source. Компания и команда были расформированы, а мой сооснователь смог уладить вопросы с инвесторами — это было нелегко, но стало ценным опытом. 🌡

Сейчас я работаю в крупной отечественной компании над CAD-подобной системой на Unreal Engine. Хотя это не идеальный движок для таких задач, работа даёт важный опыт, которым я постараюсь делиться, если позволит время.

Также занимаюсь несколькими собственными проектами: переработал ИИ систему на базе GPT, сформировав на её основе две демки для разных задач, работаю над MMO играми для Telegram. Код метавёрса можно найти на GitLab: https://gitlab.com/le7el/xr/ — хоть он частично урезан, он всё равно может быть полезен для академических целей.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥6⚡2
Hackerman Logic pinned a photo
Я давно думал про игру, в которой смог бы объединить интересные мне механики и забавное название. Несколько месяцев назад я показал свои идеи друзьям, и им мои идеи зашли. Так я начал работу над своей ММО игрой для Telegram - Miner Caravan ⛏.

Игра про добычу руды, исследования пещер, развитие личное, и совместное - всего сообщества, а также сотрудничество и соперничество. Изначально за две недели посиделок ночами и выходными я реализовал первый прототип, ребята активно помогали с UI и тестированием. Я на себя взял геймплей, бэкенд, devops и прочие задачи по разработке. Так у нас появился игровой клиент, а также кластер с матчмейкером и динамическим управлением серверами. 😎

Мир в игре генерируемый (но детерминированный), как в первых TES, в современной NMS, и подобных играх. Без ограничений на размеры вселенной, но с ограниченными подземельями. Прототип был собран на коленке, с кучей багов и лазеек. Игроки майнили с разных устройств, подключали программы-кликеры, и накручивали себе кучи ресурсов за считанные часы. 🔓

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

Прототип был реализован на JavaScript (и frontend и backend). Так проще всего было связать сервер и клиент по WebSocket протоколу. Но я быстро начал погрязать в абстракциях и ограничениях. Со стороны сервера, например, было достаточно много сложностей в отладке генератора подземелий. Мне приходилось вручную просматривать большие матрицы числовых данных. Я пытался сделать рисование картинок на виртуальном холсте или в bitmap, но это было чересчур сложно.

Со скрипом допилив генерацию подземелий и до какой-то степени навигацию (о ней ниже), я выяснил что никто не понимает как играть. 👎 Изначально была сделана система обучения в виде презентации на старте игры, но как выяснилось, большинство игроков их просто закрывает, не читая (надо было убрать к чёрту кнопку ❌ и оставить только "далее"). Поэтому был реализована интерактивная обучалка с принципом конечного автомата в основе. Можно посмотреть в боте, если ещё не видели: Miner Caravan Bot. Делайте интерактивные обучалки as it has to be fun.

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

После возвращения к работе, я занялся новыми фичами - монстрами 👾 и улучшением системы взаимодействия и перемещения.

Изначально для простоты были использованы дискретные плитки для перемещения персонажей и простой A* алгоритм. Но в конечном итоге это привело к вороху проблем с синхронизацией положения персонажей на клиентах и сервере. Я решил переключиться на navmesh. Но вот незадача - я не нашёл нормальной библиотеки для генерации и навигации по сетке на JS. Из качественных я нашёл только webasm порт recast/detour. С ним мы не поладили - он напрочь отказывался выдавать мне навигационную сетку, и при этом не выдавал никаких ошибок и логов (вот тебе null, и отвяжись). Отлаживать всё это было практически нереально, поэтому я принял важное решение - выкинуть всё и начать сначала (ну почти). 🗑

Продолжение следует...

#minercaravan
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥5
Немного мыслей про языки.

C++ в его современном виде кажется слишком громоздким. Каждая новая фича пытается устранить недостатки прошлых версий и сделать код безопаснее и удобнее, но сам язык усложняется. То же самое происходит, например, с Rust. Мы наращиваем абстракции, чтобы упростить разработку. При этом решаем старые проблемы, плодя новые, требующие либо адаптации мышления, либо новых решений (yet again). 🤔

Мы стали забывать, что каждый уровень абстракции увеличивает стоимость и отдаляет нас от решения проблемы. 💸

Семантика перемещения решает проблему копирования, но требует дополнительных функций, правило трех превратилось в правило пяти (не появится ли скоро правило семи?). По сути, это лишь копирование указателя, но с нюансом (как в анекдоте про нюанс). Спецификаторы доступа public/protected/private помогают скрыть то, что не нужно (по замыслу автора) менять пользователям, но разве вам не приходилось бороться с сокрытыми полями в классах 🎮 Unreal Engine и выдумывать методы обхода таких решений? Не чувствовали ли вы себя шпионом, который пробивается к полям через касты и смещения. Как это добавляет безопасности?

Здесь можно вспомнить про PHP с Laravel и прочими популярными MVC фреймворками. Они тратят больше времени на создание абстракций, чем на выдачу контента пользователю. И это только для обработки одного запроса (после чего оно спокойно умирает). А попробуйте обновить старый сайт с Laravel 5 до Laravel 8 - сколько времени это займёт? Куда удобнее и легче в поддержке тот же Wordpress, простой как вьетнамский тапок.

Вспомним также и ORM фреймворки вроде SQL Alchemy (Python), Gorm (Go), и прочие, которые позволяют писать красивый код, который очень нравится писать программисту, но в ущерб производительности (в разы) и гибкости (попробуйте создать полиморфические таблицы и запросы к ним с помощью любимого ORM фреймворка). Почему не использовать низкоуровневый драйвер и SQL?

В JavaScript ситуация еще интереснее: вокруг языка возник зоопарк над-языков, фреймворков, библиотек «для увеличения надежности и упрощения разработки». Однако некоторые фреймворки стали настолько громоздкими, что нынче требуются новые, более простые, которые решают проблемы старых. Никто не понимает как работает Webpack, поэтому был создан Vite, а Angular меняют на Svelte. При этом ванильный JavaScript и DOM вполне неплохи, и с ними тоже можно работать и, что важнее - быстро решать проблемы, не перегружая голову условиями и ограничениями фреймворков.

По факту, всё это напоминает скорее ритуал. Компании используют выбранный фреймворк, даже если он больше мешает, чем помогает, потому что разработчики знают только его. Появляется необходимость в бэкенде — мы не привлекаем Go-программистов, а переводим часть фронтендеров на NodeJS (и так сойдёт, поскейлим вертикально, горизонтально, всё остальное - излишние расходы и ненужная оптимизация - фу). Для десктопа и мобильных мы берем Electron и наш любимый фреймворк, закрывая всё одной командой. One ring lang to rule them all! И имя ему - JavaScript. 😅

Разве это не прекрасно? (Не всегда).

#программирование #мысли
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
Полезный скрипт от моего товарища, который нас не раз выручал. Позволяет восстанавливать удаленные ветки в git. 🔓

#programming #git #scripts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Forwarded from Nikolay Bulatov
# покажет вам все коммиты на кончиках вашего графика фиксации, которые больше
# не ссылаются ни на одну ветку, ни на тег
git fsck --no-reflog | awk '/dangling commit/ { print $3}'| xargs -I %m git show -s --format="%h - %ci %s" %m

# Вернуть как ветку
git branch recover-branch ab1afef

# Преобразовать ветку в stash
git stash apply recover-branch
git stash
🔥2👍1
Проблема абстрактного метавёрса

Основная жалоба со стороны пользователей, как и у большинства метавселенных, — "а что тут делать?". 🤷‍♀️
Поэтому я решил добавить в игру конкретные занятия: от простых, но эффективных (с точки зрения конверсии и удержания), до сложных и захватывающих. Подробности пока разглашать не буду. Разработка построена так, чтобы с минимальными усилиями (учитывая, что команда разработки сейчас - это я один) создать базовую версию игры. Она должна поддерживать онлайн-активность, и постепенно дополняться новыми фичами. Главная идея - создать замкнутую экономику с продуманной циркуляцией ресурсов и игровой валюты, параллельно предложив увлекательный и социально-ориентированный геймплей.

Приоритеты

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

Решение

Для серверной части я выбрал язык C. До этого на нём я писал только небольшие эксперименты, но мне давно хотелось попробовать что-то серьёзное (аж руки чесались) 🧑‍💻. Ведь именно на C созданы многие фундаментальные библиотеки, на которых построено практически всё, что мы знаем (zlib, openssl, libpng, и прочие). Я решил что это будет отличным опытом, особенно учитывая что на C также создавались культовые игры Doom, Quake, Half-Life, Counter-Strike, WarCraft и многие другие. Кроме того, C всё-таки очень простой в сравнении с другими языками, и количество абстракций сведено к минимуму, что мне тоже нравится. Что из этого выйдет - посмотрим, но пока всё получается, всё очень интересно и приносит ощутимый опыт. 🌡

Большой рефакторинг

Так начался перенос логики игры с JS на C. 👉
Чтобы освоить C, я сделал несколько тестов с ключевыми системами игры в виде отдельных систем. Первым делом - генерация подземелий. У меня уже был JS-код, генерирующий детерминированные подземелья по заданному сиду.

Если коротко, то переносить код с JS на C было не так сложно, как я предполагал изначально. Систему генерации подземелий на JS я писал около 2-3 недель, мучаясь с отладкой. На C я всё переписал в течение недели.

Перенос генерации подземелий

Код Mersenne Twister мне помог Copilot буквально за несколько минут ⬆️, этот алгоритм я использую для генерации детерминированных (с указанным сидом) целых чисел, чисел с плавающей точкой, цветов и других данных.

Далее потребовалась загрузка конфигурации для особых миров (таких как центральный мир, где появляются новые игроки при логине). С этим отлично справилась библиотека cJSON. Работать с ней оказалось проще, чем, например, с JSON в Unreal Engine, и конфигурации миров стали быстро загружаться в соответствующие структуры.

Потом я реализовал динамические массивы для хранения данных генерации (изначально - отдельный под каждую структуру). Когда их стало несколько, я объединил их в одну универсальную структуру с использованием void* и вспомогательных функций. Это было хорошим упражнением в работе с указателями.

Для визуализации подземелий использовал libpng, которая позволила наконец-то увидеть подземелья в виде картинок вместо анализа JSON матриц на десятки тысяч элементов 👀 в NodeJS. Это значительно упростило отладку.

На C были переписаны и оптимизированы функции для создания подземелий:
- Генерация шума - изначальная генерация детерминированной карты с заданными параметрами;
- Сглаживание шума - создание стен и пустот, которые образую комнаты и коридоры;
- Определение изолированных областей - выделение и отсеивание слишком мелких регионов;
- Соединение комнат - нахождение и соединение ближайших комнат в единую сеть;
- Расположение игровых объектов - добавление руды, монстров, и четырёх порталов в каждом подземелье (по 4 сторонам квадрата).

#minercaravan
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2🔥1
Немного про CMake

Переход на C потребовал также повозиться с системой сборки. Мне нужно было не просто собрать проект, но и иметь возможность отлаживать не только собственный код, но и код используемых библиотек (а также я хотел их собирать с нужными мне оптимизациями под целевое железо). Системные библиотеки мне для этого не подходили, поэтому я изучил возможности CMake, а именно — модуль ExternalProject. Этот модуль позволяет добавлять дополнительные проекты как зависимости (напрямую из репозиториев, оно само их клониует при сборке), и CLion (который я использую) распознаёт их как отдельные сборочные конфигурации, что заметно облегчает отладку и сборку.

ExternalProject оказался удачным выбором для построения дерева зависимостей: легко добавить как стандартные библиотеки, так и header-only библиотеки. Приходится писать конфигурацию вручную для каждой библиотеки, но это буквально copy-paste с небольшими правками.

Так как целевая платформа у меня одна — Linux/Unix, поддержку кроссплатформенности (Windows) я оставил за кадром. Из-за установки зависимостей в /usr/local у меня возникают некоторые конфликты с системными библиотеками (в частности, OpenSSL), т.к. система также использует этот путь для поиска .so. Но на данный момент это не критично, так как проект работает в WSL (а деплоиться будет в поды в кластере). Версию OpenSSL можно было бы согласовать с системной, но мы ведь не ищем легких путей, верно?

Пример

Листинг файла CMakeLists.txt:
cmake_minimum_required(VERSION 3.22)
project(mc_game_server C)

include(ExternalProject)

# Включаем файл, в котором у нас настроена сборка zlib.
include(${CMAKE_SOURCE_DIR}/cmake/zlib.cmake)

# ... (omitted)

target_include_directories(myapp PRIVATE
/usr/local/include
${CMAKE_SOURCE_DIR}/src)

target_link_libraries(myapp PRIVATE
m
-Wl,--start-group # Разрешение зависимостей
${ZLIB_LIBRARY}
# ... (omitted)
-Wl,--end-group
)


Листинг файла cmake/zlib.cmake:
include(ExternalProject)

#region Zlib

if (CMAKE_BUILD_TYPE STREQUAL "Debug")
message(STATUS "zlib: Building in Debug mode")
set(ZLIB_C_FLAGS "-O0 -g -mavx -mavx2 -ftree-vectorize -march=native")
else ()
message(STATUS "zlib: Building in Release mode")
set(ZLIB_C_FLAGS "-O3 -mavx -mavx2 -ftree-vectorize -march=native")
endif ()

ExternalProject_Add(
zlib
PREFIX /usr/local/src/zlib # Install source code to this directory
GIT_REPOSITORY git@github.com:madler/zlib.git
GIT_TAG v1.3.1
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=/usr/local # Install to this directory
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} # Build type
-DCMAKE_C_FLAGS=${ZLIB_C_FLAGS} # C flags
-DZLIB_BUILD_EXAMPLES=0 # Don't build examples
BUILD_COMMAND ${ZLIB_BUILD_COMMAND}
INSTALL_COMMAND cmake --install . --config ${CMAKE_BUILD_TYPE}
)

ExternalProject_Get_Property(zlib install_dir)
set(ZLIB_ROOT_DIR ${install_dir})
set(ZLIB_INCLUDE_DIR /usr/local/include)
set(ZLIB_LIBRARY /usr/local/lib/libz.a)

#endregion


Путь установки библиотеки можно изменить с /usr/local на любой другой.

#cmake #minercaravan
🔥3❤1
https://www.jetbrains.com/rider/whatsnew/

Однако, интересное.
❤1
Forwarded from эйай ньюз
Убийца Mac Mini от Nvidia – Digits

Вы только гляньте, шустрая коробочка помещается на ладошке Хуанга!

128 GB оперативки, 1 петафлоп в fp4, 20 Arm ядер. На такой машинке можно инференсить модели вплоть до 200 млрд параметров. Можно соединить две такие малышки и запускать уже 405B модель.

Обещают выпустить в мае, цена вопроса - $3000.

Хочу себе такую домой! 🥺

@ai_newz
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6🤯3👍1🤔1
С Днём Победы!
9 мая — день великой памяти, гордости и благодарности. Мы чтим подвиг тех, кто отстоял свободу и мир, кто отдал всё ради будущего.
Пусть мужество, сила духа и вера в лучшее всегда живут в наших сердцах.
Мира, добра и крепкого здоровья вам и вашим близким!
👍13👎1
🔥3👍2
Forwarded from Shpota Productions
Остросюжетный фильм об капитане милиции с установленным в тело искусственным интеллектом в сеттинге будущего СССР.
В главной роли Роман Курцын.

📱 YOUTUBE

📱 ВК ВИДЕО

Фильм снят при финансовой поддержке краудфандинга на planeta.ru

Приятного просмотра!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
Forwarded from Нейродвиж
ИИ впервые написал операционку: представлен VibeOS — проект, созданный Claude Code практически с нуля😮

Разработчик выложил систему, которую он навайбокодил в паре с нейросетью всего за 64 сессии. Получилась полноценная ОС с графическим интерфейсом в духе macOS, которая заводится на Raspberry Pi.

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

Золотой стандарт соблюдён: DOOM запускается 😂

Попробовать и изучить историю разработки можно — на GitHub.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
https://people.freebsd.org/~lstewart/articles/cpumemory.pdf

Очень полезная штука для всех, кто себя считает программистом.
👍2