GUCEF
Este es el monorrepositorio principal de la plataforma Galaxy Unlimited. El software contenido en este documento es una colección de bibliotecas y servicios y aplicaciones derivados, todos de naturaleza bastante genérica. El objetivo general de estas bibliotecas es actuar como un conjunto de herramientas de C++ con el que desarrollar rápidamente aplicaciones y servicios. Algunas de estas herramientas/aplicaciones/servicios también se incluyen en el mismo mono-repositorio.
Tenga en cuenta que los módulos de la plataforma principal no exigen intencionalmente versiones más nuevas de C++ para permitir su uso en situaciones en las que no hay un compilador moderno disponible. Cualquier uso de funciones de lenguaje más nuevas tiende a manejarse mediante macros, por ese motivo, de modo que el código aún se puede compilar utilizando compiladores más antiguos.
Sobre el nombre
GUCEF significaba "Galaxy Unlimited Client Engine Framework" en un momento. Era parte de una pila de varios niveles que tenía niveles de pila de software GUCE y GU independientes. GUCE significa "Galaxy Unlimited Client Engine". GUC significaba "Galaxy Unlimited Client". GU sigue siendo la abreviatura de "Galaxy Unlimited". En este momento, GUCEF y GUCE se han fusionado y también se han incorporado algunas partes de GUC y GU. En lugar de centrarse en el lado del cliente, gran parte del nuevo desarrollo se ha centrado en los servicios de soporte y, en general, en el desarrollo back-end.
un poco de historia
A lo largo de los años, el autor creó varias bases de código y aprendió lecciones. De forma lenta pero segura, surgió un núcleo común de código que comenzó a crecer orgánicamente. La base de código central común original se perdió parcialmente un par de veces debido a problemas de retención de datos y prácticas de copia de seguridad de jóvenes, lo que se vio aún más limitado por la falta de recursos financieros. Se fusionaron varios repositorios, combinando varias copias de seguridad parciales para crear la primera versión del repositorio GUCEF. Esta primera versión encontró su hogar público en SourceForce. Originalmente se utilizó CVS como sistema de control de versiones, seguido de SVN y más tarde de Git. Cuando se contempló el cambio a Git, también se consideró un nuevo hogar para el repositorio de código abierto. Debido a la creciente popularidad de la comunidad de código abierto, GitHub ganó la elección como nuevo hogar para GUCEF y algunos repositorios relacionados, donde permanece hoy.
Sobre el autor
Aparte de las dependencias, casi todo el código de este repositorio fue escrito por Dinand Vanvelzen. Dinand comenzó a programar cuando era niño durante la década de 1980, escribiendo código ensamblador para el MSX, que era una versión diseñada por Philips del concepto de PC. Más tarde, durante la década de 1990, los principios de programación RAD se convirtieron en la nueva historia de amor a través de Borland Delphi, seguido de Borland C++ Builder. En ese momento, el autor se había embarcado en una educación profesional en las artes oscuras de la ingeniería de software. Se siguió una estrategia dual entre la programación de aplicaciones y la programación de back-end/nivel inferior, que eran grados distintos en ese momento. Durante este tiempo, el código base que se encuentra en este repositorio continuó creciendo y evolucionando a medida que los conceptos se mezclaban y evolucionaban. Durante la década de 2000, el enfoque principal del autor fue la visualización, principalmente gráficos en 3D, tanto a nivel profesional como como curiosidad intelectual que se abrió paso en este repositorio. La migración a los Estados Unidos y la formación de una familia desaceleraron el nuevo desarrollo hasta reducirlo a un mínimo durante un buen número de años antes de comenzar a recuperarse una vez que la situación personal se estabilizó. Es durante esta fase que el idealismo juvenil empezó a dar paso al pragmatismo. Profesionalmente, el ámbito de la atención sanitaria intervencionista dio paso a la atención sanitaria empresarial, que a su vez dio paso al sector financiero. Los nuevos desarrollos posteriores se han centrado pragmáticamente en las necesidades comunes en la vida profesional del autor con los proyectos extraños incidentales mezclados como un medio para lograr un fin.
desglose mono-repo
- /plataforma: tiene los módulos de la plataforma principal que tienen funcionalidades portátiles concretas e interfaces para utilizar funcionalidades adicionales a través de complementos.
- /plugins: tiene varios complementos que se pueden usar opcionalmente para ampliar las capacidades de la plataforma.
- /projects: tiene scripts y similares para generar proyectos de construcción
- /common/bin: esto tiene salida binaria de proyectos
- /dependencies: como sugiere el nombre, esta carpeta tiene las diversas bibliotecas de dependencias utilizadas por los complementos, nunca directamente por las bibliotecas de la plataforma.
- /tests: como sugiere el nombre, contiene un código de prueba dedicado
Cómo generar un proyecto para mi IDE
El método principal a través del cual se admiten archivos de proyecto/solución IDE es a través de CMake. Casi todos los archivos CMake se generan automáticamente a través de una herramienta incluida en este repositorio llamada 'ProjectGenerator'. ProjectGenerator realiza un análisis de los archivos en el repositorio con archivos ModuleInfo.xml mínimos para identificar módulos, a partir de ahí deriva todas las rutas necesarias y genera los archivos necesarios. Esta misma herramienta también puede generar archivos de middleware para otras cadenas de herramientas, no solo para CMake. También se incluyen archivos de premake 4 y premake 5 y de Android, pero no se actualizan con tanta frecuencia en este momento, por lo que su kilometraje variará en función de ellos.
En la mayoría de los casos, primero querrás ir a /projects/CMake para generar los archivos IDE relevantes. En esa carpeta verás varios scripts con nombres largos. En algún momento, esto se refactorizará según la lista TODO, pero por ahora el esquema es el siguiente:
Como ejemplo, tiene un archivo de secuencia de comandos como 'RunCMake_Shared_CodeBlocks_Unix_Debug_pubsub2pubsub.sh'
- RunCMake_: este primer segmento es solo para diferenciarlo de otros archivos en la carpeta por razones históricas, ignórelo.
- Shared_: este segmento está relacionado principalmente con CMake, donde el método de compilación del módulo predeterminado pasado será 'dinámico' (dll/so) frente a estático (.lib/.a).
- CodeBlocks_: este segmento tiene el nombre del IDE para el cual desea generar archivos de proyecto, en este ejemplo el IDE de bloques de código.
- Unix_: este segmento indica la plataforma de destino. Algunos IDE admiten múltiples plataformas de destino.
- Debug_: Es posible que este segmento no esté presente en todos los scripts, depende de las capacidades del generador. Para algunos generadores, los archivos del proyecto deben crearse desde el principio para la depuración o la versión de lanzamiento. Esto no es necesario en el caso de, por ejemplo, Visual Studio.
- pubsub2pubsub.sh: este segmento indica el objetivo principal de la vista lógica en todo el mono-repositorio. En este caso el servicio pubsub2pubsub.
En otras palabras, el formato es: 'RunCMake_Shared/Static_IDE to use_OS Target_Debug/Release_Target name.Extensión de script ejecutable'
En Windows, cuando ejecuta el script anterior y similares, también activará la ejecución del ProjectGenerator. Esto simplemente tiene como objetivo hacer que el flujo sea más infalible, ya que generalmente los archivos CMake confirmados ya están actualizados y, por lo tanto, este paso generalmente se puede eliminar y omitir. Después de este posible paso, se invoca a CMake para que se encargue de la generación de los archivos de compilación. Estos archivos se escriben en /common/bin. Este repositorio sigue la idea de que los archivos de salida temporales no deben mezclarse con el código. Si tiene problemas por cualquier motivo con archivos de salida obsoletos o defectuosos (¿problema con el disco?), siempre puede eliminar toda la estructura de carpetas en /common/bin
Bibliotecas de plataforma contenidas
- gucefMT: Biblioteca con primitivas de programación multiproceso. Probablemente se incorporará a gucefCORE en algún momento.
- gucefCORE: Biblioteca con funcionalidad que es fundamental para la forma en que funciona la funcionalidad creada en la plataforma, como los sistemas de complementos/registro/métricas/eventos/etc.
- gucefIMAGE: biblioteca opcional utilizada al crear software que utiliza imágenes digitales
- gucefVFS: biblioteca opcional que se utiliza al crear software que realiza E/S de estilo de sistema de archivos más complejo más allá del acceso básico. VFS = Sistema de archivos virtuales.
- gucefCOMCORE: biblioteca opcional utilizada al crear software que realiza redes básicas
- gucefCOM: biblioteca opcional que se utiliza al crear software que realiza redes y utiliza una funcionalidad bastante estándar de la industria, como StatsD.
- gucefWEB: biblioteca opcional que se utiliza al crear software que realiza redes de estilo Internet/Web.
- gucefPUBSUB: biblioteca opcional utilizada al crear software que utiliza conceptos de publicación/suscripción
- gucefGUI: biblioteca opcional que se utiliza cuando se necesita una GUI. El enfoque principal está en las GUI dentro del contexto de renderizado, no en las GUI nativas del sistema operativo.
- gucefINPUT: biblioteca opcional que se utiliza cuando se necesita soporte para dispositivos de entrada humana.
- gucefLOADER: biblioteca opcional utilizada al cargar dinámicamente múltiples versiones de la plataforma GUCEF de forma dinámica
- gucefPATCHER: biblioteca opcional que se utiliza cuando se necesita soporte para la funcionalidad de parcheo automático frente a un usuario final que descarga actualizaciones manualmente
- gucefMATH: biblioteca opcional utilizada al realizar cálculos matemáticos mediante conceptos OO
- gucefKAITAI: biblioteca opcional utilizada al interpretar formatos binarios aprovechando el esquema Kaitai para hacerlo
Complementos de plataforma contenidos
- dstorepluginPARSIFALXML: complemento gucefCORE: agrega compatibilidad con el códec DStore (DataNode) para XML. Escribir mediante código GUCEF y leer mediante la biblioteca de dependencia ParsifalXML
- dstorepluginJSONPARSER: complemento gucefCORE: agrega compatibilidad con el códec DStore (DataNode) para JSON. Utiliza las bibliotecas de dependencia json-parser y json-builder
- dstorepluginYAML: complemento gucefCORE: agrega compatibilidad con el códec DStore (DataNode) para YAML. Utiliza la biblioteca de dependencia libyaml
- codecspluginZLIB: complemento gucefCORE: agrega soporte de códec para zlib/gzip/deflate/crc32/adler32
- codecspluginSTBRUMMEHASH: complemento gucefCORE: agrega soporte de códec para CRC32/MD5/SHA1/SHA3/SHA256/Keccak
- imgpluginDEVIL: complemento gucefIMAGE: agrega funcionalidad de administración de imágenes digitales procedente de la biblioteca de dependencia de imágenes DEVIL. Admite varios códecs de imágenes.
- imgpluginFLIC: complemento gucefIMAGE: agrega soporte de códec de imagen para el formato FLIC
- imgpluginFreeImage: complemento gucefIMAGE: agrega funcionalidad de administración de imágenes digitales procedente de la biblioteca de dependencia de imágenes FreeImage. Admite varios códecs de imágenes.
- imgpluginITV: complemento gucefIMAGE: agrega soporte de códec de imagen para el formato ITV de ingeniería inversa
- vfspluginAWSS3: complemento gucefVFS: agrega backend VFS para montar y usar AWS S3 como parte del sistema de archivos virtual
- vfspluginDVP: complemento gucefVFS: backend VFS obsoleto para montar y usar archivos DVP como parte del sistema de archivos virtual
- vfspluginITV: complemento gucefVFS: backend VFS para montar y usar archivos ITV de ingeniería inversa como parte del sistema de archivos virtual
- vfspluginVP: complemento gucefVFS: backend VFS para montar y usar archivos de almacenamiento 'Violation Pack' como parte del sistema de archivos virtual, como el que usan los juegos Decent y FreeSpace.
- vfspluginZIP: complemento gucefVFS: backend VFS para montar y usar archivos compatibles con zlib como parte del sistema de archivos virtual, como .gz y .zip.
- inputdriverDIRECTINPUT8: complemento gucefINPUT: agrega un controlador de entrada para la interacción del dispositivo de entrada a través de Microsoft DirectInput 8
- inputdriverMSWINMSG: complemento gucefINPUT: agrega un controlador de entrada para la interacción del dispositivo de entrada a través de mensajes API de Microsoft Windows Win32
- inputdriverNANDROID: complemento gucefINPUT: agrega un controlador de entrada para la interacción del dispositivo de entrada a través de API nativas de Android
- inputdriverOIS: complemento gucefINPUT: agrega un controlador de entrada para la interacción del dispositivo de entrada a través de la biblioteca de dependencia OIS
- inputdriverXWINMSG: complemento gucefINPUT: agrega un controlador de entrada para la interacción del dispositivo de entrada a través del sistema de mensajería X-Windowing para Linux
- pubsubpluginAWSSNS: complemento gucefPUBSUB: agrega un backend compatible con el concepto pub-sub para el servicio SNS de AWS. Utiliza el SDK de AWS C++.
- pubsubpluginAWSSQS: complemento gucefPUBSUB: agrega un backend compatible con el concepto pub-sub para el servicio SQS de AWS. Utiliza el SDK de AWS C++.
- pubsubpluginKAFKA: complemento gucefPUBSUB: agrega un backend compatible con el concepto pub-sub para transmisiones de Kafka. Utiliza la biblioteca de dependencia RdKafka.
- pubsubpluginMSMQ: complemento gucefPUBSUB: agrega un backend compatible con el concepto pub-sub para MSMQ. Utiliza el subsistema MSMQ del sistema operativo Windows que debe instalarse.
- pubsubpluginREDISCLUSTER: complemento gucefPUBSUB: agrega un backend compatible con el concepto pub-sub para transmisiones de Redis. Utiliza redis++ y dependencias contratadas.
- pubsubpluginSTORAGE: complemento gucefPUBSUB: agrega un backend compatible con el concepto pub-sub que permite una fácil interacción con VFS y sus capacidades.
- pubsubpluginUDP: complemento gucefPUBSUB: agrega un backend compatible con el concepto pub-sub para UDP básico
- pubsubpluginWEB: complemento gucefPUBSUB: agrega un backend compatible con el concepto pub-sub para conceptos web como HTTP/REST/WebSockets
- ProjectGenDependsFilter: complemento ProjectGen: permite filtrar bibliotecas en un repositorio basado en un informe de salida de la herramienta depende.exe
- ProjectGenVSImporter: complemento ProjectGen: importa archivos de proyecto de Visual Studio para generar un punto de partida ModuleInfo.xml para un nuevo repositorio
- comcorepluginDBL: complemento gucefCOMCORE que intenta proporcionar información del controlador de red Myricom DBL
- comcorepluginGEOOSM: complemento gucefCOMCORE que agrega capacidades de búsqueda de ubicación geográfica basadas en Open Street Maps
Servicios contenidos
- UdpViaTCP: Servicio puente que canaliza el tráfico UDP a través de un segmento TCP. Será reemplazado por pubsub2pubsub.
- udp2kafka: servicio de adaptador que permite el ingreso de tráfico UDP a flujos de Kafka. Será reemplazado por pubsub2pubsub.
- udp2redis: servicio de adaptador que permite la entrada de tráfico UDP en flujos de Redis para redis no agrupados. Será reemplazado por pubsub2pubsub.
- udp2rediscluster: servicio de adaptador que permite la entrada de tráfico UDP en flujos de Redis para redis en clúster. Será reemplazado por pubsub2pubsub.
- ProcessMetrics: Servicio de agente que obtiene métricas para un proceso objetivo. Diseñado como una alternativa liviana y específica a los contadores de rendimiento de alta frecuencia y similares.
- redisinfo: servicio de monitoreo que utiliza el protocolo Redis para obtener información sobre los clústeres de Redis y expone dicha información como métricas para transmitir.
- pubsub2storage: servicio adaptador que se traduce de manera más general entre paradigmas de mensajería y almacenamiento. Será reemplazado por pubsub2pubsub.
- pubsub2pubsub: servicio adaptador que traduce de manera más general entre diferentes paradigmas de mensajería. Reemplazará a muchos de los otros servicios de adaptador.
- FilePusher: servicio de agente que monitorea el sistema de archivos en busca de ciertos archivos y los envía a un destino VFS, por ejemplo, AWS S3.
- FileSorter: Servicio de agente que ordena archivos automáticamente. Útil para la clasificación inicial de archivos de imágenes y vídeos digitales, por ejemplo.
- GucefLogService: servicio que puede aceptar registros de la plataforma GUCEF transmitidos a través de una conexión de red. Dirigido a situaciones en las que no podemos tener/acceder a registros locales
- ServerPortExtender: servicio utilizado para revertir el inicio de la conexión entrante/saliente para un puerto del servidor de aplicaciones, evitando así las restricciones de solo salida
- UdpTransformer: servicio que toma UDP de entrada y realiza una transformación simplista seguida de una retransmisión
- MsmqMetrics: Servicio de agente que recopila información sobre colas MSMQ y posteriormente recopila y transmite métricas para dichas colas.
Herramientas contenidas
- ProjectGenerator: herramienta para generar automáticamente varios archivos de proyecto/módulo y diferentes vistas lógicas del mismo mono-repositorio
- DCSBruteInstaller: herramienta para aprovechar una combinación de hardware y este software para descifrar por fuerza bruta los códigos en un panel de alarma residencial DCS
- itvExporter: herramienta de exportación de ingeniería inversa para recursos contenidos en un juego clásico
- GucefArchiver: herramienta de archivado básica que aprovecha VFS y sus complementos
- HDFiller: como sugiere el nombre, llena tu disco duro. Diseñado para escenarios de prueba.
- PubSubStorageTool: herramienta para manipular archivos de almacenamiento producidos por el complemento de almacenamiento pubsub
Bibliotecas misceláneas contenidas
- MemoryLeakFinder: biblioteca auxiliar de plataforma cargada dinámicamente para rastrear pérdidas de memoria con la ayuda de la funcionalidad de la plataforma GUCEF
- ProjectGen: Biblioteca que contiene toda la lógica de la herramienta ProjectGenerator. Admite complementos para ampliar la funcionalidad.
lista de TODOS
- A corto plazo: agregue soporte websocket básico nativo a la plataforma
- A corto plazo: agregue soporte de parámetros adecuado para códecs
- A corto plazo: agregue compatibilidad con StringView
- A corto plazo: pase inicial completo en el complemento 'web' pubsub2pubsub
- A corto plazo: pase inicial completo en el complemento pubsub2pubsub 'aws sns'
- A corto plazo: pase inicial completo en el complemento pubsub2pubsub 'aws sqs'
- A corto plazo: agregar la clase CodecChain basada en configuración
- A medio plazo: arreglar la integración de GitHub CI. El enlace de activación de compilación automática está roto.
- A medio plazo: agregar el sistema de esquema DataNode
- A medio plazo: agregar un motor de transformación de mensajes basado en configuración
- A medio plazo: agregar soporte para AWS Lambda
- A medio plazo: agregue compatibilidad con Utf16 y Utf32
- A medio plazo: use StringView en lugar de String para todas las referencias de cadenas estáticas
- A mediano plazo: convertir ProjectGenerator en algo que pueda ejecutarse como un servicio en segundo plano.
- Medio plazo: soporte completo de GitHub Actions a través de ProjectGenerator
- A mediano plazo: agregue soporte para GitLab CI a través de ProjectGenerator
- A medio plazo: completar el cambio de nombre de los archivos fuente de la plataforma para que todos tengan prefijo de módulo
- A medio plazo: eliminar el código inactivo como parte de un esfuerzo de revitalización más amplio de los proyectos contenidos en el mono-repositorio. Determine qué otras aplicaciones contenidas en este documento vale la pena guardar.
- A mediano plazo: agregue soporte de transmisión al sistema de registro utilizando buffers de salida preasignados por subproceso como optimización
- A medio plazo: recrear la funcionalidad del cliente de la consola de la plataforma
- A medio plazo: agregar compatibilidad con sockets seguros nativos para las plataformas compatibles
- A largo plazo: agregue soporte para ensamblaje web
- A largo plazo: agregue compatibilidad con Jenkins CI a través de ProjectGenerator
- Un día: desaprobar/deshacer el prefijo 'C' de estilo clásico MFC para las clases. Este sería un gran cambio que rompería todo y es por eso que aún no ha ocurrido.
- En curso: evaluar la necesidad de actualizar varias dependencias considerando una gran cantidad de restricciones
- En curso: perfeccionar el registro/las métricas
- En curso: agregar más documentación en formato javadoc (compatible con doxygen)