Исправлены последние редкие ctd при очистке мусора (наконец-то)
Добавлена обработка клавиш в первом приближении.
Комментарий
Все еще до конца не перешел из состояния "втупляю" в состояние "поперло", но через полторы недели отпуск, там разгонюсь.
Система обработки клавиш на данный момент использует калбаки glfw с дополнительной оберткой в виде темплейтов биндов - для создания класса с привязкой к конфигу и системой делегатов для получения вызовов по по событию (на данный момент OnPress и OnRelease).
Выглядит это следующим образом:
Оглашается раскрытие темплейта и вызов его статичного метода для регистрации в системе обработки ввода.
Бинд привязывается к текстовой метке UserSettings конфига
клавиши пока в цифровом формате и без модификаторов
А дальше, где-нибудь в коде на один (или сразу на все) делегаты вешается нужный метод
в данном случае по нажатию Escape будет вызван метод OnEscape экземпляра актера testActor
При этом в лог будет записано страшное, ибо я не придумал ничего умнее, чем связать бинд с конфигом через систему Property (т.е. сейчас каждый бинд это полновесный метакласс фреймворка):
Глубоко прорабатывать систему пока не буду - нет необходимости. Добавлю обработку для мыши, чтобы все таки можно было камерой гулять, и продолжу со светом.
Когда я забеременела вторым ребенком в 2022-ом, продемонстрировала, счастливая, мужу тест с двумя яркими красными полосками, муж сказал:
- Мне нужен психолог!
А дочь из комнаты крикнула:
- Ноги его в моей комнате не будет!
- Ну что ж, у меня самое чуткое и понимающее семейство в мире! - восторженно сказала я и стала обнимать собаку. - Скуленька, а ты-то рада?!
Но на одном понимании Скули не выедешь - необходимо было расширяться. И стала я проектировать пристройку к дому со стороны входа.
Пристройка состоит из открытой веранды на первом этаже (потому что там уже вход в дом и окно из кухни, и застраивать все это крытыми помещениями было не вариантом), и на ней два помещения: детская для нового члена семьи и санузел.
Идея построить санузел на втором этаже у нас у всех вообще была уже давно. Потому что было две спальни на втором, и ночью спускаться вниз каждый раз по нужде (да и в душ тоже) было крайне неудобно. Только куда его пихать?
Были у меня мысли встроить унитаз на лестничном проеме аккуратно, чтоб не мешал проходу, и чтоб открытию-закрытию дверей тоже не мешал, но это было не реально! Он бы все равно встал так, чтоб через него надо было бы перешагивать, выходя и заходя как из нашей комнаты, так и из комнаты дочери. Сооружали мы временно подвесной рукомойник в спальне, но все это было не то! Я мечтала о большой ванной комнате с зеркалом, ванной, часами, подсветками и прочими радостями. И беременность подтолкнула к мечте решительно!
Только где проектировать вход в санузел? Второй этаж получается весь трамвайного типа! Поднимаешься по лестнице: направо к дочери, налево к нам. Все! Иных проходов нет. Пристройку для санузла и детской я разделила ровно на две части, детская примыкает к нашей спальне, санузел - формально к дочериной, но наша комната шире дочериной, поэтому стена санузла захватывает обе спальни. И получается, что оба входа - и в новую детскую, и в санузел - будут из нашей спальни! А если б даже и были бы наши две спальни по ширине одинаковые, и санузел строго примыкал бы только к дочериной комнате, все равно не удобно было бы нам всем ходить в санузел через дочь! Это издевательство было бы над ней. А так дочери бегать через нас? Ага!... А потом сын подрастет и тоже будет бегать через нас в туалет! (Мало того, что просто проход в его комнату через нас) Никакой личной жизни?!
Вот поэтому я и не стала мелочиться: я спроектировала вход в санузел из КАЖДОЙ спальни! И из нашей, и из дочериной, и из новостроеной комнаты сына!
Когда я все это рисовала и показывала строителям, они удивились:
- Это что вы все вот так здесь по кругу ходить будете, что ли?!
Ага. Зашли в дочерину комнату, прошли в санузел, зашли из него к сыночку, вышли к нам в спальню и пошли обратно к дочери. Все взялись за руки и ходим! Делать нам больше нечего... Как же они не поняли мою гениальную задумку?! Мой СУПЕР-ПРОЕКТ!... Недооцененный.
А дочь с мужем до сих пор ржут надо мной! Потому что это наглядная демонстрация data race: точку доступа открыли трем потокам, а мьютексы на чтение и запись поставить забыли! Тут или пул бюрократии, чтобы сходить поссать: сначала надо постучать и запросить разрешение на транзакцию (не ссыт ли кто в данный момент?), затем отправить всем трем потокам пуш-уведомление (шпингалеты или таблички) о том, что в данный момент идет активная транзакция, потом не забыть отправить обратные пуш-уведомления (три таблички снять или разблокировать шпингалеты), что транзакция завершена, можно заходить другому потоку, или будут дед-локи (например дочь три шпингалета закрыла, а потом открыла только свой, и в туалет, кроме как через ее комнату, больше никому не попасть), или та самая дата-рейс!
Тут доработать-то... Что два пальца об асфальт!
Варианты решения
Общий мьютекс. mutex.lock(), mutex.unlock(). Ну просто шпингалетики ставим и троссиками их соединяем! Делов-то? Закрываешь один шпингалет, троссики натягиваются, шестеренки шуршат, и закрываются остальные! А Ганс Форальберг нервно курит в сторонке.
Обернуть наш сортир в std::atomic. Ну унитаз и так атомарен по определению, в него не могут физически посрать два человека одновременно. Осталось разобраться с ванной, с раковиной... Как-то сделать их неделимыми вместе с унитазом! Например тройной клапан подачи воды и слива: перекрывает все так, что слив и вода свободны либо только для унитаза, либо только для раковины, либо только для ванны. Тогда нарушить атомарность не будет ни для кого никакого стимула! Все будут об этом помнить... Делов-то?
Спинлок в виде закольцованых датчиков под ковриками, которые подают сигнал и зажигают индикаторы красным в каждой комнате! (Желательно бы еще блокировать магнитными полями все двери).
std::queque. Вывесить табло электронной очереди перед пристройкой. Автоинформатор на весь этаж: «Талон с номером А4, пройдите к унитазу!»
И так как нам бюрократией заниматься лень, то у нас конечно же дата-рейс! Все двери открыты, ни шпингалетов, ни табличек, ни красно-зеленых световых индикаторов "занято\свободно", ни талонов МФЦ нет. Поэтому периодически у нас (если все дома) раздается или мужнино "Я сру! Сюда идти не надо!", или дочерин визг из ванны, а за ним визг домработницы, которая зашла помыть помещение, не постучав, или мое грозное "Ну кто опять убрал пандус?!"
Странно, и почему же надо мной вся семья ржет? Ведь я гениальный архитектор!
Хочу помочь своей хорошей подруге. Человек очень светлый, но сейчас у неё проблема: сын после 9 класса горит желанием поступить в лицей Иннополиса, нужно олимпиадное программирование на C++. Плюс интересуется робототехникой на C++.
Сама она не программист, найти репетитора сложно. Я ищу профессионала, который сможет подготовить парня к олимпиадному уровню.
Важно: это не просьба о бесплатных занятиях. Подруга дисциплинированная и требовательная, ребёнок будет всё выполнять, оплата — адекватная рынку.
Просто мне очень хочется найти человека, который поможет осуществить мечту. Если вы сами репетитор или знаете такого — отзовитесь в личку. Спасибо.
Привет! Меня зовут Аня, я - главный системный программист с++ в одной крупной гос.структуре, , но в портале дочерней ИТ-компании меня постоянно мотает на уровне должностей: то назначат старшим разработчиком, то повысят до ведущего, то обратно вернут в старшие. Ха-ха!
По Леонгарду, моя акцентуация: 75 % застревающая, 25 % эмотив (хотя может сейчас уже как-то и 50% на 50%), на август 2026-го мне 39 лет, моему мужу тоже, и он шизоид. У нас с ним двое шикарных детей: дочь, 17 лет и сын, 3 года.
Я тру-сканер. У меня каждый день разные задачи! Работаю, иногда шедеврю в шедевруме для развлечения. Написала недавно автобиографичный синопс к сериалу. Отправила его по 30 адресам кинокомпаний, но ответов нет. Я и не жду! Творчество - только ради творчества.
Перемещаюсь я при помощи ступенькоходной коляски Caterwil, благодаря чему наверное я легко узнаваемая в своем ежедневном маршруте.
Дома я пытаюсь контролировать бытовой хаос. Развожу перепелов, горлиц, петуньи на балконе. Живу в снт в частном доме на участке 6 соток.
Каждый день я встаю в 3:20 и еду на трехколесном велосипеде на вокзал в сопровождении мужа. На вокзале мы с мужем поднимаемся к очень сонным охранникам и забираем коляску (в нашем безопасном снт даже танк вражеский не проедет! поэтому коляску храню на вокзале!), муж уезжает досыпать домой до своих законных 7 утра, а в 4:28 отходит моя электричка. И в 7:31 я уже в Москве на своей станции! В 16:55 обратно... И в 19:52 я дома! Вот такое расписание. И в дороге я часто болтаю с ИИ, мы с ним обсуждаем птиц, растения и мои текущие проблемы, и иногда я ему, как живому настоящему приятелю, рассказываю короткие каверзные истории - воспоминания, случаи из жизни, о персонажах в электричке.
Именно так и родилась у меня идея открыть свой блог на Пикабу. Потому что я поняла, что не могу не писать, и читатели нужны живые, помимо ИИ.
Раньше у меня был депрессивный "Толстой-контент" в ЖЖ. Теперь он закрыт, и здесь скорее ожидается формат "Чехов-Булгаков-контент".
У меня помимо горлиц и перепелов, также есть заливистый кенар Овсянчик, китайские перепела, живущие прямо с горлицами, и два волнистых попугая - Бирюза и Оливка. Также у меня старый кремовый лабрадор Белка, 13 лет, хаски Скуля, 11 лет. Дочь Скули и кого-то типа немецкой овчарки - Урча. Кошка Рона - на любой плач сына она бежит мурчать. Лучшая нянька! И кот Рыжий.
Еще я - тот самый классический ебанарий, который берет микрозаймы до зарплаты. "Привет, ИИ! Я опять набрала микрозаймы и не знаю, как их отдать... зарабатываю дохуя, а все равно не хватает..." - мой типичный запрос за дней 5 до зарплаты.
По убеждениям я космополит, пацифист и атеист-агностик.
Музыкальные предпочтения: Александр Иванов, RONDO, Def Leppard, Nazareth, Ольга Кормухина, Черный кофе, Queen, Black Subbath, Scorpions, UDO, Accept, ДДТ, Judast Priest, W.A.S.P., AC/DC, Ария, Led Zeppelin, System of A Down, Любэ, Chris Rea, Sabaton, Linkin Park, Bon Jovi, Evanescence, Rammstein, Deep Purple, Кураж, Александр Барыкин, Skid Raw, Braian Adams, Агата Кристи и многое другое (сняла самое популярное по прослушиванию в яндекс-музыке).
Да, кстати! У меня есть вокальное прошлое, покрытое пылью и плесенью.
В общем, кто не испугался, и кого не стошнило - добро пожаловать!
Добавлен Направленный источник света (Directional Light Source)
Добавлена TBN (TangentBinormalNormal) матрица в структуру передачи Vertex->Fragment
Добавлен пересчет Нормалей 3д модели в Мировое пространство
Исправлены ошибки шейдерного домена Surface
Исправлена ошибка очистки генерации Выражений в коде материла
Комментарий
Отрисовка кубов с направленным источником света
Ну чтож, шейдер успешно внедрен, логика написана. Теперь нужно дописать оставшиеся юниты света и вплотную заняться объемным источником света для получения корректного света от звезд. После чего переключится на каст теней. Почему не сейчас? Потому что для теней нужно будет делать отдельный прогон шейдера в отдельный же буфер вывода (текстуру). Причем нужно будет реализовать несколько техник. Отдельно для планетарных и других крупных небесных объектов, и отдельно для мелочи, типо станций, кораблей, мелких обломков, итд.
Но перед этим всем, думаю, стоит наконец добавить код для чтения клавиш, чтобы камерой можно было гулять, ибо тестировать стало несколько не удобно.
Так-же, собирая тестовый релизный билд обратил внимание, что в Linux бинарях пропал ctd при завершении потоков. Конечно, это не означает, что ошибка исправлена, ибо в конфигурации Дебага она никуда не делась. Но, по крайней мере, можно не торопится с ее исправлением, ибо не критично (главное потом не забыть, про нее xD)
Бонус: Проверил, как направленный источник света будет работать с картой нормалей
это не движок, а внешний редактор шейдеров SHADERed, который я использую для предварительных тестов. Нормаль сгенерирована через Шум Перлина
В движок обработку карт нормалей добавлять пока не буду - займусь этим, когда дойду до текстур. Будет это где-то после теней и систем частиц. Тогда-же, наверное, и паралакс сделаю.
Компактная и портабельная программа, четко выполняющая свое предназначение — редкая для современного мира красота и услада для глаз опытного разработчика. Именно такие проекты, реализующие серверы и клиенты для веба вы найдете в этой статье.
Проект "Sandbird' в действии.
Ода миниатюризации
Есть много причин, по которым миниатюрные девушк.. ээ реализации программ заслуживают внимания:
обучение — врядли получится разобраться как устроен вебсервер, перелопачивая исходники монстров вроде Apache или Nginx, спасет только миниатюрная реализация;
основа для собственных проектов — большой объем чужого исходного кода под капотом вашего проекта будет висеть гирей и отвлекать ресурсы на поддержку, в отличие от чего-то маленького и простого;
борьба с энтропией — популярные библиотеки постоянно растут и раздуваются, при этом объем используемого функционала не особо меняется. Таким образом, большая часть кода в современном проекте с кучей внешних библиотек не используется никогда.
Разумеется есть определенные риски использования таких «наколенных» библиотек, связанные с неполной реализацией, безопасностью, работой под нагрузкой и так далее.
Но говоря откровенно, всего этого хватает с головой и в больших, известных реализациях, которые вы используете каждый день на работе.
Еще с опытом приходит понимание, что любая программа — не более чем инструмент а реальную опасность всегда представляют живые люди, а не тупые машины.
Тестовое окружение
Не стал опять заморачиваться с *BSD, чтобы в третий раз не описывать специальную прослойку epoll-shim, позволяющую быстро и более-менее безболезненно портировать серверный софт с линукса. На этот раз в качестве тестового окружения выступает обычная Ubuntu Linux 25.10, хотя и с немного нестандартным ядром.
Компилятором выступит штатный же GCC, без изысков:
A tiny (~800sloc) embeddable HTTP server written in C89, compatible with Linux, OSX and Windows.
800 строк на чистом С, причем наиболее портабельного стандарта С89, c поддержкой Windows, Linux и MacOS — отличный набор для реального применения, например в качестве встроенного вебсервера для WiFi-роутера.
Один из примеров, демонстрирующих работу этой библиотеки — на заглавном скриншоте к статье, причем показана обработка вебформы.
Вот так выглядит сборка примера:
cd example gcc hello.c ../src/*.c -I../src -std=c89 -pedantic -Wall -Wextra -o hello
Так выглядит код тестового приложения с использованием этой библиотеки:
К сожалению этот интересный проект по большей части прототип, иллюстрирующий как можно на коленке без внешних библиотек реализовать серверную сторону вебсокетов на чистом С.
В случае реального использования, столь вольное использование malloc для обработки входящих пакетов быстро превратится в проблему:
.. /* deal with normal frames (non-fragmented) */ if (WEBSFR_GET_OPCODE(frm.info) != 0x0) { /* read data */ if (data) free(data); data = malloc(frm.length + 1); ..
Так выглядит сокращенная версия тестового сервера вебсокетов, c минимумом обработчиков:
#include "../webs.h"
int myFuncZ(webs_client* self) { printf("server %ld: (id %ld) connected!\n", self->srv->id, self->id); webs_send(self, "greetings, salutations!"); return 0; } int myFunc2(webs_client* self) { printf("server %ld: (id %ld) disconnected!\n", self->srv->id, self->id); return 0; } int main(void) { webs_server* server1 = webs_start(7754); if (!server1) { printf("failed to initialise a server.\n"); return 1; } server1->events.on_open = myFuncZ; server1->events.on_close = myFunc2;
Как видно из кода выше, все интересное происходит именно в обработчиках, где собственно и будет находиться ваша собственная логика, если вдруг решитесь использовать эту штуку.
Повторюсь, что весь этот проект, несмотря на всю свою интересность — сырой прототип и тащить в прод подобный код без переработки, "as-is" точно не стоит.
Собирается только для Linux и только с помощью gcc.
Реализуют весьма продвинутый HTTP/HTTPS сервер и клиент, причем фактически в одном файле. Есть поддержка сборки как на Linux так и Windows, причем для второй есть готовый проект для Visual Studio.
Разумеется это не мейнстрим и к качеству есть вопросы, зато все уместилось в очень небольшом коде, без особых ухищрений по миниатюризации и потому вполне читаемому.
Так выглядит сборка тестового сервера, использующего эту библиотеку:
Всего 1.5к строк на С++11 от безвестного китайского автора реализуют полнофункциональный FTP/FTPS‑сервер — с chroot, поддержкой локальных и анонимных юзеров и всем прочим.
FTPS это довольно редко встречающееся расширение протокола FTP, с поддержкой шифрования передачи данных. Не набравшее большой популярности ввиду появления SFTP и органичений самого FTP и потому мало известное широкой админской публике.
В работе:
Проект использует известную библиотеку libnet, о чем автор забыл сообщить и которую необходимо установить до сборки:
apt install libnet1-dev
Сама сборка происходит с помощью обычного cmake:
mkdir build && cd build cmake ..
Реализация FTP-сервера тут максимально классическая — используется chroot а использование 21 и 20 портов зашито в код:
Все это означает, что запускать сервер придется от суперпользователя:
sudo ./tiny_ftpserver ../tiny_ftpserver.conf
У этого проекта есть один неожиданный нюанс:
на самом деле это.. студенческая работа.
И подобныхпроектов на Github оказалось великоемножество. Так что далеко не везде в 2026м году забыли что такое высшее техническое образование, что не может не радовать.
FineFTP is a minimal FTP server library for Windows and Unix flavors.
~2k строк на С++14 реализуют FTP-сервер в виде.. библиотеки!
В этом и есть основная фишка этого проекта — возможность встроить FTP (причем сервер а не клиент) в ваше собственное приложение.
Так выглядит код примера, с внедрением FTP-сервера:
#include <fineftp/server.h> #include <thread>
int main() { // Create an FTP Server on port 2121. We use 2121 instead of the default port // 21, as your application would need root privileges to open port 21. fineftp::FtpServer ftp_server(2121);
// Add the well known anonymous user. Clients can log in using username // "anonymous" or "ftp" with any password. The user will be able to access // your C:\ drive and upload, download, create or delete files. On Linux just // replace "C:\\" with any valid path. FineFTP is designed to be cross-platform. ftp_server.addUserAnonymous("C:\\", fineftp::Permission::All);
// Start the FTP Server with a thread-pool size of 4. ftp_server.start(4);
// Prevent the application from exiting immediately for (;;) std::this_thread::sleep_for(std::chrono::milliseconds(100)); return 0; }
Зачем и для чего такое может быть нужно — другой вопрос, все же обычно работу с файлами в конечном приложении (например обновление прошивки) стараются реализовать в виде клиента и через HTTP/HTTPS.
Но с точки зрения использования все отлично работает:
Это хорошая, взрослая библиотека, с несколькими коммитерами, с историей разработки, которая активно поддерживается и развивается.
Старого цирка с chroot и 21м портом тут нет, поэтому все работает без привилегий суперпользователя — на скриншоте выше как раз видно использование нестандартного порта для работы.
Поддерживается сборка для Linux, MacOS и Windows c приоритетом для последней.
Отличный проект, но далеко не последний в сегодняшней подборке.
Этот проект — привет из далекого и славного прошлого:
This is a modern re-implementation of rcp (remote copy protocol) daemon, originally part berkeley r-commands.
Да, это самый настоящий сервер RCP, всего 300 строк на Golang от знаменитого в узких кругах компьютерных реконструкторов автора Tenox.
RCP, если кто вдруг не знает, это такой устаревший протокол передачи файлов между компьютерами с UNIX, мало пригодный для использования в современных реалиях, ввиду отсутствия какого-либо шифрования и авторизации.
Но крайне актуальный, если имеете дело с устаревшим оборудованием или встраиваемыми системами, которые до сих пор используют rcp для например загрузки обновлений прошивок по сети.
Возвращаясь к проекту:
rcpd от Tenox реализует серверную сторону — сервер RCP
К этому серверу подключаются клиенты для загрузки или скачивания файлов. Так выглядит процесс копирования файла, в качестве клиента тут rcp из пакета GNU Inetutils:
Как видите и клиент и сервер запускаются от суперпользователя — такие были времена, RCP использует 514 порт, который нельзя занять без привилегий.
Сборка:
go build -o rcpd .
Кстати в Makefile проекта есть поддержка кроссплатформенных сборок, с весьма богатым выбором:
Стоит добавить, что протокол RCP сам по себе очень простой и не менялся весь период своего существования, что позволяет подключаться к этому RCP-серверу 21 века даже с помощью клиентских программ из 80х и 90х.
За кадром
Детально разобрать удалось лишь малую часть интересных находок, поэтому ниже буквально одной строкой про интересные миниатюрные, точно заслуживающие внимания.
Утро! (может доброе, а может и нет). Короче небольшое оправдание за то что сегодня не так много изучил - я не спал, в смысле просто лежал на кровати до 04 50 а потом пошёл всё таки продолжать изучение. Давно не выкладывал ничего потому что был занят запахиванием всего мистера робота без ощутимой потери качества на сд карту 32 гб.
Итак, сегодня узнал о том как в c++ пишутся ветвления, циклы, функции, так что вот что то такое получилось:
здесь у нас происходит несколько вещей, сначала идёт заголовок моей функции, потом вызывается функция main которая в свою очередь вызывает функцию которую я инициализирую после. В итоге программа запускается, main вызывает функцию, та инициализируются и просит у пользователя число, потом находит корень из него и выводит его в консоль, далее процесс повторяется пока пользователь не введёт число 101, тогда цикл остановится, main вернёт 0 и программа успешно завершится, как то так, если я что то не правильно понял - буду рад объяснению.