Unterschied zwischen NOW() und SYSDATE()

Die Funktion NOW() gibt immer den Zeitpunkt aus an dem das Query gestartet worden ist. Daher liefert es auch nach 2 Sekunden Pause (s.u.) die gleiche Zeit.

Beispiel:

mariadb root@server:(none)> select now(), sleep(2), now(2);
+---------------------+----------+----------------------------+
| now()               | sleep(2) | now(2)                     |
+---------------------+----------+----------------------------+
| 2018-08-30 19:40:53 | 0        | 2018-08-30 19:40:53.240000 |
+---------------------+----------+----------------------------+
1 row in set
Time: 2.051s

mariadb root@server:(none)> select sysdate(), sleep(2), sysdate();
+---------------------+----------+---------------------+
| sysdate()           | sleep(2) | sysdate()           |
+---------------------+----------+---------------------+
| 2018-08-30 19:41:50 | 0        | 2018-08-30 19:41:52 |
+---------------------+----------+---------------------+
1 row in set
Time: 2.050s

Methode 1 Einfach

Die wohl einfachste Methode ist einfach spring.jpa.show-sql auf true zu setzen.

spring.jpa.show-sql=true

Damit das ganze lesbarer ist, kann man auch gleich die Formatierung des SQL Queries veranlassen. Das ganze wird mit spring.jpa.properties.hibernate.format_sql gesteuert. Setzt man auch dieses Wert auf treu, dann erhält man das gewünschte Ergebnis. Leider ist dieses komplett unoptimiert und geht direkt am Loggingframework vorbei. Schlimmer noch die Parameter der Prepared Statements können nicht angezeigt werden.

Methode 2 Loggingframework

Mit den Einstellungen:

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

Bekommt man das gleiche Ergebnis, aber die Ausgaben werden über das Loggingframework ausgegeben. Enums werden so aber nicht ausgegeben. Dafür muss separat folgender Schalter verwendet werden:

logging.level.org.hibernate.type.EnumType=TRACE

Installation

Die Installation von Wireguard beschränkt sich auf ein (noch out of tree) Kernelmodul und den wireguard-tools.

yaourt --noconfirm -S wireguard-dkms wireguard-tools linux-headers

Es müssen die Kernel Headers in der passenden Version zum laufenden Kernel installiert sein. Unter Manjaro Linux wird ein einfaches Schema dafür verwendet. Der Paketname lautet: linuxYYY-headers. YYY steht für die Kernelversion. Zum Beispiel: linux418-headers ist ein Paketname. Das Paket linux-headers zeigt immer auf den letzten Kernel.

Scenario

Es sollen 3 Rechner über ein privates Netzwerk 10.0.0.0/24 über das Wireguard VPN miteinander verbunden werden. Der Server am Standort A ist über eine DynDNS Adresse server.dyndns.com über das Internet erreichbar. Der Server bekommt die Adresse 10.0.0.1 im VPN. Am Standort B sollen 2 Clients mit den Adressen 10.0.0.2 und 10.0.0.3 mit dem Server verbunden werden.

Als Port wird hier in dem Beispiel 33333 verwendet. Der Port ist frei wählbar. Der Port muss bei NAT am Router auf die entsprechende IP Adresse im internen Netz zeigen. Wireguard verwendet das zustandslose Protokoll UDP.

Schlüssel anlegen

1. Schritt

Als Root die Dateien publickey und wg0.conf anlegen. Diese werden auf allen Maschinen benötigt und bilden die gemeinsame Basis für die Konfiguration von Wireguard.

cd /etc/wireguard
umask 077
printf "[Interface]\nPrivateKey = " > wg0.conf
wg genkey | tee -a wg0.conf | wg pubkey > publickey
mcedit /etc/wireguard/wg0.conf

2. Schritt

Konfiguration Server

[Interface]
PrivateKey = DiesesIstDerGeneriertePrivateKey=
ListenPort = 33333
Address = 10.0.0.1/24

[Peer]
PublicKey = DiesesIstDerPublicKeyDesClients1=
AllowedIPs = 10.0.0.2/32

[Peer]
PublicKey = DiesesIstDerPublicKeyDesClients2=
AllowedIPs = 10.0.0.3/32

Konfiguration Clients

Client 1
[Interface]
PrivateKey = DiesesIstDerGeneriertePrivateKey=
ListenPort = 33333
Address = 10.0.0.3/24

