In Java 1.8 gibt es einen neue schöne static join Methode, es braucht nur ein Begrenzer angegeben zu werden und schon wird ein schöner String zusammengebaut.
Hier mal ein kleines Beispiel:
Was für neue schönen Methoden hast Du entdeckt?
mit Java, Raspberry Pi, SDR, Linux, Arduino, Sicherheit, Blender, KI, Statistik, Krypto und Blockchain
In Java 1.8 gibt es einen neue schöne static join Methode, es braucht nur ein Begrenzer angegeben zu werden und schon wird ein schöner String zusammengebaut.
Hier mal ein kleines Beispiel:
Was für neue schönen Methoden hast Du entdeckt?
Die Telekom hat es nun auch geschaft, eine von mir gemeldete Sicherheitslücke in ihren Prepaid Karten zu erwähnen. Auch wenn die Sicherheitslücke von tausenden Betroffenen Karten als Verpackungsfehler (verschleiern) deklariert wird.
Aber immerhin gibt es in der Hall auf Fame ( http://www.telekom.com/sicherheit/danke ) eine Danksagung:
Die Seite ist auch am 5.5.2017 im neuen Layout noch sichtbar, aber unter einer neuen Adresse und das sogar mit https 😉 „Gemeldete Telekom Sicherheitslücke mit Prepaid Karten nun auch in der „Hall of Fame“ vermerkt“ weiterlesen
In Java 1.8 gibt es das neue Schlüsselwort default. In Eclipse Neon wird dies auch unterstüzt.
So kann eine default Methode in einen interface erstellt werden:
Sie kann dann so verwendet werden:
In Eclipse ist sie an dem kleinen D erkennbar. Die default implementierung kann auch vererbt werden.
Hier eine schöne Aufzählung der Neuerungen der neuen Eclipse Neon Version.
Cool:
Content Assist now supports substring patterns. Enter any part of the desired proposal’s text, and Content Assist will find it! For example, completing on selection proposes all results containing selection as a substring.
The Refactor > Rename popup now shows an Options… link which opens the full Rename dialog that provides more options like renaming a field’s getter and setter methods.
You can now select multiple elements in views like Package Explorer and Outline and then search for References, Declarations, Implementors, and Read/Write Access (where applicable):
Der gute BPMN 2.0 Modeler von Camunda:
Bricht leider bei der Installation ab mit diesem Fehler: „Camunda BPMN 2.0 Modeler 2.7.1 läuft leider noch nicht mit Eclipse Neon 4.6.0“ weiterlesen
Nach dem ssh Login, kommt bei mir diese oder ähnliche Fehlermeldungen auf der Konsole:
1 2 3 |
-bash: /usr/share/bash-completion/bash_completion: line 1942: unexpected EOF while looking for matching `"' -bash: /usr/share/bash-completion/bash_completion: line 1957: unexpected token `�' in conditional command -bash: /usr/share/bash-completion/bash_completion: line 1957: syntax error: unexpected end of file |
Wie können die Fehler gefixt werden?
Einfach das bash_completion Package neu installieren mit:
1 |
sudo apt-get install bash-completion |
Schnell und einfach!
Normalerweise habe ich die Antenne drinnen. Da es heute aber so schön ist, wird sie mal draußen angebracht
und schon ist der Empfang fast doppelt so groß und fast 300 Km weit:
oder hier
Hier auf Twitter kann jeder in Echtzeit mit 5 Minuten Verzögerung die Anzahl ablesen, da ein Raspberry Pi über node-red die Ergebnisse postet:
Anzahl #Flugzeuge in #Hannover (#HAJ #EDDV) 51 angefragt per #ADSB am Sat Jun 04 2016 17:26:28 GMT+0200 (CEST) per #Raspberry #Pi
— Thomas Wenzlaff (@twusb) 4. Juni 2016
Wie können Flugdaten mit dem Raspberry PI und node-RED auf Twitter alle 5 Minuten ausgegeben werden? Und wie kann eine einfach Gui erstellt werden?
Mit diesen Node-RED Flow, werden die Flugdaten von thinkspeak.com eingelesen (die Daten kommen von eine meiner Raspberry Pis und können frei verwendet werden) und alle 5 Minuten an Twitter gesendet.
Die Funktion die den Text für Twitter erstellt, kann diesen Inhalt haben:
1 2 3 4 5 6 7 |
var newMsg = { payload: msg.payload + " #Flugzeuge im Umkreis von #Hannover (#HAJ #EDDV #Airport) Abfrage per #ADSB am " + new Date() + " mit #Raspberry Pi" }; return newMsg; |
Hier die node-red GUI, die über die Url http://pi-adresse:1880/ui/ geöffnet wird:
Hier werden an Twitter die Daten alle 5 Minuten hingesendet, bitte folgen:
Anzahl #Flugzeuge in #Hannover (#HAJ #EDDV) 18 angefragt per #ADSB am Tue May 31 2016 21:50:48 GMT+0200 (CEST) per #Raspberry #Pi
— Thomas Wenzlaff (@twusb) 31. Mai 2016
Hier kann der Flow importiert werden:
Die node-red Admin Konsole kann im Terminal wie folgt installiert werden:
1 |
sudo npm install -g node-red-admin |
Ergebnis nach ein paar Minuten: „Wie kann die node-red-admin Konsole auf den Raspberry Pi installiert werden?“ weiterlesen
Einen solchen Flow mit node-RED erstellen:
Die Ausgabe der Flugzeuge in Hannover wird rechts im Debug Reiter und auf der Console des Raspberry Pi ausgegeben.
Oder über import - clipboard
diesen Flow aus der Datei flow.json importieren: „Raspberry Pi mit node-red: Wie können Flugdaten automatisch alle 5 Minuten abgefragt werden?“ weiterlesen
Meine Hausautomatisation die auf einen Raspberry Pi mit Debian Linux läuft, arbeitet mit Openhab.
Wie können da nun die Transpondersignale von den Flugzeugen in Hannover (EDDV) angezeigt werden?
Das geht mit der REST Schnitstelle von ThinkSpeak.
So sieht die Seite von Openhab aus.
Oben wird die aktuelle Anzahl von Flugzeugen und der Zeitpunkt der Daten die gerade empfangen werden angezeigt. Eine automatisch Aktualisierung ist bei mir auf 15 Minuten eingestellt. Der Feed wird alle 5 Minuten aktualisiert und wenn man die letzten Daten angezeigt bekommen will, braucht man nur auf den „aktualisieren“ Schalter klicken.
Die Daten kann jeder abfragen, da die API von ThinkSpeak öffentlich ist!
Was ist nötig?
Ein Eintrag in der Sitemap Datei:
1 2 3 4 5 6 7 8 9 10 11 |
Frame { Group item=gFlug label="Fluginfos" icon="flugzeug"{ Frame label="Hannover HAJ (EDDV)" { Text item=flugzeugeAnzahl icon="flugzeug" Text item=flugzeugeUpdate icon="flugzeug" Switch item=flugzeugeAktualisieren icon="flugzeug" Text item=flugzeugeZeitpunkt icon="flugzeug" } } } |
Eine neue Datei im Items Verzeichnis Flug.items mit diesm Inhalt:
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 |
// // Steuerung des Fluginformationen via OpenHAB // // (c) 2016 Thomas Wenzlaff http://www.wenzlaff.info // // Liefert aus den Feed die Anzahl Flugzeuge als Json Feed // https://api.thingspeak.com/channels/44177/feeds/last.json // // z.B. // {"created_at":"2016-05-16T14:05:02Z","entry_id":80051,"field1":"15"} Group gFlug // alle 15 Minuten abfragen String flugzeugeAnzahl "Anzahl Flugzeuge [%s]" { http="<[https://api.thingspeak.com/channels/44177/feeds/last.json:900000:JS(getAnzahlFlugzeuge.js)]" } // Zeitpunkt der letzten aktualisierung des Feeds String flugzeugeUpdate "Letztes Feed update [%s]" // Zeitpunkt der letzen aktualisierung String flugzeugeZeitpunkt "Letzte aktualisierung [%s]" // Schalter zum aktualisieren der Anzahl der Flugzeuge Switch flugzeugeAktualisieren "aktualisieren" |
Eine neue Datei im Transform Verzeichnis mit Namen getAnzahlFlugzeuge.js mit diesem Inhalt
1 |
JSON.parse(input).field1; |
Und noch eine Flug.rules im Rules Verzeichnis, die bei klick auf den Schalter aktiv wird:
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 |
import org.openhab.core.library.types.* import org.openhab.model.script.actions.* import java.util.Date import java.text.SimpleDateFormat // // Fluginfos für OpenHAB // // (c) 2016 Thomas Wenzlaff http://www.wenzlaff.info // //------------------------------------------------------------------------ // Aktualisiert die Fluginfos, d.h die Anzahl der Flugzeuge aus ThingSpeak //------------------------------------------------------------------------ rule "Aktualisiert die Fluginfos von ThingSpeak" when Item flugzeugeAktualisieren received command ON then logInfo("Flug","aktualisiere Fluginfos ...") var String result = sendHttpGetRequest("https://api.thingspeak.com/channels/44177/feeds/last.json") // {"created_at":"2016-05-16T16:10:02Z","entry_id":80076,"field1":"11"}' by the function '$.field1' logInfo("Flug", "nur das Ergebnis der Abfrage: " + result) var String anzahl = transform("JSONPATH", "$.field1", result) logInfo("Flug", "Anzahl der Flugzeuge, update auf: " + anzahl) var String createdAt = transform("JSONPATH", "$.created_at", result) logInfo("Flug", "Letztes update um: " + createdAt) // aktualisierungs Datum setzen flugzeugeUpdate.postUpdate(createdAt) // aktualisiere Anzahl der Flugzeuge flugzeugeAnzahl.postUpdate(anzahl) // Schalter wieder zurücksetzen flugzeugeAktualisieren.postUpdate("OFF") var SimpleDateFormat df = new SimpleDateFormat( "HH:mm:ss dd.MM.YYYY" ) var String timestamp = df.format( new Date() ) flugzeugeZeitpunkt.postUpdate(timestamp); end |
Und noch das von mir erstellte Icon des Flugzeuges:
Dies super Icon kann kostenlos von hier geladen und frei verwendet werden. Wer kann ein besseres zur freien Verwendung zeichnen?
Manchmal möchte man Ereignisse mit Java zeitgesteuert oder wiederholt ausführen. Das geht auch mit Java Mitteln. Die bekannte java.util.Timer Klasse kann schon was. Der Open Source Framework Quartz hat ua. aber diese Vorteile:
Quartz ist ein kleiner Framework der nur quartz-x.y.z.jar im Classpath benögigt (inkl. log sl4j-api.jar, und c3p0.jar). Er kann Standalone oder im Server als J2EE Anwendung verwendet werden. Die wichtigsten drei Klassen sind Task/Job, Trigger und der Listener.
Sie spielen so zusammen:
Wie kann ein Timer in Java mit Quartz erstellt werden? „Wie kann ein Timer in Java mit Quartz erstellt werden?“ weiterlesen
Mit Java ist es nicht schwer, einen REST Client zu erstellen. Das geht mit Jersey und JDom in 3 Zeilen.
Hier nun mal ein Beispiel.
Die Anzahl der Flugzeuge in Hannover wird von mir mit einem Raspberry Pi empfangen und an thingspeak gesendet.
Diese Daten kann jeder leicht abfragen. „Anzahl der Flugzeuge mit 3 Zeilen Java Code ausgeben via REST API mit Jersey und JDom 2.0“ weiterlesen
Mal einen Docker Container von Ted Sluis mit DUMP1090 aus den Niederlande testen. Man braucht dazu keine Antenne.
Cool 164 Flugzeuge, das ist ja viel mehr, als hier in EDDV. Aber hier wird auch gestreikt. Wer wie in einem Blog-Eintrag beschrieben, docker am laufen hat, braucht nur mit einer Zeile den Container auf dem Raspberry Pi starten:
1 |
sudo docker run -d -h dump80 -p 8080:80 tedsluis/dump1090-mutability:v1.15_heatmaprangeview_arm |
„Docker Image für Dump1090-Mutability auf dem Raspberry Pi am Beispiel aus Utrecht – Niederlande in 10 min testen“ weiterlesen
Zuerst installieren wir Docker aus einem vorhandenen Archive. Optional auf http://blog.hypriot.com/downloads/ schauen, was die aktuellste Version ist. Ok, wir verwenden 1.10.3 vom 10.03.2016:
„Wie kann in 5 min Docker auf einem aktuellen Debian Jessie Raspberry Pi installiert werden?“ weiterlesen