Liquibase: Best Practices

Liquibase ist ein System, um Datenbankschema-Änderungen festzuhalten und per SCM nachvollziehen zu können. Diese Änderungen können in XML, YAML, JSON oder SQL geschrieben werden und enthalten datenbankunabhängige Anweisungen. Liquibase kümmert sich dann darum, die Konvertierung für die jeweilige Datenbank zu übernehmen.

liquibase_logo

Zudem kann es Migrations-Skripte erstellen, oder eingebettet als Anwendungsbestandteil die Datenbank direkt (beim Hochfahren der Anwendung) auf den aktuellen Stand bringen.

Im Folgenden stelle ich meine persönlichen Empfehlungen bei der Verwendung von Liquibase vor:

Continue reading

Posted in Did you know?, Java Persistence | Tagged , , , | Leave a comment

Java 8 Lambdas unter der Lupe

Mit Java 8 kam das wohl größte Update für Java SE. Dabei gab es sowohl Neuerungen in der Sprache (Lambdas, Default-Methoden, …), in der Klassen-Bibliothek (Streams), als auch in der JVM. Die Lambda-Ausdrücke sind eine Art Grundlage für viele der neuen Funktionalitäten. Zudem ermöglichen sie uns, auf eine funktionale Art und Weise zu programmieren. Genau genommen ist ein Lambda-Ausdruck ein Code-Block, der im Gegensatz zu Methoden/Funktionen aber keinen Namen hat. Es handelt sich also um eine anonyme Funktion, die man über Variablen referenzieren und Methoden als Parameter mit- bzw. von dort zurückgeben kann. Bei der Definition eines Lambda-Ausdrucks wird der Inhalt noch nicht ausgeführt, kann aber anschließend beliebig oft aufgerufen werden.

Mit der Einführung der Lambda-Ausdrücke wurde Java zwar nicht gleich eine funktionale Programmiersprache. Aber allein die Möglichkeit, auf funktionale Art und Weise zu programmieren, ermöglicht es uns, besser lesbaren und verständlicheren Code zu schreiben. Zudem bietet es auch Vorteile in der nebenläufigen Programmierung. Das wird im Zeitalter von Multicore- und Multiprozessor-Hardware immer wichtiger.

Continue reading

Posted in Java and Quality, Java Basics | Tagged , , , , | Leave a comment

Android Instant Apps vs. Progressive Web Apps

Two days ago, Google announced so called Android Instant Apps at the Google I/O 2016. Android Instant Apps are Android apps which could replace mobile websites. They open by clicking a URL and do not need to be installed. But Android Instant Apps are not the first idea of Google to provide a smooth transition between apps and the web. Some of you might have heard about Progressive Web Apps which were announced back in 2014 on the Chrome Dev Summit. The idea behind Progressive Web Apps is similar to Android Instant Apps. You open a link, and you will get the look and feel of a native app.

In this post we’ll take a quick look at both technologies and clarify where they distinguish.

Continue reading

Posted in Web as a Platform | Tagged , , , , | Leave a comment

Gradle Script Kotlin

Eine neue Zusammenarbeit ist zwischen den Entwicklern des Build Tools Gradle und der Programmiersprache Kotlin entstanden. Der Gründer von Gradle Inc., Hans Dockter, hat sich mit dem Kotlin-Team von JetBrains zusammengesetzt und versucht herauszufinden, wie Gradle von Kotlin (und umgekehrt) profitieren kann. Herausgekommen ist dabei mit Gradle Script Kotlin der Beginn einer Kooperation mit dem Ziel, Gradle Build-Skripte auch mit der statisch typisierten JVM-Sprache Kotlin schreiben zu können.

Continue reading

Posted in Build, config and deploy, Other languages for the Java VM | Tagged , | Leave a comment

i18n for GWT SimplePager

Nowadays, internationalization (i18n) is virtually indispensable in most applications. Therefore, GWT also provides a powerful and commonly used i18n mechanism to meet this requirement. Unfortunately, even in the GWT source code itself, there are components which still contain hard-coded text.

The problem

The SimplePager, which can be used as a navigation within paginated tables, shows texts like “1-10 of 14” or “1-20 of over 1000”. This is implemented in SimplePager’s createText()-method:

protected String createText() {
    // Default text is 1 based.
    NumberFormat formatter = NumberFormat.getFormat("#,###");
    HasRows display = getDisplay();
    Range range = display.getVisibleRange();
    int pageStart = range.getStart() + 1;
    int pageSize = range.getLength();
    int dataSize = display.getRowCount();
    int endIndex = Math.min(dataSize, pageStart + pageSize - 1);
    endIndex = Math.max(pageStart, endIndex);
    boolean exact = display.isRowCountExact();
    return formatter.format(pageStart) + "-" + formatter.format(endIndex)
        + (exact ? " of " : " of over ") + formatter.format(dataSize);
}

