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 version:resolve-ranges, um Dependencies mit Range Angaben zu konkreten Versioen aufzulösen, sonst scheitert der Release-Vorgang
  3. mvm version: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.

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.

Samstag, 28. Dezember 2013

Make it run, make it right, make it fast.

Drei Grundsätze der Programmierung: "Make it run, make it right, make it fast.". Wichtig ist, dass sich hierbei um ein Periodisierung geht. D.h. zuerst muss das Programm laufen, erst wenn es läuft mache es schön, dass es deinen eigenen Ansprüchen genügt und dann erst, zu aller letzt, mache es schnell.

Donnerstag, 14. November 2013

Codeanalyse ganz einfach

Für die Code Analyse bzw. für die Analyse der Codequalität gibt es eine Reihe von Werkzeugen wie PMD, Findbugs, Emma, Sonar und und und. Die Werkzeuge sind mehr oder weniger einfach zu bedienen und lassen sich meist gut in bestehende Entwicklungsumgebungen wie Eclipse, Ant oder Maven integrieren. Aber es geht noch einfacher. Man kann Codeanalysen auch in der Kommandozeile machen. Hier ein paar Beispiele:

Beispiel 1: Finden von Null Rückgabewerten, ein typischer Codestinker
grep -e "return null"  projectXX/net/ffreax/**/*.java | wc -l

Beispiel 2: Finde die Dateien mit den meisten Zeilen, potentielle Gottklassen bzw. überladenen Klassen
wc -l projectXX/net/ffreax/**/*.java | sort -nr | head

Ab jetzt wird PMD hinzugenommen, duz muss PMD heruntergeladen (Link) werden.

Beispiel 3: Code Duplikate finden, hier für PHP
bin/run.sh cpd --files ~/Documents/ME_Code_Review/projectXX-Web/Classes/ --minimum-tokens 120 --language php | less

Beispiel 4: Gott Klassen finden
bin/run.sh pmd -d ~/Documents/ME_Code_Review/projectXX-Android/net/  -l java   -R rulesets/java/design.xml | grep GodClass

Beispiel 5: Alle Basic Probleme
bin/run.sh pmd -d ~/Documents/ME_Code_Review/projectXX-Android/net/  -l java -r design -f text -R rulesets/java/basic.xml | less

Mittwoch, 13. November 2013

Ant und Jmeter: Automatisches anpassen des Jmeter Testplan

Jmeter lässt sich in Ant relativ einfach via Jmeter Task integrieren. Dazu benötigt mann nur ein JAR (extras/ant-jmeter-*.jar), welches mit Jmeter kommt. Jmeter selbst kann mit Variablen umgehen, die man z.B. via Kommandozeile setzen kann, hier wir das Property duration auf 12 gesetzt.
jmeter.sh -n -l r.xml -t LPT-woff-size-load.jmx -Jduration=12
Im Testplan kann man dann einfach auf diesen Wert zugreifen, hier wird zusätzlich ein Default Wert 60 gesetzt:
${__P(duration,60)}


Leider bietet der Jmeter-Ant Task nicht diese Flexibilität oder ich habe sich nicht finden können. Alternativ kann man in Ant den Jmeter Testplan direkt modifizieren. Der Testplan ist eine XML Datei  die man via Ant XML Task modifizieren kann:
<?xml version="1.0" encoding="UTF-8" ?>
<project name="jmeter">
 <description>
  This file contains private task for: Load generation with jemeter.
 </description>
  
   <property name="jmeter-home" value="${env.JMETER_HOME}" />

   <path id="ant.xml.classpath">
  <fileset dir="antlibs">
   <include name="xmltask.jar"/>
  </fileset>
 </path>

 <taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask" classpathref="ant.xml.classpath"/>
 
 <target name="load_jmeter" >
  <echot level="info">Generate synthetic load with JMeter.</echot>
  <fail message="JMeter Home not set. Use evirmoment variable JMETER_HOME or property jmeter-home in file: ${setupfile}">
   <condition>
    <not>
     <or>
      <isset property="env.JMETER_HOME" />
      <isset property="jmeter-home" />
     </or>
    </not>
   </condition>
  </fail>
  <!-- ant-jmeter.jar comes with jmeter, be sure this is the release you have -->
  <path id="ant.jmeter.classpath">
   <fileset dir="${jmeter-home}/extras">
    <include name="ant-jmeter-*.jar"/>
   </fileset>
  </path> 
  <taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" classpathref="ant.jmeter.classpath" />
  <xmltask source="src/${load.jmeter.testplan.file}" dest="results/${load.jmeter.testplan.file}">
   <replace path="//stringProp[@name='RunTime.seconds']/text()" withText="${load.duration}" />
  </xmltask>
  <copy file="src/urls.txt" todir="results" />
  
  <jmeter jmeterhome="${jmeter-home}" resultlogdir="results/jtl" testplan="results/${load.jmeter.testplan.file}">
   <property name="jmeter.save.saveservice.output_format" value="xml"/>
  </jmeter>
 </target>

</project>