GUCEF
Este é o principal mono-repo da plataforma Galaxy Unlimited. O software aqui contido é uma coleção de bibliotecas e serviços e aplicativos derivados, todos de natureza bastante genérica. O objetivo geral dessas bibliotecas é atuar como um conjunto de ferramentas C++ para desenvolver rapidamente aplicativos e serviços. Algumas dessas ferramentas/aplicativos/serviços também estão incluídas no mesmo mono-repo.
Observe que os principais módulos da plataforma intencionalmente não exigem versões mais recentes do C++ para permitir que sejam usados em situações onde nenhum compilador moderno está disponível. Qualquer uso de recursos de linguagem mais recentes tende a ser tratado por meio de macros, por esse motivo, de modo que o código ainda possa ser compilado usando compiladores mais antigos.
Sobre o nome
GUCEF significou "Galaxy Unlimited Client Engine Framework" ao mesmo tempo. Fazia parte de uma pilha multicamadas que tinha camadas independentes de pilha de software GUCE e GU. GUCE significava "Galaxy Unlimited Client Engine". GUC significava "Cliente Galaxy Unlimited". GU ainda é a abreviatura de "Galaxy Unlimited". Neste momento, o GUCEF e o GUCE fundiram-se e algumas partes do GUC e do GU também foram incorporadas. Em vez de focar no lado do cliente, grande parte do novo desenvolvimento concentrou-se no suporte a serviços e, em geral, no desenvolvimento back-end.
Um pouco de história
Ao longo dos anos diversas bases de código foram criadas e lições aprendidas pelo autor. Lenta mas seguramente surgiu um núcleo comum de código que começou a crescer organicamente. A base de código do núcleo comum original foi parcialmente perdida algumas vezes devido a problemas de retenção de dados e práticas de backup de jovens, ainda mais limitadas pela falta de recursos financeiros. Vários repositórios foram mesclados, combinando vários backups parciais para criar a primeira versão do repositório GUCEF. Esta primeira versão encontrou seu lar público no SourceForce. Originalmente, o CVS foi usado como sistema de controle de versão, seguido pelo SVN e mais tarde pelo Git. Quando a mudança para o Git foi considerada, um novo lar para o repositório de código aberto também foi considerado. Devido à crescente popularidade da comunidade de código aberto, o GitHub ganhou o dia como o novo lar do GUCEF e de alguns repositórios relacionados, onde permanece até hoje.
Sobre o autor
Além das dependências, quase todo o código deste repositório foi escrito por Dinand Vanvelzen. Dinand começou a programar ainda criança na década de 1980, escrevendo código assembly para o MSX, que foi uma versão projetada pela Philips de um conceito de PC. Mais tarde, durante a década de 1990, os princípios de programação RAD tornaram-se o novo caso de amor via Borland Delphi, seguido pelo Borland C++ Builder. Neste momento, o autor iniciou a educação profissional nas artes obscuras da engenharia de software. Uma estratégia dupla foi seguida entre programação de aplicativos e programação de back-end/nível inferior, que eram graus distintos na época. Durante esse tempo, a base de código que você encontra neste repositório continuou a crescer e evoluir à medida que os conceitos se misturavam e evoluíam. Durante a década de 2000, o foco principal do autor era a visualização, principalmente gráficos 3D, tanto profissionalmente quanto como uma curiosidade intelectual abrindo caminho para este repositório. A migração para os Estados Unidos e a constituição de uma família desaceleraram o novo desenvolvimento durante um bom número de anos, antes de começarem a recuperar quando a situação pessoal se estabilizou. Foi durante esta fase que o idealismo juvenil começou a dar lugar ao pragmatismo. Profissionalmente, o domínio dos cuidados de saúde intervencionistas deu lugar aos cuidados de saúde empresariais que, por sua vez, mais tarde deram lugar ao sector financeiro. O novo desenvolvimento subsequente concentrou-se pragmaticamente nas necessidades comuns da vida profissional do autor, com os projetos excêntricos incidentais misturados como um meio para um fim.
detalhamento mono-repo
- /plataforma: possui os principais módulos da plataforma com funcionalidades portáteis concretas e interfaces para utilização de funcionalidades adicionais por meio de plug-ins
- /plugins: possui vários plug-ins que podem ser usados opcionalmente para estender os recursos da plataforma
- /projects : possui scripts e similares para gerar projetos de construção
- /common/bin : tem saída binária de projetos
- /dependencies: Como o nome sugere, esta pasta contém as diversas bibliotecas de dependências usadas pelos plugins, nunca pelas bibliotecas da plataforma diretamente.
- /testes: como o nome sugere, contém algum código de teste dedicado
Como gerar um projeto para meu IDE
O principal método pelo qual os arquivos de projeto/solução IDE são suportados é via CMake. Os próprios arquivos CMake são quase todos gerados automaticamente por meio de uma ferramenta incluída neste repositório chamada ‘ProjectGenerator’. ProjectGenerator realiza uma análise dos arquivos no repositório com arquivos ModuleInfo.xml mínimos para identificar os módulos, a partir daí deriva todos os caminhos necessários e gera os arquivos necessários. Essa mesma ferramenta também pode gerar arquivos de middleware para outras cadeias de ferramentas, não apenas para o CMake. Também há arquivos premake 4 e premake 5 e android make incluídos, mas eles não são atualizados com tanta frequência no momento, então sua milhagem irá variar com eles.
Na maioria dos casos, você deseja acessar /projects/CMake primeiro para gerar os arquivos IDE relevantes. Nessa pasta você verá vários scripts com nomes longos. Em algum momento isso será refatorado de acordo com a lista TODO, mas por enquanto o esquema é o seguinte:
Por exemplo, você tem um arquivo de script como 'RunCMake_Shared_CodeBlocks_Unix_Debug_pubsub2pubsub.sh'
- RunCMake_: Este primeiro segmento é apenas para diferenciá-lo de outros arquivos na pasta por motivos históricos, ignore.
- Shared_: Este segmento está principalmente relacionado ao CMake, onde o método de construção de módulo padrão passado será 'dinâmico' (dll/so) vs estático (.lib/.a)
- CodeBlocks_ : Este segmento possui o nome do IDE para o qual você deseja gerar os arquivos do projeto, neste exemplo o IDE Code Blocks
- Unix_: Este segmento indica a plataforma de destino. Alguns IDEs oferecem suporte a múltiplas plataformas de destino.
- Debug_: Este segmento pode não estar presente para todos os scripts, depende das capacidades do gerador. Para alguns geradores, os próprios arquivos do projeto precisam ser criados desde o início para depuração ou versões de lançamento. Isso não é necessário no caso, digamos, do Visual Studio
- pubsub2pubsub.sh: este segmento denota o alvo principal da visualização lógica em todo o mono-repo. Neste caso o serviço pubsub2pubsub.
Em outras palavras, o formato é: 'RunCMake_Shared/Static_IDE para usar_OS Target_Debug/Release_Target nome.Extensão de script executável'
No Windows, quando você executa o script acima e similares, ele também aciona a execução do ProjectGenerator. O objetivo é apenas tornar o fluxo mais infalível, já que geralmente os arquivos CMake confirmados já estão atualizados e, portanto, esta etapa geralmente pode ser corrigida e ignorada. Seguindo esta etapa potencial, o CMake é invocado para cuidar da geração dos arquivos de construção. Esses arquivos estão sendo gravados em /common/bin. Este repositório segue o pensamento de que os arquivos de saída temporários não devem ser misturados com o código. Se você tiver problemas por qualquer motivo com arquivos de saída obsoletos/ruins (problema de disco?), sempre é possível excluir toda a estrutura de pastas em/common/bin
Bibliotecas de plataforma independentes
- gucefMT: Biblioteca com primitivas de programação multithread. Provavelmente será incorporado ao gucefCORE em algum momento.
- gucefCORE: Biblioteca com funcionalidade essencial para a forma como a funcionalidade construída na plataforma opera, como sistemas de plugin/logging/metrics/eventing/etc
- gucefIMAGE: biblioteca opcional usada na construção de software que utiliza imagens digitais
- gucefVFS: biblioteca opcional usada ao criar software que executa E/S de estilo de sistema de arquivos mais complexo, além do acesso básico. VFS = Sistema de Arquivos Virtuais.
- gucefCOMCORE: Biblioteca opcional usada ao construir software que executa redes básicas
- gucefCOM: Biblioteca opcional usada ao criar software que executa redes e usa funcionalidades razoavelmente padrão da indústria, como StatsD
- gucefWEB: Biblioteca opcional usada ao construir software que executa redes no estilo Internet/Web
- gucefPUBSUB: Biblioteca opcional usada ao construir software que usa conceitos de publicação/assinatura
- gucefGUI: Biblioteca opcional usada quando uma GUI é necessária. O foco principal está nas GUIs dentro do contexto de renderização e não nas GUIs nativas do sistema operacional
- gucefINPUT: biblioteca opcional usada quando é necessário suporte para dispositivos de entrada humanos.
- gucefLOADER: Biblioteca opcional usada ao carregar dinamicamente múltiplas versões da plataforma GUCEF
- gucefPATCHER: Biblioteca opcional usada quando o suporte é necessário para a funcionalidade de correção automática versus um usuário final baixando atualizações manualmente
- gucefMATH: biblioteca opcional usada ao realizar cálculos matemáticos por meio de conceitos OO
- gucefKAITAI: biblioteca opcional usada ao interpretar formatos binários aproveitando o esquema Kaitai para fazer isso
Plug-ins de plataforma contidos
- dstorepluginPARSIFALXML: plugin gucefCORE: Adiciona suporte ao codec DStore (DataNode) para XML. Escrevendo via código GUCEF e lendo através da biblioteca de dependência ParsifalXML
- dstorepluginJSONPARSER: plugin gucefCORE: Adiciona suporte ao codec DStore (DataNode) para JSON. Usa as bibliotecas de dependência json-parser e json-builder
- dstorepluginYAML: plugin gucefCORE: Adiciona suporte ao codec DStore (DataNode) para YAML. Usa a biblioteca de dependência libyaml
- codecspluginZLIB: plugin gucefCORE: Adiciona suporte de codec para zlib/gzip/deflate/crc32/adler32
- codecspluginSTBRUMMEHASH: plugin gucefCORE: Adiciona suporte de codec para CRC32/MD5/SHA1/SHA3/SHA256/Keccak
- imgpluginDEVIL: plugin gucefIMAGE: Adiciona funcionalidade de gerenciamento de imagens digitais proveniente da biblioteca de dependência de imagens DEVIL. Suporta vários codecs de imagem.
- imgpluginFLIC: plugin gucefIMAGE: Adiciona suporte a codec de imagem para o formato FLIC
- imgpluginFreeImage: plugin gucefIMAGE: Adiciona funcionalidade de gerenciamento de imagens digitais proveniente da biblioteca de dependência de imagens FreeImage. Suporta vários codecs de imagem.
- imgpluginITV: plugin gucefIMAGE: Adiciona suporte a codec de imagem para o formato ITV de engenharia reversa
- vfspluginAWSS3: plugin gucefVFS: Adiciona back-end VFS para montagem e uso do AWS S3 como parte do sistema de arquivos virtual
- vfspluginDVP: plugin gucefVFS: back-end VFS obsoleto para montagem e uso de arquivos DVP como parte do sistema de arquivos virtual
- vfspluginITV: plugin gucefVFS: back-end VFS para montagem e uso de arquivos ITV de engenharia reversa como parte do sistema de arquivos virtual
- vfspluginVP: plugin gucefVFS: backend VFS para montar e usar arquivos compactados 'Violation Pack' como parte do sistema de arquivos virtual, como usado pelos jogos Decent e FreeSpace
- vfspluginZIP: plugin gucefVFS: back-end VFS para montagem e uso de arquivos compactados compatíveis com zlib como parte do sistema de arquivos virtual, como .gz e .zip
- inputdriverDIRECTINPUT8: plugin gucefINPUT: Adiciona um driver de entrada para interação do dispositivo de entrada via Microsoft DirectInput 8
- inputdriverMSWINMSG: plugin gucefINPUT: Adiciona um driver de entrada para interação do dispositivo de entrada por meio de mensagens da API Win32 do Microsoft Windows
- inputdriverNANDROID: plugin gucefINPUT: adiciona um driver de entrada para interação do dispositivo de entrada por meio de APIs nativas do Android
- inputdriverOIS: plugin gucefINPUT: Adiciona um driver de entrada para interação do dispositivo de entrada por meio da biblioteca de dependência OIS
- inputdriverXWINMSG: plugin gucefINPUT: Adiciona um driver de entrada para interação do dispositivo de entrada por meio do sistema de mensagens X-Windowing para Linux
- pubsubpluginAWSSNS: plugin gucefPUBSUB: Adiciona um back-end compatível com o conceito pub-sub para o serviço SNS da AWS. Usa o AWS C++ SDK.
- pubsubpluginAWSSQS: plugin gucefPUBSUB: Adiciona um back-end compatível com o conceito pub-sub para o serviço SQS da AWS. Usa o AWS C++ SDK.
- pubsubpluginKAFKA: plugin gucefPUBSUB: Adiciona um back-end compatível com o conceito pub-sub para fluxos Kafka. Usa a biblioteca de dependência RdKafka.
- pubsubpluginMSMQ: plugin gucefPUBSUB: Adiciona um back-end compatível com o conceito pub-sub para MSMQ. Usa o subsistema MSMQ do sistema operacional Windows que precisa ser instalado.
- pubsubpluginREDISCLUSTER: plugin gucefPUBSUB: Adiciona um back-end compatível com o conceito pub-sub para fluxos Redis. Usa dependências redis++ e Hiredis.
- pubsubpluginSTORAGE: plugin gucefPUBSUB: Adiciona um backend compatível com o conceito pub-sub que permite fácil interação com o VFS e seus recursos
- pubsubpluginUDP: plugin gucefPUBSUB: Adiciona um back-end compatível com o conceito pub-sub para UDP básico
- pubsubpluginWEB: plugin gucefPUBSUB: Adiciona um back-end compatível com o conceito pub-sub para conceitos da Web como HTTP/REST/WebSockets
- ProjectGenDependsFilter: Plugin ProjectGen: permite a filtragem de bibliotecas em um repositório com base em um relatório de saída da ferramenta depende.exe
- ProjectGenVSImporter: Plug-in ProjectGen: importa arquivos de projeto do Visual Studio para gerar um ponto de partida ModuleInfo.xml para um novo repositório
- comcorepluginDBL: plugin gucefCOMCORE que tenta fornecer informações do driver de rede Myricom DBL
- comcorepluginGEOOSM: plugin gucefCOMCORE que adiciona recursos de pesquisa de localização geográfica baseados em Open Street Maps
Serviços Contidos
- UdpViaTCP: serviço de ponte que canaliza o tráfego UDP em um segmento TCP. Será substituído por pubsub2pubsub.
- udp2kafka: Serviço adaptador que permite a entrada de tráfego UDP em fluxos Kafka. Será substituído por pubsub2pubsub.
- udp2redis: serviço de adaptador que permite a entrada de tráfego UDP em fluxos Redis para redis não clusterizados. Será substituído por pubsub2pubsub.
- udp2rediscluster: serviço de adaptador que permite a entrada de tráfego UDP em fluxos Redis para redis clusterizados. Será substituído por pubsub2pubsub.
- ProcessMetrics: serviço de agente que obtém métricas para um processo de destino. Pretendido como uma alternativa leve e direcionada para contadores de desempenho de alta frequência e similares
- redisinfo: serviço de monitoramento que usa o protocolo Redis para obter informações sobre clusters Redis e expõe essas informações como métricas para transmissão
- pubsub2storage: serviço adaptador que traduz de forma mais geral entre paradigmas de mensagens e armazenamento. Será substituído por pubsub2pubsub.
- pubsub2pubsub: serviço adaptador que traduz de forma mais geral entre diferentes paradigmas de mensagens. Substituirá muitos dos outros serviços do adaptador.
- FilePusher: serviço de agente que monitora o sistema de arquivos para determinados arquivos e os envia para um destino VFS, por exemplo, AWS S3.
- FileSorter: serviço de agente que classifica arquivos automaticamente. Útil para classificação inicial de arquivo digital de imagens e vídeos, por exemplo.
- GucefLogService: Serviço que pode aceitar logs da plataforma GUCEF transmitidos via conexão de rede. Destinado a situações em que não podemos ter/acessar logs locais
- ServerPortExtender: Serviço usado para reverter o início da conexão de entrada/saída para uma porta do servidor de aplicativos, ignorando assim as restrições somente de saída
- UdpTransformer: Serviço que recebe UDP de entrada e executa uma transformação simplista seguida de uma retransmissão
- MsmqMetrics: serviço de agente que coleta informações sobre filas MSMQ e posteriormente coleta e transmite métricas para essas filas
Ferramentas contidas
- ProjectGenerator: Ferramenta para gerar automaticamente vários arquivos de projeto/módulo e diferentes visualizações lógicas do mesmo mono-repo
- DCSBruteInstaller: ferramenta para aproveitar uma combinação de algum hardware e este software para quebrar os códigos com força bruta em um painel de alarme residencial DCS
- itvExporter: ferramenta de exportação de engenharia reversa para ativos contidos em um jogo clássico
- GucefArchiver: ferramenta básica de arquivamento que aproveita o VFS e seus plugins
- HDFiller: Como o nome sugere, ele preenche o disco rígido. Destinado a cenários de teste.
- PubSubStorageTool: Ferramenta para manipular arquivos de armazenamento produzidos pelo plugin de armazenamento pubsub
Bibliotecas Diversas Contidas
- MemoryLeakFinder: biblioteca auxiliar de plataforma carregada dinamicamente para rastrear vazamentos de memória auxiliada pela funcionalidade da plataforma GUCEF
- ProjectGen: Biblioteca que contém toda a lógica da ferramenta ProjectGenerator. Suporta plug-ins para expandir a funcionalidade.
Lista de tarefas
- Curto prazo: Adicionar suporte básico de websocket nativo à plataforma
- Curto prazo: adicione suporte de parâmetros adequado para codecs
- Curto prazo: Adicionar suporte para StringView
- Curto prazo: passagem inicial completa no plugin pubsub2pubsub 'web'
- Curto prazo: passagem inicial completa no plugin pubsub2pubsub 'aws sns'
- Curto prazo: passagem inicial completa no plugin pubsub2pubsub 'aws sqs'
- Curto prazo: Adicionar classe CodecChain orientada por configuração
- Médio prazo: corrigir a integração do GitHub CI. O link do gatilho de compilação automática está quebrado.
- Médio prazo: Adicionar sistema de esquema DataNode
- Médio prazo: Adicionar mecanismo de transformação de mensagem orientado por configuração
- Médio prazo: adicionar suporte ao AWS Lambda
- Médio prazo: adicionar suporte a Utf16 e Utf32
- Médio prazo: use StringView em vez de String para todas as referências de strings estáticas
- Médio prazo: Transforme o ProjectGenerator em algo que possa ser executado como um serviço em segundo plano
- Médio prazo: suporte completo ao GitHub Actions via ProjectGenerator
- Médio prazo: adicionar suporte GitLab CI via ProjectGenerator
- Médio prazo: renomeação completa dos arquivos de origem da plataforma para que todos tenham prefixo de módulo
- Médio prazo: Remover o código morto como parte de um esforço maior de revitalização dos projetos contidos no mono-repo. Determine quais outros aplicativos contidos aqui valem a pena salvar.
- Médio prazo: Adicionar suporte de fluxo ao sistema de registro usando buffers de saída pré-alocados por thread como uma otimização
- Médio prazo: recriar a funcionalidade do cliente do console da plataforma
- Médio prazo: Adicionar suporte nativo de soquete seguro para as plataformas suportadas
- Longo prazo: adicionar suporte para web assembly
- Longo prazo: adicione suporte ao Jenkins CI por meio do ProjectGenerator
- Um dia: descontinuar/desfazer o prefixo 'C' do estilo MFC clássico para classes. Esta seria uma grande mudança, quebrando tudo, e é por isso que ainda não ocorreu.
- Em andamento: Avaliar a necessidade de atualizar várias dependências considerando uma infinidade de restrições
- Em andamento: refinar registros/métricas
- Em andamento: Adicionar mais documentação em formato javadoc (compatível com doxygen)