Dienstag, 2. Dezember 2014

Use latest Vim on MacOSX and Setup

Vim ist neben Eclipse mein zweit liebster Editor für Sourcecode. MacOSX kommt mit einem nicht ganz aktuellem Vim daher, dies ist oft kein grosses Problem.  Man kann mit  dem MacOSX Packetmanager Homebrew eine aktuelle Vim Version installieren:
brew install vim 

Bei einem Aufruf von Vim wird jetzt aber immer noch das alte Vim gestartet. die kann man wie folgt im Terminal beheben:
sudo mv /usr/bin/vim /usr/bin/vim73
sudo ln -s  /usr/local/Cellar/vim/7.4.488/bin/vim /usr/bin/vim

Das alte Vim bleibt so erhalten.

Dann hat man aber auf dem MacBook Pro das Problem dass die Pfeiltasten nicht korrekt funktionieren, sie liefern die Buchstaben A, B, C, D. Ausserdem funktioniert die Backspace Taste nicht. Um dies Beides zu beheben, muss man die die Datei .vimrc im Home-Vereichnis des Users anlegen und sie mit folgen Inhalt versehen:
set nocp

set backspace=2

Neben dem alten Vim bietet MacOSX auch ein veraltetes Git und Maven. 

Dienstag, 11. November 2014

Neues Java Projekt gelauncht: Simple Guitar Tuner

Ich habe auf Github ein kleines Projekt simpleguitartuner gelauncht und das erste Release gebaut. Mit ihm kann sehr einfach die Saiten einer Gitarre stimmen. Im Gegensatz zu den anderen Tuningprogrammen ist dieses sehr präzise bezüglich der Frequenzen. Das Programm wird gestartet: java -jar simpleguitartuner-0.0.1.jar und gestoppt mit CTRL + C. Einfacher geht es nicht. Nach dem Start gibt die Saite an, die man stimmen möchte, dann spielt man die Saite und bekommt das Ergebnis und den Sollwert sehr genau angezeigt. Das geht so lang, bis man das Programm beendet.

Hier die Daten:

Mittwoch, 22. Oktober 2014

Optimierung von If Else in Java

If-Else Konstrukte mit zwei Exit-Points kann auf zwei verschiedene Weisen in Java formuliert werden:
Hier beide Varianten, einmal mit und einmal ohne Kommentare. Dann befindet sich der zweite Exit-Point im Else-Zweig. Welche dieser beiden Varianten ist performanter?

Die Antwort ist, es egal. Aus beiden Code-Varianten wird identischer Byte-Code erzeugt:

Dienstag, 9. September 2014

Elastic Search Date und Timestamp

In Elastic Search kann man das Datum auf sehr verschiedene Weisen angeben:
"range": {
                    "@timestamp": {
                        "gte": "2014-09-08T09:00" ,
                        "lte": "2014-09-08T10:00"

                    }}

oder:

"range": {
                    "@timestamp": {
                      "from": 1410167281557,
                      "to": 1410170881557
}}
 

From und To sind Parameter zur Angabe des Time Ranges, sie sollen nicht mehr benutzt werden, weil sie deprecated sind. Sie sind durch GTE und LTE zur ersetzen, nicht durch GT oder LT.

Die Werte der From und des To Feldes sind Epoch-Werte in msec. Diese kann man unter Mac OS X im Terminal wie folgt erzeugen:

date -j -f "%Y-%m-%d %H-%M-%S" "2015-06-08 05-30-00" "+%s000"

Mittwoch, 27. August 2014

Java GC Optimierung

Mit Java 8 sind einige JVM Optionen jetzt als Standard gesetzt. Das sind folgende GC Tuning Massnahmen:

  • -XX:+UseCompressedOops 
  • -XX:+DoEscapeAnalysis
Das erste Flag verringert den Speicherverbrauch auf 64 Bit Systemen.

Nachzulesen bei Oracle unter folgendem Link: http://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html


Und hier noch ein paar hilfreiche Links zum Thema GC:

Sonntag, 3. August 2014

Java auf einem QNAP TS-110, der zweite Versuch

Nachdem mein erster Versuch gescheitert war auf meinem QNAP TS-110 Java zu installieren, gibt es jetzt gut Nachrichten. QNAP bietet jetzt ein funktionsfähiges Java 8 als JRE. Es lässt sich einfach via QNAP App-Manager installieren.

Und hier der Beweis im Terminal:

