Hier der Beispiel Code … „Stream Test mit BTC und ETH Adressen“ weiterlesen
Java: Array von Dubletten und null entfernen mit HashSet und zurück
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; import org.junit.jupiter.api.Test; /** * Dubletten Test. * * @author Thomas Wenzlaff * */ public class TestDoppelte { @Test void testDoppelteUndNullEntfernen() { System.out.println("----> Array mit Orten:"); List<String> orte = new ArrayList<>(); orte.add(null); orte.add(null); // doppelter Eintrag orte.add("Hannover"); orte.add("Langenhagen"); orte.add("Bremen"); orte.add("Bremen"); // doppelter Eintrag orte.stream().forEach(ort -> System.out.println(ort)); assertEquals(6, orte.size()); System.out.println("----> Entfernen von Dubletten mit HashSet:"); Set<String> orteSetOhneDublette = new HashSet<>(orte); orteSetOhneDublette.stream().forEach(ort -> System.out.println(ort)); assertEquals(4, orteSetOhneDublette.size()); System.out.println("----> Wieder zurück als Liste ohne die null Werte und anders sortiert:"); List<String> kopie = orteSetOhneDublette.stream().filter(Objects::nonNull).collect(Collectors.toList()); kopie.stream().forEach(ort -> System.out.println(ort)); assertEquals(3, kopie.size()); } } |
Ergebnis: „Java: Array von Dubletten und null entfernen mit HashSet und zurück“ weiterlesen
Vaadin Anwendung auf dem Raspberry Pi 4 B in 10 Minuten mit Jetty-Server und Archetype erstellen als Vorbereitung für den richtiger Lockdown ab Mittwoch!
Eine kleine Demo zeigt, dass es gar nicht so kompliziert ist, ein professionelles Web-Application-Framework auf dem Raspberry Pi zum Laufen zu bekommen. Und das in 10 Minuten! Ok, dann los.
Eine vaadin Anwendung Version 16.0.0 und Jetty Server 9.4.15 in 10 Minuten erstellen. Das ist mit dem Archetype möglich. Als Version wird latest angegeben. Diesen Aufruf auf der Kommandozeile in einem leeren Verzeichnis aufrufen:
1 2 3 4 5 6 7 |
mvn -B archetype:generate \ -DarchetypeGroupId=com.vaadin \ -DarchetypeArtifactId=vaadin-archetype-application \ -DarchetypeVersion=LATEST \ -DgroupId=de.wenzlaff.twvaadinprojekt.app \ -DartifactId=twvaadinprojekt-app \ -Dversion=1.0-SNAPSHOT |
Das ist beim 2. Mal in 10 Sekunden erledigt. Beim 1. Mal müssen noch die Maven Artefakte ins lokale Repo geladen werden, das dauert etwas. „Vaadin Anwendung auf dem Raspberry Pi 4 B in 10 Minuten mit Jetty-Server und Archetype erstellen als Vorbereitung für den richtiger Lockdown ab Mittwoch!“ weiterlesen
Ein eigenes Maven-Plugin in 15 Minuten inklusive Dokumentation erstellen
Ein eigenes Maven-Plugin zu erstellen ist nicht schwer und ist schnell gemacht. Wir wollen ein Plugin welches einen Verzeichnis Inhalt mit ls -la in das Log schreibt erstellen. Es können aber auch andere Linux Befehle übergeben werden. Hier nun die 6 Schritte mit den Vorlagen die mind. nötig sind.
1. Wir legen in Eclipse ein neue Maven Projekt mit Java 1.8 an. mit Artifact Id und Group Id de.wenzlaff.command.maven.plugin
2. In der pom.xml fügen wir die folgenden Abhängikeiten hinzu: „Ein eigenes Maven-Plugin in 15 Minuten inklusive Dokumentation erstellen“ weiterlesen
Raspberry Pi: Bibelleseplan im ics Kalender Format mit 1189 Termine
Hier hatte ich gestern ja schon die Biblellesepläne im EXCEL, TXT und PDF Format erzeugt.
Nun habe ich mit dem Generator auch für jeden Tag einen Termin im ics-Kalender Format erzeugt (Google, Apple, Outlock …). Und zwar 1189 Termine die jeweils um 6 Uhr morgens in der Woche 3 und am Wochenende 4 Kapitel angeben. Starten tut alles am 1.9.2019. Die ics-Datei kann hier geladen, und dann in dem Kaleder deiner Wahl importiert werden. Vorher wie immer ein backup (export) des Kalenders machen.
bibelleseplan_2019-08-17-ganze-Bibel.ics
Wer nich gleich mit der ganzen Bible starten will, kann auch mit einem Bibelbuch anfangen, mit Mathäus:
bibelleseplan_2019-08-17-mathaeus.ics
Bei klick auf Import in den Kalender kommt z.B. auf einem Mac, erst noch die Abfrage in welchem Kalender man importieren will:
Anschließend sind am Wochenende jeweils 4 Einträge um 6 Uhr zu finden: „Raspberry Pi: Bibelleseplan im ics Kalender Format mit 1189 Termine“ weiterlesen
Raspberry Pi: Bibelleseplan (PDF, Excel, TXT, ics) Generator (mit Java und twbibel)
Wer die 1189 Kapitel der Bibel in einem Jahr lesen will, kann einfach jeden Wochentag 3 Kapitel und am Wochenende 4 lesen. An vielen Stellen im Internet gibt es auch Bibellesepläne. Ich habe mal ein paar Pläne in unterschiedlichen Formaten generiert, die hier kostenlos geladen werden können:
bibelleseplan_1.9.2019 (PDF)
bibelleseplan_1.9.2019 (Excel)
bibelleseplan_1.9.2019 (TXT)
bibelleseplan_2019-08-17-ganze-Bibel (ics) siehe auch hier
bibelleseplan_2019-08-17-mathaeus (ics) siehe auch hier
Um aber die twbibel von MavenCentral mal zu testen, folgt hier ein kleines Java-Programm. Dieses wird dann noch um eine Oberfläche (GUI) oder Kommandozeilen-Client erweitert um verschiedene Bibellesepläne mit unterschiedlichen Start Datum zu generieren.
Um die Bibel Lib zu nutzen, muss in der pom.xml für das Maven-Projekt dieser Eintrag gemacht werden:
1 2 3 4 5 6 7 |
<dependencies> <dependency> <groupId>de.wenzlaff.twbibel</groupId> <artifactId>de.wenzlaff.twbibel</artifactId> <version>0.0.2</version> </dependency> </dependencies> |
Dann eine Java Klasse mit ungefähr diesem Inhalt: „Raspberry Pi: Bibelleseplan (PDF, Excel, TXT, ics) Generator (mit Java und twbibel)“ weiterlesen
Java-Zweizeiler: Wie können alle Tage eines Zeitraumes mit Java 8 ausgegeben werden?
Manchmal benötigt man alle Tage im Jahr oder alle Tage im Monat oder alle Tage von Start Datum bis zum Ende Datum. Das geht mit Java 8 in einen Zweizeiler:
1 2 3 4 5 6 7 |
// erst die Differenz zwischen Start und Ende Datum berechnen long daysBetween = ChronoUnit.DAYS.between(startDate, endDate); // dann über alle Tage iteriern IntStream.iterate(0, i -> i + 1) .limit(daysBetween) .mapToObj(i -> startDate.plusDays(i) .collect(Collectors.toList()); |
Hier das Ergebnis und die ganze Klasse:
Wie kann mit Java 8 und dem DOM-Parser einfach eine XML Datei erzeugt werden?
Wie kann mit Java 8 mit dem DOM-Parser einfach eine XML Datei erzeugt werden?
Es sind keine weiteren Abhängigkeiten nötig. Allso keine imports von Fremdjars. Alles ist in Java 8 vorhanden:
1 2 3 4 5 6 7 8 9 |
import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; |
Es muss ein DOM Object mit der Baumstruktur erzeugt werden. Dann kann mit dem Transformer und dem StreamResult in eine Datei geschrieben werden.
Hier nun die drei Schritte:
1. Mit der DocumentBuilderFactory ein neues Document erzeugen:
1 |
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument() |
2. Benötigte Elemente und Attribute erzeugen und dem Dokument hinzufügen „Wie kann mit Java 8 und dem DOM-Parser einfach eine XML Datei erzeugt werden?“ weiterlesen
Java Webclient des Statistischen Bundesamtes für GENESIS Online DB starten auf Mac OS X und Raspberry Pi bzw. Linux
Das Statistische Bundesamt bietet für registrierten Nutzern 3 Werkzeuge kostenlos zum Download an. Unter anderem ein Java-Web-Client. Es heißt:“
Durch den „GENESIS-Webservice“ werden bestimmte Funktionen von GENESIS-Online auch für die automatisierte Verarbeitung zugänglich gemacht, wie z. B. Abruf und Download von Daten. Über unser Dienstangebot (WSDL) können registrierte GENESIS-Online-Nutzer die entsprechenden Schnittstellen in ihre eigenen Applikationen integrieren und programmgesteuert die angebotenen Dienste nutzen.“
Ok, dann wollen wir mal testen. Wir wollen auf den Mac OS X und dann auf einem Raspberry Pi die autom. Abfragen stellen. Als Beispiel sollen mal die Daten abfrage der Transfusion von Vollblut und Erythrozytenkonzentrat (EK) u.Ä. in Deutschland verwendet werden. Die Anzahl ist rückläufig, wenn auch in Deutschland immer noch fast eine Millionen Einheiten (a mind. ca. 200 Euro) verkauft werden.
Datenquelle: Statistisches Bundesamt (Destatis), Genesis-Online,
Abrufdatum 22.06.2019; Datenlizenz by-2-0; eigene Berechnung/eigene Darstellung
Welche Schritte sind nötig? „Java Webclient des Statistischen Bundesamtes für GENESIS Online DB starten auf Mac OS X und Raspberry Pi bzw. Linux“ weiterlesen
Java 8 Quickie: Kein PermSize und MaxPermSize – by by java.lang.OutOfMemoryError: PermGen error
Ab Java 8 werden die PermSize und MaxPermSize Kommandozeilen Parameter nicht mehr verwendet. Es wird eine Warnung in der Art:
1 2 3 |
Java HotSpot(TM) Server VM warning: ignoring option PermSize=32m; support was removed in 8.0 Java HotSpot(TM) Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0 |
ausgegeben. Also tschüss java.lang.OutOfMemoryError: PermGen error.
Quelle: Oracle.com
JUnit 5 Quickie: @CsvSource
Mit der @CsvSource Annotation in JUnit 5 kann man mit Kommaseparierte Parameter leicht und übersichtliche Tests schreiben. Die API ist aber noch im EXPERIMENTAL Status.
Hier mal ein Beispiel. Für jeden Kommandozeilen Parameter eine Testmethode schreiben:
„JUnit 5 Quickie: @CsvSource“ weiterlesen
Java 8 Quickie: Wie können alle bestimmten Dateien eines Verzeichnis in einer Zeile ermittelt werden?
Mit der static Methode Files.newDirectoryStream. Diese Methode gibt es schon seit Java 1.7. Hier mal ein Beispiel für alle PDF Datein im aktuellen Verzeichnis:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
List<Path> pdfDateien = new ArrayList<Path>(); String eingabeVerzeichnis = "."; try { Files.newDirectoryStream(Paths.get(eingabeVerzeichnis), path -> path.toString().endsWith(".pdf")) .forEach(path -> pdfDateien.add(path)); } catch (IOException e) { System.err.println(e); } |
Update PDF-Formulare automatisch auswerten – PDF-Formulare to CSV (Excel) – Version 0.0.2 veröffentlicht – nun auch für Windows!
Wie hier ausführlich beschrieben, hier nun die Version 0.0.2 für den Raspberry Pi als DEB Archive aber auch als RPM für RedHat und für Windows nur die JAR Datei zum kostenlosen Download twpdfformulartocsv-0.0.2.zip
Einige Funktionen sind nun NEU z.b. die Hilfe, die mit -h aufgerufen werden kann, hier aber erst einmal das BPMN zum Programmablauf:
Die Versions Ausgabe mit -v „Update PDF-Formulare automatisch auswerten – PDF-Formulare to CSV (Excel) – Version 0.0.2 veröffentlicht – nun auch für Windows!“ weiterlesen
PDF-Formulare automatisch auswerten – PDF-Formulare to CSV
Manchmal möchte man mehrere PDF-Formulare automatisch auswerten. Z.B. von einer Umfrage. Also wie bekommt man die im PDF-Formular eingegebenen Felder aller PDF Dateien eines Verzeichnises in eine Excel CSV Datei für die Auswertung? Wie man PDF-Formulare kostenlos erstellt, hatte ich ja schon hier beschrieben.
Das geht mit dem Raspberry Pi (oder auch Mac und Windows) ganz einfach mit dem Java Tool twpdfformulartocsv das ich implementiert habe. Es muss mind. Java 8 auf dem Pi installiert sein. Das kann man mit java -version überprüfen. Es kommt auf dem Pi Zero bei mir
1 2 3 |
openjdk version "1.8.0_181" OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-2~deb9u1-b13) OpenJDK Client VM (build 25.181-b13, mixed mode) |
Hier nun die Schritte, um es zu installieren.
„PDF-Formulare automatisch auswerten – PDF-Formulare to CSV“ weiterlesen
JUnit Quickie: Wie können die Testmethoden einer Klasse automatisch in zufälliger Reihenfolge (Pseudozufall) ausgeführt werden?
Wie können die Testmethoden einer Klasse automatisch in zufälliger Reihenfolge ausgeführt werden? Ab JUnit 5.4 geht das mit der Annotation @TestMethodOrder. Es wird nur die @TestMethodOrder(MethodOrderer.Random.class) Annotation an der jeweiligen Test-Klasse benötigt. Die Zufallsfunktion wird mit Hilfe der System.nanoTime() Funktion erzeugt. Also ein Pseudozufall. Aber für Test reicht es.
Wir verwenden diese Testklasse: „JUnit Quickie: Wie können die Testmethoden einer Klasse automatisch in zufälliger Reihenfolge (Pseudozufall) ausgeführt werden?“ weiterlesen
JUnit Quickie: Wie können die Testmethoden einer Klasse automatisch in alphabetischer Reihenfolge ausgeführt werden?
Wie können die Testmethoden einer Klasse automatisch in alphabetischer Reihenfolge ausgeführt werden? Ab JUnit 5.4 geht das mit der Annotation @TestMethodOrder
Es wird nur die @TestMethodOrder(MethodOrderer.Alphanumeric.class) Annotation an der jeweiligen Test-Klasse benötigt. Mit dem Alphanumeric wird die Reihenfolge auf alphabetischer gesetzt. „JUnit Quickie: Wie können die Testmethoden einer Klasse automatisch in alphabetischer Reihenfolge ausgeführt werden?“ weiterlesen
Raspberry Pi: Um welche Uhrzeit wird immer der letzte Kaffee am Tag gekocht?
Vor ein paar Tagen hatte ich die Auswertung zum Kaffeeverbrauch gepostet. Die Daten werden ja online von einem meiner Raspberry Pi erfasst. Gestern der Beitrag zu der Frage: Wann der 1. Kaffee des Tages gekocht wird.
Heute habe ich mal gefragt, um welche Uhrzeit wird bei uns eigentlich der letzte Kaffee am Abend gekocht? Man soll ja vor dem zu Bett gehen nicht noch viel Kaffee trinken.
Die Antwort im Durchschnitt um 15:14 Uhr. Der gemessene Zeitraum ist fast 2 Jahre mit über 500 Messwerte. Hier dazu die Grafik mit der Uhrzeit als Y Wert. X ist die Anzahl der Messungen (Tage). Die rote Linie der Mittelwert.
Und weil ich Diagramme liebe, noch mal eins mit Punkten … „Raspberry Pi: Um welche Uhrzeit wird immer der letzte Kaffee am Tag gekocht?“ weiterlesen
Raspberry Pi: Um welche Uhrzeit wird immer der 1. Kaffee am Tag gekocht?
Gestern hatte ich die Auswertung zum Kaffeeverbrauch gepostet. Die Daten werden ja von einem meiner Raspberry Pi erfasst.
Heute habe ich mal gefragt, um welche Uhrzeit wird bei uns eigentlich der 1. Kaffee gekocht? Die Antwort im Durchschnitt um 6:54 Uhr. Der gemessene Zeitraum ist fast 2 Jahre mit über 500 Messwerte. Hier dazu die Grafik mit der Uhrzeit als Y Wert. X ist die Anzahl der Messungen (Tage)

Java 8 Quickie: Zeitzonen Umwandlung mit ZonedDateTime: UTC nach Europas Zeitzone

Manchmal hat man Zeitangaben z.B. aus IOT Geräten in der Form eines Strings „2018-12-10 12:14:15 UTC“. Nun müssen die Zeitangaben die in UTC verwendet werden in die lokale Zeitzone für Europa/Berlin umgewandelt werden. Das ist in der Regel eine Stunde plus. Wie geht das aber mit der Java 8 API?
Java 8 Quickie: Alle Zeitzonen mit getAvailableZoneIds mit Java ermitteln

Wie können alle Zeitzonen mit Java ermittelt werden? Das geht mit der Methode getAvailableZoneIds der Klasse ZoneId. Die Methode ist thread save und der Set kann zukünftig noch erweitert werden. Bei mir ist er heute 600 Einträge (IDs) groß, wie dieser JUnit Test zeigt:
@Test
public void testGetAlleZeitzonen(){
List
Das sind die Zeitzonen IDs:
„Java 8 Quickie: Alle Zeitzonen mit getAvailableZoneIds mit Java ermitteln“ weiterlesen