Bevorzugt in D6, D7, D8
Die Arbeit bestand aus 2 Schwerpunkten:
1. Weiterenwicklung / Wartung der Microservices eines Internetshops
Die Microservices sind backendseitig mit Scala / Spring-Boot und frontendseitig mit HTML/CSS/TypeScript implementiert.
Es
wurde an Microservices im Bereich der Zahlung und Lieferung gearbeitet.
Das Verhalten des Shops bei Lastspitzen wurde untersucht und
verbessert.
2. Entwicklung / Wartung des Infrastruktur-Codes
Eine selbstgeschriebenes Anwendungsframework zum Aufsetzen der Infrastruktur wurde abgelöst. Es
wurde ein neues Anwendungsframework entworfen
und implementiert. Das neue Anwendungsframework basiert auf dem AWS Cloud
Development Kit (CDK) und ist in TypeScript geschrieben.
Neben Wartungsarbeiten bestand der Einsatz aus den folgenden Phasen mit Weiterentwicklungen:
Phase: Weiterentwicklung des Kernels und der Konfiguration eines IoT-Devices
Technologie: Java, Kotlin, Docker, Azure
Das
IoT-Device enthält einen in Kotlin geschriebenen Kernel und läuft unter
Linux entweder auf einem Hardware-Device oder innerhalb einer VM. Der
Kernel lädt Docker-Images und kontrolliert die Ausführung von
Docker-Containern, die die eigentiche Anwendungslogik enthalten.
Durch eine Azure-Cloud-Anwendung werden mit Azure-Functions und dem Azure-IoT-Hub die IoT-Devices konfiguriert.
Phase: Weiterentwicklung einer Streaming-Anwendung zur Aggregation von Netflow-Daten und der zug. Visualisierung
Technologie: Java, Apache Beam, Flink, Kafka, ElasticSearch, Grafana
In einer mit Apache Beam implementierten Streaming-Anwendung werden Netflow-Daten zeitlich aggregiert und die Hosts / Anwendungen mit den höchsten Kommunikationsvolumina bestimmt. Die Anwendung läuft auf Flink-Clustern und kann mehrere 100.000 NetFlow-Pakete pro Sekunde verarbeiten.
Es wurde eine weitere Aggregation nach
"Differentiated Service Code Points" (DSCP) und die Berücksichtigung der
"Explicit Congestion Notification" (ECN) implementiert. Durch Optimierung der Streaming-Pipeline-Struktur konnte die Last der Pipeline
trotz der zusätzlichen Funktionalität reduziert werden.
Flow-Aggregate werden in ElasticSearch gespeichert. Ein ElasticSearch-Plugin wurde angepasst, das die Abfrage der Flow-Aggregate als Zeitreihen erlaubt. Ein Grafana-Plugin wurde erweitert, um die Abfrage und Visualisierung der zusätzlichen DSCP-Aggregation und ECN-Information zu ermöglichen.
Phase: Signierung von Multi-Architektur-Docker-Images
Technologie: Docker, Notary, CircleCI
Die auf den oben beschriebenen IoT-Devices laufenden Docker-Images werden mit Docker Content Trust signiert. Dazu wurden die benötigten Public/Private-Key-Paare eingerichtet und der Build-Vorgang entsprechend angepasst.
Da das IoT-Device auf unterschiedlichen Prozessoren
laufen kann, handelt es sich bei den Docker-Images um
Multi-Architektur-Images. Signierte Multi-Architektur-Images konnten zur
Zeit der Umsetzung noch nicht durch Docker selbst erzeugt werden
sondern verlangten den direkten Einsatz des zugrundeliegenden
Notary-Service.
Phase: Nutzung von Cortex zur Speicherung und Visualisierung von Netflow-Daten
Technologie: Java, Apache Beam, Flink, Kafka, Cortex, Prometheus, Grafana
Es wurde eine Sink-Transformation für Apache-Beam implementiert, um Flow-Aggregate in Cortex zu speichern. Hauptprobleme bei der Umsetzung waren die zeitliche Ordnung von Ergebnissen und Kardinalitätsbeschränkungen.
Cortex verlangt, dass Samples, die zur gleichen Zeitreihe gehören, zeitlich geordnet geschrieben werden. Apache-Beam garantiert jedoch keine zeitliche Ordnung von Ergebnissen. Zur Lösung wurden ein weiteres Attribut in Zeitreihen eingeführt, das "verspätete" Ergebnisse anderen Zeitreihen zuordnet. Über dieses Attribut kann bei der späteren Abfrage aggregiert werden.
Cortex verlangt, dass das Produkt der Attribut-Kardinalitäten einer Metric nicht zu groß wird. Um dieses Problem zu mildern wurde ein Teil der Attribute in die Metrik-Namen kodiert.
Es wurde ein SBT Plugin entwickelt, um die Verwendung von ScalaJS-Code in TypeScript-Code zu erleichtern. Dazu leitet das Plugin aus ScalaJS-Sourcen eine entsprechende TypeScript-Declaration-Datei ab. Die TypeScript-Declaration-Datei wird zusammen mit der ScalaJS-Ausgabe in ein Node-Modul gebündelt, das in TypeScript-Code importiert werden kann. Dadurch kann aus TypeScript-Code typsicher auf ScalaJS-Code zugegriffen werden.
Die Anwendung besteht aus einem Spring-Boot-Backend und Angular-Clients für Administratoren bzw. Versicherungsverkäufer.
Die Anwendung wurde durch folgende Maßnahmen modernisiert:
Am Code wurden zahlreiche Verbesserungen durchgeführt:
Während des Einsatzes wurden einzelne Features full-stack bearbeitet (Frontend und Backend). Dabei wurden bestehende Features überarbeitet und neue Features entworfen und entwickelt. Die Frontend-Entwicklung fand mit TypeScript, ScalaJS und Angular statt. In der Backend-Entwicklung kam hauptsächlich Scala und etwas Go zum Einsatz.
Eine weiterer wichtiger Beitrag war die Einführung von Integration-Tests, in denen Plattform-Bestandteile in lokalen Kubernetes Clustern deployt und getestet werden. Dazu wurde Kubernetes in Docker (kind) innerhalb von Gitlab-CI eingesetzt.
Der Einsatz gliederte sich grob in 3 Phasen:
Phase: Überarbeitung der Kommunikation mit Jupyter Kernels
Die Umsetzung basierte auf Akka. Der Kommunikationszustand wurde durch Aktoren repräsentiert, die für eine verlässliche Sitzungs- / Jupyter-Kernel-Verwaltung sorgten.
Phase: Entwicklung eines Ingress für die Funktionsausführung
Die Plattform erlaubt es, wiederkehrende Auswertungen als HTTP-Funktionen zu deployen (basierend auf OpenFaaS). Es wurde ein Ingress entwickelt, der die Authorisierung der Aufrufe vornimmt und Aufrufergebnisse sowie zug. Log-Ausgaben persistiert. Der Ingress unterstützt sowohl synchrone als auch asynchrone Funktionsaufrufe. Ergebnisse können weitergeleitet, weitergeleitet und persistiert oder nur persistiert werden. Durch Streaming ist sichergestellt, dass der Ingress auch bei sehr großen Datenmengen mit begrenztem Speicher auskommt.
Phase: Rechte/Rollen-Konzept für Repository
Das Repository basiert auf Apache Oak. Es wurde ein Rechte/Rollen-Konzept umgesetzt, das private, gemeinsame und geschützte Arbeitsbereiche unterstützt.
Während der Projektlaufzeit wurden 4 unabhängige Unterprojekte bearbeitet.
Unterprojekt: Proof of Concept von Authorisierungsszenarien im IoT-Umfeld
Detaillierte Beschreibung: Es wurden Nutzungsszenarien für EBikes untersucht. Ein Fahrradbesitzer authorisiert mittels "User Managed Access" (UMA) eine andere Person zur Nutzung des Fahrrads. Das Fahrrad wird mittels OAuth 2.0 "Device Flow" authorisiert, auf Besitzer- und Nutzer-Daten zuzugreifen. Verschiedene Nutzer authorisieren sich mittels UMA gegenseitig, auf bestimmte Daten (z.B. aufgezeichnete Fahrten) zuzugreifen.
Alle User-Interfaces wurden als "Single-Page Application" mittels Scala.js umgesetzt. Das Backend (der Resource-Server) wurde mittels Akka-HTTP implementiert. Die Kommunikation erfolgte mittels JSON und der circe-JSON-Bibliothek, wodurch dieselben Datenmodelle sowohl in den User-Interfaces als auch im Backend genutzt werden konnten.
Unterprojekt: Entwicklung eines Handshake-Endpunktes für IoT Devices und eines zug. Konfigurationstools
Detaillierte Beschreibung: Mittels eines 2-Schritt-Handshakes wird ein "shared secret" zwischen IoT-Devices und einem Backend etabliert und beide Seiten zugleich authentisiert. Der Handshake ist an den Diffie-Hellman Key-Exchange-Algorithmus angelehnt. Da es sich um "Constrained Devices" handelt und um Bandbreite zu sparen, werden CVCs und EdDSA-Schlüssel verwendet.
Unterprojekt: Bewertung möglicher Protokoll-Stacks, Kommunikationspatterns, Kommunikationssetups und System-Architekturen für IoT-Devices
Detaillierte Beschreibung: Die verschiedenen Protokoll-Stacks wurden anhand der folgenden Kriterien bewertet: Direktheit, Sicherheit, Zustandslosigkeit, Cloud-Support, Reifegrad, Kosten-Effizienz, Robustheit und geeignete Nachrichtengrößen. Bei den Kommunikationspatterns wurde untersucht, wie mit Devices kommuniziert werden kann, die die meiste Zeit nicht erreichbar sind. Dabei wurde das Konzept "Digital Twin" beleuchtet. Die Bewertung des Kommunikationssetup befasste sich damit, wie eine sichere Kommunikation zwischen Devices und Backend hergestellt werden kann. Hier wurden "pre-shared keys" bei denen Devices vorab im System registriert werden müssen, mit der Verwendung von Zertifikatsketten verglichen. Schließlich wurde eine Software-Architektur aufgestellt, die dem Konzept des "Digital Twin" Rechnung trägt.
Unterprojekt: Anbindung von Devices an das Internet der Dinge (IoT)
Detaillierte Beschreibung: Es wurde ein Backend zur Anbindung von Devices entwickelt, die Status-Informationen senden (Telemetry) und Befehle entgegennehmen können (Control). Die Devices sind nur zu bestimmten Zeitpunkten erreichbar. Alle Events werden aufgezeichnet, um daraus ein Bild vom momentanen Device Zustand ableiten zu können.
Das Backend ist in Form eines Flussgraphen implementiert, an das die Ein- und Ausgaben als Daten-Sourcen bzw. -Senken angebunden sind. Backpressure verhindert, dass das System überladen werden kann. Das Backend kann in einer geclusterten Umgebung laufen, da zusätzliche Instanzen ohne Datenverlust jederzeit gestartet und wieder beendet werden können.
Die Implementierung des Backend basiert auf Akka Streams und Aktoren. Außerdem kommen die Bibliotheken Shapeless, Cats und Monocle zum Einsatz.
Projekt: Multi-Kanal Nachrichtenversand
Detaillierte Beschreibung: Über eine JMS-Queue gelangen pro Tag bis zu 2 Mio Nachrichten in das System; durch eine Regelauswertung wird entschieden, ob und wenn ja welche Nachrichten versandt werden müssen; mit einer selbst entwickelten Template-Engine werden SMS- und EMail-Nachrichten erzeugt, die abschließend an einen Rest-Service übergeben werden. Mit einer in JSF realisierten Anwendung kann das System administriert werden.
Projekt: Entwicklung einer Lieferanten-/Sortimentsverwaltung
Detaillierte Beschreibung: Entwicklung einiger JSF-Composite-Komponenten (zur Eingabe komplexer Datenmodelle inkl. Validierungen); Enwicklung einer Scala-Bibliothek zur Anbindung des Host-Systems (IBM-IMS) via IMS-Connect (Implementierung in Form eines Monads, das eine Konversation mit dem Host beschreibt. Außerdem eine interne DSL zur Definition der Konversationen). Entwicklung eines Template-System zur Beschreibung semi-strukturierter Produkteigenschaften (Implementierung mittels Scala-Parser-Combinators). Entwicklung mehrerer "Boundaries" für den Zugriff auf eine MongoDB. Entwicklung eines Rest-Services zur Adressabfrage (Implementierung durch JaxWs). Entwicklung einer flexiblen Daten-Repräsentations/Darstellung/Binding-Schicht (an JSON angelehntes Objektmodell, einfache Schema-Sprache, JSON-Path-Implementierung, automatischer Aufbau/Verarbeitung von HTML-Formularen)
Projekt: Entwicklung von Erweiterungen für das Play-Framework
Detaillierte Beschreibung: Verbesserungen im Bereich der Formularverarbeitung, der Internationalisierung und des Stylings von Templates.
Projekt: Entwicklung einer Login-Verwaltung
Detaillierte Beschreibung: Entwicklung einer kleinen Web-Anwendung mit der die Logins für eine Internet-Anwendung verwaltet werden können.
Projekt: Dynamisierung einer Lese-Anwendung
Detaillierte Beschreibung: Eine bestehende Lese-Anwendung erlaubte den Zugriff auf eine Reihe statisch verlinkter Textsammlungen. Die Link-Auflösung zwischen den Textsammlungen (insbesondere auch die Ermittlungen von inversen Verweisen (d.h. finde die Stellen, an denen auf eine bestimmte Stelle verwiesen wird)) wurde dynamisiert. Dadurch ist es nun möglich einzelne Textsammlungen unabhängig voneinander zu aktualisieren. Die Aufgabe wurde durch eine Reihe komplexer XSLT-Transformation und durch Implementierung von Custom-XPath-Funktionen gelöst.
Projekt: Weiterentwicklung eines Web-Application-Frameworks
Detaillierte Beschreibung: Beseitigung von ClassLoader-Leaks bei Redeployments; Streaming von großen Inhalten zwischen Backend und Browser; Durchreichen von Filter-/Suchkriterien an das Backend (Übersetzung von XPath-Ausdrücken in entsprechende HQL (Hibernate Query Language) Anfragen); Integration des Zugriffs auf ein JCR (Java Content Repository) in das 2PC-Protokoll (2-Phase-Commit) im JBoss 7.
Projekt: Anpassung einer Einzelplatz-Web-Anwendung an das Internet
Detailierte Beschreibung: Eine Einzelplatz-Endkunden-Anwendung, die einen eingebetteten Tomcat nutzt, wurde dynamisiert und mit Login-Mechanismen versehen. Die Anwendung kann nun auf einem Server betrieben und von vielen Benutzern gemeinsam genutzt werden.
Projekt: Überwachung, Profiling und Verbesserung (Code-Optimierung) einer Web-Anwendung
Projekt: Weiterentwicklung, Wartung und Betrieb einer Web-Anwendung und der dahinter liegenden Services
Detaillierte Beschreibung: Der Einsatz lässt sich grob in 3 Phasen unterteilen:
Projekt: Entwicklung eines Code-Generators für GWT-Anwendungen
Meine Hauptstärken liegen im Design und in der Umsetzung von Software-Lösungen. Als Architekt kann ich den Entwurfsprozess begleiten und als Senior-Entwickler an der Umsetzung mitwirken. Bei Bedarf kann ich kleinere Entwicklerteams koordinieren und mein Wissen an andere Teammitglieder weitergeben.
Linux:
Scriptsprachen
Finanzdienstleistung
Handel
Internet
Bevorzugt in D6, D7, D8
Die Arbeit bestand aus 2 Schwerpunkten:
1. Weiterenwicklung / Wartung der Microservices eines Internetshops
Die Microservices sind backendseitig mit Scala / Spring-Boot und frontendseitig mit HTML/CSS/TypeScript implementiert.
Es
wurde an Microservices im Bereich der Zahlung und Lieferung gearbeitet.
Das Verhalten des Shops bei Lastspitzen wurde untersucht und
verbessert.
2. Entwicklung / Wartung des Infrastruktur-Codes
Eine selbstgeschriebenes Anwendungsframework zum Aufsetzen der Infrastruktur wurde abgelöst. Es
wurde ein neues Anwendungsframework entworfen
und implementiert. Das neue Anwendungsframework basiert auf dem AWS Cloud
Development Kit (CDK) und ist in TypeScript geschrieben.
Neben Wartungsarbeiten bestand der Einsatz aus den folgenden Phasen mit Weiterentwicklungen:
Phase: Weiterentwicklung des Kernels und der Konfiguration eines IoT-Devices
Technologie: Java, Kotlin, Docker, Azure
Das
IoT-Device enthält einen in Kotlin geschriebenen Kernel und läuft unter
Linux entweder auf einem Hardware-Device oder innerhalb einer VM. Der
Kernel lädt Docker-Images und kontrolliert die Ausführung von
Docker-Containern, die die eigentiche Anwendungslogik enthalten.
Durch eine Azure-Cloud-Anwendung werden mit Azure-Functions und dem Azure-IoT-Hub die IoT-Devices konfiguriert.
Phase: Weiterentwicklung einer Streaming-Anwendung zur Aggregation von Netflow-Daten und der zug. Visualisierung
Technologie: Java, Apache Beam, Flink, Kafka, ElasticSearch, Grafana
In einer mit Apache Beam implementierten Streaming-Anwendung werden Netflow-Daten zeitlich aggregiert und die Hosts / Anwendungen mit den höchsten Kommunikationsvolumina bestimmt. Die Anwendung läuft auf Flink-Clustern und kann mehrere 100.000 NetFlow-Pakete pro Sekunde verarbeiten.
Es wurde eine weitere Aggregation nach
"Differentiated Service Code Points" (DSCP) und die Berücksichtigung der
"Explicit Congestion Notification" (ECN) implementiert. Durch Optimierung der Streaming-Pipeline-Struktur konnte die Last der Pipeline
trotz der zusätzlichen Funktionalität reduziert werden.
Flow-Aggregate werden in ElasticSearch gespeichert. Ein ElasticSearch-Plugin wurde angepasst, das die Abfrage der Flow-Aggregate als Zeitreihen erlaubt. Ein Grafana-Plugin wurde erweitert, um die Abfrage und Visualisierung der zusätzlichen DSCP-Aggregation und ECN-Information zu ermöglichen.
Phase: Signierung von Multi-Architektur-Docker-Images
Technologie: Docker, Notary, CircleCI
Die auf den oben beschriebenen IoT-Devices laufenden Docker-Images werden mit Docker Content Trust signiert. Dazu wurden die benötigten Public/Private-Key-Paare eingerichtet und der Build-Vorgang entsprechend angepasst.
Da das IoT-Device auf unterschiedlichen Prozessoren
laufen kann, handelt es sich bei den Docker-Images um
Multi-Architektur-Images. Signierte Multi-Architektur-Images konnten zur
Zeit der Umsetzung noch nicht durch Docker selbst erzeugt werden
sondern verlangten den direkten Einsatz des zugrundeliegenden
Notary-Service.
Phase: Nutzung von Cortex zur Speicherung und Visualisierung von Netflow-Daten
Technologie: Java, Apache Beam, Flink, Kafka, Cortex, Prometheus, Grafana
Es wurde eine Sink-Transformation für Apache-Beam implementiert, um Flow-Aggregate in Cortex zu speichern. Hauptprobleme bei der Umsetzung waren die zeitliche Ordnung von Ergebnissen und Kardinalitätsbeschränkungen.
Cortex verlangt, dass Samples, die zur gleichen Zeitreihe gehören, zeitlich geordnet geschrieben werden. Apache-Beam garantiert jedoch keine zeitliche Ordnung von Ergebnissen. Zur Lösung wurden ein weiteres Attribut in Zeitreihen eingeführt, das "verspätete" Ergebnisse anderen Zeitreihen zuordnet. Über dieses Attribut kann bei der späteren Abfrage aggregiert werden.
Cortex verlangt, dass das Produkt der Attribut-Kardinalitäten einer Metric nicht zu groß wird. Um dieses Problem zu mildern wurde ein Teil der Attribute in die Metrik-Namen kodiert.
Es wurde ein SBT Plugin entwickelt, um die Verwendung von ScalaJS-Code in TypeScript-Code zu erleichtern. Dazu leitet das Plugin aus ScalaJS-Sourcen eine entsprechende TypeScript-Declaration-Datei ab. Die TypeScript-Declaration-Datei wird zusammen mit der ScalaJS-Ausgabe in ein Node-Modul gebündelt, das in TypeScript-Code importiert werden kann. Dadurch kann aus TypeScript-Code typsicher auf ScalaJS-Code zugegriffen werden.
Die Anwendung besteht aus einem Spring-Boot-Backend und Angular-Clients für Administratoren bzw. Versicherungsverkäufer.
Die Anwendung wurde durch folgende Maßnahmen modernisiert:
Am Code wurden zahlreiche Verbesserungen durchgeführt:
Während des Einsatzes wurden einzelne Features full-stack bearbeitet (Frontend und Backend). Dabei wurden bestehende Features überarbeitet und neue Features entworfen und entwickelt. Die Frontend-Entwicklung fand mit TypeScript, ScalaJS und Angular statt. In der Backend-Entwicklung kam hauptsächlich Scala und etwas Go zum Einsatz.
Eine weiterer wichtiger Beitrag war die Einführung von Integration-Tests, in denen Plattform-Bestandteile in lokalen Kubernetes Clustern deployt und getestet werden. Dazu wurde Kubernetes in Docker (kind) innerhalb von Gitlab-CI eingesetzt.
Der Einsatz gliederte sich grob in 3 Phasen:
Phase: Überarbeitung der Kommunikation mit Jupyter Kernels
Die Umsetzung basierte auf Akka. Der Kommunikationszustand wurde durch Aktoren repräsentiert, die für eine verlässliche Sitzungs- / Jupyter-Kernel-Verwaltung sorgten.
Phase: Entwicklung eines Ingress für die Funktionsausführung
Die Plattform erlaubt es, wiederkehrende Auswertungen als HTTP-Funktionen zu deployen (basierend auf OpenFaaS). Es wurde ein Ingress entwickelt, der die Authorisierung der Aufrufe vornimmt und Aufrufergebnisse sowie zug. Log-Ausgaben persistiert. Der Ingress unterstützt sowohl synchrone als auch asynchrone Funktionsaufrufe. Ergebnisse können weitergeleitet, weitergeleitet und persistiert oder nur persistiert werden. Durch Streaming ist sichergestellt, dass der Ingress auch bei sehr großen Datenmengen mit begrenztem Speicher auskommt.
Phase: Rechte/Rollen-Konzept für Repository
Das Repository basiert auf Apache Oak. Es wurde ein Rechte/Rollen-Konzept umgesetzt, das private, gemeinsame und geschützte Arbeitsbereiche unterstützt.
Während der Projektlaufzeit wurden 4 unabhängige Unterprojekte bearbeitet.
Unterprojekt: Proof of Concept von Authorisierungsszenarien im IoT-Umfeld
Detaillierte Beschreibung: Es wurden Nutzungsszenarien für EBikes untersucht. Ein Fahrradbesitzer authorisiert mittels "User Managed Access" (UMA) eine andere Person zur Nutzung des Fahrrads. Das Fahrrad wird mittels OAuth 2.0 "Device Flow" authorisiert, auf Besitzer- und Nutzer-Daten zuzugreifen. Verschiedene Nutzer authorisieren sich mittels UMA gegenseitig, auf bestimmte Daten (z.B. aufgezeichnete Fahrten) zuzugreifen.
Alle User-Interfaces wurden als "Single-Page Application" mittels Scala.js umgesetzt. Das Backend (der Resource-Server) wurde mittels Akka-HTTP implementiert. Die Kommunikation erfolgte mittels JSON und der circe-JSON-Bibliothek, wodurch dieselben Datenmodelle sowohl in den User-Interfaces als auch im Backend genutzt werden konnten.
Unterprojekt: Entwicklung eines Handshake-Endpunktes für IoT Devices und eines zug. Konfigurationstools
Detaillierte Beschreibung: Mittels eines 2-Schritt-Handshakes wird ein "shared secret" zwischen IoT-Devices und einem Backend etabliert und beide Seiten zugleich authentisiert. Der Handshake ist an den Diffie-Hellman Key-Exchange-Algorithmus angelehnt. Da es sich um "Constrained Devices" handelt und um Bandbreite zu sparen, werden CVCs und EdDSA-Schlüssel verwendet.
Unterprojekt: Bewertung möglicher Protokoll-Stacks, Kommunikationspatterns, Kommunikationssetups und System-Architekturen für IoT-Devices
Detaillierte Beschreibung: Die verschiedenen Protokoll-Stacks wurden anhand der folgenden Kriterien bewertet: Direktheit, Sicherheit, Zustandslosigkeit, Cloud-Support, Reifegrad, Kosten-Effizienz, Robustheit und geeignete Nachrichtengrößen. Bei den Kommunikationspatterns wurde untersucht, wie mit Devices kommuniziert werden kann, die die meiste Zeit nicht erreichbar sind. Dabei wurde das Konzept "Digital Twin" beleuchtet. Die Bewertung des Kommunikationssetup befasste sich damit, wie eine sichere Kommunikation zwischen Devices und Backend hergestellt werden kann. Hier wurden "pre-shared keys" bei denen Devices vorab im System registriert werden müssen, mit der Verwendung von Zertifikatsketten verglichen. Schließlich wurde eine Software-Architektur aufgestellt, die dem Konzept des "Digital Twin" Rechnung trägt.
Unterprojekt: Anbindung von Devices an das Internet der Dinge (IoT)
Detaillierte Beschreibung: Es wurde ein Backend zur Anbindung von Devices entwickelt, die Status-Informationen senden (Telemetry) und Befehle entgegennehmen können (Control). Die Devices sind nur zu bestimmten Zeitpunkten erreichbar. Alle Events werden aufgezeichnet, um daraus ein Bild vom momentanen Device Zustand ableiten zu können.
Das Backend ist in Form eines Flussgraphen implementiert, an das die Ein- und Ausgaben als Daten-Sourcen bzw. -Senken angebunden sind. Backpressure verhindert, dass das System überladen werden kann. Das Backend kann in einer geclusterten Umgebung laufen, da zusätzliche Instanzen ohne Datenverlust jederzeit gestartet und wieder beendet werden können.
Die Implementierung des Backend basiert auf Akka Streams und Aktoren. Außerdem kommen die Bibliotheken Shapeless, Cats und Monocle zum Einsatz.
Projekt: Multi-Kanal Nachrichtenversand
Detaillierte Beschreibung: Über eine JMS-Queue gelangen pro Tag bis zu 2 Mio Nachrichten in das System; durch eine Regelauswertung wird entschieden, ob und wenn ja welche Nachrichten versandt werden müssen; mit einer selbst entwickelten Template-Engine werden SMS- und EMail-Nachrichten erzeugt, die abschließend an einen Rest-Service übergeben werden. Mit einer in JSF realisierten Anwendung kann das System administriert werden.
Projekt: Entwicklung einer Lieferanten-/Sortimentsverwaltung
Detaillierte Beschreibung: Entwicklung einiger JSF-Composite-Komponenten (zur Eingabe komplexer Datenmodelle inkl. Validierungen); Enwicklung einer Scala-Bibliothek zur Anbindung des Host-Systems (IBM-IMS) via IMS-Connect (Implementierung in Form eines Monads, das eine Konversation mit dem Host beschreibt. Außerdem eine interne DSL zur Definition der Konversationen). Entwicklung eines Template-System zur Beschreibung semi-strukturierter Produkteigenschaften (Implementierung mittels Scala-Parser-Combinators). Entwicklung mehrerer "Boundaries" für den Zugriff auf eine MongoDB. Entwicklung eines Rest-Services zur Adressabfrage (Implementierung durch JaxWs). Entwicklung einer flexiblen Daten-Repräsentations/Darstellung/Binding-Schicht (an JSON angelehntes Objektmodell, einfache Schema-Sprache, JSON-Path-Implementierung, automatischer Aufbau/Verarbeitung von HTML-Formularen)
Projekt: Entwicklung von Erweiterungen für das Play-Framework
Detaillierte Beschreibung: Verbesserungen im Bereich der Formularverarbeitung, der Internationalisierung und des Stylings von Templates.
Projekt: Entwicklung einer Login-Verwaltung
Detaillierte Beschreibung: Entwicklung einer kleinen Web-Anwendung mit der die Logins für eine Internet-Anwendung verwaltet werden können.
Projekt: Dynamisierung einer Lese-Anwendung
Detaillierte Beschreibung: Eine bestehende Lese-Anwendung erlaubte den Zugriff auf eine Reihe statisch verlinkter Textsammlungen. Die Link-Auflösung zwischen den Textsammlungen (insbesondere auch die Ermittlungen von inversen Verweisen (d.h. finde die Stellen, an denen auf eine bestimmte Stelle verwiesen wird)) wurde dynamisiert. Dadurch ist es nun möglich einzelne Textsammlungen unabhängig voneinander zu aktualisieren. Die Aufgabe wurde durch eine Reihe komplexer XSLT-Transformation und durch Implementierung von Custom-XPath-Funktionen gelöst.
Projekt: Weiterentwicklung eines Web-Application-Frameworks
Detaillierte Beschreibung: Beseitigung von ClassLoader-Leaks bei Redeployments; Streaming von großen Inhalten zwischen Backend und Browser; Durchreichen von Filter-/Suchkriterien an das Backend (Übersetzung von XPath-Ausdrücken in entsprechende HQL (Hibernate Query Language) Anfragen); Integration des Zugriffs auf ein JCR (Java Content Repository) in das 2PC-Protokoll (2-Phase-Commit) im JBoss 7.
Projekt: Anpassung einer Einzelplatz-Web-Anwendung an das Internet
Detailierte Beschreibung: Eine Einzelplatz-Endkunden-Anwendung, die einen eingebetteten Tomcat nutzt, wurde dynamisiert und mit Login-Mechanismen versehen. Die Anwendung kann nun auf einem Server betrieben und von vielen Benutzern gemeinsam genutzt werden.
Projekt: Überwachung, Profiling und Verbesserung (Code-Optimierung) einer Web-Anwendung
Projekt: Weiterentwicklung, Wartung und Betrieb einer Web-Anwendung und der dahinter liegenden Services
Detaillierte Beschreibung: Der Einsatz lässt sich grob in 3 Phasen unterteilen:
Projekt: Entwicklung eines Code-Generators für GWT-Anwendungen
Meine Hauptstärken liegen im Design und in der Umsetzung von Software-Lösungen. Als Architekt kann ich den Entwurfsprozess begleiten und als Senior-Entwickler an der Umsetzung mitwirken. Bei Bedarf kann ich kleinere Entwicklerteams koordinieren und mein Wissen an andere Teammitglieder weitergeben.
Linux:
Scriptsprachen
Finanzdienstleistung
Handel
Internet
"Der Consultant hat uns bei der Arbeit an einer großen, unter hohe Last stehenden Web-Anwendung (ca. 7 Millionen Kunden), sowie der dahinter liegenden Services äußerst wertvolle Dienste geleistet. Durch sein großes Wissen in vielen Bereichen und seine Fähigkeit, sich schnell neues relevantes Wissen anzueignen, konnte er das System an vielen Stellen stark verbessern. Der Consultant zeichnet sich außerdem durch sein gründliches und schnelles Arbeiten aus. Wir möchten uns bei dem Consultant für seinen sehr engagierten Einsatz bedanken und ihn anderen Projektanbietern weiterempfehlen."
— Projekt Weiterentwicklung, Wartung und Betrieb einer Web-Anwendung und der dahinter liegenden Services, 09/10 - 12/12
Referenz durch Teamleiter, 1&1 Internet AG, vom 07.11.12
"Der Consultant hat sich sehr schnell in unsere komplexe Portalumgebung eingearbeitet und sich sehr gut in unser verteiltes Entwicklerteam integriert. Er hat die ihm aufgetragenen Arbeiten innerhalb der vorgegebenen Zeit zu unserer vollsten Zufriedenheit fertiggestellt. Der Consultant zeichnet sich besonders durch seine selbstständige Arbeitsweise sowie sein hohes Qualitätsbewusstsein aus. Wir möchten dem Consultant an dieser Stelle nochmals für seinen engagierten Einsatz danken und ihn ausdrücklich an andere Projektanbieter weiterempfehlen."
— Projekt Unterstützung Portalentwicklung (SAP Community Network), 04/08 - 08/08
Referenz durch Development Manager, SAP AG, vom 27.08.10
"Der Consultant betreut seit mehreren Jahren den digitalen Bereich eines unserer wichtigsten Projekte. Bereits in der Konzeptionsphase profitierten wir von seinem profunden und umfangreichen IT-Wissen. Im Anschluss an die Konzeption übernahm er eigenständig die Programm-Entwicklung. Die Anwendung läuft fehlerfrei und wird von einigen tausend privaten Einzelnutzern wie auch von zahlreichen Rechenzentren im Serverbetrieb genutzt. Zur Produktion der Anwendung müssen regelmäßig umfangreiche XML-Datenbestände nach komplexen Regeln aufbereitet werden. Auch diese Aufbereitung hat der Consultant realisiert und hierfür eine Produktionsumgebung eingerichtet, die sich in unserer täglichen Arbeit bewährt. Der Consultant zeichnet sich durch sein hohes Qualitätsbewusstsein, seine Dienstleistungsorientierung, seine Flexibilität und seine Vielseitigkeit aus. Zudem findet er für anstehende Aufgaben kundenorientierte Lösungen und ist darüber hinaus stets an der Weiterentwicklung des Projekts interessiert und bringt sich hier konstruktiv ein. Wir bedanken uns an dieser Stelle ausdrücklich bei unserem Consultant für die langjährige hervorragende Zusammenarbeit und freuen uns auf die weitere Kooperation. Gerne empfehlen wir ihn auch an andere Projektanbietern weiter!"
— Projekt Polizei-Fach-Handbuch - Online, 12/02 - 06/10
Referenz durch Vertriebsleitung, Fachverlag im Raum Düsseldorf (20 MA), vom 15.07.10
"Der Consultant kam in einer entscheidenden Projektphase hinzu, in der es galt, einen Releasetermin zu halten, und hat sich innerhalb kürzester Zeit in die laufende Entwicklung äußerst produktiv integriert. Besonders hervorzuheben ist, dass er trotz des großen Zeitdrucks Konzepte ersonnen und umgesetzt hat, die nun im Gesamtprojekt eine zentrale Rolle einnehmen. Darunter fällt insbesondere der weitreichende Einsatz von XML-Konfigurationsdateien. Neben seinen konzeptionellen und entwicklerischen Tätigkeiten moderierte der Consultant eine Study-Group, die dabei half, das heterogen zusammengesetzte Entwicklerteam zu integrieren und das Know-how über die Gesamtapplikation zwischen den Entwicklern auszutauschen. Wir möchten an dieser Stelle dem Consultant für seinen engagierten und kompetenten Einsatz danken und ihn an andere Projektanbieter weiterempfehlen."
— Projekt persönliche Finanzanalyse, 10/01 - 06/02
Referenz durch Projektleiter einer Großbank in Deutschland vom 04.06.02