Jetzt ist das QNAP vollständig, einen Tomcat kann man auch installieren, Damit habe ich einen kleinen Entwicklungsserver. Allerdings darf vom QNAP TS-110 nicht zu viel erwarten. Das RAM ist mit 256MB sehr begrenzt und die CPU (Marvell 800MHz) auch. Kleinere Anwendungen sollten aber möglich sein. Als nächstes Projekt kann das QNAP die Tinkerforge Wetterstation bedienen.

Donnerstag, 19. Juni 2014

Unit Test mit R, ganz einfach

Auch wenn R oft nicht als richtige Programmiersprache gilt, so gibt es auch in R die Möglichkeit Unit Test zu schreiben. Dafür stehen verschiedene Packages zur Verfügung:

  • RUnit
  • testthat
Hier ein minimales Einsteigerbeispiel mit testthat:


source("main/analyzeXltReport.R")
library(testthat)


test_that("Error Rates", {
  xltreport = loadXltXmlReport("test/testreport.xml")
  expect_that( getTranscationErrorCount(xltreport), equals(24) )
  expect_that( getAtionErrorCount(xltreport), equals(24) )
})

Zuerst wird die zu testende Datei geladen und dann das Testframework. Danach ruft man die Testmethode test_that auf mit einem guten Namen und dem eigentlichen Testcode.

Wenn man jetzt den Test ausführt liefert er beim Erfolg kein Ergebnis:
> source('~/git/lhotse-nfa/loadtest/analysis/test/analyzeXltReportTest.R')
> 
Bei Fehlern sieht es dann z.B. wie folgt aus:
> source('~/git/lhotse-nfa/loadtest/analysis/test/analyzeXltReportTest.R')
Fehler: Test failed: 'Error Rates'
Not expected: getTranscationErrorCount(xltreport) not equal to 20
Mean relative difference: 0.2.

Eine kleine Anmerkung, die Pfade in den R Scripten auch im Unit Test beziehen sich auf das aktuelle Directory!

Weitere Informationen zum Unit Testing mit R findet Ihr hier: 


Dienstag, 17. Juni 2014

Python vs. R

Im akademischen Bereich ist R schon lange eine wichtige Konstante wenn es darum geht statistische Auswertungen aka Data Science zu machen (Link). Lange wurde Python wegen seines guten Handlings von Daten als Ersatz für Mainstream-Anwendungen benutzt. Das Datenhandling war ähnlich einfach wie das in R.
R ist im Vergleich zu anderen Programmiersprachen gewöhnungsbedürftig (Link). Auch wenn diese Dinge wie Schleifen vs apply oder der Mangel an graphischen Interfaces (GUI), Blockkommentaren oder Multithreading berechtigt sind, so lässt sich R aber sehr komfortabel als Scriptsprache, wie unter anderem auch Python einsetzen.
Das führt auch  zu einer ständig wachsenden Beliebtheit dieser Sprache wie Redmonk in ihrem Ranking für Programmiersprachen feststellt feststellt (Link). Python schneidet bei diesen Rankings deutlich besser ab. Einen Anteil an der wachsenden Popularität von R hat das gute R IDE RStudio (Link), das abgesehen von der Doppelklick-Select-Word Anomalie sehr zu empfehlen ist.

Kurz zusammengefasst: R ist nicht tot sondern erfreut sich wachsender Beliebtheit und Python sowieso.

Es gibt ein neues Wort im Englischem: Datensparsamkeit

Datensparsamkeit ist nicht erst seit dem NSA Skandal populär. Getrieben durch den CCC und einigen Datenschutzbeauftragten gibt es in Deutschland ein Datenschutzgesetz in dem die Datensparsamkeit als Mittel beschrieben wird.
Jetzt wurde diese Idee geadelt, durch die Übernahme in den Englischen Sprachgebrauch durch Martin Fowler: http://martinfowler.com/bliki/Datensparsamkeit.html

In diesem Sinne, schaut immer aufmerksam auf eure Daten und natürlich auf eure Passwörter.

Mittwoch, 11. Juni 2014

Welche Java GC Version wird benutzt? Oder wie identifiziere ich den Java GC?

Java bietet eine reiche Auswahl an GC Varianten:

  1. SerialGC
  2. ParallelGC
  3. ParallelOldGC
  4. CMS GC
  5. G1 GC
Zusammen mit den möglichen Parametern hat man einen sehr grossen Suchbereich um den optimalen GC mit den optimalen Einstellungen zu finden. GC Optimierungen haften immer etwas mythisches an. Es gibt Supertricks, die bei genauerem Hinsehen und Testen oft überholt sind. Es hilft nur ein ebenes Testsetting aufzubauen und selbst zu messen.
Damit stellt sich die Frage welcher GC wird denn verwendet, ich gebe doch keinen an. Da hilft die Kommandozeile weiter:

