2..27 – noch nicht angekommen

So, nun bin ich in der zweiten Woche meiner Auszeit. Einige Leute fragen schon, wie es läuft und wie es geht und was ich so mache…

Meine Antwort derzeit ist, dass ich noch nicht angekommen bin. Es fällt mir zum Beispiel schwer 2 Stunden am Stück an einem Buch zu lesen. Mich überkommt immer noch so eine Unruhe.

Aber ich habe schon ein paar Erfahrungen gemacht, die ich ohne diese Pause nicht gemacht hätte. Da ist dieses Projekt vert.x . Ich lese jeden Eintrag in der Google Group, jeden Twitter Pieps von @TimFox und jedes Ticket was aufgemacht wird und bekomme so sehr viel von dem Projekt mit. Auch andere kämpfen mit Git und nicht jeder Schalter  ist sofort klar. Warum ist die vorgeschlagen Verzeichnisstruktur von Maven so nett und warum sollte man nicht grössere Codeänderungen ankündigen und dann lange nicht machen. Alle warten darauf und sie kommen nicht…

Und mir geht der Code von dieser einen Klasse nicht aus dem Kopf. Da ist dieser Code in org.vertx.java.deploy.impl.cli.Starter :

    private Starter(String[] sargs) {
	String vertxVersion = String.format("vert.x %s", System.getProperty("vertx.version", "0.0.0-UNKNOWN!"));
    if (sargs.length < 1) {
      displaySyntax();
    } else {
      String command = sargs[0].toLowerCase();
      Args args = new Args(sargs);
      if ("version".equals(command)) {
        log.info(vertxVersion);
      } else {
        if (sargs.length < 2) {
          displaySyntax();
        } else {
          String operand = sargs[1];
          switch (command) {
            case "version":
              log.info(vertxVersion);
              break;
            case "run":
              runVerticle(false, operand, args);
              break;
            case "runmod":
              runVerticle(true, operand, args);
              break;
            case "install":
              installModule(operand, args);
              break;
            case "uninstall":
              uninstallModule(operand);
              break;
            default:
              displaySyntax();
          }
        }
      }
    }
  }
...
 
  private void runVerticle(boolean module, String main, Args args) {
    boolean clustered = args.map.get("-cluster") != null;
    if (clustered) {
      log.info("Starting clustering...");
      int clusterPort = args.getInt("-cluster-port");
      if (clusterPort == -1) {
        clusterPort = 25500;
      }
      String clusterHost = args.map.get("-cluster-host");
      if (clusterHost == null) {
        clusterHost = getDefaultAddress();
        if (clusterHost == null) {
          log.error("Unable to find a default network interface for clustering. Please specify one using -cluster-host");
          return;
        } else {
          log.info("No cluster-host specified so using address " + clusterHost);
        }
      }
      vertx = new DefaultVertx(clusterPort, clusterHost);
    }
    String repo = args.map.get("-repo");
    mgr = new VerticleManager(vertx, repo);
 
    boolean worker = args.map.get("-worker") != null;
 
    String cp = args.map.get("-cp");
    if (cp == null) {
      cp = ".";
    }
 
    // Convert to URL[]
 
    String[] parts;
 
    if (cp.contains(CP_SEPARATOR)) {
      parts = cp.split(CP_SEPARATOR);
    } else {
      parts = new String[] { cp };
    }
    int index = 0;
    final URL[] urls = new URL[parts.length];
    for (String part: parts) {
      try {
        URL url = new File(part).toURI().toURL();
        urls[index++] = url;
      } catch (MalformedURLException e) {
        throw new IllegalArgumentException("Invalid path " + part + " in cp " + cp) ;
      }
    }
 
    String sinstances = args.map.get("-instances");
    int instances;
    if (sinstances != null) {
      try {
        instances = Integer.parseInt(sinstances);
 
        if (instances != -1 && instances < 1) {
          log.error("Invalid number of instances");
          displaySyntax();
          return;
        }
      } catch (NumberFormatException e) {
        displaySyntax();
        return;
      }
    } else {
      instances = 1;
    }
 
    String configFile = args.map.get("-conf");
    JsonObject conf;
 
    if (configFile != null) {
      try {
        String sconf = new Scanner(new File(configFile)).useDelimiter("\\A").next();
        try {
          conf = new JsonObject(sconf);
        } catch (DecodeException e) {
          log.error("Configuration file does not contain a valid JSON object");
          return;
        }
      } catch (FileNotFoundException e) {
        log.error("Config file " + configFile + " does not exist");
        return;
      }
    } else {
      conf = null;
    }
 
    Handler<String> doneHandler = new Handler<String>() {
      public void handle(String id) {
        if (id == null) {
          // Failed to deploy
          mgr.unblock();
        }
      }
    };
    if (module) {
      mgr.deployMod(main, conf, instances, null, doneHandler);
    } else {
      mgr.deploy(worker, main, conf, urls, instances, null, doneHandler);
    }
 
    addShutdownHook();
    mgr.block();
  }

