ГУСЕФ
Это основной монорепозиторий для платформы Galaxy Unlimited. Программное обеспечение, содержащееся здесь, представляет собой набор библиотек, производных служб и приложений, которые по своей природе являются довольно общими. Основная цель этих библиотек — выступать в качестве набора инструментов C++ для быстрой разработки приложений и сервисов. Некоторые такие инструменты/приложения/сервисы также включены в тот же монорепозиторий.
Обратите внимание, что основные модули платформы намеренно не требуют использования новых версий C++, чтобы их можно было использовать в ситуациях, когда современный компилятор недоступен. По этой причине любое использование новых функций языка обычно обрабатывается с помощью макросов, так что код по-прежнему может компилироваться с использованием старых компиляторов.
О названии
GUCEF одно время расшифровывался как «Galaxy Unlimited Client Engine Framework». Это была часть многоуровневого стека, который имел независимые уровни программного стека GUCE и GU. GUCE расшифровывался как «Galaxy Unlimited Client Engine». GUC расшифровывался как «Galaxy Unlimited Client». ГУ по-прежнему является аббревиатурой «Galaxy Unlimited». В это время GUCEF и GUCE объединились, а также были включены некоторые части GUC и GU. Вместо того, чтобы сосредоточиться на клиентской стороне, многие новые разработки сосредоточены на вспомогательных услугах и, как правило, на внутренней разработке.
Немного истории
На протяжении многих лет были созданы различные базы кода и извлечены уроки автором. Медленно, но верно возникло общее ядро кода, которое начало органично расти. Первоначальная общая базовая кодовая база была частично потеряна пару раз из-за проблем с хранением данных и практики резервного копирования, что еще больше сдерживалось нехваткой финансовых ресурсов. Различные репозитории были объединены вместе, объединив различные частичные резервные копии для создания первой версии репозитория GUCEF. Эта первая версия нашла свой публичный дом на SourceForce. Первоначально в качестве системы контроля версий использовалась CVS, затем SVN, а затем Git. Когда рассматривался переход на Git, также рассматривалась возможность создания нового дома для репозитория с открытым исходным кодом. Благодаря растущей популярности сообщества открытого исходного кода GitHub стал новым домом для GUCEF и некоторых связанных с ним репозиториев, где он остается и по сей день.
Об авторе
Помимо зависимостей, почти весь код в этом репозитории был написан Динандом Ванвелзеном. Динанд начал программировать еще ребенком в 1980-х годах, написав ассемблерный код для MSX, который представлял собой разработанную Philips концепцию ПК. Позже, в 1990-е годы, принципы программирования RAD стали новым увлечением благодаря Borland Delphi, а затем Borland C++ Builder. В этот момент автор приступил к профессиональному образованию в области темных искусств разработки программного обеспечения. Применялась двойная стратегия: прикладное программирование и серверное/низкоуровневое программирование, которые в то время были разными степенями. За это время кодовая база, которую вы найдете в этом репозитории, продолжала расти и развиваться по мере смешивания и развития концепций. В 2000-е годы основное внимание автора уделялось визуализации, в основном 3D-графике, как профессионально, так и в качестве интеллектуальной диковинки, пробившейся в этот репозиторий. Миграция в Соединенные Штаты и создание семьи замедлили новое развитие до минимума на значительное количество лет, прежде чем начать восстанавливаться, как только личная ситуация стабилизировалась. Именно на этом этапе юношеский идеализм начал уступать место прагматизму. В профессиональном плане интервенционная медицина уступила место промышленному здравоохранению, которое, в свою очередь, позже уступило место финансовому сектору. Последующие новые разработки были прагматично сосредоточены на общих потребностях профессиональной жизни автора, а случайные странные проекты примешивались как средства для достижения цели.
разбивка монорепо
- /platform: здесь есть основные модули платформы, имеющие как конкретную переносимую функциональность, так и интерфейсы для использования дополнительных функций через плагины.
- /plugins: содержит различные плагины, которые можно использовать для расширения возможностей платформы.
- /projects: здесь есть сценарии и тому подобное для создания проектов сборки.
- /common/bin: имеет двоичный вывод проектов.
- /зависимости: как следует из названия, эта папка содержит различные библиотеки зависимостей, используемые плагинами, а не библиотеками платформы напрямую.
- /tests: как следует из названия, содержит специальный тестовый код.
Как создать проект для моей IDE
Основной метод поддержки файлов проекта/решения IDE — через CMake. Сами файлы CMake почти все автоматически генерируются с помощью инструмента ProjectGenerator, включенного в этот репозиторий. ProjectGenerator выполняет анализ файлов в репозитории с использованием минимального количества файлов ModuleInfo.xml для идентификации модулей, затем извлекает все необходимые пути и генерирует необходимые файлы. Этот же инструмент может выводить файлы промежуточного программного обеспечения и для других цепочек инструментов, а не только для CMake. Также включены файлы premake 4 и premake 5 и android make, но в настоящее время они обновляются не так часто, поэтому ваш опыт будет зависеть от них.
В большинстве случаев вам нужно сначала перейти в /projects/CMake, чтобы сгенерировать соответствующие файлы IDE. В этой папке вы увидите различные скрипты с длинными именами. В какой-то момент это будет реорганизовано в соответствии со списком TODO, но на данный момент схема выглядит следующим образом:
В качестве примера у вас есть файл сценария, например «RunCMake_Shared_CodeBlocks_Unix_Debug_pubsub2pubsub.sh».
- RunCMake_: этот первый сегмент предназначен только для того, чтобы отделить его от других файлов в папке по историческим причинам, игнорируйте.
- Shared_: этот сегмент в основном связан с CMake, где переданный метод сборки модуля по умолчанию будет «динамическим» (dll/so) и статическим (.lib/.a).
- CodeBlocks_: этот сегмент содержит имя IDE, для которой вы хотите создать файлы проекта, в этом примере IDE Code Blocks.
- Unix_: этот сегмент обозначает целевую платформу. Некоторые IDE поддерживают несколько целевых платформ.
- Debug_: Этот сегмент может присутствовать не для всех скриптов, это зависит от возможностей генератора. Для некоторых генераторов сами файлы проекта необходимо создавать с самого начала либо для отладочной, либо для выпускной сборки. Это не требуется, скажем, в случае Visual Studio.
- pubsub2pubsub.sh: этот сегмент обозначает основную цель логического представления всего монорепозитория. В этом случае служба pubsub2pubsub.
Другими словами, формат: «Запустите CMake_Shared/Static_IDE для использования_OS Target_Debug/Release_Target name.Executable script».
В Windows, когда вы запускаете приведенный выше сценарий и аналогичные ему, он также запускает запуск ProjectGenerator. Это просто предназначено для того, чтобы сделать процесс более надежным, поскольку обычно зафиксированные файлы CMake уже обновлены, и поэтому этот шаг обычно можно исправить и пропустить. После этого потенциального шага вызывается CMake, который позаботится о создании файлов сборки. Такие файлы записываются в /common/bin. Этот репозиторий следует идее о том, что временные выходные файлы не следует смешивать с кодом. Если по какой-либо причине у вас возникнут проблемы с устаревшими/плохими выходными файлами (проблема с диском?), всегда можно просто удалить всю структуру папок в /common/bin.
Содержащиеся библиотеки платформы
- gucefMT: Библиотека с примитивами многопоточного программирования. Вероятно, в какой-то момент он будет включен в gucefCORE.
- gucefCORE: Библиотека с функциональностью, которая является основной для работы функций, построенных на платформе, таких как системы плагинов/журналов/метрик/событий/и т. д.
- gucefIMAGE: дополнительная библиотека, используемая при создании программного обеспечения, использующего цифровые изображения.
- gucefVFS: дополнительная библиотека, используемая при создании программного обеспечения, которое выполняет более сложный ввод-вывод в стиле файловой системы, помимо простого доступа. VFS = виртуальная файловая система.
- gucefCOMCORE: дополнительная библиотека, используемая при создании программного обеспечения, выполняющего базовые сетевые функции.
- gucefCOM: дополнительная библиотека, используемая при создании программного обеспечения, которое поддерживает работу в сети и использует стандартные отраслевые функции, такие как StatsD.
- gucefWEB: дополнительная библиотека, используемая при создании программного обеспечения, обеспечивающего работу в сети в стиле Интернет/Веб.
- gucefPUBSUB: дополнительная библиотека, используемая при создании программного обеспечения, использующего концепции публикации/подписки.
- gucefGUI: дополнительная библиотека, используемая, когда необходим графический интерфейс. Основное внимание уделяется графическим пользовательским интерфейсам в контексте рендеринга, а не собственным графическим интерфейсам ОС.
- gucefINPUT: дополнительная библиотека, используемая, когда необходима поддержка устройств ввода, выполняемых человеком.
- gucefLOADER: дополнительная библиотека, используемая при динамической загрузке нескольких версий платформы GUCEF.
- gucefPATCHER: дополнительная библиотека, используемая, когда необходима поддержка функции автоматического исправления, а не когда конечный пользователь загружает обновления вручную.
- gucefMATH: дополнительная библиотека, используемая при выполнении математических вычислений с помощью объектно-ориентированных концепций.
- gucefKAITAI: дополнительная библиотека, используемая при интерпретации двоичных форматов с использованием для этого схемы Kaitai.
Содержащиеся плагины платформы
- dstorepluginPARSIFALXML: плагин gucefCORE: добавляет поддержку кодека DStore (DataNode) для XML. Запись через код GUCEF и чтение через библиотеку зависимостей ParsifalXML.
- dstorepluginJSONPARSER: плагин gucefCORE: добавляет поддержку кодека DStore (DataNode) для JSON. Использует библиотеки зависимостей json-parser и json-builder.
- dstorepluginYAML: плагин gucefCORE: добавляет поддержку кодека DStore (DataNode) для YAML. Использует библиотеку зависимостей libyaml.
- codecspluginZLIB: плагин gucefCORE: добавляет поддержку кодеков для zlib/gzip/deflate/crc32/adler32.
- codecspluginSTBRUMMEHASH: плагин gucefCORE: добавляет поддержку кодеков CRC32/MD5/SHA1/SHA3/SHA256/Keccak.
- imgpluginDEVIL: плагин gucefIMAGE: добавляет функциональность управления цифровыми изображениями, полученную из библиотеки зависимостей изображений DEVIL. Поддерживает различные кодеки изображений.
- imgpluginFLIC: плагин gucefIMAGE: добавляет поддержку кодека изображения для формата FLIC.
- imgpluginFreeImage: плагин gucefIMAGE: добавляет функциональность управления цифровыми изображениями, полученную из библиотеки зависимостей изображений FreeImage. Поддерживает различные кодеки изображений.
- imgpluginITV: плагин gucefIMAGE: добавляет поддержку кодека изображения для обратного проектирования формата ITV.
- vfspluginAWSS3: плагин gucefVFS: добавляет серверную часть VFS для монтирования и использования AWS S3 как части виртуальной файловой системы.
- vfspluginDVP: плагин gucefVFS: устаревший бэкэнд VFS для монтирования и использования файлов архива DVP как части виртуальной файловой системы.
- vfspluginITV: плагин gucefVFS: серверная часть VFS для монтирования и использования реверс-инжиниринга архивных файлов ITV как части виртуальной файловой системы.
- vfspluginVP: плагин gucefVFS: серверная часть VFS для монтирования и использования архивных файлов «Violation Pack» как части виртуальной файловой системы, например, используемой в играх Decent и FreeSpace.
- vfspluginZIP: плагин gucefVFS: серверная часть VFS для монтирования и использования совместимых с zlib архивных файлов как части виртуальной файловой системы, таких как .gz и .zip.
- inputdriverDIRECTINPUT8: плагин gucefINPUT: добавляет драйвер ввода для взаимодействия с устройствами ввода через Microsoft DirectInput 8.
- inputdriverMSWINMSG: плагин gucefINPUT: добавляет драйвер ввода для взаимодействия с устройством ввода через сообщения API Microsoft Windows Win32.
- inputdriverNANDROID: плагин gucefINPUT: добавляет драйвер ввода для взаимодействия с устройствами ввода через собственные API-интерфейсы Android.
- inputdriverOIS: плагин gucefINPUT: добавляет драйвер ввода для взаимодействия с устройствами ввода через библиотеку зависимостей OIS.
- inputdriverXWINMSG: плагин gucefINPUT: добавляет драйвер ввода для взаимодействия с устройствами ввода через систему обмена сообщениями X-Windowing для Linux.
- pubsubpluginAWSSNS: плагин gucefPUBSUB: добавляет серверную часть, совместимую с концепцией pub-sub, для службы SNS AWS. Использует AWS C++ SDK.
- pubsubpluginAWSSQS: плагин gucefPUBSUB: добавляет серверную часть, совместимую с концепцией pub-sub, для сервиса AWS SQS. Использует AWS C++ SDK.
- pubsubpluginKAFKA: плагин gucefPUBSUB: добавляет бэкенд, совместимый с концепцией pub-sub, для потоков Kafka. Использует библиотеку зависимостей RdKafka.
- pubsubpluginMSMQ: плагин gucefPUBSUB: добавляет серверную часть, совместимую с концепцией pub-sub, для MSMQ. Использует подсистему MSMQ операционной системы Windows, которую необходимо установить.
- pubsubpluginREDISCLUSTER: плагин gucefPUBSUB: добавляет бэкенд, совместимый с концепцией pub-sub, для потоков Redis. Использует зависимости Redis++ и Hiredis.
- pubsubpluginSTORAGE: плагин gucefPUBSUB: добавляет серверную часть, совместимую с концепцией pub-sub, которая позволяет легко взаимодействовать с VFS и ее возможностями.
- pubsubpluginUDP: плагин gucefPUBSUB: добавляет бэкэнд, совместимый с концепцией pub-sub, для базового UDP.
- pubsubpluginWEB: плагин gucefPUBSUB: добавляет серверную часть, совместимую с концепцией pub-sub, для таких веб-концепций, как HTTP/REST/WebSockets.
- ProjectGenDependsFilter: плагин ProjectGen: позволяет фильтровать библиотеки в репозитории на основе выходного отчета инструмента Depend.exe.
- ProjectGenVSImporter: плагин ProjectGen: импортирует файлы проекта Visual Studio для создания отправной точки ModuleInfo.xml для нового репозитория.
- comcorepluginDBL: плагин gucefCOMCORE, который пытается предоставить информацию из сетевого драйвера Myricom DBL.
- comcorepluginGEOOSM: плагин gucefCOMCORE, который добавляет возможности поиска географического местоположения на основе Open Street Maps.
Содержащиеся услуги
- UdpViaTCP: служба моста, которая направляет трафик UDP через сегмент TCP. Будет заменен на pubsub2pubsub.
- udp2kafka: служба адаптера, которая позволяет проникать UDP-трафику в потоки Kafka. Будет заменен на pubsub2pubsub.
- udp2redis: служба адаптера, которая позволяет проникать UDP-трафику в потоки Redis для некластеризованного Redis. Будет заменен на pubsub2pubsub.
- udp2rediscluster: служба адаптера, которая позволяет проникать UDP-трафику в потоки Redis для кластерного Redis. Будет заменен на pubsub2pubsub.
- ProcessMetrics: служба агента, которая получает метрики для целевого процесса. Предназначен как целевая облегченная альтернатива высокочастотным счетчикам производительности и т.п.
- redisinfo: служба мониторинга, которая использует протокол Redis для получения информации о кластерах Redis и предоставляет такую информацию в виде показателей для широковещательной рассылки.
- pubsub2storage: служба адаптера, которая в более общем смысле преобразует парадигмы обмена сообщениями и хранилищем. Будет заменен на pubsub2pubsub.
- pubsub2pubsub: служба адаптера, которая в более общем смысле преобразует различные парадигмы обмена сообщениями. Заменит многие другие службы адаптеров.
- FilePusher: служба агента, которая отслеживает файловую систему на наличие определенных файлов и отправляет их в место назначения VFS, например AWS S3.
- FileSorter: служба агента, которая автоматически сортирует файлы. Удобен, например, для первоначальной сортировки цифровых фото- и видеоархивов.
- GucefLogService: служба, которая может принимать журналы платформы GUCEF, передаваемые через сетевое соединение. Направлен на ситуации, когда мы не можем иметь или получать доступ к локальным журналам.
- ServerPortExtender: служба, используемая для отмены инициирования входящего/исходящего соединения для порта сервера приложений, что позволяет обойти только ограничения на исходящий трафик.
- UdpTransformer: служба, которая принимает входной UDP и выполняет упрощенное преобразование с последующей повторной передачей.
- MsmqMetrics: служба агента, которая собирает информацию об очередях MSMQ, а затем собирает и передает показатели для указанных очередей.
Содержащиеся инструменты
- ProjectGenerator: инструмент для автоматического создания различных файлов проекта/модуля и различных логических представлений одного и того же монорепозитория.
- DCSBruteInstaller: инструмент, позволяющий использовать комбинацию некоторого оборудования и этого программного обеспечения для взлома кодов домашней панели сигнализации DCS.
- itvExporter: инструмент экспорта ресурсов, содержащихся в классической игре, с помощью реверс-инжиниринга.
- GucefArchiver: базовый инструмент архиватора, использующий VFS и его плагины.
- HDFiller: Как следует из названия, он заполняет ваш жесткий диск. Предназначен для тестовых сценариев.
- PubSubStorageTool: инструмент для управления файлами хранилища, созданными плагином хранилища pubsub.
Содержащиеся разные библиотеки
- MemoryLeakFinder: динамически загружаемая вспомогательная библиотека платформы для отслеживания утечек памяти с помощью функций платформы GUCEF.
- ProjectGen: библиотека, содержащая всю логику инструмента ProjectGenerator. Он поддерживает плагины для расширения функциональности.
список дел
- В краткосрочной перспективе: добавьте базовую поддержку веб-сокетов, встроенную в платформу.
- В краткосрочной перспективе: добавить правильную поддержку параметров для кодеков.
- В краткосрочной перспективе: добавить поддержку StringView.
- Краткосрочная перспектива: завершить начальный этап работы над плагином pubsub2pubsub 'web'.
- В краткосрочной перспективе: завершить начальный этап плагина pubsub2pubsub 'aws sns'.
- Краткосрочная перспектива: завершить начальный этап плагина pubsub2pubsub 'aws sqs'.
- В краткосрочной перспективе: добавить класс CodecChain, управляемый конфигурацией.
- Среднесрочная перспектива: исправить интеграцию GitHub CI. Ссылка на триггер автоматической сборки не работает.
- Среднесрочная перспектива: добавление системы схемы DataNode.
- Среднесрочная перспектива: добавление механизма преобразования сообщений на основе конфигурации.
- Среднесрочная перспектива: добавление поддержки AWS Lambda
- Среднесрочная перспектива: добавить поддержку Utf16 и Utf32.
- В середине срока: используйте StringView вместо String для всех ссылок на статические строки.
- Среднесрочная перспектива: превратить ProjectGenerator во что-то, что может работать в качестве фоновой службы.
- Среднесрочная перспектива: полная поддержка GitHub Actions через ProjectGenerator.
- Среднесрочная перспектива: добавление поддержки GitLab CI через ProjectGenerator.
- Среднесрочная перспектива: полное переименование исходных файлов платформы, чтобы все они имели префикс модуля.
- Среднесрочная перспектива: удаление мертвого кода в рамках более масштабных усилий по оживлению проектов, содержащихся в монорепозитории. Определите, какие еще приложения, содержащиеся здесь, стоит сохранить.
- В среднесрочной перспективе: добавить поддержку потоков в систему журналирования, используя предварительно выделенные выходные буферы для каждого потока в качестве оптимизации.
- Среднесрочная перспектива: воссоздание функциональности клиента консоли платформы.
- В среднесрочной перспективе: добавить встроенную поддержку защищенных сокетов для поддерживаемых платформ.
- В долгосрочной перспективе: добавление поддержки веб-сборки.
- В долгосрочной перспективе: добавьте поддержку Jenkins CI через ProjectGenerator.
- Однажды: упраздните/отмените классический префикс C в стиле MFC для классов. Это было бы огромным изменением, ломающим все, поэтому оно до сих пор не произошло.
- Продолжается: оценка необходимости обновления различных зависимостей с учетом множества ограничений.
- Продолжается: Уточнение ведения журналов/метрик.
- В процессе: добавление дополнительной документации в формате Javadoc (совместимой с doxygen).