java  -verbose:gc -XX:+PrintGCDetails


Das Ergebnis der Konsole ist spezifisch für die entsprechenden GCs.

SerialGC -XX:+UseSerialGC

Es ist ein genrationaler GC mit den drei Generationen: New Generation Tenured Generation und der Perm Generation. Die New Generation teilt sich in die Bereiche Eden, From und To.







ParallelGC -XX:+UseParallelGC

Es ist ein genrationaler GC mit den drei Generationen: Young Generation, Old Generationen Perm Generation. Die New Generation teilt sich in die Bereiche Eden, From und To. Es lässt sich leicht vermuten, dass der ParallelGC eine weiterentwickelte, parallele Variante des SerialGC ist. Es soll durch die Benutzung von allen Kernen die Dauer der GCs verkürzen. Er macht also nur Sinn, wenn man über mehrere CPU-Kerne verfügt.


CMS GC -XX:+UseConcMarkSweepGC

Es ist ein genrationaler GC mit den drei Generationen: Young Generation, Concurrent Mark Sweep Generationen und der Perm Generation. Die New Generation teilt sich in die Bereiche Eden, From und To. 

Der CMS GC basiert auf den Erfahrungen des ParallelGC. Hier werden möglichst viele GC Schritte (Mark, Sweep) parallel ausgeführt ohne ein Stop-The-World auszuführen. Das heisst man kann ungenutzte CPU Kerne für den GC nutzen, wenn man denn welche hat. Der Overhead des CMS GC ist grösser als des ParallelGC aber durch die Benutzung zusätzlicher CPU Kerne wird dieser negative Effekt überkompensiert, so das der CMS bei vilene normalen Anwendungen die Performance der Anwendung verbessert aber die CPU Usage erhöht. Er ist also sinnvoll, wenn ich freie CPU Ressourcen habe. Zusätzlich braucht der CMS immer freien Speicher für seine Operationen. Er kann nicht den ganzen Speicher ausnutzen.

G1 GC -XX:+UseG1GC

G1 GC Details unter Java 7

G1 oder Garbage First ist der zu letzt entstandene GC. Er setzt auf dem CMS GC auf und ändert die Speicherbenutzung für die Young Generation und die folgende Generation, mit dem Ziel die Speicheroperationen zu minimieren und damit die GC Laufzeiten zu reduzieren. Hier teil sich der Speicher in den Garbage First Heap und die bekannte Perm Generation. Der Garbage First Heap kennt da die Unterteilungen in Young und Survivors. Für den G1 GC gelten die selben Performance und Load Anmerkungen wie für den CMS GC, wobei der G1 leicht bessere Werte als der CMS erzielen sollte.

Unter Java 8 wurde der G1 überarbeitet, das hatte zur Folge, dass der Perm Generation jetzt Metaspace heisst.

Fazit

Genereller Tip, der für 80% aller Anwendungen passt. Macht keine GC Einstellungen, lasst sie weg und nutzt die gewonnene Zeit um die Software robuster zu machen. Tipp 2: Setzt die aktuellste Java Version ein. Ein aktuelles Java mit einem neuen GC schliessen viele Optimierungstricks ein, also nur die sinnvollen.
GC Optimierungen bleiben aufwendig. Nur bei High Performance oder High Load Applikationen sind GC Optimierungen sinnvoll. Aber generell gilt immer, zu erste messen, dann optimieren.

Weitere Informationen zum Java GC:

  1. http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/
  2. http://www.angelikalanger.com/Articles/EffectiveJava/27.GCTuning/27.GCTuning.html
  3. http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/G1GettingStarted/index.html
  4. http://www.fasterj.com/articles/oraclecollectors1.shtml

Donnerstag, 3. April 2014

HOWTO: Releasing a new Software Version with Maven and Git.

Ausgangslage:

  • Versionsverwaltung mit Git und Feature Branches
  • Ich befinde mich auf dem Branch development 
  • Alle Fehler auch Javadoc Fehler sind beseitigt
  • Alle Änderungen commitet und gepushed
  • Java
  • Maven 3 und SNAPSHOTS
  • Nexus
