Shop

Sonntag, 17. Juli 2016

Clean Code Vortrag bei der InfPro IT Solutions

Am vergangenen Freitag durfte ich einen 3 stündigen Vortrag zu Thema Clean Code halten.
Die InfPro IT Solutions hat mich zu diesem Vortrag eingeladen. Rund 10 Teilnehmer haben an dem Vortrag teilgenommen. Es war eine sehr gute Veranstaltung. Das Ambiente war sehr nett, die Mitarbeiter aufmerksam und die Diskussionen anregend.
Alles was man für ein gelungenes Event.
Wir konnten die Themen am Abend bei dem einen oder anderen Bierchen noch vertiefen.

Dienstag, 1. März 2016

Security in WebApplikationen

Ich habe nun mein ersten Gehversuch mit e-books gemacht.

Security in Web Applikationen behandelt die Themen Cookies, Sessionhandling und Response-Headers immer im Context der Sicherheit.
Kaufen kann man das buch bei Amazon.

Dienstag, 26. Mai 2015

Die fünf entscheidenden Fragen des Managements

Book review: Die fünf entscheidenden Fragen des Managements, von Peter F. Drucker.

Ich hatte das Buch von Peter F. Drucker schon fast ein Jahr in der Schublade liegen. Irgendwie war ich sehr skeptisch bei diesem Buch, denn ich hatte mich ja schon in das MBO (Management by Objectives / Führen durch Zielvereinbarung) Thema eingelesen und befunden, dass ein Thema das wesentlich älter ist als ist nix mehr für mich ist.

Weit gefehlt. Da könnten sich Manager von heute noch eine Scheibe runter schneiden.

Die einfachsten Fragen sind oft am schwersten zu beantworten.

  • Was ist unsere Mission?
  • Wer ist unser Kunde?
  • Worauf legt der Kunde Wert?
  • Was sind unsere Ergebnisse?
  • Was ist unser Plan?

Zwar geht es in dem Buch nur um “Non Profit”-Management, also um das Managen von “Non Profit” Organisationen, doch gerade diese Organisationen müssen umso straffer geführt werden, da unter anderem die Mittel für Fehltritte fehlen.
Die oben gestellten Fragen zielen auf die Selbsteinschätzung eines Unternehmens ab. Und das ist glaube ich auch der Punkt. Es geht um die tourliche retrospektive.

Allerdings geht dabei nichts ohne Vertrauen. Nur Vertrauen ermöglicht es, dass abeichende Meinungen öfter Vorgebracht werden. Ein nettes Zitat von Aristoteles:

In den wesentlichen Dingen Einheit, im Handeln Freiheit, und bei allen Dingen Vertrauen.

Mission steht in diesem Zusammenhang für das Was. Also was machen wir, nicht wie machen wir es. Was wollen wir erreichen, nicht wie wollen wir es erreichen. Am Ende sollte dann ein Plan entstehen, das wäre ein messbares Ergebnis, ein fokussierter Aktionsplan.
Sie soll:

  • soll jedem Mitarbeiter bekannt sein. (grundlegende Führungsverantwortung)
  • soll auf ein T-Shirt passen.

Wichtig ist: Gutes sollte man nur dann tun, wenn es zur Mission passt.
Wenn man von den Mitarbeitern Selbständigkeit einfordert bedeutet dies Freiheit und Verantwortung zu übergeben.

Jedes noch so gute Unternehmen kann ohne Kunden nicht überleben. Die Frage nach dem Kunden ist gleichzeitig die Frage nach dem Wer muss zufriedengestellt werden. Oft gibt es nicht nur Hauptkunden sondern auch Nebenkunden. Dabei gilt es die Prioritäten klar zu legen. Dabei kann man sich den Kunden auch selbst erschaffen. Noch besser als Kunden sind allerdings Fans.

Wert oder auf Englisch eben value ist das was wir unserem Kunden liefern müssen, damit er wirklich zufrieden ist. Dabei sind nicht nur die Hypothesen wichtig, man kann auch mal den Kunden zu fragen was ihm wirklich wichtig ist.

Retrospektiven, was haben wir für Ergebnisse erzielt. Die Mission mit dem tatsächlich erreichten vergleichen. Das ist oft sehr schwer, auch wird dieser Punkt gern vergessen. Wenn es gut läuft, denkt man nicht daran, wenn es nicht so gut läuft hat man vermeintlich keine Zeit. Aber nur die Rückschau erlaubt es den Plan zu verfeinern.