[Peer]
PublicKey = DiesesIstDerPublicKeyDesClients1=
AllowedIPs = 10.0.0.1/24
EndPoint = server.dyndns.com:33333
Client 2
[Interface]
PrivateKey = DiesesIstDerGeneriertePrivateKey=
ListenPort = 33333
Address = 10.0.0.3/24

[Peer]
PublicKey = DiesesIstDerPublicKeyDesClients2=
AllowedIPs = 10.0.0.1/24
EndPoint = server.dyndns.com:33333

Service aktivieren

sudo systemctl enable wg-quick@wg0

Service neustarten

sudo wg-quick down wg0; sudo wg-quick up wg0

Achtung: Wenn man Änderung auf einem entfernten PC durchführt und für die Verbindung Wireguard verwendet, so sollte man auf jeden Fall die Konfiguration doppelt prüfen. Kommt es zu einem Fehler, dann sperrt man sich selbst aus.

IPv4 Forwarding

Ich bevorzuge die Aktivierung des Forwarding nur für das wg0 Interface freizuschalten.

  • Für alle Interfaces

    sysctl net.ipv4.ip_forward=1

  • Nur für Wireguard IPv4-forwarding erlauben

    sysctl net.ipv4.conf.wg0.forwarding=1

Persistierung der Einstellung Forwarding

Die Datei /etc/sysctl.d/30-ipforward.conf mit folgenden Inhalt anlegen:

net.ipv4.ip_forward=1    

Überprüfung Einstellung

Nach einem Neustart kann die Verarbeitung der Datei mit sysctl -a überprüft werden.

sudo sysctl -a | grep net.ipv4.conf.wg0.forwarding

Fehlerbild

Beim Starten einer Spring Boot Anwendung unter JDK11 (Java 11 Umgebung) kommt es zu einer Fehlermeldung. Es betrifft auch das letzte Release 2.0.4.RELEASE.

Caused by: java.lang.NullPointerException: null
    at javassist.util.proxy.SecurityActions.setAccessible(SecurityActions.java:103) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.DefineClassHelper.toClass3(DefineClassHelper.java:151) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.DefineClassHelper.toClass2(DefineClassHelper.java:134) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.DefineClassHelper.toClass(DefineClassHelper.java:95) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.FactoryHelper.toClass(FactoryHelper.java:131) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.ProxyFactory.createClass3(ProxyFactory.java:530) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.ProxyFactory.createClass2(ProxyFactory.java:515) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.ProxyFactory.createClass1(ProxyFactory.java:451) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.ProxyFactory.createClass(ProxyFactory.java:422) ~[javassist-3.22.0-GA.jar:na]
    at org.hibernate.proxy.pojo.javassist.JavassistProxyFactory.postInstantiate(JavassistProxyFactory.java:75) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:162) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:156) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:58) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    ... 46 common frames omitted

Ohne Änderung läuft die Anwendung unter JDK10 fehlerfrei.

Ursache der NullPointerException

Diese lässt sich auf einen Fehler in javassist zurückführen. Siehe issue 194 für weitere Informationen.

Fehler wurde in neuer GA gefixt

Der Fehler in javassist wurde mit 3.23.1-GA behoben. Als Workaround (dieser kann unerwünschte Seiteneffekte besitzen) kann man die Dependency in dem POM überschreiben.

Gradle

Mit Gradle muss bei der Verwendung des Spring Boot Dependencies Management Plugins im Abschnitt Dependencies javassist eingefügt werden. Das Einfügen überschreibt die impleziete Abhängigkeit von Spring-Boot-Data-JPA.

dependencies {
    // Override javassist version 3.22.0-GA from spring-boot-starter-data-jpa.
    // This fixes javassist runtime error with JDK11.
    // See https://github.com/jboss-javassist/javassist/issues/194
    compile('org.javassist:javassist:3.23.1-GA')
}

Mit gradle dependencies kann die Änderung leicht geprüft werden:

./gradlew clean dependencies | grep javassist
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
\--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA

Ein aktueller Status von dem Projekt Lombok

Hier ein kurzer Zwischenbericht über den aktuellen Stand JDK, Eclipse (STS4 Version), Gradle mit Lombok.

JDK10

Als Vorbereitung Java 10 installieren…

yaourt --noconfirm -S jre10-openjdk-headless jre10-openjdk jdk10-openjdk openjdk10-doc openjdk10-src

