Montag, 5. Januar 2015

Erstellen eines eigenen Grade Plugins

Gradle lässt sich wie fast jeden andere System mittels Plugins erweitern. Ein Plugin ist nichts weiter als eine Jar-Datei die man am besten auf einen Nexus deployed. Über diesen Nexus wird dann das Plugin für andere Gradle-Projekte bereitgestellt. Hier ein typischer Ausschnitt aus der Datei build.gradle.

buildscript {
        repositories {
                maven { url "http://nexus.ebert-p.com:8080/content/groups/public" }
                maven { url "http://repo.gradle.org/gradle/libs-releases-local" }
        }

        dependencies {
                classpath "de.otto:lpt-gradle-plugin:0.0.3-SNAPSHOT"
        }
}


apply plugin: "lpt-gradle"

Mit repositories wird definiert wo nach den dependencies gesucht werden soll. Mit  dependencies wird die Jar-Datei beschrieben, die Code, hier ein eigenes Gradle-Plugin enthält. Mit apply wir das Gradle-Plugin auf das aktuelle Projekt angewendet. Wie Gradle von dem Plugin-Namen zur ausführbaren Klasse kommt wird unten beschrieben.

Zuerst muss das Plugin programmiert werden. Womit man diese Jar-Datei baut ist egal, es ist auch möglich ein Gradle-Plugin mit Maven zu bauen. Wenn man das Gradle Plugin mit Java entwickeln möchte, muss man seine Haupklasse von org.gradle.api.Plugin ableiten.

package com.ebertp.gradleplugin.wpt;

import org.gradle.api.Plugin;
import org.gradle.api.Project;


public final class WptTest implements Plugin<Project> {

@Override
public void apply(Project project) {
System.out.println("Hello Gradle Plugin User, this is Java.");
}


}


Als Zweites muss ein Mapping vom Plugin-Namen zur Hauptklasse definiert werden. Dafür muss eine Properties-Datei mit dem Namen des Plugins unter resources/META-INF/gradle-plugins angelegt werden.

src/
├── main
│   ├── java
│   │   └── com
│   │       └── ebertp
│   │           └── gradleplugin
│   │               └── wpt
│   │                   └── WptTest.java
│   └── resources
│       └── META-INF
│           └── gradle-plugins
│               └── lpt-gradle.properties
└── test
    ├── java

    └── resources

In dieser Properties-Datei wird das Mapping des Plugin-Names auf die Java Klasse definiert:

implementation-class=com.ebertp.gradleplugin.wpt.WptTest


Wichtig, der Plugin-Name hat nichts mit dem Namen der Jar Datei zu tun!

Jetzt muss nur noch eine Har-Datei gebaut werden und auf den Nexus hochgeladen werden.

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.