Der Plan verrät uns, ob wir noch auf schiene sind. Müssen wir die Mission ändern, oder passt unser Leitbild noch. Eine alternative zu einem Plan ist eine Vision. Allerdings sollte man beachten, wenn man mehr als fünf Ziele hat, dann hat man gar keine Ziele.


Ich hoffe ich habe noch nicht zu viel verraten. Das Buch beantwortet die Fragen in einem Detailgrad, der am Ende noch Spielraum für einen selbst lässt. Mich hat es angeregt zu träumen. Träumen von einer Organisation wie ich sie gerne führen würde. Peter F. Drucker ist für mich aufgestiegen zu einem der führenden Management Vordenker. Interessant wäre eine Synopse der Texte von Drucker und anderen Management Autoren wie z.B. Tom Demarco. Vielleicht könnte diese Idee jemand umsetzen.

Donnerstag, 30. Oktober 2014

Der eigenen Rolle bewusst werden

In einem Unternehmen kann leider nicht immer alles ganz rund laufen, das hat verschiedenste Gründe. Aber darauf möchte ich hier gar nicht weiter eingehen. Als Mitarbeiter ist man dann oft versucht die Probleme zu identifizieren und am liebsten fängt man da mal nicht bei den eigenen Problemen an.

He should mind his own business. (Er soll vor der eigenen Haustüre kehren) - Idiom

Ich möchte das hier mal mit einem Schneeballsystem vergleichen. Wenn sich jeder darum kümmert, dass er optimal seine Leistung bringen kann. Jeder aber auch die Dinge die Ihn daran hindern nach oben tragen würde zu seinem Vorgesetzten. Dann würde sich eine kleine Produktivitätslawine in Gang setzten, die sich schwer stoppen liese.

“Wenn sich jeder um sich selbst kümmert, ist für alle gesorgt.” - Aus der Schweiz

Ich bin zwar immer noch der Meinung, dass man durch geschickte Führung aus eine 5-8 Personen Team ein High-Perfomance-Team formen kann. Aber was machen, wenn sich das leider nicht ergibt. Wie kann man sich trotzdem professionell verhalten.

Mind your own business!

Man muss sich zu jeder Zeit seiner Rolle bewusst sein, oder eben die Rolle neu ausstecken. Dazu können die folgenden Fragen helfen:
* Was spiele ich für eine Rolle in diesem Projekt, Meeting, Gruppe, Unternehmen?
* Was sind meine Aufgaben, was habe ich für Pflichten?
* Wann ist meine Aufgabe erledigt?
* Wann muss ich meine Aufgaben erledigt haben?
* Wen und wie muss ich informieren?
Ein Kollege von mir hat mal gesagt: “Verhalte dich so, als wärst du eine eigene Firma innerhalb des Unternehmens.”

Mit diesem Satz im Kopf möchte ich gerade noch einen Gedanken an diesen Text anknüpfen.
In einem letzten Gespräch wo auch ein Projektverantwortlicher teil nahm, wurde das Thema Tests angesprochen. Darauf hin antwortete der Projektverantwortliche mit den Worten, wenn es zeitlich eng wird, verzichten wir auf die Tests. Dazu meine Fragen die ich nur so in den Raum stellen möchte:
1. Haben sie schon mal an einem Projekt mitgearbeitet wo es am Ende nicht zeitlich eng geworden ist?
2. Wie würden sie sich verhalten, wenn sie als Firma den Auftrag bekommen würden, würden sie trotzdem Tests schreiben?

Public Id Generator

Ein PublicIdGenerator macht in JSF an mehreren Stellen Sinn. Hier möchte ich kurz wo es Sinn machen kann, und warum. Zum andern zeige ich euch dann den Code für den PublicIdGenerator. Die Verwendung ist glaube ich selbsterklärend.

Wo kann man den Generator verweden

  • Wenn man die interne (Datenbank) Id einer Klasse (Entität) nicht nach außen geben will.
  • Wenn man noch gar keine interne Id einer Klasse hat, weil eben diese z.B. noch nicht persistiert wurde.

