Es gibt 6 State im Enum:
Es gibt mind. diese Status:
Hier mal ein Beispiel, für einige Status. Die Thread-Klasse die nur 5 Sekunden warte: „Java Thread – 6 State oder wie starten wir ein einfaches Java Programm auf dem Raspberry Pi“ weiterlesen

Wenzlaff.de – Rund um die Programmierung
mit Java, Raspberry Pi, SDR, Linux, Arduino, Sicherheit, Blender, KI, Statistik, Krypto und Blockchain
Alles rund um Java
Es gibt 6 State im Enum:
Es gibt mind. diese Status:
Hier mal ein Beispiel, für einige Status. Die Thread-Klasse die nur 5 Sekunden warte: „Java Thread – 6 State oder wie starten wir ein einfaches Java Programm auf dem Raspberry Pi“ weiterlesen
Es wurde vorgestern eine neue Version von JUnit 5 veröffentlicht,
siehe https://junit.org/junit5/docs/5.4.0-M1/release-notes/
Mindmap zum Thema „Neue M1 Version von JUnit 5.4.0 veröffentlicht“ weiterlesen
Build Pipeline mit YAML Script zum erzeugen eines *.deb Archives mit Maven für Debian auf Raspberry Pi.
Oder wie kann man ein *.deb Archive mit Maven Plugin erzeugen?
Oder wie verpackt man ein JAR in ein deb Archive, um es einfach auf einem Raspberr Pi zu installieren?
Oder wer braucht ein Template für das erzeugen von Maven Artefacten mit einer automatischen Pipeline in GitLab?
Oder wie validiere ich die Build-Scripte der Build-Pipeline?

Auf diese ua. Frage gibt dieser Blog-Artikel Auskunft.
Wir wollen eine Build-Pipeline mit mehreren Javaversionen, test und build bzw. deploy erstellen. Hier der Flow der Pipeline:
So sieht die Pipeline mit den drei Stages aus: „Build Pipeline mit YAML Script zum erzeugen eines *.deb Archives mit Maven und jdeb für Debian auf Raspberry Pi mit GitLab“ weiterlesen
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
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)


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?

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“ weiterlesenGestern noch 20 Jahre wenzlaff.de gefeiert und heute schon ein JUnit Quicki zum sortieren mit stream sorted und kein Raspberry Pi Thema.

Der JUnit Test: „Java Quickie: Gestern coole 20 Jahr Feier und heute schon ein JUnit-Test mit stream sorted ;-)“ weiterlesen
Heute vor 20 Jahren, am 1.12.1998 ging die Domain wenzlaff.de zum ersten mal ans Netz. Wie die Zeit vergeht.
Es war eine statische Webseite mit Freeware und Sprüche Datenbank mit Newsletter und einigen C++ und Java Programmen zum kostenlosen Download aus meiner Hand. Hier ein etwas unvollständiges Bildschirmfoto, mehr habe ich leider nicht mehr gefunden:



