Die Modularisierung und die damit tief eingreifenden Änderungen in das Java System führen dazu das nicht alle Java Programme auf anhieb unter Java 9 einwandfrei laufen. Unter Archlinux ist eine Paralellinstallation von verschiedenen Java Versionen gleichzeit möglich.

Installation Java 9

pacman -S jdk9-openjdk

Verwaltung der Java Versionen

Die verschiedenen Versionen verwaltet Arch Linux über eine kleines Skript (/usr/bin/archlinux-java). Die aktuell vorhandenen Versionen und aktivierte Version kann man über status anzeigen lassen.

[sascha@Laptop ~]$ archlinux-java status
Available Java environments:
java-8-jdk (default)
java-9-jdk
java-9-openjdk

Das Skript passt die Links /usr/lib/jvm/default und /usr/lib/jvm/default-runtime. Die Links sollten nur über das Hilfsskript aktualisiert werden.

Programme mit einer anderen Java Version starten

Programme die nur mit einer bestimmten Version starten können weiterhin mit Hilfe der Umgebungsvariablen gestartet werden. Hierzu kann wiederum ein kleines Skript genutzt werden.

#!/bin/sh
export PATH=/usr/lib/jvm/java-8-openjdk/jre/bin/:$PATH
exec "$@"

Auruf mit ~/bin/jre8 Pfad_zur_Anwendung Parameter

Duck DNS (www.duckdns.org) bietet eine einfache, schnelle und vor allem eine kostenlose Möglichkeit ein DNS Eintrag zu erhalten. Eine Registration ist nicht nötig, wenn man z.B. über einen Google Account (OAuth2) verfügt. Hier genügt es sich mit dem Button anzumelden.

Unter dem Link “install” finden sich für die gängigsten Router, Betriebssystem und weitere Programme Installationsanleitungen.

Beispiel Fritzbox mit 2 SubDomains

  • Anmeldung an der Fritzbox
  • Internet –> Freigaben –> Dynanic DNS
  • Benutzerdefiniert
  • Benutzername ist die Emailadresse mit der man sich registriert hat
  • Domainname eine der SubDomains eintragen
  • Update URL –> https://www.duckdns.org/update?domains=SubDomain1,SubDomain2&token=XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&ip=<ipaddr>&ipv6=<ip6addr>

Es muss nur die SubDomain angegeben werden. Mehrere Domains können per Komma getrennt gelistet werden. Den Update-Link inklusive Token aus der Installastionsanleitung kopieren und die Domains anpassen. ipaddr und ipv6addr sind Platzhalter in der Fritzbox und müssen genauso übergeben werden.

Ist auf dem Linuxsystem keine passende Version für einen Renderer von HTML Seiten vorhanden, so können Webseiten innerhalb der Eclipse Workbench nicht angezeigt werden und der Container zeigt nur eine Fehlermeldung an. Der Xulrunner ist noch nicht auf GTK3 portiert und wird auch nicht mehr weiter entwickelt.

Daher verwende ich den Webkit2 als Renderer. Dazu muss die eclipse.ini der Workbench angepasst werden und webkit2 (webkit2gtk) installiert werden.

Eclipse.ini

-Dorg.eclipse.swt.browser.DefaultType=webkit

Unter Arch Linux muss webkit2 installiert werden

pacman -S webkit2gtk

Verwendet man eine ältere Version des Gradle Wrapper, so kann Gradle –> Refresh Gradle Project folgender Fehler in Eclipse angezeigt werden

unbound classpath container: 'JRE System Library [JavaSE-1.9]' in project 'XXX'

Ursache ist das Eclipse keine JRE für Java 9 finden kann. Es hat sich in Eclispe das Namensschema geändert, so dass eine installierte Java 9 JRE nicht erkannt wird bzw. einen anderen Namen bekommt. Updated man den Wrapper, dann wird beim aktualisieren des Projektes die neue Schreibweise [JavaSE-9] in Eclipse eingetragen und somit auch die JRE erkannt und der Fehler unbound classpath container verschwindet.

Gleiche gilt auch für die neueren Versionen von Java 10 und 11.

Siehe Artikel Wrapper aktualisieren

Gradle Wrapper aktualisieren

Der gradle-wrapper kann mit

./gradlew wrapper --gradle-version=4.3.1 --distribution-type=bin