Im Wesentlichen lassen sich alle Anwendungsszenarien darauf zurück führen. Wie in einem vorhergehenden Artikel beschrieben, kann man diese Id für die Generierung eine Style-Class verwenden, und dann nochmal in einem CientBehavior um JavaScript-Code zu generieren. Oder man benötigt sie für die Identifiezierung eines Objectes in Comboboxen, da bietet sich ein einfacher Object Konverter an.

Generator Code

Der Generator ist eigentlich straightforward implementiert.

@ViewAccessScoped
@Named
public class PublicIdGenerator implements Serializable {
    private Map<String, Key> publicIds;
    private Map<Key, String> objects;
    protected PublicIdGenerator() {
        publicIds = new HashMap<String, Key>();
        objects = new HashMap<Key, String>();
    }
    public String generatePublicId(final Object object) {
        return generatePublicId(object.getClass(), object);
    }
    public String generatePublicId(final Class<?> clazz, final Object object) {
        final String publicId;
        final Key key = new Key(clazz, object);
        if (objects.containsKey(key)) {
            publicId = objects.get(key);
        } else {
            publicId = generateId();
            publicIds.put(publicId, key);
            objects.put(key, publicId);
        }
        return publicId;
    }
    private String generateId() {
        return UUID.randomUUID().toString();
    }
    public Object lookup(final Class<?> clazz, final String publicId) {
        Key key = publicIds.get(publicId);
        if (key == null) {
            throw new IllegalStateException("No entry for public id " + publicId + ". Possible manipulation detected.");
        }
        if (!clazz.equals(key.getClazz())) {
            throw new IllegalStateException("Invalid clazz " + clazz.getName() + " for public id " + publicId);
        }
        return key.getObject();
    }
    private static class Key implements Serializable {
        private final Class<?> clazz;
        private final Object object;
        Key(final Class<?> clazz, final Object object) {
            super();
            this.clazz = notNull(clazz, "Parameter 'clazz' must not be 'NULL'");
            this.object = notNull(object, "Parameter 'object' must not be 'NULL'");
        }
        Class<?> getClazz() {
            return clazz;
        }
        Object getObject() {
            return object;
        }
        //TODO Generate Equals and HashCode
    }
}

Dienstag, 8. Juli 2014

JSF Komponenten in JavaScript identifizieren, oder wie kommt man an die clientID einer Komponente

Generelle Patentrezepte gibt es auch hier nicht, aber ich möchte verschiedene Anwendungsszenarien aufzeigen, die Ihnen vielleicht helfen können einige knifflige JSF JavaScript Problemchen zu lösen.

Die einfachste Art an eine Komponenten Id zu kommen ist sicherlich folgende:

<h:inputtext binding="#{fullName}" value="#{fullName}">
</h:inputtext>
#{fullName.clientId}

Somit kann man einfach auf die Id zugreifen und diese z.B. in JavaScripts verwenden.

Für JavaScript bietet sich JQuery an, mit JQuery kann man leicht ein Dom Objekt identifizieren:

$('#{fullName.clientId}'.replace(/:/g,"\\:"))
    oder
    $('[@id=#{fullName.clientId}]')

Das Problem im ersten fall ist, dass alle ‘:’ escaped werden müssen, darum die replace Funktion, im zweiten Fall ist das nicht notwendig, da über das id Attribut gesucht wird.

Allerdings kommt man so nicht immer zum Ziel und ich gehe oft darauf über, über Klassen zu referenzieren, vorallem dann wenn man über eine Komponente innerhalb einer ui:repeat referenzieren will, ist das oftmals kein Fehler:

<h:inputText id="value"styleClass="#{field.name} #{page.id}"
value="#{field.value}"></h:inputText>

Zugreifen kann man dann über:

$('.#{field.name}.#{page.id}')

Das Ganze ist hier natürlich nur Theorie. In der Praxis wir man den JavaScript-Code z.B. über ein ClientBehavior rendern.

Freitag, 7. Februar 2014

Java Art - Puzzle 1

Java also can be art.
But what is the result of the execution.

Singleton the Highlander way

Singleton Implementierungen gibt es verschiedenste, aber möchte man wirklich nur eine Instanz eines Objektes sollte man es nach der Highlander Methode machen.
Egal ob man noch auf dem Memory Modell von java < 1.5 oder eben nach dem Fix von 1.5 arbeitet, diese Methode sollte immer funktionieren. Und wer hats erfunden? Bill Pugh in seiner arbeit an dem Java Memory Model.