08.08.2018

Eclipse STS4 in M12 ist entpackt. Ich habe die aktuellste Version von Lombok mit dem integrieren Installer installiert. Auf dem Arch Linux System wird hier der absolute Pfad eingetragen. Leider gibt es folgenden Fehler:

16.08.2018

Hurra! Es ist geschafft. Endlich läuft Eclipse mit Gradle und Lombok unter einer Java Version > 8 !!! Aktuell verwende ich das letzte Milestone-Release M14 der STS14 mit der letzten Version v1.18.2 und der letzten Gradle Version 4.9.

JDK11

16.08.2018

Achtung: es gibt kein offizielles Paket für die EA-Version. Man findet sie auch nicht so leicht im AUR, da dass Paket jdk-devel heißt. Besser wäre jdk11-ea. Dann würde mann es mit yaourt -s jdk11 auch als EA finden.

yaourt --noconfirm -S jdk-devel
sudo archlinux-java set java-11-jdk

Auch hier gibt es offenbar keine Probleme mehr…

Installation

yaourt -S --noconfirm smartgit

Openrepo

Oft bewegt man sich in der Konsole in einem Git Repository und möchte dieses mit SmartGit verwenden. Normalerweise öffnet man SmartGit und verwendet Open Repository um ein existierendes Repository zu öffnen. Es gibt aber den CLI Parameter open. Dieser öffnet das Repository das als Parameter übergeben worden ist. Hier mag SmartGit keine Verzeichnisse die per Symlink geöffnet werden (z.B. Angabe von .). Das Eval von $(pwd) zur Hilfe wandelt das aktuelle Verzeichnis in einen absoluten Pfad um. Das ganze in ein Shell Skript openrepo verpackt, macht es jetzt sehr einfach ein Repository aus dem Verzeichnis heraus zu öffnen.

#!/bin/bash

#
# opens git repository in current dir in smartgit
#
smartgit --open $(pwd)

Pfade anpassen

Das Skript liegt im lokalen bin Pfad im Homeverzeichnisses (~/bin). Damit der Pfad beim starten einer shell eingebunden wird, empfiehlt es sich ein Skript local-user-bin.sh im /etc/profiles.d-Verzeichnis anzulegen mit folgendem Inhalt:

# If user ID is greater than or equal to 1000 & if ~/bin exists and is a directory & if ~/bin is not already in your $PATH
# then export ~/bin to your $PATH.
if [[ $UID -ge 1000 && -d $HOME/bin && -z $(echo $PATH | grep -o $HOME/bin) ]]
then
    export PATH="${PATH}:$HOME/bin"
fi

Java 11 wird LTS

Wichtig ist das nach den letzten Releases Java 9, 10 nun wieder eine LTS Version zur Verfügung steht. Support soll es bis 2023 geben.

Welche JEPs haben in die neue Version 11 geschafft?

  • 181 Nest-Based Access Control

  • 309 Dynamic Class-File Constants

  • 315 Improve Aarch64 Intrinsics

  • 318 Epsilon: A No-Op Garbage Collector

  • 320 Remove the Java EE and CORBA Modules Die Module Java EE und CORBA sollen entfernt werden.

  • 321 HTTP Client (Standard) Aktualisierte Version HTTP Client API.

  • 323 Local-Variable Syntax for Lambda Parameters

(var x, var y) -> x.process(y) // implicit typed lambda expression

  • 324 Key Agreement with Curve25519 and Curve448

Sicherer Austausch von kryptographischen Schlüsseln nach RFC 7748 durch Curve25519 und Curve448.

  • 327 Unicode 10

Endlich noch mehr Zeichen dank Unicode 10.

  • 328 Flight Recorder

Eventrecorder der beim Debuggen von Anwendungen nützlich sein kann.

  • 329 ChaCha20 and Poly1305 Cryptographic Algorithms

Implementierung ChaCha20 und ChaCha20-Poly1305.

  • 330 Launch Single-File Source-Code Programs

Direktes starten von Quelltextdateien! Vorraussetzung ist das das Programm aus einer einzigen Quelltextdatei besteht.

  • 331 Low-Overhead Heap Profiling

  • 332 Transport Layer Security (TLS) 1.3

Update auf Version 1.3 des Protokolls.

  • 333 ZGC: A Scalable Low-Latency Garbage Collector