Ich habe in der letzen Woche so viel über diesen Zeilen nachgedacht. Meine erste Reaktion war: “Das muss umgebaut werden.” Der Boolean “module” ist nicht gut: lieber zwei Methoden runVertical und runModule – ja und dann muss das Auslesen von den Konfigurationsparametern an anderer Stelle gemacht werden… und überhaupt lässt sich das Ding derzeit mit ”

vertx version version version version

aufrufen. Kein Fehler – komisch. Ich werde das umschreiben … macht das Sinn? Dies sind keine funktionalen Erweiterungen – und bekomme ich es so hin, dass es verständlicher sein wird? Unsicherheit!

 

half year off

So, mein Sabbatical startet heute. Während eines halben Jahres werde ich mich Weiterbilden und mit Sachen beschäftigen, für die ich im täglichen Geschäft nicht genug Zeit hatte. Mein Arbeitgeber Inventage war so lieb und hat mir ein halbes Jahr unbezahlten Urlaub gegeben.

Eine Pause wollte ich schon so lange mal machen. Bisher war es allerdings immer ein Reden darüber. Letzten Februar haben meine Frau und ich, bei unserer Fahrt in den Winterurlaub, wieder einmal darüber geredet und festgestellt, dass es eigentlich jetzt eine gute Zeit für uns wäre. Also, dann machen wir es. Im Prinzip soll alles wie bisher funktionieren. Die Zeit die ich bisher im Büro war, beschäftige ich mich nun mit anderen Sachen. Meine Aufgaben in der Familie bleiben die gleichen.

Was habe ich alles vor:

  • Viel lesen. Bei mir liegen so viele Bücher rum, die ich endlich mal in die Hand nehmen möchte. Habe gestern mit “The Annotated Turing” von Charles Petzold angefangen
  • 3 Wochen New York
    • Englisch lernen/verbessern
    • Stadt erleben und anschauen, ich war noch nie an der Ostküste und bin sehr gespannt
  • Software bauen, insbesondere bei interessanten Open Source Projekten helfen,
    • werde mir auf jeden Fall vert.x anschauen.
  • mich mit Single Page Html Seiten/Applikationen beschäftigen, dazu gehört auch das ich in Coffeescript, Knockout, jQuery usw eintauchen möchte
  • mit Leuten treffen
  • und wenn noch Zeit ist

Zumindest habe ich mir dies alles auf die Liste gesetzt. Was passieren wird, werde ich sehen… und protokollieren, werde ich es hier auf dieser Seite.

So, let’s have fun. vert.x is compiling…

It’s never to late for git.

If not already done, every software developer must try GIT – the fast, distributed version control system. It’s such a nice and useful tool. Once every week I find a new little nice feature.

The last month I used the git-client together with a svn-remote repository and I will never use the svn client again. It is so handy to have the full history of the repository on my notebook.  I can commit my changes every time to my local repository and merging/branching is just fun.  I’m so much faster …

Here my path to git