Dienstag, 24. September 2013

Lession learned (JSF): Exception Handler

If an Exception is thrown during the execution of a Phase, the PhaseListener after phase event is called before the Exception is handled from the Exception Handler.

Dienstag, 10. September 2013

Primefaces multifile upload in IE10

Primefaces multifile upload works in IE10.
But not out of the Box in the Community Edition. There ist a fix in the primefaces version 3.5.9.

See Group Entry

But get it work with the Community Edition is far easy.

Use the fileUpload component like you would do it in IE9.
And add the CSS styles described below.

Sonntag, 8. September 2013

JSF Bootstrap Message and Messages Renderer

Add the JSF Bootstrap Render to your Page to view the JSF Messages in Bootstrap Style.
Here you can find the Code Snippets.

Sonntag, 28. April 2013

Fit to Parent in JavaFx

Versucht man mit JavaFx und SceneBuilder UIs zu zeichnen und die einzelnen Fragmente per Code zusammen zuführen, funktioniert das mit den Anchor nicht outofthebox. Die Anchor Attribute müssen beim einzufügenden Fragment händisch ergänzt werden.

Java Enum#parseFrom

How the parse an enum from an constant?

Mittwoch, 31. Oktober 2012

Taskfokusiertes arbeiten oder Wie wir die Zeit anhalten

Wer kennt das Problem nicht. Man sitzt im Büro, eigentlich hätte man ja genug Arbeit, aber irgendwie kommt man mit der zu erledigenden Arbeit nicht weiter.
Das hat natürlich unterschiedliche Gründe:
  • Arbeit muss immer wieder unterbrochen werden
  • Ständig kommen neue Anforderungen dazu
  • Wir können uns schwer auf eine Sache konzentrieren
Oft liegt es aber auch daran wie unsere Arbeit an uns heran getragen wird. Die Arbeiten sind geprägt von verschiedensten Daten, die Arbeit muss da begonnen werden und da muss sie fertig sein. In den seltensten Fällen geht es dabei um Einzelaufgaben, vielmehr geht es um eine ganze Menge von Aufgaben, die dann als ein gesamtes zu einem Termin fertig sein muss.
Zu alle dem gibt es auch noch Routine-aufgaben die auch zu erledigen sind. Diese Aufgaben sind oft nicht klar aufgelistet und dennoch müssen wir diese Aufgaben erledigen, und selbstverständlich haben auch diese einen Fertigstellungstermin.
Auf jeden Fall scheint alles Zeit getrieben. Somit muss es einen nicht verwundern wenn einige die Ansicht vertreten, sie hätten zu wenig Zeit.
Jedoch hängt die Sichtweise auf das offensichtliche Problem immer vom Blickwinkel des Betrachters ab. Wir sollten unsere Ansicht zu dem Thema gründlich überdenken.
Halten wir doch einfach einmal die Zeit an!
Nicht das wie es am Ende aussieht sollte uns im Moment wichtig sein, sondern die nächste Aufgabe welche wir erledigen müssen um das Endergebnis zu erreichen.
Die Umstellung von dem zeit getriebenen Arbeiten auf Aufgaben fokussiertes Arbeiten hilft uns hierbei.
Machen sie sich frei, schnappen sie sich eine Aufgabe und arbeiten sie diese ab. Haben sie die Aufgabe erledigt haben sie sich eine Pause verdient. Dann geht es wieder weiter.
Es gibt verschiedene Techniken wie man einen konstanten Durchsatz beim Aufgaben fokussierten Arbeiten erreicht.
  • TODO dazu werde ich einen weiteren Beitrag schreiben.
Auch gibt es unterschiedlichste Techniken wie Aufgaben priorisiert und somit auf die Reise geschickt werden können. Denn am idealsten ist es natürlich wenn sich jemand anderer Gedanken macht welche Aufgabe als nächstes zu erledigen ist.
  • TODO dazu werde ich einen weiteren Beitrag schreiben.

Montag, 27. August 2012

Arduino Roboter

IMG_0802

