GUCEF
Il s'agit du principal mono-repo de la plateforme Galaxy Unlimited. Le logiciel contenu ici est une collection de bibliothèques et de services et applications dérivés, tous de nature assez générique. L’objectif primordial de ces bibliothèques est d’agir comme une boîte à outils C++ permettant de développer rapidement des applications et des services. Certains de ces outils/applications/services sont également inclus dans le même mono-dépôt.
Notez que les principaux modules de la plate-forme n'exigent pas intentionnellement des versions plus récentes de C++ pour leur permettre d'être utilisées dans des situations où aucun compilateur moderne n'est disponible. Toute utilisation de fonctionnalités de langage plus récentes a tendance à être gérée via des macros pour cette raison, de sorte que le code peut toujours être compilé à l'aide de compilateurs plus anciens.
A propos du nom
GUCEF signifiait autrefois « Galaxy Unlimited Client Engine Framework ». Il faisait partie d'une pile à plusieurs niveaux comportant des niveaux de pile logicielle GUCE et GU indépendants. GUCE signifiait "Galaxy Unlimited Client Engine". GUC signifiait « Galaxy Unlimited Client ». GU est toujours l'abréviation de "Galaxy Unlimited". À cette époque, GUCEF et GUCE ont fusionné et certaines parties de GUC et GU ont également été incorporées. Au lieu de se concentrer sur le côté client, une grande partie du nouveau développement s'est concentrée sur les services de support et généralement sur le développement back-end.
Un peu d'histoire
Au fil des années, diverses bases de code ont été créées et les leçons apprises par l'auteur. Lentement mais sûrement, un noyau commun de code a émergé et a commencé à se développer de manière organique. La base de code de base commune d'origine a été partiellement perdue à plusieurs reprises en raison de problèmes de conservation des données et de pratiques de sauvegarde plus jeunes, encore contraintes par un manque de ressources financières. Différents référentiels ont été fusionnés, combinant diverses sauvegardes partielles pour créer la première version du référentiel GUCEF. Cette première version a trouvé sa place publique sur SourceForce. À l'origine, CVS était utilisé comme système de contrôle de version, suivi de SVN et plus tard de Git. Lorsque le passage à Git a été envisagé, un nouvel emplacement pour le dépôt open source a également été envisagé. En raison de la popularité croissante de la communauté open source, GitHub a remporté la victoire en tant que nouveau domicile pour GUCEF et certains dépôts associés où il se trouve aujourd'hui.
À propos de l'auteur
Mis à part les dépendances, presque tout le code de ce référentiel a été écrit par Dinand Vanvelzen. Dinand a commencé à programmer lorsqu'il était enfant dans les années 1980, en écrivant du code assembleur pour le MSX, une version conçue par Philips d'un concept de PC. Plus tard, au cours des années 1990, les principes de programmation RAD sont devenus la nouvelle histoire d'amour via Borland Delphi suivi de Borland C++ Builder. À ce stade, l’auteur s’était lancé dans une formation professionnelle dans les arts sombres du génie logiciel. Une double stratégie a été poursuivie entre la programmation d’applications et la programmation back-end/niveau inférieur qui étaient à l’époque des degrés distincts. Pendant ce temps, la base de code que vous trouvez dans ce référentiel a continué à croître et à évoluer à mesure que les concepts se mélangeaient et évoluaient. Au cours des années 2000, l'auteur s'est principalement concentré sur la visualisation, principalement sur les graphiques 3D, à la fois professionnellement et en tant que curiosité intellectuelle faisant son chemin dans ce référentiel. La migration vers les États-Unis et la création d'une famille ont ralenti le nouveau développement pendant un bon nombre d'années avant de commencer à reprendre une fois la situation personnelle stabilisée. C’est durant cette phase que l’idéalisme de la jeunesse a commencé à céder la place au pragmatisme. Sur le plan professionnel, le domaine des soins de santé interventionnels a cédé la place aux soins de santé en entreprise, qui à leur tour ont cédé la place au secteur financier. Les nouveaux développements ultérieurs se sont concentrés de manière pragmatique sur les besoins communs dans la vie professionnelle de l'auteur, en mélangeant des projets bizarres accidentels comme moyen d'arriver à une fin.
panne mono-repo
- /platform : les principaux modules de la plate-forme ont à la fois des fonctionnalités portables concrètes et des interfaces permettant d'utiliser des fonctionnalités supplémentaires via des plugins.
- /plugins : il contient divers plugins qui peuvent éventuellement être utilisés pour étendre les capacités de la plateforme.
- /projects : contient des scripts et autres pour générer des projets de build
- /common/bin : ceci a une sortie binaire des projets
- /dependencies : Comme son nom l'indique, ce dossier contient les différentes bibliothèques de dépendances utilisées par les plugins, jamais directement par les bibliothèques de la plateforme.
- /tests : Comme son nom l'indique, il contient du code de test dédié
Comment générer un projet pour mon IDE
La principale méthode par laquelle les fichiers de projet/solution IDE sont pris en charge est via CMake. Les fichiers CMake eux-mêmes sont presque tous générés automatiquement via un outil inclus dans ce référentiel appelé « ProjectGenerator ». ProjectGenerator effectue une analyse des fichiers dans le dépôt avec un minimum de fichiers ModuleInfo.xml pour identifier les modules, à partir de là, il dérive tous les chemins nécessaires et génère les fichiers nécessaires. Ce même outil peut également générer des fichiers middleware pour d’autres chaînes d’outils, pas seulement pour CMake. Il existe également des fichiers Premake 4, Premake 5 et Android Make, mais ils ne sont pas mis à jour aussi fréquemment pour le moment, donc votre kilométrage variera en fonction de ceux-ci.
Dans la plupart des cas, vous souhaitez d'abord accéder à /projects/CMake pour générer les fichiers IDE appropriés. Dans ce dossier, vous verrez divers scripts avec des noms longs. À un moment donné, cela sera remanié selon la liste TODO, mais pour l'instant, le schéma est le suivant :
À titre d'exemple, vous avez un fichier de script tel que « RunCMake_Shared_CodeBlocks_Unix_Debug_pubsub2pubsub.sh »
- RunCMake_ : Ce premier segment sert simplement à le distinguer des autres fichiers du dossier pour des raisons historiques, ignorez-le.
- Shared_ : Ce segment est principalement lié à CMake où la méthode de construction de module par défaut transmise sera « dynamique » (dll/so) vs statique (.lib/.a)
- CodeBlocks_ : Ce segment porte le nom de l'IDE pour lequel vous souhaitez générer des fichiers projet, dans cet exemple l'IDE Code Blocks
- Unix_ : Ce segment désigne la plateforme cible. Certains IDE prennent en charge plusieurs plates-formes cibles.
- Debug_ : Ce segment peut ne pas être présent pour tous les scripts, cela dépend des capacités du générateur. Pour certains générateurs, les fichiers de projet eux-mêmes doivent être créés dès le début pour les versions de débogage ou de version. Ce n'est pas nécessaire dans le cas, par exemple, de Visual Studio
- pubsub2pubsub.sh : Ce segment désigne la cible principale de la vue logique sur l'ensemble du mono-repo. Dans ce cas, le service pubsub2pubsub.
En d'autres termes, le format est : "RunCMake_Shared/Static_IDE pour utiliser_OS Target_Debug/Release_Target name.Executable script extension"
Sous Windows, lorsque vous exécutez le script ci-dessus et similaire, cela déclenchera également une exécution de ProjectGenerator. Ceci est simplement destiné à rendre le flux plus infaillible, car généralement les fichiers CMake validés sont déjà à jour et cette étape peut donc généralement être supprimée et ignorée. Suite à cette étape potentielle, CMake est invoqué pour prendre en charge la génération des fichiers de build. Ces fichiers écrivent dans /common/bin. Ce dépôt suit l'idée selon laquelle les fichiers de sortie temporaires ne doivent pas être mélangés avec du code. Si vous rencontrez des problèmes pour une raison quelconque avec des fichiers de sortie périmés/mauvais (problème de disque ?), vous pouvez toujours simplement supprimer toute la structure des dossiers sous /common/bin.
Bibliothèques de plates-formes confinées
- gucefMT : Bibliothèque avec primitives de programmation multithread. Sera probablement intégré à gucefCORE à un moment donné.
- gucefCORE : bibliothèque avec des fonctionnalités essentielles au fonctionnement des fonctionnalités construites sur la plate-forme, telles que les systèmes plugin/logging/metrics/eventing/etc.
- gucefIMAGE : bibliothèque facultative utilisée lors de la création de logiciels utilisant des images numériques
- gucefVFS : bibliothèque facultative utilisée lors de la création de logiciels qui effectuent des E/S de style système de fichiers plus complexes au-delà du simple accès de base. VFS = système de fichiers virtuel.
- gucefCOMCORE : bibliothèque facultative utilisée lors de la création de logiciels effectuant une mise en réseau de base
- gucefCOM : bibliothèque facultative utilisée lors de la création de logiciels effectuant une mise en réseau et utilisant des fonctionnalités assez standard de l'industrie telles que StatsD
- gucefWEB : bibliothèque facultative utilisée lors de la création de logiciels effectuant une mise en réseau de style Internet/Web
- gucefPUBSUB : bibliothèque facultative utilisée lors de la création de logiciels utilisant les concepts de publication/abonnement
- gucefGUI : bibliothèque facultative utilisée lorsqu'une interface graphique est nécessaire. L'accent est mis principalement sur les interfaces graphiques dans le contexte du rendu des interfaces graphiques non natives du système d'exploitation.
- gucefINPUT : bibliothèque facultative utilisée lorsque la prise en charge des périphériques de saisie humaine est nécessaire.
- gucefLOADER : bibliothèque facultative utilisée lors du chargement dynamique de plusieurs versions de la plate-forme GUCEF
- gucefPATCHER : bibliothèque facultative utilisée lorsque la prise en charge est nécessaire pour la fonctionnalité de mise à jour automatique par rapport à un utilisateur final téléchargeant manuellement les mises à jour
- gucefMATH : bibliothèque facultative utilisée lors de l'exécution de calculs mathématiques via des concepts OO
- gucefKAITAI : bibliothèque facultative utilisée lors de l'interprétation des formats binaires en exploitant le schéma Kaitai pour ce faire
Plugins de plateforme confinés
- dstorepluginPARSIFALXML : plugin gucefCORE : ajoute la prise en charge du codec DStore (DataNode) pour XML. Écriture via le code GUCEF et lecture via la bibliothèque de dépendances ParsifalXML
- dstorepluginJSONPARSER : plugin gucefCORE : ajoute la prise en charge du codec DStore (DataNode) pour JSON. Utilise les bibliothèques de dépendances json-parser et json-builder
- dstorepluginYAML : plugin gucefCORE : ajoute la prise en charge du codec DStore (DataNode) pour YAML. Utilise la bibliothèque de dépendances libyaml
- codecspluginZLIB : plugin gucefCORE : ajoute la prise en charge des codecs pour zlib/gzip/deflate/crc32/adler32
- codecspluginSTBRUMMEHASH : plugin gucefCORE : ajoute la prise en charge des codecs pour CRC32/MD5/SHA1/SHA3/SHA256/Keccak
- imgpluginDEVIL : plugin gucefIMAGE : ajoute une fonctionnalité de gestion d'images numériques provenant de la bibliothèque de dépendances d'images DEVIL. Prend en charge divers codecs d'image.
- imgpluginFLIC : plugin gucefIMAGE : ajoute la prise en charge du codec d'image pour le format FLIC
- imgpluginFreeImage : plugin gucefIMAGE : ajoute une fonctionnalité de gestion d'images numériques provenant de la bibliothèque de dépendances d'images FreeImage. Prend en charge divers codecs d'image.
- imgpluginITV : plugin gucefIMAGE : ajoute la prise en charge du codec d'image pour le format ITV d'ingénierie inverse
- vfspluginAWSS3 : plug-in gucefVFS : ajoute le backend VFS pour le montage et l'utilisation d'AWS S3 dans le cadre du système de fichiers virtuel
- vfspluginDVP : plugin gucefVFS : backend VFS obsolète pour le montage et l'utilisation de fichiers d'archive DVP dans le cadre du système de fichiers virtuel
- vfspluginITV : plugin gucefVFS : backend VFS pour le montage et l'utilisation de fichiers d'archive ITV par ingénierie inverse dans le cadre du système de fichiers virtuel
- vfspluginVP : plugin gucefVFS : backend VFS pour le montage et l'utilisation des fichiers d'archive 'Violation Pack' dans le cadre du système de fichiers virtuel tel que celui utilisé par les jeux Decent et FreeSpace
- vfspluginZIP : plugin gucefVFS : backend VFS pour le montage et l'utilisation de fichiers d'archives compatibles zlib dans le cadre du système de fichiers virtuel tel que .gz et .zip
- inputdriverDIRECTINPUT8 : plugin gucefINPUT : ajoute un pilote d'entrée pour l'interaction du périphérique d'entrée via Microsoft DirectInput 8
- inputdriverMSWINMSG : plug-in gucefINPUT : ajoute un pilote d'entrée pour l'interaction du périphérique d'entrée via les messages de l'API Microsoft Windows Win32
- inputdriverNANDROID : plugin gucefINPUT : ajoute un pilote d'entrée pour l'interaction du périphérique d'entrée via les API Android natives
- inputdriverOIS : plugin gucefINPUT : ajoute un pilote d'entrée pour l'interaction du périphérique d'entrée via la bibliothèque de dépendances OIS
- inputdriverXWINMSG : plugin gucefINPUT : ajoute un pilote d'entrée pour l'interaction du périphérique d'entrée via le système de messagerie X-Windowing pour Linux
- pubsubpluginAWSSNS : plug-in gucefPUBSUB : ajoute un backend compatible avec le concept pub-sub pour le service SNS d'AWS. Utilise le kit SDK AWS C++.
- pubsubpluginAWSSQS : plug-in gucefPUBSUB : ajoute un backend compatible avec le concept pub-sub pour le service SQS d'AWS. Utilise le kit SDK AWS C++.
- pubsubpluginKAFKA : plugin gucefPUBSUB : ajoute un backend compatible avec le concept pub-sub pour les flux Kafka. Utilise la bibliothèque de dépendances RdKafka.
- pubsubpluginMSMQ : plugin gucefPUBSUB : ajoute un backend compatible avec le concept pub-sub pour MSMQ. Utilise le sous-système MSMQ du système d'exploitation Windows qui doit être installé.
- pubsubpluginREDISCLUSTER : plugin gucefPUBSUB : ajoute un backend compatible avec le concept pub-sub pour les flux Redis. Utilise les dépendances Redis++ et Hiredis.
- pubsubpluginSTORAGE : plugin gucefPUBSUB : ajoute un backend compatible avec le concept pub-sub qui permet une interaction facile avec le VFS et ses capacités
- pubsubpluginUDP : plugin gucefPUBSUB : ajoute un backend compatible avec le concept pub-sub pour UDP de base
- pubsubpluginWEB : plugin gucefPUBSUB : ajoute un backend compatible avec le concept pub-sub pour les concepts Web tels que HTTP/REST/WebSockets
- ProjectGenDependsFilter : plugin ProjectGen : permet le filtrage des bibliothèques dans un dépôt basé sur un rapport de sortie de l'outil depend.exe
- ProjectGenVSImporter : plugin ProjectGen : importe les fichiers de projet Visual Studio pour générer un point de départ ModuleInfo.xml pour un nouveau dépôt
- comcorepluginDBL : plugin gucefCOMCORE qui tente de fournir des informations depuis le pilote réseau Myricom DBL
- comcorepluginGEOOSM : plugin gucefCOMCORE qui ajoute des fonctionnalités de recherche de géolocalisation basées sur Open Street Maps
Services confinés
- UdpViaTCP : service de pont qui achemine le trafic UDP sur un segment TCP. Sera remplacé par pubsub2pubsub.
- udp2kafka : service d'adaptateur qui permet l'entrée du trafic UDP dans les flux Kafka. Sera remplacé par pubsub2pubsub.
- udp2redis : service d'adaptateur qui permet l'entrée du trafic UDP dans les flux Redis pour les Redis non clusterisés. Sera remplacé par pubsub2pubsub.
- udp2rediscluster : service d'adaptateur qui permet l'entrée du trafic UDP dans les flux Redis pour les Redis en cluster. Sera remplacé par pubsub2pubsub.
- ProcessMetrics : service d'agent qui obtient des métriques pour un processus cible. Conçu comme une alternative légère et ciblée aux compteurs de performances haute fréquence et similaires
- redisinfo : service de surveillance qui utilise le protocole Redis pour obtenir des informations sur les clusters Redis et expose ces informations sous forme de métriques à diffuser
- pubsub2storage : Service adaptateur qui traduit plus généralement entre les paradigmes de messagerie et le stockage. Sera remplacé par pubsub2pubsub.
- pubsub2pubsub : Service adaptateur qui traduit plus généralement entre différents paradigmes de messagerie. Remplacera de nombreux autres services d’adaptateur.
- FilePusher : service d'agent qui surveille le système de fichiers pour certains fichiers et les pousse vers une destination VFS, par exemple AWS S3.
- FileSorter : service d'agent qui trie automatiquement les fichiers. Pratique pour le tri initial des archives d'images et de vidéos numériques par exemple.
- GucefLogService : service qui peut accepter les journaux de la plate-forme GUCEF diffusés via une connexion réseau. Destiné aux situations où nous ne pouvons pas avoir/accéder aux journaux locaux
- ServerPortExtender : service utilisé pour inverser l'initiation de connexion entrante/sortante pour un port de serveur d'applications, contournant ainsi les restrictions de sortie uniquement.
- UdpTransformer : service qui prend l'entrée UDP et effectue une transformation simpliste suivie d'une retransmission
- MsmqMetrics : service d'agent qui collecte des informations sur les files d'attente MSMQ, puis collecte et transmet des métriques pour lesdites files d'attente.
Outils contenus
- ProjectGenerator : outil pour générer automatiquement divers fichiers de projet/module et différentes vues logiques du même mono-repo
- DCSBruteInstaller : outil permettant d'exploiter une combinaison de matériel et de ce logiciel pour déchiffrer par force brute les codes d'un panneau d'alarme domestique DCS
- itvExporter : outil d'exportation par ingénierie inverse pour les actifs contenus dans un jeu classique
- GucefArchiver : outil d'archivage de base qui exploite le VFS et ses plugins
- HDFiller : Comme son nom l'indique, il remplit votre disque dur. Destiné aux scénarios de tests.
- PubSubStorageTool : outil pour manipuler les fichiers de stockage produits par le plugin de stockage pubsub
Bibliothèques diverses contenues
- MemoryLeakFinder : bibliothèque d'assistance de plate-forme chargée dynamiquement pour détecter les fuites de mémoire à l'aide des fonctionnalités de la plate-forme GUCEF
- ProjectGen : Bibliothèque qui contient toute la logique de l'outil ProjectGenerator. Il prend en charge les plugins pour étendre les fonctionnalités.
Liste À FAIRE
- Court terme : ajouter la prise en charge de base de Websocket nativement à la plateforme
- À court terme : ajouter la prise en charge appropriée des paramètres pour les codecs
- Court terme : ajouter la prise en charge de StringView
- Court terme : réussite initiale complète au plugin "web" pubsub2pubsub
- Court terme : passage initial complet au plugin pubsub2pubsub 'aws sns'
- Court terme : réussite initiale complète au plugin pubsub2pubsub 'aws sqs'
- À court terme : ajouter une classe CodecChain pilotée par la configuration
- À mi-parcours : correction de l'intégration de GitHub CI. Le lien du déclencheur de construction automatique est rompu.
- À mi-parcours : ajouter le système de schéma DataNode
- À moyen terme : ajouter un moteur de transformation de messages piloté par la configuration
- À moyen terme : ajouter la prise en charge d'AWS Lambda
- Moyen terme : ajout du support Utf16 et Utf32
- À mi-parcours : utilisez StringView au lieu de String pour toutes les références de chaîne statiques
- À moyen terme : transformez ProjectGenerator en quelque chose qui peut fonctionner en tant que service en arrière-plan
- À mi-parcours : prise en charge complète des actions GitHub via ProjectGenerator
- Moyen terme : ajouter la prise en charge de GitLab CI via ProjectGenerator
- À mi-parcours : Renommer complètement les fichiers sources de la plateforme pour qu'ils aient tous un préfixe de module
- À moyen terme : suppression du code mort dans le cadre d'un effort plus large de revitalisation des projets contenus dans le mono-repo. Déterminez quelles autres applications contenues dans ce document méritent d’être sauvegardées.
- À moyen terme : ajouter la prise en charge des flux au système de journalisation en utilisant des tampons de sortie pré-alloués par thread à titre d'optimisation
- Moyen terme : recréer la fonctionnalité client de la console de la plateforme
- À moyen terme : ajouter la prise en charge native des sockets sécurisés pour les plates-formes prises en charge
- Long terme : ajouter la prise en charge des assemblages Web
- Long terme : ajouter le support de Jenkins CI via ProjectGenerator
- Un jour : déprécier/annuler le préfixe « C » de style MFC classique pour les classes. Ce serait un énorme changement qui briserait tout, c’est pourquoi cela ne s’est pas encore produit.
- En cours : évaluer la nécessité de mettre à jour diverses dépendances en tenant compte de la pléthore de contraintes
- En cours : Affiner la journalisation/les métriques
- En cours : ajouter davantage de documentation au format javadoc (compatible doxygen)