Mittwoch, 12. Oktober 2016

Java 9 am Horizont

Java 9

New Version Scheme: MAJOR.MINOR.SECURITY
--> keine "1.8u102" mehr, sondern "8.102.5"

keine rt.jar und tools.jar

jrt-fs.jar -> nötig um Klassen in neuen Java Modulen zu finden. Gibt es in Java 8 + 9

jdeps -jdkinternals [-apionly] my.jar --> prüft ob interne apis verwendet werden, ist in 9 nicht mehr erlaubt
sun.misc.*, sun.reflect* --> removed or moved to sun.misc.Unsafe

G1 is default GC
Unified GC Logging und alte Flags wurden gemapped auf neue Flags
GC mit alten depricateden Flags von Java8 läuft in 9 nicht mehr

VM Flag
java.ext.dirs in java8 deprecated, in 9 dropped

Security/Crypt Changes: see Oracle JRE and JDK Cryptographic Roadmap

Code Check for JDK9
openjdk.java.net/ JDK-9 Outreach

jdeps


Abhängigkeiten zu Modulen:

./jdeps -s ../lib/ant-javafx.jar

Abhängigkeiten zu Klassen

./jdeps -v ../lib/ant-javafx.jar

Abhängigkeiten zu Packages

./jdeps -verbose:package ../lib/ant-javafx.jar

Abhängigkeiten zu internen Klassen (smelly!)

./jdeps -jdkinternals ../lib/ant-javafx.jar

Welche Pakete gehören zu welchen Profilen? ( wie kompakt kann die JRE sein, um diesen Code auszuführen )
./jdeps -P ../lib/ant-javafx.jar

Wie groß ist ein Profil?
./jdeps --check java.compact1
./jdeps --check java.compact2
./jdeps --check java.compact3


./jdeps --generate-module-info . ../jrt-fs.jar
cat jrt.fs/module-info.java
    module jrt.fs {
        exports jdk.internal.jimage;
        exports jdk.internal.jimage.decompressor;
        exports jdk.internal.jrtfs;
        provides java.nio.file.spi.FileSystemProvider with jdk.internal.jrtfs.JrtFileSystemProvider;
    }

Jigsaw

Code aufräumen, strukturieren, hat 8 Jahre gedauert

Problem java.lang.Object --> toString --> java.lang.String --> java.util.regex --..-->
-> Wo macht man den Schnitt ?

Java Modules bringt:
Skalierbarkeit
Sicherheit
Performance

Naming nach reverse.domain.name pattern empfohlen, packages eine Ebene unter module
Versionen SOLLTEN nicht in modul-namen enthalten sein
module-info.java kann aber beliebig um weitere Informationen erweitert werden.
Konkret kann eine jar auch mit Versionsinfo erzeugt werden über jar-Kommando

Lösung für Module in unterschiedlichen Versionen im Module-Path: Verschiedene Layer des Module-Loaders

Neben Module noch modular jars ( eine jar + module-info.class )

Es gibt einen Module-Path (Reihe von Verzeichnissen mit Modulen), dort liegen alle Module. Java löst alle Abhängigkeiten eines Moduls im Modulepath auf und erzeugt so den Classpath
Module-Path und Classpath mischen geht

Abhängigkeit weiterreichen ( reexportieren ): requires public <package-name>

Services

    Modul provides <implementierung> über <interface>
Services-Consumer-Modul
    uses <interface>

?? was ist mit zwei Service Implementierungen im module path?
noch in klärung

UnnamedModule: - Alle Klassen eines Classpath sind über das UnnamedModule exportiert, Backwards Compatibility

Live:


Jigsaw runterladen unter
https://jdk9.java.net/jigsaw/
 
1 Module
./javac -d modules/com.greetings src/com.greetings/module-info.java src/com.greetings/com/greetings/Main.java
./java --module-path modules -m com.greetings/com.greetings.Main

2 Modules
./javac -d modules2/org.astro src2/org.astro/module-info.java src2/org.astro/org/astro/World.java
./javac --module-path modules2 -d modules2/com.greetings src2/com.greetings/module-info.java src2/com.greetings/com/greetings/Main.java
./java --module-path modules2 -m com.greetings/com.greetings.Main

Packaging

