Hackerman Logic
137 subscribers
31 photos
3 videos
22 links
Когнитивно-искажённые мысли отдельно взятого не особо сферического погромиста в вакууме.
Download Telegram
Немного мыслей про языки.

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
Forwarded from Denis Sexy IT 🤖
This media is not supported in your browser
VIEW IN TELEGRAM
И снова криповая история про симуляцию, фанаты аниме Пантеон оценят:

Челы загрузили мозг мухи-дрозофилы - нейрон за нейроном - и запустили его в симуляции физического тела (это не нейросеть имитирующая биологию мухи, тут нет весов или тренировки, это именно копия реальных нейронов мухи)

Ее мозг это ~125 000 нейронов и ~50 миллионов синапсов

Сигналы виртуального мира входят в копию, активность бежит по всей системе мухи и вирутальное тело двигается ☕️

Дальше такое же хотят сделать с мышами

Тут больше деталей:
https://eon.systems

Матрицу для мух мы сделали, поздравляю – хоть для кого-то
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👎1
Forwarded from SOLANO Arch
Вы когда-нибудь задумывались о том, что усталый гнев и нестабильность человека это следствие чувства страха? Нет? и не надо...Лучше задуматься о целеполагании в архитектуре. Цель архитектора: Научиться видеть
Вопреки ожиданиям, цель в архитектуре каждый определяет сам. Я говорю не о целях проекта, а о цели архитектуры как способа мышления и пути.
Кто-то скажет: архитекторы – ремесленники, и без погружения в домен ничего толкового не получится. И будет прав лишь отчасти. Старый образ "архитектора в башне из слоновой кости" уходит в прошлое. Мы уже понимаем: спущенные сверху спецификации и навязанные технологии часто приводят к раздорам.
Так в чем же цель? Для меня она звучит просто: научиться видеть.
Архитектура – это не только про код или схемы. Это способ мышления, окружающий нас повсюду: от структуры книги до устройства торгового центра, от мотоцикла до человеческого тела. Это умение видеть целое в разрозненном, утраченном, необнаруженном.
Ключ к этому видению – понимание множества view (точек зрения). В консервативной архитектуре (знакомой с Waterfall и TOGAF) этот термин означает видение системы с разных ракурсов: бизнеса, безопасности, разработчика, владельца, вендора. Все эти view вместе и дают ту самую "способность видеть".
Опасность – в грубой группировке заинтересованных лиц (например, просто "бизнес" или "заказчик"). За ней теряется суть: требование топ-менеджера "срочно перевести интеграцию на онлайн" и жалоба рядового сотрудника на "некорректный расчет бонусов" – это разные миры с разными первопричинами. То же и "на нашей стороне": у каждого в команде – аналитика, разработчика, тестировщика – свой ценный view.
Архитектору важно быть близко к команде, а не над ней. Его роль – предостеречь от ошибок, помочь сгладить углы и срезать путь до проблем, а не болезненно указывать на них постфактум. Сокращайте дистанцию. Ваше мнение должно быть важно команде потому, что вы помогаете идти верным курсом.
Резюмируя: Моя цель – Видеть. Видеть целое через множество view, видеть суть за требованиями, видеть путь для команды.
А какая ваша цель в архитектуре? Запишите ее сейчас, а потом – через год, два. Уверена, она будет меняться. Это увлекательный путь.
P.S. Классическая цель архитектуры предприятия лишь подтверждает это: с наименьшими потерями выявить и сопоставить view всех сторон для построения цельного решения и создать общее информационное поле. И помните: ваш собственный view, синтезирующий все услышанное, – невероятно ценен. Стремитесь к тому, чтобы ваше решение открывало то, о чем стороны даже не знали, что этого искренне хотят.
🔥3😢2❤1🌚1
Forwarded from Рестарт
Media is too big
VIEW IN TELEGRAM
«Гагарин. За пределами звезд» — вышел первый трейлер несуществующего фантастического сериала.

Чувак с помощью нейронки смешал в один коктейль «Звёздные Войны», «Стражей Галактики», «Чужого», «Космическую Одиссею», «Дюну» и эстетику боевых роботов, завернув всё это в визуальные стили от 70-х до современного кино.

Вылетев за пределы Земли, Гагарин обнаружил голограмму — искусственный экран, скрывающий правду о нашей солнечной системе.
За ней — огромная межпланетная империя, населённая сотнями видов существ. И один закон: цивилизации, не достигшие мира и гармонии, не покидают свой аквариум. Гагарин нарушил закон. Его поймали. Приговорили. Он сбежал. И пока Земля думала, что он погиб — он путешествовал по вселенной 65 лет.


«Снято» лучше фильмов от Фонда Кино😂😂😂
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2💯2🔥1
Forwarded from ai.dot(ufna, dev)
Солдаты живут, пока их помнят.

Мы помним.

С Днём Победы!
❤11👎1