- Integrate Jacoco into your Maven pom.xml.
- Add into your file .gitlab-ci.yml: echo -n "Total:" ; cat target/site/jacoco/index.html | grep -o 'Total[^%]*%' | grep -o -E '[0-9]+%$
- Add Badge in Gitlab under Setting.
- Gitlab scan the console for the Regex you given in Point 3.
Montag, 13. Juli 2020
Gitlab Badges for Maven Jacocoo Test Coverage
Dienstag, 25. Februar 2020
Datenschutz ist Freiheit
Aus gegebene Anlass (Heise Online), weil demnächst der deutsche Saat alle Passwörter abfangen darf und damit nicht nur die Kommunikation aller Bürger mitlesen kann sondern auch gezielt falsche Informationen verbreiten kann hier ein Hinweis auf die Electronic Frontier Foundation, kurz EFF. Die EFF hat eine Seite zum Thema Survillance Self-Defence mit kurzen Anleitung zu sicheren Benutzung von Diensten übers Internet.
Unnützes Wissen:
Die EFF, bzw. ein EFF Aufkleber ist in der brillanten britischen Serie The IT Crowd zu sehen.
Unnützes Wissen:
Die EFF, bzw. ein EFF Aufkleber ist in der brillanten britischen Serie The IT Crowd zu sehen.
Donnerstag, 30. Januar 2020
Git house keeping
Über die Entwicklungszeit eines Projektes sammeln sich im Git viele Feature Branches, die man oft vergisst wegzuräumen. So geht es:
Löschen von lokalen Branches:
Löschen von remote Branches:
Löschen von lokalen Branches:
- git checkout master
- git branch -l | grep --color=never -v master | xargs git branch -D
Löschen von remote Branches:
- git branch -r | grep --color=never -v master | xargs git push origin --delete
Mittwoch, 22. Januar 2020
Kurz und Gut: Software Metriken
Metriken helfen den Zustand von laufender Software zu überwachen (Monitoring) und Fehler frühzeitig zu erkennen. Das passiert dann mittels Alerts, die meist auf Metriken aufsetzen. Man kann in der Regel drei grundsätzlichen Arten von Metriken unterscheiden:
Ich empfehle die Benutzung von Countern und Gauges.
- Counter
- Meter bzw. Histogramm
- Gauge
Aber wo ist der der Unterschied zwischen den Metrik Typen?
Hier ein Real Word Beispiel:
Ein Gauge gibt an wie hoch der Wasserstand in deiner Badewanne ist.
Ein Counter dagegen gibt an, wie oft jemand mit einem Eimer Wasser die Badewanne befüllt.
Hier jetzt das Software Beispiel:
Ein Gauge gibt an wie viele Einträge in deiner Datenbank sind.
Ein Counter gibt an wie viele Elemente hinzugefügt wurden.
- Gauges:
- Benutzter Speicherplatz (RAM, Heap, Disk, ...)
- CPU Usage
- Anzahl von Einträgen in einer Datenbanktabelle
- Load
- Counter:
- Requests
- Laufzeit
- Fehler
- Transaktionen
- Logzeilen
Kurz gesagt:
Ein Gauge zeigt einen Zustand an, ein Counter zählt Events.
Ich empfehle die Benutzung von Countern und Gauges.
Warum ich den dritten Metriktyp Meter und Histogramm nicht empfehle.
Meter neigen dazu zu lügen, oft werden die zusätzlichen Informationen nicht gebraucht und sie erhöhen den Aufwand.
Das Hauptproblem ist aber das die oft wenigen Daten die in einem Metrikpunkt akkumuliert werden. Sie erzeugen bei den verwendeten Aggregationen wie in Histogramm und Meter ein falsches Bild von den Daten. Ein ist Quantilberechnung über 5 Werte ist 95% Sinn frei.
Zusammenfassung
- KISS: Keep it simple an stupid - eine Metrik ist nur ein Float Wert und ein Name. So sollte auch der Code aussehen.
- Benutzt Counter und Gauge, je nach Anwendungskontext.
- Vermeidet die Metrik-Typen Meter und Histogramm, es sei denn ihr wisst genau was ihr tut.
- Metriken helfen den Zustand von laufender Software zu überwachen und Fehler frühzeitig zu erkennen.
- Metriken ersetzen kein Logging.
- Metriken sind nicht mit Observability zu verwechseln.
Freitag, 27. Dezember 2019
Einfache Bewegungserkennung auf dem Raspberry Pi
Mit dem Thema Bewegungserkennung wird gerne KI in Verbindung gebracht, aber Bewegungserkennung geht auch mit normalen Computer Vision Mitteln.
Es ist sehr einfach möglich, Bewegungserkennung mit einfachen UNIX Programmen durchzuführen. Ich benutze hier ImageMagic. Folgend ein Beispiel, das auf einem Raspberry Pi Zero W läuft. Hier ein Auszug aus dem BASH Script:
Es ist sehr einfach möglich, Bewegungserkennung mit einfachen UNIX Programmen durchzuführen. Ich benutze hier ImageMagic. Folgend ein Beispiel, das auf einem Raspberry Pi Zero W läuft. Hier ein Auszug aus dem BASH Script:
raspistill -o camImages/$DATE.jpg
convert -normalize -blur 0x8 camImages/$DATE.jpg blur/$DATE.jpg
compare -fuzz 8% -metric RMSE nb3.jpg nb4.jpg x.jpg
- Zuerst muss ein Bild aufgenommen werden.
- Dann wir das Bild bzgl. des Histogramms normalisiert und mit dem Weichzeichen wird das Bildrauschen des Kamerasensors eliminiert.
- Zuletzt wird das aktuelle Bild mit dem Vorgängerbild verglichen. Die Metrik gibt an, wie stark sich die Bilder unterscheiden, hier muss ein passender Schwellwert (-fuzz 8%) eingestellt werden.
Mit dieser Lösung werden Bewegungen in Bildern zuverlässig erkannt. Hier ein Beispiel für ein Differenzbild.
Die Nachteile:
- Dieser Lösung ist die hohe Laufzeit von ca. 75 sec auf Raspberry Zero W.
- Die Normalisierung ist noch nicht optimal, Änderungen in der Beleuchtung werden häufig als Bewegung erkannt, das kann zur Zeit nur durch ein Anhaben des Schwellwertes kompensiert werden.
Update:
Einige Optimierungen wie die Verringerung der Bildauflösung führen zur einer Reduktion der Laufzeit von 90 sec auf 75 sec auf 23 sec. Durch die jetzt kürzeren Abstände zwischen den Bildern werden Fehlerkennungen noch weiter reduziert.
Samstag, 10. August 2019
Programmiersprachen die ich gelernt oder benutzt habe
Programmiersprachen die ich gelernt oder benutzt habe:
- Assembler
- BASIC
- BASH
- C
- Go
- Groovy
- JavaScript
- Java
- Lingo
- MS-DOS Scripting
- Objevtive-C
- Pascal
- Pearl
- Python
- R
- Ruby
- SAS
- Scala
- SPS
Programmiersprachen die ich extrem gut beherrsche:
- Java
- BASH
- R
Programmiersprachen die gerne probieren würde:
GO
Dienstag, 6. August 2019
Java, XML und Performance
XML ist ein populäres Datenformat für den Datenaustausch zwischen Systemen. Der Vorteil von XML ist, es gibt sehr stabile Parser. Aber wie sieht es mit der Performance aus? Folgende Aufgabe: Einlesen einer XML Datei mit 100T Elementen, die einige Unterelemete besitzt, die Tiefe ist 4, Dateigrösse 60Mb, Java 8.
Zum Performancevergleich wurde mit einem Subset von 350 Elementen gearbeitet.
Test 1: Java, XML, DOM, Xpath, 350 Elemente in Datei
Test 2: Java, XML, DOM, Jaxen 1.2 Xpath, 350 Elemente in Datei
Zum Performancevergleich wurde mit einem Subset von 350 Elementen gearbeitet.
Test 1: Java, XML, DOM, Xpath, 350 Elemente in Datei
- Laufzeit pro Element: 20ms
- Verhältnis XML Parsen/DB Speichern: 25, das XML Verarbeiten verbraucht primär die Zeit
- Geschätzte Gesamtlaufzeit: 33 min
Test 2: Java, XML, DOM, Jaxen 1.2 Xpath, 350 Elemente in Datei
- Laufzeit pro Element: 3ms
- Verhältnis XML Parsen/DB Speichern: 15, das XML Verarbeiten verbraucht primär die Zeit
- Geschätzte Gesamtlaufzeit: 5 min
- Jaxen Xpath ist deutlich schneller als das normale Java Xpath
Beide Tests waren erfolgreich. Jetzt der Test mit voller Datenmenge.
Test 3: Java, XML, DOM, Jaxen 1.2 Xpath, 100T Elemente in Datei
- Manueller Abbruch des Test, weil die Laufzeit unglaublich schlecht war.
Test 3: Java, XML, DOM, Xpath, 100T Elemente in Datei
- Manueller Abbruch des Test, weil die Laufzeit unglaublich schlecht war.
- Performance ist aber besser als Jaxen.
- Bei einer Detailanalyse sieht man das die Laufzeit für die XPath Evaluierung nach oben schnellen, das obwohl ausreichen RAM (XMX) vorhanden ist. Der Schluss daraus ist, das die Auswertung von XPath ausdrücken eine hohe Komplexität hat, es werden scheinbar Listen durchlaufen. Übertragen auf relationale DBs, XPath Evaluierung entsprechen sequential Scans. Java XPath kann also nicht die Element-Adresse im Speicher berechnen, sondern muss sie suchen, indem (mehrere) Listen sequentiell durchlaufen werden.
Zusammenfassung
- Die Verarbeitung grosser XML Dateien mittels DOM und XPath ist ineffizient. Das gilt wahrscheinlich auch für andere DOM basieret Formate wie JSON.
- Jaxen XPath ist deutlich schneller als Java XML XPath für kleine und normale DOMs.
- Lösungen:
- Alternativen wäre Streaming XML via SAX oder StAX.
- Wechsel von XML zu CSV.
Abonnieren
Posts (Atom)