aktualisiert werden. Es wird in der gradle-wrapper.properties die URL angepasst. Die aktuellste Version kann unter Gradle gefunden werden.

Java 9

Ältere Versionen des Wrappers laufen nicht unter Java 9. Wenn auf dem System gradle installiert ist kann mit:

gradle wrapper --gradle-version=4.5.1
gradle --version

der Wrapper auf eine aktuelle Version angehoben werden. Dies funktioniert auch unter Java 9. Die eigentliche Aktualisierung erfolgt erst bei aufruf des Wrappers mit z.B. ./gradlew –version.

Aggregatfunktionen in SQL

In den meisten DBMS werden SQL Aggregatfunktionen zusammen mit der GROUP BY Funktion verwendet.

Beispiel einer Mehrfachaggregation mit COUNT

Geben sei eine Tabelle Produkte.

  • product_id
  • artNr
  • product_type_id
  • price

Über die Tabelle Produkte sollen verschieden Aggregatsfunktionen ausgeführt werden (Hier das zählen von Vorkommen). Eine Möglichkeit ist sicherlich die Ergebnisse in dedizierten Abfragen zu ermitteln. Dieses hat aber auch 4 Ergebniszeilen zur Folge.

---Anzahl der Produkte
SELELCT COUNT(*) FROM Produkte

---Anzahl der Produkt mit artNr > 1000
SELECT COUNT(*) FROM Produkte WHERE artNr > 1000

---Anzahl der Produkte die von Typ 3 sind
SELECT COUNT(*) FROM Produkte WHERE product_type_id = 3

---Anzahl der Produkte die von Typ 3 sind und eine ArtNr > 1000
SELECT COUNT(*) FROM Produkte WHERE product_type_id = 3 AND artNr > 1000

Diese einzelnen Abfragen sollen als Gesamtergebnis in einer Zeilen ausgeben werden!

10000 60 200 23

Wie kann man nun aber das in eine Abfrage verpacken? Dazu schauen wir uns die Definition der COUNT Anweisung an.

Es werden alle Zeilen gezählt in dem das Argument nicht NULL ist.

Es kann mit Hilfe der CASE-Anweisung können wir hieraus einzelne Prädikate/Vorbedingungen erstellen. p1 und p2.

SELECT
    CASE WHEN artNr > 1000        THEN 1 END p1,
    CASE WHEN product_type_id = 3 THEN 1 END p2
FROM products

Da kein ELSE Block angegeben ist, gibt CASE standardmäßig NULL zurück.

Das ganz Konstrukt sieht dann wie folgt aus:

SELECT count(*) AS cnt,
    count(p1) AS grt1000,
    count(p2) AS type3,
    count(p1+p2) AS combined FROM (
        SELECT
               CASE WHEN artNr > 1000 THEN 1 END p1,
               CASE WHEN product_type_id = 3 THEN 1 END p2
        FROM products)
products

Jetzt zählt count jede Reihe der Tabelle in denen die zuvor definierten Vorbedingungen gelten. Heraus kommt eine Ergebnisreihe. Da hier genau ein Full Table Scan erforderlich ist, kann dieses gerade bei größeren Tabellen auch zur Optimierung von Abfragen verwendet werden.

Wenn ein Projekt in Eclipse als Gradle Projekt geführt wird, dann lässt sich dieses nicht per ALT + SHIFT + R einfach umbennen.

Hinweis: Dieses gilt nur wenn der Projektname in der .settings Datei von Gradle festgelegt wird.

Eclispe hat dann ein Problem das Projekt zu synchronisieren und bringt eine Fehlermeldung…

org.eclipse.buildship.core.UnsupportedConfigurationException: Project at '/home/sascha/Eclipse/Workspaces/DW2/demo13' can't be named 'Demo2' because it's located directly under the workspace root. If such a project is renamed, Eclipse would move the container directory. To resolve this problem, move the project out of the workspace root or configure it to have the name 'demo13'.

Hier stimmen die Namen des Projektes in Eclipse mit dem Projektnamen in der Settingsdatei nicht überein. Die Lösung ist zunächst die Namen gleichzustellen und dann das Gradleprojekt zu aktualisieren.

rootProject.name = 'demo13' //

Gradle --> refresh gradle project

Danach kann in der Settingsdatei der neue Name eingetragen werden und erneut aktualisiert werden. Jetzt benennt Eclipse das Projekt erfolgreich um.