구세프
이것은 Galaxy Unlimited Platform의 주요 모노 리포지토리입니다. 여기에 포함된 소프트웨어는 본질적으로 상당히 일반적인 라이브러리와 파생 서비스 및 애플리케이션의 모음입니다. 이러한 라이브러리의 가장 중요한 목적은 애플리케이션과 서비스를 신속하게 개발하는 데 사용할 수 있는 C++ 도구 상자 역할을 하는 것입니다. 이러한 도구/애플리케이션/서비스 중 일부는 동일한 모노 저장소에도 포함되어 있습니다.
기본 플랫폼 모듈은 최신 컴파일러를 사용할 수 없는 상황에서 사용할 수 있도록 최신 버전의 C++를 의도적으로 요구하지 않습니다. 최신 언어 기능의 사용은 매크로를 통해 처리되는 경향이 있으므로 코드는 이전 컴파일러를 사용하여 계속 컴파일할 수 있습니다.
이름에 대해서
GUCEF는 한때 "Galaxy Unlimited Client Engine Framework"를 의미했습니다. 이는 독립적인 GUCE 및 GU 소프트웨어 스택 계층이 있는 다중 계층 스택의 일부였습니다. GUCE는 "Galaxy Unlimited Client Engine"을 의미합니다. GUC는 "Galaxy Unlimited Client"의 약자입니다. GU는 여전히 "Galaxy Unlimited"의 약어입니다. 이때 GUCEF와 GUCE가 통합되었고 GUC와 GU의 일부도 통합되었습니다. 많은 새로운 개발에 클라이언트 측에 초점을 맞추는 대신 서비스 지원 및 일반적으로 백엔드 개발에 중점을 두었습니다.
약간의 역사
수년에 걸쳐 다양한 코드베이스가 만들어졌고 저자는 교훈을 얻었습니다. 천천히 그러나 확실하게 유기적으로 성장하기 시작한 코드의 공통 핵심이 나타났습니다. 원래의 공통 핵심 코드 기반은 데이터 보존 문제와 최신 백업 관행으로 인해 부분적으로 몇 번 손실되었으며, 재정 자원 부족으로 인해 더욱 제약을 받았습니다. 다양한 저장소를 병합하여 다양한 부분 백업을 결합하여 GUCEF 저장소의 첫 번째 버전을 만들었습니다. 이 첫 번째 버전은 SourceForce에서 공개 홈을 찾았습니다. 원래는 CVS가 버전 관리 시스템으로 사용되었고, 그 뒤를 SVN, 나중에 Git이 사용했습니다. Git으로의 이전을 고려할 때 오픈 소스 저장소를 위한 새로운 홈도 고려되었습니다. 오픈 소스 커뮤니티의 인기가 높아짐에 따라 GitHub는 GUCEF 및 현재 남아 있는 일부 관련 저장소의 새로운 본거지로 자리 잡았습니다.
저자 소개
종속성을 제외하면 이 저장소의 거의 모든 코드는 Dinand Vanvelzen이 작성했습니다. Dinand는 1980년대 어렸을 때부터 프로그래밍을 시작하여 Philips가 PC 개념을 채택한 MSX용 어셈블리 코드를 작성했습니다. 나중에 1990년대에 RAD 프로그래밍 원칙이 Borland Delphi와 Borland C++ Builder를 통해 새로운 사랑을 받게 되었습니다. 이 시점에서 저자는 소프트웨어 엔지니어링의 어두운 기술에 대한 전문 교육을 시작했습니다. 당시에는 별개의 수준이었던 애플리케이션 프로그래밍과 백엔드/하위 수준 프로그래밍 사이에 이중 전략이 추구되었습니다. 이 기간 동안 이 저장소에서 찾은 코드베이스는 개념이 혼합되고 발전함에 따라 계속 성장하고 발전했습니다. 2000년대에 저자의 주요 초점은 시각화에 있었는데, 주로 전문적으로나 이 저장소에 유입되는 지적 호기심으로서 3D 그래픽이었습니다. 미국으로 이주하고 가족을 시작하면서 수년 동안 새로운 발전이 조금씩 느려지더니 개인적인 상황이 안정되자 다시 회복되기 시작했습니다. 젊은 시절의 이상주의가 실용주의에 자리를 내주기 시작한 것은 바로 이 단계에서입니다. 전문적으로 중재적 의료 영역은 기업 의료에 자리를 내주었고, 이는 나중에 금융 부문에 자리를 내주었습니다. 이후의 새로운 개발에서는 목적을 위한 수단으로 부수적인 괴짜 프로젝트가 혼합되어 작가의 직업 생활에서 공통적인 요구 사항에 실용적으로 초점을 맞췄습니다.
모노 레포 분석
- /platform : 여기에는 플러그인을 통해 추가 기능을 활용하기 위한 인터페이스와 구체적인 이식 가능 기능을 모두 갖춘 기본 플랫폼 모듈이 있습니다.
- /plugins : 플랫폼 기능을 확장하는 데 선택적으로 사용할 수 있는 다양한 플러그인이 있습니다.
- /projects : 빌드 프로젝트 생성을 위한 스크립트 등이 있습니다.
- /common/bin : 프로젝트의 바이너리 출력이 있습니다.
- /dependent : 이름에서 알 수 있듯이 이 폴더에는 플랫폼 라이브러리가 직접 사용하는 것이 아니라 플러그인에서 사용하는 다양한 종속성 라이브러리가 있습니다.
- /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_ : 이 세그먼트는 대부분 전달된 기본 모듈 빌드 방법이 '동적'(dll/so)과 정적(.lib/.a)인 CMake와 관련되어 있습니다.
- CodeBlocks_: 이 세그먼트에는 프로젝트 파일을 생성하려는 IDE의 이름이 있습니다. 이 예에서는 Code Blocks IDE입니다.
- Unix_ : 이 세그먼트는 대상 플랫폼을 나타냅니다. 일부 IDE는 여러 대상 플랫폼을 지원합니다.
- Debug_ : 이 세그먼트는 모든 스크립트에 존재하지 않을 수 있으며 생성기의 기능에 따라 다릅니다. 일부 생성기의 경우 디버그 또는 릴리스 빌드를 위해 처음부터 프로젝트 파일 자체를 생성해야 합니다. Visual Studio의 경우에는 필요하지 않습니다.
- pubsub2pubsub.sh : 이 세그먼트는 전체 모노 저장소에 대한 논리적 뷰의 주요 대상을 나타냅니다. 이 경우 pubsub2pubsub 서비스입니다.
즉, 형식은 'RunCMake_Shared/Static_IDE를 사용하여_OS Target_Debug/Release_Target 이름.실행 가능한 스크립트 확장'입니다.
Windows에서 위 스크립트 및 이와 유사한 스크립트를 실행하면 ProjectGenerator 실행도 트리거됩니다. 이는 일반적으로 커밋된 CMake 파일이 이미 최신 상태이므로 이 단계를 일반적으로 생략하고 건너뛸 수 있으므로 흐름을 더욱 확실하게 만들기 위한 것입니다. 이 잠재적 단계에 따라 빌드 파일 생성을 처리하기 위해 CMake가 호출됩니다. 이러한 파일은 /common/bin에 기록됩니다. 이 저장소는 임시 출력 파일이 코드와 혼합되어서는 안 된다는 생각을 따릅니다. 어떤 이유로든 오래되거나 잘못된 출력 파일(디스크 문제?)로 인해 문제가 발생하는 경우 언제든지 /common/bin 아래의 전체 폴더 구조를 삭제할 수 있습니다.
포함된 플랫폼 라이브러리
- gucefMT: 다중 스레드 프로그래밍 기본 요소가 포함된 라이브러리입니다. 어느 시점에서는 gucefCORE로 접힐 가능성이 높습니다.
- gucefCORE: 플러그인/로깅/메트릭/이벤트/등 시스템과 같이 플랫폼에서 구축된 기능이 작동하는 방식의 핵심 기능이 포함된 라이브러리
- gucefIMAGE: 디지털 이미지를 활용하는 소프트웨어를 구축할 때 사용되는 선택적 라이브러리
- gucefVFS: 단순한 기본 액세스 이상으로 더 복잡한 파일 시스템 스타일 I/O를 수행하는 소프트웨어를 구축할 때 사용되는 선택적 라이브러리입니다. VFS = 가상 파일 시스템.
- gucefCOMCORE: 기본 네트워킹을 수행하는 소프트웨어를 구축할 때 사용되는 선택적 라이브러리
- gucefCOM: 네트워킹을 수행하고 StatsD와 같은 상당히 업계 표준 기능을 사용하는 소프트웨어를 구축할 때 사용되는 선택적 라이브러리
- gucefWEB: 인터넷/웹 스타일 네트워킹을 수행하는 소프트웨어를 구축할 때 사용되는 선택적 라이브러리
- gucefPUBSUB: 게시/구독 개념을 사용하는 소프트웨어를 구축할 때 사용되는 선택적 라이브러리
- gucefGUI: GUI가 필요할 때 사용되는 선택적 라이브러리입니다. 주요 초점은 OS 기본 GUI가 아닌 렌더링 컨텍스트 내의 GUI에 있습니다.
- gucefINPUT: 인간 입력 장치에 대한 지원이 필요할 때 사용되는 선택적 라이브러리입니다.
- gucefLOADER: 여러 GUCEF 플랫폼 버전을 동적으로 로드할 때 사용되는 선택적 라이브러리
- gucefPATCHER: 자동 패치 기능에 대한 지원이 필요할 때와 최종 사용자가 수동으로 업데이트를 다운로드할 때 사용되는 선택적 라이브러리
- gucefMATH: OO 개념을 통해 수학 계산을 수행할 때 사용되는 선택적 라이브러리
- gucefKAITAI: Kaitai 스키마를 활용하여 바이너리 형식을 해석할 때 사용되는 선택적 라이브러리
포함된 플랫폼 플러그인
- dstorepluginPARSIFALXML: gucefCORE 플러그인: XML에 대한 DStore(DataNode) 코덱 지원을 추가합니다. GUCEF 코드를 통해 작성하고 ParsifalXML 종속성 라이브러리를 통해 읽기
- dstorepluginJSONPARSER: gucefCORE 플러그인: JSON에 대한 DStore(DataNode) 코덱 지원을 추가합니다. json-parser 및 json-builder 종속성 라이브러리를 사용합니다.
- dstorepluginYAML: gucefCORE 플러그인: YAML에 대한 DStore(DataNode) 코덱 지원을 추가합니다. 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 플러그인: 가상 파일 시스템의 일부로 AWS S3를 마운트하고 사용하기 위해 VFS 백엔드를 추가합니다.
- vfspluginDVP: gucefVFS 플러그인: 가상 파일 시스템의 일부로 DVP 아카이브 파일을 마운트하고 사용하기 위한 더 이상 사용되지 않는 VFS 백엔드
- vfspluginITV: gucefVFS 플러그인: 리버스 엔지니어링된 ITV 아카이브 파일을 가상 파일 시스템의 일부로 마운트하고 사용하기 위한 VFS 백엔드
- vfspluginVP: gucefVFS 플러그인: Decent 및 FreeSpace 게임에서 사용되는 가상 파일 시스템의 일부로 'Violation Pack' 아카이브 파일을 마운트하고 사용하기 위한 VFS 백엔드
- vfspluginZIP: gucefVFS 플러그인: .gz 및 .zip과 같은 가상 파일 시스템의 일부로 zlib 호환 아카이브 파일을 마운트하고 사용하기 위한 VFS 백엔드
- inputdriverDIRECTINPUT8: gucefINPUT 플러그인: Microsoft DirectInput 8을 통한 입력 장치 상호 작용을 위한 입력 드라이버를 추가합니다.
- inputdriverMSWINMSG: gucefINPUT 플러그인: Microsoft Windows Win32 API 메시지를 통해 입력 장치 상호 작용을 위한 입력 드라이버를 추가합니다.
- inputdriverNANDROID: gucefINPUT 플러그인: 기본 Android API를 통해 입력 장치 상호 작용을 위한 입력 드라이버를 추가합니다.
- inputdriverOIS: gucefINPUT 플러그인: OIS 종속성 라이브러리를 통해 입력 장치 상호 작용을 위한 입력 드라이버를 추가합니다.
- inputdriverXWINMSG: gucefINPUT 플러그인: Linux용 X-Windowing 메시징 시스템을 통해 입력 장치 상호 작용을 위한 입력 드라이버를 추가합니다.
- pubsubpluginAWSSNS: gucefPUBSUB 플러그인: AWS의 SNS 서비스에 대한 pub-sub 개념 호환 백엔드를 추가합니다. AWS C++ SDK를 사용합니다.
- pubsubpluginAWSSQS: gucefPUBSUB 플러그인: AWS SQS 서비스에 대한 pub-sub 개념 호환 백엔드를 추가합니다. AWS C++ SDK를 사용합니다.
- pubsubpluginKAFKA: gucefPUBSUB 플러그인: Kafka 스트림에 대한 pub-sub 개념 호환 백엔드를 추가합니다. RdKafka 종속성 라이브러리를 사용합니다.
- pubsubpluginMSMQ: gucefPUBSUB 플러그인: MSMQ용 pub-sub 개념 호환 백엔드를 추가합니다. 설치해야 하는 Windows 운영 체제 MSMQ 하위 시스템을 사용합니다.
- pubsubpluginREDISCLUSTER: gucefPUBSUB 플러그인: Redis 스트림에 대한 pub-sub 개념 호환 백엔드를 추가합니다. redis++ 및 Hiredis 종속성을 사용합니다.
- pubsubpluginSTORAGE: gucefPUBSUB 플러그인: VFS 및 해당 기능과 쉽게 상호 작용할 수 있는 pub-sub 개념 호환 백엔드를 추가합니다.
- pubsubpluginUDP: gucefPUBSUB 플러그인: 기본 UDP에 대해 pub-sub 개념 호환 백엔드를 추가합니다.
- pubsubpluginWEB: gucefPUBSUB 플러그인: HTTP/REST/WebSockets와 같은 웹 개념에 대해 pub-sub 개념 호환 백엔드를 추가합니다.
- ProjectGenDependsFilter: ProjectGen 플러그인: dependency.exe 도구 출력 보고서를 기반으로 저장소의 라이브러리 필터링을 허용합니다.
- ProjectGenVSImporter: ProjectGen 플러그인: Visual Studio 프로젝트 파일을 가져와 새 저장소에 대한 ModuleInfo.xml 시작점을 생성합니다.
- comcorepluginDBL: Myricom DBL 네트워크 드라이버에서 정보를 제공하려고 시도하는 gucefCOMCORE 플러그인
- comcorepluginGEOOSM: Open Street Maps 기반 지리적 위치 조회 기능을 추가하는 gucefCOMCORE 플러그인
포함된 서비스
- UdpViaTCP: TCP 세그먼트를 통해 UDP 트래픽을 전달하는 브리지 서비스입니다. pubsub2pubsub로 대체됩니다.
- udp2kafka: Kafka 스트림으로의 UDP 트래픽 수신을 허용하는 어댑터 서비스입니다. pubsub2pubsub로 대체됩니다.
- udp2redis: 비클러스터형 Redis에 대해 UDP 트래픽을 Redis 스트림으로 수신할 수 있게 해주는 어댑터 서비스입니다. pubsub2pubsub로 대체됩니다.
- udp2rediscluster: 클러스터링된 Redis에 대한 Redis 스트림으로 UDP 트래픽 수신을 허용하는 어댑터 서비스입니다. pubsub2pubsub로 대체됩니다.
- ProcessMetrics: 대상 프로세스에 대한 지표를 얻는 에이전트 서비스입니다. 고주파수 성능 카운터 등에 대한 경량 대안을 목표로 함
- redisinfo: Redis 프로토콜을 사용하여 Redis 클러스터에 대한 정보를 얻고 브로드캐스트할 메트릭과 같은 정보를 노출하는 모니터링 서비스
- pubsub2storage: 메시징 패러다임과 스토리지 간에 보다 일반적으로 변환하는 어댑터 서비스입니다. pubsub2pubsub로 대체됩니다.
- pubsub2pubsub: 서로 다른 메시징 패러다임 간에 보다 일반적으로 변환하는 어댑터 서비스입니다. 다른 많은 어댑터 서비스를 대체합니다.
- FilePusher: 특정 파일에 대한 파일 시스템을 모니터링하고 이를 AWS S3와 같은 VFS 대상으로 푸시하는 에이전트 서비스입니다.
- FileSorter: 파일을 자동으로 정렬해주는 에이전트 서비스입니다. 예를 들어 디지털 사진 및 비디오 아카이브의 초기 정렬에 편리합니다.
- GucefLogService: 네트워크 연결을 통해 스트리밍되는 GUCEF 플랫폼 로그를 허용할 수 있는 서비스입니다. 로컬 로그를 보유하거나 액세스할 수 없는 상황을 목표로 합니다.
- ServerPortExtender: 애플리케이션 서버 포트에 대한 인바운드/아웃바운드 연결 시작을 역방향으로 수행하여 송신 전용 제한을 우회하는 데 사용되는 서비스
- UdpTransformer: 수신 UDP를 가져와서 단순한 변환을 수행한 후 재전송을 수행하는 서비스
- MsmqMetrics: MSMQ 대기열에 대한 정보를 수집한 후 해당 대기열에 대한 메트릭을 수집 및 전송하는 에이전트 서비스
포함된 도구
- ProjectGenerator: 다양한 프로젝트/모듈 파일과 동일한 모노 저장소의 다양한 논리적 보기를 자동 생성하는 도구
- DCSBruteInstaller: 일부 하드웨어와 이 소프트웨어의 조합을 활용하여 DCS 홈 경보 패널의 코드를 무차별 대입 크랙하는 도구입니다.
- itvExporter: 클래식 게임에 포함된 자산을 위한 리버스 엔지니어링 내보내기 도구
- GucefArchiver: VFS 및 해당 플러그인을 활용하는 기본 아카이버 도구
- HDFiller: 이름에서 알 수 있듯이 하드 드라이브를 채웁니다. 테스트 시나리오용입니다.
- PubSubStorageTool: pubsub 저장소 플러그인에서 생성된 저장소 파일을 조작하는 도구
포함된 기타 라이브러리
- MemoryLeakFinder: GUCEF 플랫폼 기능의 지원을 받아 메모리 누수를 추적하기 위해 동적으로 로드된 플랫폼 도우미 라이브러리
- ProjectGen: ProjectGenerator 도구의 모든 논리를 보유하는 라이브러리입니다. 기능을 확장하기 위해 플러그인을 지원합니다.
할 일 목록
- 단기: 플랫폼에 기본 웹소켓 지원 추가
- 단기: 코덱에 대한 적절한 매개변수 지원 추가
- 단기: StringView 지원 추가
- 단기: pubsub2pubsub '웹' 플러그인에서 초기 통과 완료
- 단기: pubsub2pubsub 'aws sns' 플러그인에서 초기 통과 완료
- 단기: pubsub2pubsub 'aws sqs' 플러그인에서 초기 통과 완료
- 단기: 구성 기반 CodecChain 클래스 추가
- 중기: GitHub CI 통합을 수정합니다. 자동 빌드 트리거 링크가 손상되었습니다.
- 중기: DataNode 스키마 시스템 추가
- 중기: 구성 기반 메시지 변환 엔진 추가
- 중기: AWS Lambda 지원 추가
- 중기: Utf16 및 Utf32 지원 추가
- 중기: 모든 정적 문자열 참조에 String 대신 StringView 사용
- 중기: ProjectGenerator를 백그라운드 서비스로 실행할 수 있는 것으로 전환
- 중기: ProjectGenerator를 통해 GitHub Actions 지원 완료
- 중기: ProjectGenerator를 통해 GitLab CI 지원 추가
- 중기: 플랫폼 소스 파일의 이름을 모두 모듈 접두사로 변경하는 작업을 완료합니다.
- 중기: 모노 저장소에 포함된 프로젝트의 대규모 활성화 노력의 일환으로 데드 코드를 제거합니다. 여기에 포함된 다른 앱 중에 저장할 가치가 있는 앱이 있는지 확인하세요.
- 중기: 스레드당 사전 할당된 출력 버퍼를 최적화로 사용하여 로깅 시스템에 스트림 지원 추가
- 중기: 플랫폼 콘솔 클라이언트 기능 재현
- 중기: 지원되는 플랫폼에 대한 기본 보안 소켓 지원 추가
- 장기: 웹 어셈블리 지원 추가
- 장기: ProjectGenerator를 통해 Jenkins CI 지원 추가
- 어느 날: 클래스에 대한 클래식 MFC 스타일 'C' 접두사를 더 이상 사용하지 않거나 실행 취소했습니다. 이것은 모든 것을 깨뜨리는 거대한 변화가 될 것이므로 아직 일어나지 않은 이유입니다.
- 진행 중: 수많은 제약 조건을 고려하여 다양한 종속성을 업데이트해야 하는지 평가합니다.
- 진행 중: 로깅/메트릭 개선
- 진행 중: 더 많은 javadoc 형식(doxygen 호환) 문서 추가