Nun habe ich endlich mein neues Spielzeug erhalten und musste auch gleich damit beginnen einen “LineFollower” zu basteln. Hier mal ein Video vom fertigen Roboter:

Roboter

schema

Schematischer Aufbau

Und anschließend noch der Code:


//motor RIGHT connected between A01 and A02
//motor LEFT connected between B01 and B02

int STBY = 10; //standby

//Motor A
int PWMA = 3; //Speed control 
int AIN1 = 9; //Direction
int AIN2 = 8; //Direction

//Motor B
int PWMB = 5; //Speed control
int BIN1 = 11; //Direction
int BIN2 = 12; //Direction

int RIGHT = 2;
int LEFT = 1;
int QRE1113_LEFT = 2;
int QRE1113_RIGHT = 4;
int schwellwert = 400;
void setup(){
  pinMode(STBY, OUTPUT);

  pinMode(PWMA, OUTPUT);
  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);

  pinMode(PWMB, OUTPUT);
  pinMode(BIN1, OUTPUT);
  pinMode(BIN2, OUTPUT);
  
  Serial.begin(9600);
  stop();
  delay(5000);
}

void loop(){
  // Lesen der Sensorwerte
  Serial.println("--");  
  int QRE_Value_LEFT = readQD(LEFT);
  Serial.println(QRE_Value_LEFT); 
  int QRE_Value_RIGHT = readQD(RIGHT);
  Serial.println(QRE_Value_RIGHT);  
  // Falls beide Sensoren schwarzen Untergrund liefern geradeaus
  // fahren
  if(QRE_Value_LEFT >= schwellwert && QRE_Value_RIGHT >= schwellwert)
  {
    Serial.println("forward");
    move(LEFT, 200, 1);
    move(RIGHT, 200, 1);
  } else if (QRE_Value_LEFT < schwellwert && QRE_Value_RIGHT< schwellwert) {
    stop(); // Überarbeiten
    if(QRE_Value_LEFT<QRE_Value_RIGHT){
      Serial.println("sharp RIGHT");
      while(readQD(RIGHT)<schwellwert) {
        move(LEFT, 150, 1);
        move(RIGHT, 150, 0);
      }
    } else {
      Serial.println("sharp LEFT");
      while(readQD(LEFT)<schwellwert) {
        move(LEFT, 150, 0);
        move(RIGHT, 150, 1);
      }
    }
    stop();
  } else {
    if(QRE_Value_LEFT<QRE_Value_RIGHT){
      Serial.println("RIGHT");
      move(RIGHT, 100, 1);
      move(LEFT, 200, 1);
    } else {
      Serial.println("LEFT");
      move(LEFT, 100, 1);
      move(RIGHT, 200, 1);
    }
  }
  delay(5);
}
int readQD(int motor){
  //Returns value from the QRE1113 
  //Lower numbers mean more refleacive
  //More than 3000 means nothing was reflected.
  int QRE1113_Pin = QRE1113_RIGHT;
  if(motor == LEFT){
    QRE1113_Pin = QRE1113_LEFT;
  }
  pinMode( QRE1113_Pin, OUTPUT );
  digitalWrite( QRE1113_Pin, HIGH );
  delayMicroseconds(10);
  pinMode( QRE1113_Pin, INPUT );

  long time = micros();

  //time how long the input is HIGH, but quit after 3ms as nothing happens after that
  while (digitalRead(QRE1113_Pin) == HIGH && micros() - time < 3000);
  int diff = micros() - time;
  pinMode( QRE1113_Pin, OUTPUT );
  digitalWrite( QRE1113_Pin, LOW );
  return diff;
}

void move(int motor, int speed, int direction){
  //Move specific motor at speed and direction
  //motor: 0 for B 1 for A
  //speed: 0 is off, and 255 is full speed
  //direction: 0 clockwise, 1 counter-clockwise
  digitalWrite(STBY, HIGH); //disable standby

  boolean inPin1 = LOW;
  boolean inPin2 = HIGH;

  if(direction == 1){
    inPin1 = HIGH;
    inPin2 = LOW;
  }

  if(motor == LEFT){
    digitalWrite(AIN1, inPin1);
    digitalWrite(AIN2, inPin2);
    analogWrite(PWMA, speed);
  }else{
    digitalWrite(BIN1, inPin1);
    digitalWrite(BIN2, inPin2);
    analogWrite(PWMB, speed);
  }
}