./jar --create --file=mlib/org.astro@1.0.jar --module-version=1.0 -C modules2/org.astro .
./jar --create --file=mlib/com.greetings.jar --main-class=com.greetings.Main -C modules2/com.greetings .
./java -p mlib -m com.greetings

./jar --print-module-descriptor --file=mlib/org.astro@1.0.jar

jlink

./jlink --module-path /home/danny/dev/java/jdk-9/jmods:mlib --add-modules com.greetings --output greetingsapp

Erzeugt images aus JRE + module. Alle Abhängigkeiten der Module werden aufgelöst und das Image erzeugt

Erzeugt eine Applikation mit Verzeichnissen bin/ conf/ lib/

?? Wie wird die Main-Class für das Start-Script in bin/ ermittelt?
muss man angeben bei der module-erzeugung
bei der jlink erzeugung? .. möglicherweise auch

jlink kann die abhängigkeiten noch compressen ( ca. 33% kleiner bei sample app )

beispiele: openjdk.java.net/projects/jigsaw/quick-start

Ausblick

Gradle 3.0 "will" Java9 komplett unterstützen

Freitag, 16. September 2016

BedCon 2016 - Vergleich von WebFrameworks

http://www.slideshare.net/GEDOPLAN

https://github.com/GEDOPLAN/webclients-check

BedCon 2016 - Resilience Patterns

BedCon 2016 - Resilience Patterns

https://www.slideshare.net/mobile/ufried/resilience-reloaded-more-resilience-patterns

BedCon 2016 - Softwarearchitektur für optimale User Experience

BedCon 2016 - Softwarearchitektur für optimale User Experience

User Experience Tool: balsamiq.com

BedCon 2016 - JPA Best Practices

JPA Best Practices

- EntityManager immer nur im RequestScope laufen lassen ( also nicht per Session ).
Der EntityManager ist an eine Transaktion gebunden, Außerhalb von Requests können sonst Nebenläufigkeiten entstehen.

- EntityManager per @Inject reingeben statt @PersistenceManager . Bei @Inject muss der EntityManager von einer Factory erzeugt werden über @Produces im Request-Scope. Auf diese Art und Weise kann der EntityManager auch an anderen Stellen verwendet werden, so @PersistenceManager nicht erlaubt ist. Hier ist aber darauf zu achten, dass der EntityManager per se immer trasaktional arbeitet. Jede Attributänderung einer JSF ManagedBean wird direkt weggespeichert wenn diese Bean dann attached ist. Durch ein explizites Ausstellen (Modus Unsynchronized) der Transaktionalität beim Produzieren des EntityManagers in der Factory lässt sich das verhindern. Allerdings muss dann der EntityManager bei einer gewollten transaktionalen Verarbeitung wieder manuell an die Transaktion gebunden werden (entityManager.joinTransaction())

Donnerstag, 15. September 2016

BedCon 2016 - Docker Orchestrierung mit Docker Swarm & Compose

BedCon 2016

Docker Orchestrierung mit Docker Swarm & Compose

- Docker mit Overlay Network braucht mind. Linux Kernel 4.2.x (basiert auf vxlan)

- Docker Compose konfiguration in yaml

BedCon 2016 - GUI Testing - Wartbare Alternativen zu Record&Play


 Wartbare Alternativen zu Record&Play GUI Testing

Slides

1. Möglichkeit: Grafisches GUI Test Tool, Tests zusammen klicken
UI elemente anhand von xpath erkennung ist gefährlich --> bei änderung der anordnung der elemente geht nix mehr
--> regressionstests nicht möglich
Lange Laufzeiten
Lange Entwicklungszeit (weil lange Laufzeiten)

2. Möglichkeit: Selenium
selenium for chrome, ff, safari, etc, and mobile
pros: programmatic tests
cons: spagetti code, bad technical API
--> Problem: Es gibt kein Model der GUI, die getestet wird
--> Lösung: Ein Model (und damit API) schaffen für die GUI
Page Object Pattern:
Selenium Page Objects
Arquillian Graphene
GEB
Testframework in groovy, hat auch Page Objects
Test-DSL

Alternativen
CATJS
Testcode (JS) im HTML enthalten

Test-Strategien
- test on lowest level! (besser viele günstige Unit-Tests als wenige teure GUI Test)
- lange laufzeiten vermeiden
- wenn extra QA Abteilung/MA, dann co-working Dev<->QA