Fortunately, this method is protected so we can overwrite it according to our needs. The calculation of the pages’ start and end, the data size and exact flag (see line 558 to 565) need to be copied. But what about the rest?

Continue reading

Posted in Java and Quality | Tagged , , , , , , | Leave a comment

Export eines Private Keys aus einem Java Keystore?

Ausgangssituation ist eine .jks-Datei, welche unser Zertifikat und den dazugehörigen Private Key enthält. Daraus sollen .cer und .key-Dateien erstellt werden. Das Zertifikat zu exportieren, ist dabei relativ einfach. (Vorausgesetzt, man kennt noch das Passwort):

$ keytool -export -keystore meinKeystore.jks -alias meineDomain.de -file meineDomain.de.crt
Keystore-Kennwort eingeben: changeit
Zertifikat in Datei <meineDomain.crt> gespeichert

Beim privaten Schlüssel wird’s kniffelig, da das Keytool diesen nicht ausgeben kann.

Die Lösung ist, es wie folgt in eine PKCS12-Datei umzuwandeln:

$ keytool -v -importkeystore -srckeystore meinKeystore.jks -srcalias meineDomain.de -destkeystore meineDomain.de.p12 -deststoretype PKCS12
Ziel-Keystore-Kennwort eingeben: changeit
Neues Kennwort erneut eingeben: changeit
Quell-Keystore-Kennwort eingeben: changeit
[meinCert.p12 wird gesichert]

…und anschließend die PKCS12-Datei via OpenSSL Tools auszulesen:

$ openssl pkcs12 -in meineDomain.de.p12 -nocerts -nodes
Enter Import Password:
MAC verified OK
Bag Attributes
friendlyName: meineDomain.de
localKeyID: 33 79 6E 65 20 31 34 36 32 31 44 32 39 36 32 37 32 14
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
GTWoqoEJAgMBAAECggEBAKYKAtjrGqa6yjWkFQUKjCsArLhnyl76ieVx4+/5ONVd
DIW0upmknVnBDKc4grgKHVpVaPLWlJHPrJawRbnFYHYCLsseT101Na7Bq6l+KEqj
91d3CugVP4sffyMZKtIAyKgb7rNI6K/N/R1j6lYwBUDsEjJy429KLs5YxLmLtYh5
JW3r/oMl8hbyb6qb+mIEbswWZGHGMByCg+xKnfW4rAECgYEA2wreuO4obPHpICQk
... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ...
xqHIYSbPVqVzrt0zip5d0Q9r/OkCgYEAxMI/kPEr2+Ihu7fKq7n+cLZgq4/zmqVz
A0vzxZJqovnG9pXRwzj4+czd3IOozqZUTRypMZxfbK/wK8JKGSYhwA6W0gkfhzvS
J7CHhlqchO4DB3gvWKN8tZVW3TQWxXqeS2QI4B1WrUyPV3vYlKEIucXV2QKBgQCa
LkkXcBTZQfMDITt8o8vBUPihl7ThmwKRwKU1fHwK2ujpPtrd3FuRK7jjI0xn/104
eLWjOCPvnW7GaqRImHhoNJ3o
-----END PRIVATE KEY-----

Posted in Security | Tagged , , , | Leave a comment

NewSQL: Was ist neu an der NoSQL Nachfolge?

NoSQL-Datenbanken haben uns gezeigt, wie skalierbare performante Datenbanken aufgebaut werden können. Leider oft auf Kosten von Transaktionssicherheit, relationaler Joins und anderen Features, welche relationale Datenbanken über die Jahre berechtigterweise zu einem in der Welt der Business-Anwendungen nicht mehr wegzudenkenden Grundpfeiler werden ließ. Auch die proprietären Client-Bibliotheken der gängigen NoSQL-Datenbanken stellen eine Hürde dar, denn auch was vor über 10 Jahren als einer der Hauptargumente für SQL-Datenbanken diente — kurze Einarbeitungszeiten und kompatibles Tooling durch eine weitestgehend standarisierte Abfragesprache — hat auch heute noch Gültigkeit und wird von gängigen NoSQL-Datenbanken oft nicht bedient, wenngleich dies die Anhänger oft nicht hören wollen. Darüber hinaus hat sich SQL über die letzten Jahrzehnte als Abfragesprache bewährt und bewiesen, dass die Konzepte dahinter tragfähig und überaus flexibel sind.

Daher verwundert es nicht, dass der nächste logische Schritt die Vermählung der beiden Platzhirsche SQL und NoSQL darstellt — der Begriff NewSQL ist geboren.

Continue reading

Posted in Java Persistence | Tagged , , , , | Leave a comment