Neuer GC zunächst nur für Linux-Plattform. Sehr geringe Latenzen. Schnellere Startupzeiten. Bis zu 15% schneller.

  • 335 Deprecate the Nashorn JavaScript Engine

JavaScript wird als deprecated markiert und in einem spären Releas entfernt werden.

  • 336 Deprecate the Pack200 Tools and API

Java Packer aus Java 5 zeiten. Ist nun deprecated.

Wann gibt es das GA von JDK 11?

Das finale Java 11 Release soll dann am 26. September freigegeben werden.

Benutzung von Gradle über die Kommandozeile

Das Buildsystem Gradle ist per se IDE agnostisch und daher lässt es sich natürlich über die Shell benutzen. Die weit verbreitete Linux-Shell Bash besitzt die vielseitige Autovervollstädigung über die Tabulatortaste. Da die Vervollständigung Kontextbezogen ist, werden auch nur die validen Optionen angezeigt.

Autovervollständigung für Gradle

Eric Wendelin hat nun eine Erweiterung gradle-completion für die Shells ZSH und Bash programmiert. Damit funktioniert die Autovervollständigung auch mit Gralde.

PKGBUILD für Arch basierte Distributionen

Da ich noch keine Zeit hatte es auf AUR zur Verfügung zu Stellen, hier ein PKGBUILD:

# Maintainer: MrPeacock
pkgname=gradle-completion
pkgver=1.3.0
pkgrel=1
pkgdesc="Bash and Zsh completion support for Gradle."
arch=(any)
url="https://github.com/gradle/gradle-completion"
license=('MIT')
depends=('bash' 'bash-completion')
makedepends=('git')
source=('gradle-completion::git+https://github.com/gradle/gradle-completion.git')
md5sums=('SKIP')

package() {
  mkdir -p $pkgdir/etc/bash_completion.d/
  cd gradle-completion
  cp gradle-completion.bash $pkgdir/etc/bash_completion.d/gradle-completion.bash    
}

Oder schnell installieren mit:

cd; mkdir gradle-completion; cd gradle-completion; curl https://mrpeacockgit.duckdns.org/Public/PublicFiles/raw/branch/master/PKGBUILDS/gradle-completion/PKGBUILD -o PKGBUILD; makepkg -i

Spring Tool Suite

Der aktuelle Milestone M13 von STS4 basiert auf dem final Release von Eclipse Photon 4.8.

Changelog

Zu den Highlights der Milestones gehören:

Spring Boot

  • Es können jetzt Änderungen an geänderten Bean Definitionen in laufenden (und neugestarteten) Spring Boot Anwendungen erkannt werden.
  • Die Live Hovers unterstützen jetzt @Inject Annotationen
  • Es kann das Matching auf Projekt und Workspace Ebene angepasst werden
  • Verbesserungen im JMX Connector

Concurse

  • Alle GitGetParams werden nun zur Verfügung gestellt: submodule_recursive, submodule_remote, clean_tags

Eclipse

  • Die Spring Starter Wizards (Neu und Edit) zeigen beide nun Informationen über deaktivierte Module an (Erklärung warum sie deaktiviert worden sind)
  • Edit Starters behandelten das Entfernen von Abhängigkeiten nicht korrekt

Atom Editor

  • Die Project Resolution funktioniert mit >= JDK9

DBeaver

DBeaver ist zurzeit mein Favorit bei den Datenbank-Tools.

Highlights von DBeaver

Die Liste der Features von DBeaver ist lang. Es werden sehr viele Datenbanksysteme unterstützt. Da DBeaver RCP von Eclipse verwendet, kann DBeaver nahtlos in Eclipse integriert werden. DBeaver ist natürlich im Marktplatz von Eclipse vorhanden.

Neues in DBeaver

Mit der Version 5.1.4 sind ein paar Korrekturen und Neuerungen eingeflossen.

Data viewer

  • Die Navigation mit Foreign keys/references wurde verbessert
  • Der Textfilter Editor wurde gefixt
  • Die Historie der Volltextsuche wurde gefixed
  • Der SQL Formatter wurde verbessert und einige Fehler beseitigt

MariaDB

  • Der Editor für Benutzerrecht wurde verbessert
  • Das Erstellen einer View wurde gefixt

Plattform

  • DBeaver basiert jetzt auf Eclipse Photon Plattform. Dieses behebt zugleich ein paar alte UI Bugs und verbessert die Performance unter Linux und MacOS.