Bash-Loops

Im Ernst, bash? array=( one two three ) for i in "${array[@]}" do echo "$i" done

Inno-Setup-Installer

Nach dem NSIS-Debakel der nächste Versuch, diesmal mit Inno Setup, ebenfalls Open Source und Freeware, aber nicht plattformunabhängig. Zum Glück gibt es amake, der ein Docker-Image für Inno-Setup gebastelt hat und per Docker-Hub zur Verfügung stellt. Das ist sogar noch komfortabler, da so die gleiche Umgebung überall zur Verfügung steht. Technisch ist das ein Linux, auf dem Inno Setup mittels Wine läuft, sagen wir so: gut dass ich das nicht...

NSIS-Installer

Seit einiger Zeit versuche ich schon, einen Windows-Installer für das Gebu-Programm zu erstellen. Dafür gibt es erstaunlich wenig Alternativen: im Endeffekt NSIS, WiX und Inno Setup, die überhaupt in die nähere Auswahl kommen. Nähere Auswahlkriterien: Freeware, Open Source und Multiplattform – da bleibt dann nur NSIS übrig. Also hab ich mich damit auseinandergesetzt, seit 2011 arbeite ich mit NSIS für ein berufliches Projekt, sollte ja gelacht sein, wenn ich das...

Ärgerlicher „Bug“ in Javas Files-API

Mannomannomann. Da debuggt man eine Stunde für einen Fehler, der m.E. im Design der Java-Files-API liegt. Erwartungshaltung vs. implementierte Realität. Wenn ich schreibe: Files.writeString(file, content, StandardOpenOption.CREATE, StandardOpenOption.WRITE); dann erwarte ich, dass eine neue Datei angelegt wird, falls sie noch nicht existiert, dass der Inhalt "content" in die Datei geschrieben wird und diese danach nur diesen Inhalt enthält. Aus mir unerfindlichen Gründen hat sich das Java-Team aber dafür entschieden, dass der...

Java-Stream-API

Weil ich gestern das Script hatte: die Stream-API von Java ist schon geil für einige Anwendungsfälle. Kurz, prägnant und lesbar. Ausschnitt vom Code gestern: einmal Pfad bis in die Unterverzeichnisse traversieren und die Dateien bearbeiten: try (Stream<Path> paths = Files.walk(pathSource)) { paths .filter(Files::isRegularFile) .filter(path -> path.toString().endsWith(EXTENSION)) .forEach(path -> processFile(path, args[1], Integer.parseInt(args[2]))); } Gerade das Filter-Map-Reduce-Pattern macht was her (Map ist im Beispiel nicht dabei). Aber ich finde es nicht einfach...

Java als Scriptsprache

Mal etwas anderes als Filme: Seit Java 11 kann man Java als Scriptsprache einsetzen, das heißt, direkt eine Java-Datei aufrufen. Im Endeffekt schreibt man eine Klasse mit main-Methode, die die Arbeit erledigt (man kann wohl mehrere Klassen in eine Datei packen, aber wer macht sowas). Was rauskommt, ist typisches Scripting der ersten Stunde: Spaghetticode, der eine Aufgabe erledigt und nicht wiederverwendet werden kann. Wenn man sich dessen bewusst ist, ist...

xjc: fehlender Modul-Export

xjc 2.3.2 liefert mir eine Exception wegen eines fehlenden Modul-Exports von com.sun.tools.xjc zu com.sun.xml.bind. Der Fehler ist im Git gefixt, seitdem gab es noch kein neues Release, also hab ich xjc selbst kompiliert. Vorgehen siehe https://ekkart.de/computer/programmierung/java/jaxb/ Vielleicht nützt das ja jemandem bis zum nächsten Release.

Java import-Fehler von QName

Die Umstellung von Java 8 auf Java 9+ ist ja sowieso schon mühselig, wenn man aber ganz exotische Fehler bekommt... Bei mir ging folgender Import nicht: import javax.xml.namespace.QName; Erstaunlicherweise ist QName eine Java-Standardklasse, sie wurde per Autocomplete auch gefunden, dann aber als not found gekennzeichnet. Der Fehler war, dass im Classpath die Maven-Abhängigkeiten vor der JRE-Library standen. Wenn man das ändert (in eclipse bei Java Build Path und Order/Export vertauschen, auch...

Get checked items of a TreeView in JavaFX

JavaFX provides an easy way to implement Java GUIs. Unfortunately, some methods or concepts are missing. I used a TreeView component with CheckBoxTreeItems. When evaluating the input I want to get all checked items from the TreeView, resp. its SelectionModel. The standard method getSelectedItems just returns the selected items, when selecting means the last clicked (i.e. selected) element. Thus I had to write my own code for traversing the tree...