Wie mache aus meiner einer aktuelle Entwicklung ein Release?
  1. mvn deploy, um die letzte Development Version als SNAPSHOT im Nexus zu veröffentlichen
  2. mvn versions:resolve-ranges, um Dependencies mit Range Angaben zu konkreten Versioen aufzulösen, sonst scheitert der Release-Vorgang
  3. mvn versions:use-latest-releases, um die Dependencies zu aktualisieren auf deren letzten Release-Stand
  4. git commit, um die Änderungen an der pom.xml in Git Repository zu übertragen
  5. git checkout master
  6. git merge development
  7. mvn release:prepare
  8. mvn release:perform
  9. git commit, um die Änderungen an der pom.xml in Git Repository zu übertragen
  10. git checkout development
  11. git merge master

Das beschreibt den kompletten Weg ein Release zu erstellen vom Development Branch und wieder zurück. Ach ja, und natürlich das Testen nicht vergessen.

Wenn etwas schief geht:

  1. Entfernen von Tags aus Git:
    1. git tag listet alle Tags auf
    2. git tag -d tagname entfernt den entsprechenden Git Tag aus dem lokalen Git Repo
    3. git push --delete origin tagname entfernt den entsprechenden Git Tag aus dem entfernten Git Repo
  2. Test im Release Prozess wirklich überspringen: mvn release:perform -Darguments="-DskipTests" 

Mittwoch, 26. März 2014

Welche Java Version läuft auf meinem Computer?

Bei dieser Frage ist nicht gemeint, wie ich die Version des aktuell installierten Java abfrage (java -version), sondern was ist dir höchste Version die auf meinem Betriebsystem/Linux läuft? Ich stand vor folgendem Problem, das sich nicht durch ein Betriebssystemupgrade lösen lies:
java -version
Error: dl failure on line 863
Error: failed /var/opt/lhotse-xlt/java/jre/lib/amd64/server/libjvm.so, because /lib64/tls/libc.so.6: version `GLIBC_2.4' not found (required by /var/opt/lhotse-xlt/java/jre/lib/amd64/server/libjvm.so)

Die Version der glibc findet man wie folgt in der BASH heraus:
/lib/libc.so.6
GNU C Library stable release version 2.3.5 (20050720), by Roland McGrath et al.

Damit ergab sich die Frage, welche Java Version läuft mit der glibc < 2.4? Über das Releasedatum des Linux-Kernels bzw. der Linux-Distribution lässt sich die Suche auf eine Java Version reduzieren: Java 6.
uname -a
Linux blade7 2.6.5-7.324-smp #1 SMP Mon Sep 20 15:38:01 UTC 2010 x86_64 x86_64 x86_64 GNU/Linux

Aber die neueren Java 6 Versionen brauch schon die glibc 2.4. Aber über die Oracle Seite (http://www.oracle.com/technetwork/java/javase/system-configurations-135212.html) findet man die korrekte Java Version: Java 6u18.

Montag, 10. März 2014

Anzahl der Java Klassen in einem Projekt zählen

Man sehr einfach mit der BASH die Anzahl der Klassen in einem Projekt zählen. Dazu baut man zuerst ein JAR Datei, z.b. mvn package.  Dann zählt man die die class Einträge in der JAR Datei: unzip -l target/scale-performance-check-1.22.jar | grep .class | wc -l
Es geht auch ein bisschen einfacher: find src/ -name "*.java" | wc -l
Hier werden aber nur die Java Dateien gezählt. Abweichungen entstehen z.B. durch innere Klassen.

Wenn man die LOC zählen möchte kann man dies mit: find src/ -name '*.java' | xargs wc -l
Hierbei werden leere Dateien und Kommentare mitgezählt.

Dienstag, 14. Januar 2014

R Blog und R Buch

R ist als Programmiersprache optimal geeignet um Daten schnell zu analysieren. Vor allem im Big Data Umfeld ist R z.B. in Kombination mit SPLUNK oder Greylog2 ein sinnvolles Werkzeug nicht nur um Daten effizient zu analysieren sondern auch Reports zu erstellen. Dafür gibt es Pakete wie knitr, xtable oder ggplot. Leider ist die Bedienung der Pakete  Eine gute Seite zur Verwendung von R und komplexen Paketen ist die Seite Quick-R von  Robert I. Kabacoff. Die Seite bietet aber noch deutlich mehr. Robert I. Kabacoff ist gleichzeitig Autor des Buches R in Action. Dem Buch merkt mann doch deutlich den akademischen Hintergrund des Autors an und ist bei weitem nicht so praktisch wie die Website. Das Buch ist sich kein MUSS, bietet aber einen interessanten Einstieg in die aktuellen statistischen Modelle.