Aber auch schon lange vor dieser Zeit, hatte ich eine Homepage, die aber dann auf den Servern der UNI-Bremen kostenlos gehostet wurde. Da hatte ich als Informatiker einen Zugang mit Akustikkoppler mit 300 Baud und Lochkarten hatten wir da auch noch. Das war wenigstens etwas zum anfassen, batches mit Lochkarten schreiben, cool!
Und es gab keine Werbung im Internet.
Die schöne alte Zeit. Und in der Zwischenzeit gab es immer mal neue Technologie. Vom statischen html zum xhtml und JavaScript über einen eigenen Java html Generator mit Templates bis heute zu den Content-Management-System mit eigener Datenbank.
Bis heute konnte ich auch auf dieser Webseite immer auf Werbung verzichten. Juhu …
Wie soll es weiter gehen? Gibt es noch Themen nach über 1000 Beiträgen? Ideen habe ich noch genug, was fehlt ist die Zeit!
In diesem Sinne, vielen Dank an alle Leser und für das viele Feedback (die über 1000 Kommentare mit Kommentarfunktion habe ich ja abgeschaltet…DSGVO läßt grüßen) das auch nach wie vor erwünscht ist, aber eben über E-Mail 😉
Ab Java 8 kann mit der forEach Methode über einen Stream iteriert werden und das mit Lambdas.
Hier mal eine Gegenüberstellung als JUnit Test:
|
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 |
@Test public void streamForEachVsForCollectionTest() { // Liste mit Mindmaps erstellen List<Mindmap> maps = new ArrayList<>(); // Mindmap 1 erstellen und der Liste hinzufügen Mindmap m1 = new Mindmap(); m1.setPath(Paths.get("mindmap-eins.itmz")); maps.add(m1); // Mindmap 2 erstellen und der Liste hinzufügen Mindmap m2 = new Mindmap(); m2.setPath(Paths.get("mindmap-zwei.itmz")); maps.add(m2); System.out.println("Altes iterieren mit for Schleife:"); List<Mindmap> ergebnis = new ArrayList<>(); // in for-Schleife Ergebnis anzeigen und Ergebnis der Liste hinzufügen for (Mindmap mindmap : maps) { System.out.println(mindmap); ergebnis.add(mindmap); } assertArrayEquals(maps.toArray(), ergebnis.toArray()); ergebnis.clear(); System.out.println("Neu mit Stream API von Java 8 iterieren:"); // iterieren mit forEach über eine Collection von Mindmaps und Lambda // expressions maps.stream().forEach(mindmap -> { System.out.println(mindmap); ergebnis.add(mindmap); }); assertArrayEquals(maps.toArray(), ergebnis.toArray()); } |
Und das Mindmap BE: „Java Quickie: Iterieren mit forEach über eine Collection (von Mindmaps) mit Lambda expressions“ weiterlesen
Mit der Methode isReachable aus der Klasse InetAddress kann seit Java 1.5 leicht überprüft werden (via Echo) ob ein Rechner bzw. Domain erreichbar ist oder „lebt“. Als Parameter wird die Timeout Zeit in Millisekunden übergeben, hier also 1000 für eine Sekunde:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@Test public void testIsDomainErreichbar() throws Exception { String domain = "kleinhirn.eu"; boolean isErreichbar = InetAddress.getByName(domain).isReachable(1000); assertTrue(isErreichbar); } @Test(expected = IllegalArgumentException.class) public void testIsDomainErreichbarExc() throws Exception { String domain = "kleinhirn.eu"; boolean isErreichbar = InetAddress.getByName(domain).isReachable(-1000); assertTrue(isErreichbar); } |
Eine IOException gibt es bei Netzwerkfehler. Und eine IllegalArgumentException wenn ein negativer Wert für den Timeout angegeben wird, das macht man ja auch nicht 😉
Wie kann die IP von einem Domain Namen ermittelt werden? Das geht mit einer Zeile InetAddress.getByName aus dem java.net.InetAddress Package schon seit JDK 1. Wenn die Domain unbekannt ist gibt es eine UnknownHostException wie diese JUnit Tests zeigen:

|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@Test public void testGetIpFromDomain() throws Exception { String domain = "kleinhirn.eu"; InetAddress ip = InetAddress.getByName(domain); assertEquals("81.169.145.74", ip.getHostAddress()); } @Test(expected = UnknownHostException.class) public void testGetIpFromUngueltigeDomain() throws Exception { String domain = "kleinhirn.fehler"; InetAddress ip = InetAddress.getByName(domain); assertEquals("81.169.145.74", ip.getHostAddress()); } |
Bisher hatte ich alle öffentlichen Repositorys in GibHub liegen. GitHub ist nun aber an Microsoft verkauft worden. Wenn das kein Grund ist, das nächste Repo mal in GitLab anzulegen. GitLab hat auch den Vorteil, das private Repos kostenlos sind und …
Also das FreeMarker-Maven-Java-Projekt nach GitLab hochladen.
Was etwas suche und Anpassung benötigte, war der CI-Prozess. Aber wenn man die Syntax der .gitlab-ci.yml kennt, geht es mit zwei Zeilen.
Also einen Docker-Container mal mit Java 11 und Maven, wie folgt erstellt: „Raspberry Pi FreeMarker Java and Maven Project goes to 去 يذهب إلى GibLab and not to GitHub“ weiterlesen
Es gibt unterschiedliche Template Engine, wie zum Beispiel Apache Velocity aber auch Apache Freemarker.
Bei der Verwendung von Templates, kann man sich einfach auf die Präsentation der Daten konzentrieren. Das läuft nach dem MVC (Model View Controller) Pattern. Die Templats können auch über diesen Online FreeMarker Template Tester ohne Aufwand getestet werden.
Heute mal ein kleines Beispiel, mit Freemarker. Wir wollen Verzeichnisse nach Mindmaps durchsuchen, und alle gefundenen Mindmaps in eine HTML-Seite ausgeben.
Fangen wir mit einem JUnit Test an: „Es muss ja nicht immer Apache Velocity sein, Apache FreeMarker geht auch!“ weiterlesen
Seit Java 7 gibt es den WatchService zum überwachen von Verzeichnissen auf System-Ebene. Der WatchService übernimmt direkt die Eventaufrufe des Betriebssystems und ist damit vergleichbar mit einem Low-Level-Event.
Damit kann man in ein paar Zeilen Code, zum Beispiel benachrichtigt werden, wenn eine neue Datei im Verzeichnis hinzugefügt wird.
Das wir mit der Konstanten StandardWatchEventKinds.ENTRY_CREATE angegeben. Es gib aber auch noch welche fürs löschen oder verändern. Die Konstanten können dann auch verknüpft werden.
Für die Verwendung muss das Package java.nio.file.* importiert werden. Hier der Beispiel Code, der das „input“ Verzeichnis des Users überwacht, der auch auf einem Raspberry Pi läuft 😉
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
String rootVerzeichnis = System.getProperty("user.dir"); Path inputPath = Paths.get(rootVerzeichnis, "input"); WatchService watchService = FileSystems.getDefault().newWatchService(); inputPath.register(watchService, StandardWatchEventKinds.ENTRY_CREATE); WatchKey key; while ((key = watchService.take()) != null) { for (WatchEvent<?> event : key.pollEvents()) { String neueDatei = event.context().toString(); // neueDatei enthält den Dateinamen der zugfügten Datei } key.reset(); } |
Mit Java kann man leicht aus einem Text eine MP3 Datei erstellen. Dazu braucht man sich nur einmal auf voicerss.org anmelden und eine API-Key generieren.
Dann einfach das Java SKD von hier runter laden. Das Zip dann auspacken und die voicerss_tts_3.jar dem Classpath hinzufügen. Dann dieses Beispiel Programm ausführen und den API-Key eintragen:
|
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 50 51 52 53 54 55 56 57 |
package de.wenzlaff.sound; import java.io.FileOutputStream; import com.voicerss.tts.AudioCodec; import com.voicerss.tts.AudioFormat; import com.voicerss.tts.Languages; import com.voicerss.tts.VoiceParameters; import com.voicerss.tts.VoiceProvider; /** * Beispiel für Text to MP3 Datei. * * Lib Download von http://www.voicerss.org/sdk/java.aspx * * @author Thomas Wenzlaff * */ public class Start { private static final String TEXT = "Hallo Thomas, das ist aber cool! Ich finde Java gut. Damit kann man sehr einfach eine MP3 Datei erstellen."; private static final String MP3_DATEI_NAME = "thomas-cool.mp3"; private static final String API_KEY = "TODO API Key eintragen"; public static void main(String[] args) throws Exception { textToMp3(TEXT, MP3_DATEI_NAME); } /** * Methode erstellt eine MP3 Datei aus dem Text * * @param text der Inhalt der MP3 Datei * @param dateiname der Name der MP3 Datei * @throws Exception bei Fehler */ private static void textToMp3(String text, String dateiname) throws Exception { VoiceProvider tts = new VoiceProvider(API_KEY); VoiceParameters params = new VoiceParameters(text, Languages.German); params.setCodec(AudioCodec.MP3); params.setFormat(AudioFormat.Format_44KHZ.AF_44khz_16bit_mono); params.setBase64(false); params.setSSML(false); params.setRate(0); byte[] voice = tts.speech(params); FileOutputStream fos = new FileOutputStream(dateiname); fos.write(voice, 0, voice.length); fos.flush(); fos.close(); } } |
Hier dann das Ergebnis direkt zum abspielen
in deutscher Sprache und Mono.
„Text to MP3 per Java in 10 Minuten“ weiterlesen
Es kommt beim löschen eines BEs mit Hibernate zu folgenden Error:
„Cannot delete or update a parent row: a foreign key constraint fails„.
Im BE gibt es mehrere OneToMany Verbindungen wie z.B. diese

„Hibernate: Cannot delete or update a parent row: a foreign key constraint fails“ weiterlesen
Ein REST-Client ist in zwei Zeilen mit Spring schnell geschrieben. Früher war es komplizierter! Hier mal eine JUnit-Testklasse: „Finale der Weltmeisterschaft 2018: REST Client in zwei Zeilen mit org.springframework.web.client.RestTemplate“ weiterlesen