Here my favorite git client in action (the command line client 😉 :

git command line

There are plugins for eclise, idea, windows, mac… So give it a try and have fun!

And if you want to have the little nice prompt add the following lines to your .bashrc:

...
#-----------------------------------
# git in prompt
#-----------------------------------
        RED="\[\033[0;31m\]"
     YELLOW="\[\033[0;33m\]"
      GREEN="\[\033[0;32m\]"
       BLUE="\[\033[0;34m\]"
  LIGHT_RED="\[\033[1;31m\]"
LIGHT_GREEN="\[\033[1;32m\]"
      WHITE="\[\033[1;37m\]"
 LIGHT_GRAY="\[\033[0;37m\]"
 COLOR_NONE="\[\e[0m\]"
 
function parse_git_branch {
        git rev-parse --git-dir &amp;&gt; /dev/null
        git_status="$(git status 2&gt; /dev/null)"
        branch_pattern="^# On branch ([^${IFS}]*)"
        remote_pattern="# Your branch is (.*) of"
        diverge_pattern="# Your branch and (.*) have diverged"
 
        if [[ ! ${git_status} =~ "working directory clean" ]]; then
                state="${RED}?"
        else
                state="${GREEN}?"
        fi
 
        # add an else if or two here if you want to get more specific
        if [[ ${git_status} =~ ${remote_pattern} ]]; then
                if [[ ${BASH_REMATCH[1]} == "ahead" ]]; then
                        remote="${YELLOW}?"
                else
                        remote="${YELLOW}?"
                fi
        fi
 
        if [[ ${git_status} =~ ${diverge_pattern} ]]; then
                remote="${YELLOW}?"
        fi
 
        if [[ ${git_status} =~ ${branch_pattern} ]]; then
                branch=${BASH_REMATCH[1]}
                echo " (${branch})${remote}${state}"
        fi
}
function prompt_func() {
        previous_return_value=$?;
        prompt="${GREEN}${USER:-$(type whoami &gt;/dev/null &amp;&amp; whoami)}@$(type uname &gt;/dev/null &amp;&amp; uname -n) ${BLUE}[\w${GREEN}$(parse_git_branch)${BLUE}]${COLOR_NONE} "
        if test $previous_return_value -eq 0
        then
                # PS1="${prompt}? "
                PS1="${prompt} \\$ "
        else
                #PS1="${prompt}${RED}?${COLOR_NONE}"
                PS1="${prompt}${RED}\\$ ${COLOR_NONE}"
        fi
}
 
PROMPT_COMMAND=prompt_func

I found this script at github and changed it a little bit. Thx to trapni.

Rodeln 1987

In meiner Jugend habe ich sehr intensiv Rodelsport betrieben. Vor zwei Wochen nun habe ich ein Bild geschenkt bekommen, auf dem ich beim Rodeln zu sehen bin. Leider habe ich nur dieses eine Bild. Wenn jemand noch mehr Bilder hat, dann meldet Euch doch bitte bei mir… würde mich sehr freuen!

Ich glaube es wurde 1987 bei der DDR Spartakiade in Oberwiesenthal aufgenommen.

1987 - Oberwiesenthal

 

 

The Clean Coder

Habe gestern Abend “The Clean Coder” von Robert C. Martin (Uncle Bob) fertig gelesen. Ich wäre so froh gewesen, wenn ich dieses Buch als Berufseinsteiger gelesen hätte. Es hätte mich so manche Fettnäpfchen vermeiden lassen.

Spannend zu lesen war seine Meinung über den “Flow”. Dieser Zustand beim Programmieren, oder Arbeiten allgemein, wo man die Zeit vergisst und einem schier alles gelingt. Uncle Bob findet diesen Zustand eher hinderlich, weil man den Blick für das Grosse verliert. Ich denke es hängt ein wenig vom Arbeitsstil ab. Ich habe immer zu Beginn mein Notizbuch vor mir liegen, wo ich den grossen Kontext aufzeichne. Manchmal komme ich dann schon in Flow während ich beim dem Design bin – also einem relativ hohen Abstraktionsniveau. Trotzdem hat mich das Buch etwas kritischer gegenüber dem Flow werden lassen.

Einen völlig anderen Blickwinkel auf den Flow hat z.B.  Joel Spolsky (bekannt von dem Blog “Joel on Software“).  Er erzählt in einem Interview, wie wichtig er den Flow findet und das er die Büros sogar so gestaltet, das man sich richtig gut in die Arbeit vertiefen kann.

Es gibt aber in dem Buch noch sehr viele andere Perlen und Denkanstösse zu finden. Lesen!

 

using amazon bookstore again

I’m using the amazon bookstore again. The bookstore has no real rivals and I like and need books. In the last few months I used:

  • books.ch
  • exlibris.ch
  • buch.de
  • buch.ch
  • buecher.de
  • buchhaus.ch

But I still don’t use the Amazon Web Services…

java.io.NotSerializableException – but where is the field?

To enable more informations about “java.io.NotSerializableException” just add the “-Dsun.io.serialization.extendedDebugInfo=true” VM argument to your run configuration.

Example: java -Dsun.io.serialization.extendedDebugInfo=true -jar your.jar

Without extendedDebugInfo:

Exception in thread "main" java.io.NotSerializableException: net.nautsch.addressbook.Country
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
        at net.nautsch.addressbook.App.main(App.java:33)

and with:

Exception in thread "main" java.io.NotSerializableException: net.nautsch.addressbook.Country
        - field (class "net.nautsch.addressbook.Address", name: "country", type: "class net.nautsch.addressbook.Country")
        - object (class "net.nautsch.addressbook.Address", net.nautsch.addressbook.Address@13caecd)
        - field (class "net.nautsch.addressbook.Person", name: "address", type: "class net.nautsch.addressbook.Address")
        - root object (class "net.nautsch.addressbook.Person", net.nautsch.addressbook.Person@158b649)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1161)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
        at net.nautsch.addressbook.App.main(App.java:33)