Freitag, 26. Juni 2015

Robust Code: Security Counter and Endless Loop

Eines der typischen Probleme bei der Entwicklung von Code sind Endlos-Schleifen. Von Ausnahmen mal abgesehen sind Endlos-Schleifen in der Regel nicht erwünscht. Leider entstehen sie durch scheinbar einfachen Code, der scheinbar korrekt ist. Hier ein Beispiel, von der Initialisierung eines Objektes, das selbst ein externes Subsystem (ZAP) initialisiert und dem entsprechend darauf wartet:

private void waitForStart() {
    while(!this.isZapDaemonUp() ) {
  sleep(1000);
        }
}

Das Problem an dieser Schleife ist, dass wenn das Subsystem nicht startet, dann hängt das eigentliche Programm in einer Endlosschleife. Der Benutzer kann das nicht erkennen. Eine robuste Lösung besteht darin einen Sicherheit-Counter einzuführen, der nach er gewissen Menge an Versuchen den Code abbricht.

private void waitForStart() {
     def secCounterStartup = 0;
     while(!this.isZapDaemonUp() ) {
         secCounterStartup++;
         log.debug "waiting for ZAP"
         sleep(1000);
         if (secCounterStartup > 20){
                throw new Exception("Zap does't start up.");                                           
         }
  }
  sleep(2000)
}

Montag, 8. Juni 2015

Json Processing in der BASH mit JQ

JSON ist nicht das schönste Datenformat, so gibt es keine Kommentare in JSON. Aber zur Zeit braucht man JSON es an vielen Stellen, z.B. um Elastic Search Abfragen zu stellen bzw. die Elastic Search Results auszuwerten. Wer mit der Bash arbeitet wird JQ als Anfragewerkzeug zu schätzen wissen. Ein immer wieder auftauchendes Problem sind Keys in JSON, die böse Zeichen enthalten wie / oder - (Slash, Minus) die bei Abfragen via JQ escaped werden müssen.

jq .hits.hits[3]._source.http-rc result2.0.json 
error: rc is not defined

.hits.hits[3]._source.http-rc                           1 compile error

So geht es richtig:

jq '.hits.hits[3]._source["http-rc"]' result2.0.json 
"200"


Was lernen wir daraus? Bezeichner, Keys, Namen im Camel Case setzen! Das spart viel Zeit, bei deinen Kollegen.

Hier als Ergänzung der Link zu Googles JSON Style Guide: http://google-styleguide.googlecode.com/svn/trunk/jsoncstyleguide.xml#Property_Name_Format