GUCEF
Dies ist das Haupt-Mono-Repo für die Galaxy Unlimited-Plattform. Die hierin enthaltene Software ist eine Sammlung von Bibliotheken und abgeleiteten Diensten und Anwendungen, die alle ziemlich allgemeiner Natur sind. Der übergeordnete Zweck dieser Bibliotheken besteht darin, als C++-Werkzeugkasten zu fungieren, mit dem Anwendungen und Dienste schnell entwickelt werden können. Einige dieser Tools/Anwendungen/Dienste sind ebenfalls im selben Mono-Repo enthalten.
Beachten Sie, dass die Hauptplattformmodule absichtlich keine neueren Versionen von C++ vorschreiben, um ihre Verwendung in Situationen zu ermöglichen, in denen kein moderner Compiler verfügbar ist. Aus diesem Grund wird die Verwendung neuerer Sprachfunktionen in der Regel über Makros abgewickelt, sodass der Code weiterhin mit älteren Compilern kompiliert werden kann.
Über den Namen
GUCEF stand einst für „Galaxy Unlimited Client Engine Framework“. Es war Teil eines mehrstufigen Stacks mit unabhängigen GUCE- und GU-Software-Stack-Stacks. GUCE stand für „Galaxy Unlimited Client Engine“. GUC stand für „Galaxy Unlimited Client“. GU ist immer noch die Abkürzung für „Galaxy Unlimited“. Zu diesem Zeitpunkt wurden GUCEF und GUCE zusammengelegt und einige Teile von GUC und GU wurden ebenfalls integriert. Anstatt sich bei vielen neuen Entwicklungen auf die Kundenseite zu konzentrieren, lag der Schwerpunkt auf unterstützenden Diensten und allgemein auf der Back-End-Entwicklung.
Ein bisschen Geschichte
Im Laufe der Jahre wurden verschiedene Codebasen erstellt und der Autor daraus Lehren gezogen. Langsam aber sicher entstand ein gemeinsamer Codekern, der organisch zu wachsen begann. Die ursprüngliche gemeinsame Kerncodebasis ging einige Male aufgrund von Datenaufbewahrungsproblemen und Backup-Praktiken junger Menschen teilweise verloren, was zusätzlich durch fehlende finanzielle Ressourcen eingeschränkt wurde. Verschiedene Repositories wurden zusammengeführt und verschiedene Teilsicherungen kombiniert, um die erste Version des GUCEF-Repos zu erstellen. Diese erste Version fand ihr öffentliches Zuhause auf SourceForce. Ursprünglich wurde CVS als Versionskontrollsystem verwendet, gefolgt von SVN und später Git. Als über den Wechsel zu Git nachgedacht wurde, wurde auch über eine neue Heimat für das Open-Source-Repo nachgedacht. Aufgrund der wachsenden Beliebtheit der Open-Source-Community hat sich GitHub als neues Zuhause für GUCEF und einige verwandte Repos durchgesetzt, wo es bis heute geblieben ist.
Über den Autor
Abgesehen von den Abhängigkeiten wurde fast der gesamte Code in diesem Repository von Dinand Vanvelzen geschrieben. Dinand begann in den 1980er Jahren als Kind mit dem Programmieren und schrieb Assembler-Code für den MSX, eine von Philips entwickelte Version eines PC-Konzepts. Später, in den 1990er Jahren, wurden die RAD-Programmierprinzipien über Borland Delphi, gefolgt von Borland C++ Builder, zum neuen Hobby. Zu diesem Zeitpunkt hatte der Autor eine Berufsausbildung in den dunklen Künsten der Softwareentwicklung begonnen. Es wurde eine Doppelstrategie zwischen Anwendungsprogrammierung und Backend-/untergeordneter Programmierung verfolgt, bei denen es sich damals um unterschiedliche Abschlüsse handelte. Während dieser Zeit wuchs und entwickelte sich die Codebasis, die Sie in diesem Repository finden, mit der Verschmelzung und Weiterentwicklung der Konzepte weiter. In den 2000er Jahren lag der Schwerpunkt des Autors auf der Visualisierung, wobei hauptsächlich 3D-Grafiken sowohl beruflich als auch als intellektuelle Kuriosität Eingang in dieses Archiv fanden. Die Migration in die Vereinigten Staaten und die Gründung einer Familie verlangsamten die Neuentwicklung mehrere Jahre lang, bevor sie sich wieder belebte, sobald sich die persönliche Situation stabilisierte. In dieser Phase begann der jugendliche Idealismus dem Pragmatismus zu weichen. Beruflich wich der Bereich der interventionellen Gesundheitsfürsorge der betrieblichen Gesundheitsfürsorge, die wiederum später dem Finanzsektor Platz machte. Die anschließende Neuentwicklung konzentrierte sich pragmatisch auf die allgemeinen Bedürfnisse im Berufsleben des Autors und mischte gelegentliche seltsame Projekte als Mittel zum Zweck mit ein.
Mono-Repo-Aufschlüsselung
- /platform: Hier sind die Hauptplattformmodule enthalten, die sowohl konkrete tragbare Funktionen als auch Schnittstellen zur Nutzung zusätzlicher Funktionen über Plugins bieten
- /plugins: Dies verfügt über verschiedene Plugins, die optional zur Erweiterung der Plattformfunktionen verwendet werden können
- /projects: Hier finden Sie Skripte und Ähnliches zum Generieren von Build-Projekten
- /common/bin: Dies hat eine binäre Ausgabe von Projekten
- /dependencies: Wie der Name schon sagt, enthält dieser Ordner die verschiedenen Abhängigkeitsbibliotheken, die von Plugins verwendet werden, niemals direkt von Plattformbibliotheken.
- /tests: Wie der Name schon sagt, enthält dies einen dedizierten Testcode
So generieren Sie ein Projekt für meine IDE
Die Hauptmethode zur Unterstützung von IDE-Projekt-/Lösungsdateien ist CMake. Die CMake-Dateien selbst werden fast alle automatisch über ein in diesem Repo enthaltenes Tool namens „ProjectGenerator“ generiert. ProjectGenerator führt eine Analyse der Dateien im Repo mit minimalen ModuleInfo.xml-Dateien durch, um Module zu identifizieren, leitet von dort alle benötigten Pfade ab und generiert die benötigten Dateien. Das gleiche Tool kann Middleware-Dateien auch für andere Toolchains ausgeben, nicht nur für CMake. Es sind auch Premake 4 und Premake 5 sowie Android-Make-Dateien enthalten, diese werden jedoch derzeit nicht so häufig aktualisiert, sodass Ihr Kilometerstand davon abweichen kann.
In den meisten Fällen möchten Sie zunächst zu /projects/CMake gehen, um die relevanten IDE-Dateien zu generieren. In diesem Ordner sehen Sie verschiedene Skripte mit langen Namen. Irgendwann wird dies gemäß der TODO-Liste umgestaltet, aber im Moment sieht das Schema wie folgt aus:
Als Beispiel haben Sie eine Skriptdatei wie „RunCMake_Shared_CodeBlocks_Unix_Debug_pubsub2pubsub.sh“.
- RunCMake_: Dieses erste Segment dient nur dazu, es aus historischen Gründen von anderen Dateien im Ordner abzuheben. Ignorieren Sie es.
- Shared_: Dieses Segment bezieht sich hauptsächlich auf CMake, wo die übergebene Standard-Modulerstellungsmethode „dynamisch“ (dll/so) vs. statisch (.lib/.a) ist.
- CodeBlocks_: Dieses Segment enthält den Namen der IDE, für die Sie Projektdateien generieren möchten, in diesem Beispiel die Code Blocks IDE
- Unix_: Dieses Segment bezeichnet die Zielplattform. Einige IDEs unterstützen mehrere Zielplattformen.
- Debug_: Dieses Segment ist möglicherweise nicht für alle Skripte vorhanden, es hängt von den Fähigkeiten des Generators ab. Bei einigen Generatoren müssen die Projektdateien selbst für Debug- oder Release-Builds von Anfang an erstellt werden. Dies ist beispielsweise im Fall von Visual Studio nicht erforderlich
- pubsub2pubsub.sh: Dieses Segment bezeichnet das Hauptziel der logischen Ansicht auf das gesamte Mono-Repo. In diesem Fall der Dienst pubsub2pubsub.
Mit anderen Worten lautet das Format: „RunCMake_Shared/Static_IDE to use_OS Target_Debug/Release_Target name.Executable script extension“
Wenn Sie unter Windows das obige Skript und ähnliches ausführen, wird auch eine Ausführung des ProjectGenerators ausgelöst. Dies dient lediglich dazu, den Ablauf narrensicherer zu machen, da die festgeschriebenen CMake-Dateien normalerweise bereits aktuell sind und dieser Schritt daher normalerweise gelöscht und übersprungen werden kann. Im Anschluss an diesen möglichen Schritt wird CMake aufgerufen, um die Generierung der Build-Dateien zu übernehmen. Solche Dateien werden nach /common/bin geschrieben. Dieses Repo folgt dem Gedanken, dass temporäre Ausgabedateien nicht mit Code vermischt werden sollten. Wenn Sie aus irgendeinem Grund Probleme mit veralteten/fehlerhaften Ausgabedateien haben (Festplattenproblem?), können Sie jederzeit einfach die gesamte Ordnerstruktur unter /common/bin löschen
Enthaltene Plattformbibliotheken
- gucefMT: Bibliothek mit Multithread-Programmierprimitiven. Wird wahrscheinlich irgendwann in gucefCORE integriert.
- gucefCORE: Bibliothek mit Funktionalität, die für die Funktionsweise der auf der Plattform aufgebauten Funktionalität von zentraler Bedeutung ist, z. B. die Systeme Plugin/Logging/Metrik/Eventing/usw
- gucefIMAGE: Optionale Bibliothek, die beim Erstellen von Software verwendet wird, die digitale Bilder verwendet
- gucefVFS: Optionale Bibliothek, die beim Erstellen von Software verwendet wird, die komplexere E/A im Dateisystemstil durchführt, die über den einfachen Zugriff hinausgehen. VFS = Virtuelles Dateisystem.
- gucefCOMCORE: Optionale Bibliothek, die beim Erstellen von Software verwendet wird, die grundlegende Netzwerkfunktionen ausführt
- gucefCOM: Optionale Bibliothek, die beim Erstellen von Software verwendet wird, die Netzwerke durchführt und weitgehend branchenübliche Funktionen wie StatsD verwendet
- gucefWEB: Optionale Bibliothek, die beim Erstellen von Software verwendet wird, die Netzwerke im Internet-/Web-Stil durchführt
- gucefPUBSUB: Optionale Bibliothek, die beim Erstellen von Software verwendet wird, die Publish/Subscribe-Konzepte verwendet
- gucefGUI: Optionale Bibliothek, die verwendet wird, wenn eine GUI benötigt wird. Der Schwerpunkt liegt auf GUIs im Kontext des Renderns, nicht auf Betriebssystem-nativen GUIs
- gucefINPUT: Optionale Bibliothek, die verwendet wird, wenn Unterstützung für menschliche Eingabegeräte benötigt wird.
- gucefLOADER: Optionale Bibliothek, die beim dynamischen Laden mehrerer GUCEF-Plattformversionen verwendet wird
- gucefPATCHER: Optionale Bibliothek, die verwendet wird, wenn Unterstützung für die Funktion zum automatischen Patchen benötigt wird, anstatt dass ein Endbenutzer Updates manuell herunterlädt
- gucefMATH: Optionale Bibliothek, die bei der Durchführung mathematischer Berechnungen über OO-Konzepte verwendet wird
- gucefKAITAI: Optionale Bibliothek, die bei der Interpretation von Binärformaten verwendet wird und dazu das Kaitai-Schema nutzt
Enthaltene Plattform-Plugins
- dstorepluginPARSIFALXML: gucefCORE-Plugin: Fügt DStore (DataNode)-Codec-Unterstützung für XML hinzu. Schreiben über GUCEF-Code und Lesen über die ParsifalXML-Abhängigkeitsbibliothek
- dstorepluginJSONPARSER: gucefCORE-Plugin: Fügt DStore (DataNode)-Codec-Unterstützung für JSON hinzu. Verwendet die Abhängigkeitsbibliotheken json-parser und json-builder
- dstorepluginYAML: gucefCORE-Plugin: Fügt DStore (DataNode)-Codec-Unterstützung für YAML hinzu. Verwendet die libyaml-Abhängigkeitsbibliothek
- codecspluginZLIB: gucefCORE-Plugin: Fügt Codec-Unterstützung für zlib/gzip/deflate/crc32/adler32 hinzu
- codecspluginSTBRUMMEHASH: gucefCORE-Plugin: Fügt Codec-Unterstützung für CRC32/MD5/SHA1/SHA3/SHA256/Keccak hinzu
- imgpluginDEVIL: gucefIMAGE-Plugin: Fügt digitale Bildverwaltungsfunktionen hinzu, die aus der DEVIL-Bildabhängigkeitsbibliothek stammen. Unterstützt verschiedene Bildcodecs.
- imgpluginFLIC: gucefIMAGE-Plugin: Fügt Bildcodec-Unterstützung für das FLIC-Format hinzu
- imgpluginFreeImage: gucefIMAGE-Plugin: Fügt digitale Bildverwaltungsfunktionen hinzu, die aus der FreeImage-Bildabhängigkeitsbibliothek stammen. Unterstützt verschiedene Bildcodecs.
- imgpluginITV: gucefIMAGE-Plugin: Fügt Bild-Codec-Unterstützung für das rückentwickelte ITV-Format hinzu
- vfspluginAWSS3: gucefVFS-Plugin: Fügt ein VFS-Backend zum Mounten und Verwenden von AWS S3 als Teil des virtuellen Dateisystems hinzu
- vfspluginDVP: gucefVFS-Plugin: Veraltetes VFS-Backend zum Mounten und Verwenden von DVP-Archivdateien als Teil des virtuellen Dateisystems
- vfspluginITV: gucefVFS-Plugin: VFS-Backend zum Mounten und Verwenden rückentwickelter ITV-Archivdateien als Teil des virtuellen Dateisystems
- vfspluginVP: gucefVFS-Plugin: VFS-Backend zum Mounten und Verwenden von „Violation Pack“-Archivdateien als Teil des virtuellen Dateisystems, wie es von den Spielen Decent und FreeSpace verwendet wird
- vfspluginZIP: gucefVFS-Plugin: VFS-Backend zum Mounten und Verwenden von zlib-kompatiblen Archivdateien als Teil des virtuellen Dateisystems wie .gz und .zip
- inputdriverDIRECTINPUT8: gucefINPUT-Plugin: Fügt einen Eingabetreiber für die Interaktion mit Eingabegeräten über Microsoft DirectInput 8 hinzu
- inputdriverMSWINMSG: gucefINPUT-Plugin: Fügt einen Eingabetreiber für die Interaktion mit Eingabegeräten über Microsoft Windows Win32-API-Nachrichten hinzu
- inputdriverNANDROID: gucefINPUT-Plugin: Fügt einen Eingabetreiber für die Interaktion mit Eingabegeräten über native Android-APIs hinzu
- inputdriverOIS: gucefINPUT-Plugin: Fügt einen Eingabetreiber für die Interaktion mit Eingabegeräten über die OIS-Abhängigkeitsbibliothek hinzu
- inputdriverXWINMSG: gucefINPUT-Plugin: Fügt einen Eingabetreiber für die Interaktion mit Eingabegeräten über das X-Windowing-Nachrichtensystem für Linux hinzu
- pubsubpluginAWSSNS: gucefPUBSUB-Plugin: Fügt ein mit dem Pub-Sub-Konzept kompatibles Backend für den SNS-Dienst von AWS hinzu. Verwendet das AWS C++ SDK.
- pubsubpluginAWSSQS: gucefPUBSUB-Plugin: Fügt ein mit dem Pub-Sub-Konzept kompatibles Backend für den SQS-Service von AWS hinzu. Verwendet das AWS C++ SDK.
- pubsubpluginKAFKA: gucefPUBSUB-Plugin: Fügt ein mit dem Pub-Sub-Konzept kompatibles Backend für Kafka-Streams hinzu. Verwendet die RdKafka-Abhängigkeitsbibliothek.
- pubsubpluginMSMQ: gucefPUBSUB-Plugin: Fügt ein mit dem Pub-Sub-Konzept kompatibles Backend für MSMQ hinzu. Verwendet das MSMQ-Subsystem des Windows-Betriebssystems, das installiert werden muss.
- pubsubpluginREDISCLUSTER: gucefPUBSUB-Plugin: Fügt ein mit dem Pub-Sub-Konzept kompatibles Backend für Redis-Streams hinzu. Verwendet Redis++- und Hiredis-Abhängigkeiten.
- pubsubpluginSTORAGE: gucefPUBSUB-Plugin: Fügt ein mit dem Pub-Sub-Konzept kompatibles Backend hinzu, das eine einfache Interaktion mit dem VFS und seinen Funktionen ermöglicht
- pubsubpluginUDP: gucefPUBSUB-Plugin: Fügt ein mit dem Pub-Sub-Konzept kompatibles Backend für Basis-UDP hinzu
- pubsubpluginWEB: gucefPUBSUB-Plugin: Fügt ein mit dem Pub-Sub-Konzept kompatibles Backend für Webkonzepte wie HTTP/REST/WebSockets hinzu
- ProjectGenDependsFilter: ProjectGen-Plugin: Ermöglicht das Filtern von Bibliotheken in einem Repo basierend auf einem Abhängigkeits.exe-Tool-Ausgabebericht
- ProjectGenVSImporter: ProjectGen-Plugin: Importiert Visual Studio-Projektdateien, um einen ModuleInfo.xml-Startpunkt für ein neues Repo zu generieren
- comcorepluginDBL: gucefCOMCORE-Plugin, das versucht, Informationen vom Myricom DBL-Netzwerktreiber bereitzustellen
- comcorepluginGEOOSM: gucefCOMCORE-Plugin, das Open Street Maps-basierte Geostandort-Suchfunktionen hinzufügt
Enthaltene Dienste
- UdpViaTCP: Bridge-Dienst, der UDP-Verkehr über ein TCP-Segment leitet. Wird durch pubsub2pubsub ersetzt.
- udp2kafka: Adapterdienst, der den Eingang von UDP-Verkehr in Kafka-Streams ermöglicht. Wird durch pubsub2pubsub ersetzt.
- udp2redis: Adapterdienst, der den Eingang von UDP-Verkehr in Redis-Streams für nicht geclusterte Redis ermöglicht. Wird durch pubsub2pubsub ersetzt.
- udp2rediscluster: Adapterdienst, der den Eingang von UDP-Verkehr in Redis-Streams für geclusterte Redis ermöglicht. Wird durch pubsub2pubsub ersetzt.
- ProcessMetrics: Agentendienst, der Metriken für einen Zielprozess abruft. Gedacht als gezielte, leichte Alternative zu Hochfrequenz-Leistungszählern und dergleichen
- redisinfo: Überwachungsdienst, der das Redis-Protokoll verwendet, um Informationen über Redis-Cluster zu erhalten und diese Informationen als Metriken zur Übertragung bereitzustellen
- pubsub2storage: Adapterdienst, der allgemeiner zwischen Messaging-Paradigmen und Speicher übersetzt. Wird durch pubsub2pubsub ersetzt.
- pubsub2pubsub: Adapterdienst, der allgemeiner zwischen verschiedenen Messaging-Paradigmen übersetzt. Wird viele der anderen Adapterdienste ersetzen.
- FilePusher: Agentendienst, der das Dateisystem auf bestimmte Dateien überwacht und diese an ein VFS-Ziel, beispielsweise AWS S3, sendet.
- FileSorter: Agentendienst, der Dateien automatisch sortiert. Praktisch für die Erstsortierung beispielsweise digitaler Bild- und Videoarchive.
- GucefLogService: Dienst, der über eine Netzwerkverbindung gestreamte GUCEF-Plattformprotokolle akzeptieren kann. Zielgruppe sind Situationen, in denen wir keine lokalen Protokolle haben bzw. nicht darauf zugreifen können
- ServerPortExtender: Dienst, der verwendet wird, um die Initiierung eingehender/ausgehender Verbindungen für einen Anwendungsserver-Port umzukehren und so Einschränkungen nur für ausgehenden Datenverkehr zu umgehen
- UdpTransformer: Dienst, der eingehendes UDP entgegennimmt und eine vereinfachte Transformation durchführt, gefolgt von einer erneuten Übertragung
- MsmqMetrics: Agentendienst, der Informationen zu MSMQ-Warteschlangen sammelt und anschließend Metriken für diese Warteschlangen sammelt und überträgt
Enthaltene Werkzeuge
- ProjectGenerator: Tool zum automatischen Generieren verschiedener Projekt-/Moduldateien und verschiedener logischer Ansichten desselben Mono-Repositorys
- DCSBruteInstaller: Tool zur Nutzung einer Kombination aus Hardware und dieser Software zum Brute-Force-Knacken der Codes in einer DCS-Hausalarmzentrale
- itvExporter: Reverse-Engineering-Exporttool für Assets, die in einem klassischen Spiel enthalten sind
- GucefArchiver: Grundlegendes Archivierungstool, das das VFS und seine Plugins nutzt
- HDFiller: Wie der Name schon sagt, füllt es Ihre Festplatte. Gedacht für Testszenarien.
- PubSubStorageTool: Tool zum Bearbeiten von Speicherdateien, die vom Pubsub-Speicher-Plugin erstellt wurden
Enthaltene sonstige Bibliotheken
- MemoryLeakFinder: Dynamisch geladene Plattform-Hilfsbibliothek zum Aufspüren von Speicherlecks mithilfe der GUCEF-Plattformfunktionalität
- ProjectGen: Bibliothek, die die gesamte Logik des ProjectGenerator-Tools enthält. Es unterstützt Plugins zur Erweiterung der Funktionalität.
TODO-Liste
- Kurzfristig: Fügen Sie der Plattform native WebSocket-Basisunterstützung hinzu
- Kurzfristig: Fügen Sie die richtige Parameterunterstützung für Codecs hinzu
- Kurzfristig: StringView-Unterstützung hinzufügen
- Kurzfristig: Schließen Sie den ersten Durchgang beim pubsub2pubsub-Web-Plugin ab
- Kurzfristig: Schließen Sie den ersten Durchgang am Plugin „aws sns“ von pubsub2pubsub ab
- Kurzfristig: Schließen Sie den ersten Durchgang am Plugin „aws sqs“ von pubsub2pubsub ab
- Kurzfristig: Konfigurationsgesteuerte CodecChain-Klasse hinzufügen
- Mittelfristig: Korrigieren Sie die GitHub CI-Integration. Der Link zum automatischen Build-Trigger ist defekt.
- Mittelfristig: DataNode-Schemasystem hinzufügen
- Mittelfristig: Konfigurationsgesteuerte Nachrichtentransformations-Engine hinzufügen
- Mittelfristig: AWS Lambda-Unterstützung hinzufügen
- Mittelfristig: Unterstützung für Utf16 und Utf32 hinzufügen
- Mittelfristig: Verwenden Sie StringView anstelle von String für alle statischen String-Referenzen
- Mittelfristig: Verwandeln Sie ProjectGenerator in etwas, das als Hintergrunddienst ausgeführt werden kann
- Mittelfristig: Vollständige GitHub Actions-Unterstützung über ProjectGenerator
- Mittelfristig: GitLab CI-Unterstützung über ProjectGenerator hinzufügen
- Mittelfristig: Vollständige Umbenennung der Plattformquelldateien, sodass alle ein Modulpräfix haben
- Mittelfristig: Entfernen Sie toten Code als Teil einer größeren Revitalisierungsmaßnahme für Projekte, die im Mono-Repo enthalten sind. Bestimmen Sie, welche anderen hierin enthaltenen Apps es wert sind, gespeichert zu werden.
- Mittelfristig: Fügen Sie Stream-Unterstützung zum Protokollierungssystem hinzu, indem Sie zur Optimierung vorab zugewiesene Ausgabepuffer pro Thread verwenden
- Mittelfristig: Erstellen Sie die Funktionalität des Plattformkonsolen-Clients neu
- Mittelfristig: Fügen Sie native Secure-Socket-Unterstützung für die unterstützten Plattformen hinzu
- Langfristig: Web-Assembly-Unterstützung hinzufügen
- Langfristig: Jenkins CI-Unterstützung über ProjectGenerator hinzufügen
- Eines Tages: Das klassische „C“-Präfix im MFC-Stil für Klassen verwerfen/rückgängig machen. Dies wäre eine große Veränderung, die alles kaputt machen würde, weshalb sie bisher noch nicht stattgefunden hat.
- Laufend: Bewerten Sie die Notwendigkeit, verschiedene Abhängigkeiten unter Berücksichtigung einer Vielzahl von Einschränkungen zu aktualisieren
- Laufend: Protokollierung/Metriken verfeinern
- Laufend: Weitere Dokumentation im Javadoc-Format (doxygen-kompatibel) hinzufügen