void stop(){
  //enable standby  
  digitalWrite(STBY, LOW);
  move(LEFT, 0, 1);
  move(RIGHT, 0, 1);
}

Donnerstag, 29. März 2012

Mockito: Mock a JspWriter

How to Mock a JspWriter to move the appended text to a StringBuilder?



Here we are :-)

Groovy: Analyse Accesslogs

Analyse access logs with groovy. Compare a special behaviour on two different files.
 pattern = ~/.*\\/(.*\.jsp).*/  
 data = new HashMap()  
 calculate("c:/P7_ARCTIS_access_log.2012_01_31%2336[1]", 0);  
 calculate("c:/P7_ARCTIS_access_log.2012_03_23%2336[1]", 1);  
 def calculate(filename, i) {  
   def file = new File(filename);  
   file.eachLine{line ->  
     if(line.contains(".jsp")) {  
       m = line=~pattern  
       def jsp = m[0][1]  
       if(!data.containsKey(jsp)) {  
         data.put(jsp, [0,0]);  
       }  
       int[] werte = data.get(jsp);  
       werte[i] = werte[i]+1;  
       data.put(jsp, werte);  
     }  
   }  
 }  
 println data  
Here we are!

Donnerstag, 16. Februar 2012

Technologischer Sex-Appeal

In der Entwicklung arbeiten wohl immer unterschiedlichste Charaktere, und so sagte mir unlängst ein Kollege, er hätte sich in einer Firma als Java Entwickler beworben, nun ist er jedoch Cobol Entwickler geworden. Er ist froh, dass er dort gelandet sei.
Gerade Unternehmen müssen bei Ihren Produkten den Fokus auf die Nachhaltigkeit ihrer Produkte legen. Nachhaltigkeit ist jedoch in der Softwareentwicklung ein dehnbarer Begriff. Oft mach es hier einen Unterschied in welcher Brache man sich bewegt. Schreibt man Software für mobile Endgeräte, kann es schon vorkommen, dass man die Software nicht nur einmal implementiert. Dabei würde man die Nachhaltigkeit in den Konzepten und in Programmiersprachen unabhängigen Algorythmen suchen. Bei Legacy Anwendungen würde man die Nachhaltigkeit dann wohl eher in der Änderbarkeit oder Wartbarkeit vermuten.
Aber gerade bei Legacysystemen kann es vorkommen, dass ein und das selbe Stück Code während seiner Lebensdauer von verschiedensten Personen angegriffen werden muss. Wie kann man dann Mitarbeiter dazu motivieren sich immer wieder in ältere Codeartefakte einzuarbeiten und diese zu verändern.
Es zeigt sich, dass diese Bereitschaft mit der Zeit einfach sinkt. Es werden immer wieder neue Technologien entwickelt, Sprachen werdern vereinfacht bzw. wieterentwickelt, auch die Entwicklungsprozesse entwickeln sich weiter. Es fängt schon bei so banalen Dingen wie einem Sourcerepository an, wo auch schon der Zahn der Zeit nagt.
Potentielle Bewerber suchen sich Ihren Job nicht mehr nur nach den Sozialen- und Intrinsischen- Merkmalen eines Unternehmens aus, nein es spielt mittlerweilen auch schon viel mehr der Technologischesexappeal des Unternehmens eine Rolle.
Wie siehts mit Ihrem Sex-Appeal aus?

Donnerstag, 27. Oktober 2011

Spielräume

Spielräume Spielräume brauchen wir um kreativ zu sein. Spielräume bedeuten jedoch nicht, dass man nicht geführt wird, genau so wenig wie Führung heisst, dass man keine Spielräume haben kann.

"Um großangelegte Veränderungen umzusetzteen, müsste darüberhinaus ein breiter Konsens zwischen unterschiedlichen Interessensgruppen gefunden werden. Dafür sind sowohl Visionen als auch eine charismatische Führung notwendig."

Tom DeMarco spielräume

Mittwoch, 26. Oktober 2011

Strategic Decisions

Strategische Entscheidungen zeichnen sich nicht dadurch aus, dass sie unbedingt sehr schwierig sind, aber sie haben einen großen Impact für folgenden Aktivitäten.

Einmal getroffen sind sie oft schwer zu ändern.