Eclipse TPTP und Gentoo

July 2nd, 2009

Wenn beim Starten einer Profiling-Session unter Eclipse 3.4.1 mit TPTP auf einem Gentoo-System der Fehler IWAT0435E auftaucht (Details hier), dann sollte man mal die alte libstdc installieren:

emerge sys-libs/lib-compat

Eclipse neu starten und schon kann es losgehen…

*grübel* Benutzt noch jemand 3.4.1? Ausser mir meine ich ;)

Tagebucheintrag:

Letzte Woche war ich für einen Tag bei einem Kunden in Döbeln (Sachsen).

Rathaus Döbeln

Thema des Workshops war ob einen nackten Swing-Client oder eine RCP-Applikation mit Netbeans bauen.  Schlussendlich haben mehr Argumente dafür gesprochen einen Swing-Client zu bauen.

Frühling in Adelboden

June 6th, 2009

Wir waren in den letzten zwei Wochen immer am Wochenende in Adelboden. Und es ist im Frühling schön dort:

dsc_00821

Blick in Richtung Lohner

Read the rest of this entry »

Ich komme immer wieder durcheinander, wie die Streams eines externen Prozesses der aus Java gestartet wird (z.B. mit java.lang.ProcessBuilder) auf die Streams in Java abgebildet werden. Hier also mein Spickzettel:

io-map-process-java1

Letztes Wochenende habe ich nun endlich meinen Hetzner-Server von Debian 4 auf Debian 5 umgestellt. Zur Administration der Domains benutze ich Virtualmin und dies sollte natürlich dann auch noch laufen. Eine Anleitung war bei www.virtualmin.com zu finden. Allerdings stimmte da die Reihenfolge in welcher man die Pakete installieren sollte noch nicht ganz. Nachdem ich einen Bug bei virtualmin.com aufgemacht hatte, war das Problem aber zusammen mit den Jungs von virtualmin.com (Jamie Cameron und Joe Cooper) schnell gelöst. Wirklich schneller und kompetenter Support – Spitzenklasse!

Nach dem Upgrade konnte ich mich dann aber nicht via POP3 auf dem Mail-Server einloggen. Ich musste dazu noch die Konfigurationsdatei (/etc/default/saslauthd) von saslauthd anpassen:

Die Zeile

START=no

auf

START=yes

ändern und den richten Pfad eintragen. Von:

OPTIONS="-c -m /var/run/saslauthd"

auf:

OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"

Dann die Services nochmal neu starten

# /etc/init.d/saslauthd restart
# /etc/init.d/postfix restart

Und schon funktionierte die Anmeldung auf dem POP3 wieder.

Oberlausitz 2009

May 3rd, 2009

Vor einer Woche sind wir aus der Oberlausitz zurückgekommen. Ich bin dort aufgewachesen und so aller zwei Jahre fahren wir Verwandte und Freunde besuchen.

Geschlafen haben wir in einer Ferienwohnung im Bischof Benno Haus im Schmochtitz bei Bautzen. Sehr grosse Wohnung, schöne Häuser mit einem wunderschönen kleinen Park

Park bei Bischof Benno Haus

und weiten Feldern ringsherum. Wirklich schick. Read the rest of this entry »

Nun, Künstler und Auftragsarbeiten ist so eine Sache… Aber nicht nur der Punkt war an meinem letzten Blog-Eintrag ein wenig “schräg”.  :)

Unter der Annahme das der Auftraggeber weiss was er möchte, geht es eigentlich bei der Anforderungsanalyse darum, dass der Auftragnehmer versteht was der Kunde eigentlich möchte. D.h. der Künstler – um beim Beispiel zu bleiben – muss die grobe Beschreibung lesen und die richtigen Fragen stellen. Er muss dem Bildliebhaber z.B. fragen: “Ist es okay, wenn das Bild kubistisch ist?”. Wenn das nicht klar ist, dann muss man sich darüber unterhalten…

Was hat die Anforderungsanalyse oder besser Anforderungserhebung in der Softwareentwicklung mit einem Künstler zu tun?

Will man ein Softwaresystem bauen, so muss man wissen was man da eigentlich bauen möchte. Logisch, oder? Also notiert man sich die Anforderungen. Doch die Frage ist: Wie genau muss dies gemacht werden?

Read the rest of this entry »

Heute hatte ich eine Diskussion über die Art und Weise wie man in Java dokumentiert.  Was sind gute Kommentare? Was muss dokumentiert werden? Was kann man weglassen?

Ich finde zu diesem Thema die Meinungen von Robert C. Martin gut, die er in seinem Buch Clean Code: A Handbook of Agile Software Craftmanship. Prentice Hall PTR. 2008 unter dem Kapitel 4 “Comments” vertritt.

Ein paar Auszüge:

Seite 63:

It is just plain silly to have a rule that says that every function must have a javadoc, or every variable must have a comment. Comments like this just clutter up the code, propagate lies, and lend to general confusion and disorganisation.

Seite 64f.:

And then there’s this paragon of redundancy:

/**
 * Returns the day of the month.
 *
 * @return the day of the month.
 */
 public int getDayOfMonth() {
    return dayOfMonth;
 }

Seite 71:

As useful as javadocs are for public API’s, they are anathema to code that is not intended for public consumption.

Auch wenn ich hier Auszüge aus dem Kapitel “Bad Comments” bringe, so halte ich Kommentare und Dokumentation zum Job eines Softwareentwicklers. Öffentliche Methoden müssen eine nützliche Dokumentation haben (Bitte aber nicht wie in getDayOfMonth ;) ). Auch macht man sich oder seinen “Nachfolgern” oft das Leben wesentlich leichter seine Intention zu erklären, warum etwas genau so und nicht anders gemacht hat. Alles im Buch beschriebene möchte ich nicht hier wiedergeben. Einfach lesen.

Da aber Softwareentwicklung in den meisten Fällen im Team erfolgt, sollte man sich aber auf Regeln einigen und diese dann auch einhalten.

KDE 4.2

January 27th, 2009

Jo, Jo, Jo… es ist vollbracht. KDE 4.2 ist erschienen. Hier auf meinem Gentoo-Arbeitsrechner benutze ich zwar immernoch 3.5.9 aber ich freue mich schon sehr. Und  meine Frau erst :) Sie musste jetzt eine Zeit lang mit 4.1 arbeiten (ich habe es ihr einfach auf den Rechner geknallt) und sie fand die 3.5.x-Serie eigentlich lustiger.

Morgen bin ich übrigens auf der Züricher KDE 4.2 Release Party. Sogar Aaron Joseph Seigo wird da sein.

Qt nun auch mit LGPL

January 14th, 2009

Was für ein Schritt! Nokia hat angekündigt, die Version 4.5 von Qt nun auch mit LGPL anzubieten. Und nicht nur das. Es sollen auch die Repositories geöffnet werden.

So gute Neuigkeiten!

Video über Kiva

January 14th, 2009

Gerade war in meiner Inbox ein Link auf ein Video wie Kiva funktioniert. Ich mag diese Organistation :)

Hier noch ein Link auf meine Seite bei Kiva. Inzwischen sind einige Leute hinzugekommen und ich konnte mein Geld zum Teil schon 3x reinvestieren.

cuddlicious gentoo

December 2nd, 2008

Thanks for “Thank you for using Gentoo:)

Gentoo is simply cuddlesome.

closest book meme

November 23rd, 2008

just another response to Ryan.

  • Grab the nearest book.
  • Open it to page 56.
  • Find the fifth sentence.
  • Post the text of the sentence in your journal along with these instructions.
  • Don’t dig for your favorite book, the cool book, or the intellectual one: pick the CLOSEST.

“Das bedeutet, Sie lassen bei dieser Option den Namensbeginn lib ebenso weg wie die Endung .a.” (C++ Entwicklung mit Linux: Thomas Wieland)

Militaristen bei Spring Source?

November 21st, 2008

“Battling complexity?”, “Choose your weapon:” “Weapons for the War on …” – Diese Aussprüche habe ich gerade auf der Seite von Spring Source gefunden. Ich dachte bisher es ginge um Java (Spring Framework, und seit Kurzem auch Groovy und Grails). Jetzt habe ich aber das Gefühl in den Krieg ziehen zu müssen. Was soll der Quatsch? Die haben offensichtlich den falschen Mann fürs Marketing eingekauft. Zumindest für meinen Geschmack…

In Europa – Geert Mak

November 9th, 2008

Heute habe ich “In Europa” von Geert Mak fertig gelesen. Seit Anfang Sommer bin ich nun daran und habe sehr viel Zeit in Gedanken mit diesem Buch verbracht. Mir gefällt die Art und Weise wie Geert Mak Geschichte schreibt und wie er mich zum Nachdenken angeregt hat. Oft hat mich das Buch erschauern lassen, wie brutal und gemein es doch zuging in Europa. Ich habe mir dann vorgestellt, wie viele schlimme Einzelschicksale es gegeben hat… dieser Gedanke bringt mich jedes Mal zum Erschauern.

Lesen!

Congratulation America!

November 5th, 2008

Ich bin zutiefst berührt. Barack Obama wurde als als 44. Präsident der Vereinigten Staaten von Amerika gewählt.

Man wacht nicht jeden Morgen auf und erlebt wie Geschichte geschrieben wird.

statisch vs. new performance

November 3rd, 2008

Heute hatten wir eine Diskussion darüber, ob auf einen Wert via einem statischen Klassenmember oder über einen Getter zugegriffen werden soll oder ob es sogar egal ist wenn man jedes Mal eine neue Instanz erzeugt. Jetzt hat es mich gejuckt, mal einfach ein kleines Beispiel zu machen. Mir ist klar, dass entscheidend ist, wie teuer das erzeugen des Objektes ist. Aber hier sind einfach mal die Zahlen vom Beispiel um ein Gefühl zu bekommen:

count: 10
static  msec: 0
get     msec: 0
new     msec: 0
count: 100
static  msec: 0
get     msec: 0
new     msec: 0
count: 1000
static  msec: 0
get     msec: 0
new     msec: 2
count: 10000
static  msec: 4
get     msec: 1
new     msec: 16
count: 100000
static  msec: 1
get     msec: 1
new     msec: 32
count: 1000000
static  msec: 0
get     msec: 0
new     msec: 224
count: 10000000
static  msec: 0
get     msec: 0
new     msec: 1848
count: 100000000
static  msec: 0
get     msec: 0
new     msec: 19029

Und hier noch das Beispiel:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
 
public class Main {
 
    private static final Person PERSON = new Person();
    private static long timestamp;
 
    public static void main(String[] args) {
        int count = 10;
        for(int i = 1; i < 9; i++){
            System.out.println("count: " + count);
            iterate(count);
            count *= 10;
        }
    }
 
    private static void iterate(int count){
        timestamp = System.currentTimeMillis();
        iterateStatic(count);
        out("static ");
        timestamp = System.currentTimeMillis();
        iterateGetter(count);
        out("get    ");
        timestamp = System.currentTimeMillis();
        iterateNew(count);
        out("new    ");
    }
 
    private static Person getPerson(){
        return PERSON;
    }
 
    private static void iterateStatic(int count){
        for(int i = 0; i < count; i++){
            Person person = PERSON;
            person.blub();
        }
    }
    private static void iterateNew(int count){
        for(int i = 0; i < count; i++){
            Person person = new Person();
            person.blub();
        }
    }
    private static void iterateGetter(int count){
        for(int i = 0; i < count; i++){
            Person person = getPerson();
            person.blub();
        }
    }
    private static void out(String s){
        System.out.println(s + " msec: " + (System.currentTimeMillis()-timestamp));
    }
}
 
class Person {
 
    private Map<?, ?> aMap = new HashMap<String, Object>();
    private Set<?> aSet = new HashSet<String>();
 
    public Person() {
    }
 
    void blub(){
    }
}

Meine Lösung von gestern funktioniert nicht, wenn die Klassenhierarchy tiefer als Eins ist. Die Methode getGenericSuperclass() liefert eben nur die Superklasse der aktuellen Klasse. Es ist also noch notwendig die Hierarchie nach Dada zu suchen um die Typinformation zu bekommen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
 
public class Parameterized {
    public static void main(String[] args) {
        new SubDada();
        new SubSubDada();
    }
}
 
abstract class Dada<T> {
    private Class<T> typeOfT;
    public Dada() {
        this.typeOfT = getTypeOfT();
        System.out.println("typeOfT: " + this.typeOfT);
    }
    @SuppressWarnings("unchecked")
    private Class<T> getTypeOfT() {
        ParameterizedType pType = getDadaAsParameterizedType(getClass());
        return (Class<T>) pType.getActualTypeArguments()[0];
    }
    private ParameterizedType getDadaAsParameterizedType(Class<?> clazz) {
        Object gstype = clazz.getGenericSuperclass();
        if (gstype instanceof ParameterizedType) {
            ParameterizedType ptype = (ParameterizedType) gstype;
            Type rawtype = ptype.getRawType();
            if (Dada.class.equals(rawtype)) {
                return ptype;
            }
        }
        return getDadaAsParameterizedType(clazz.getSuperclass());
    }
}
 
class SubDada extends Dada<String> {
    public SubDada() {
    }
}
 
class SubSubDada extends SubDada {
    public SubSubDada() {
    }
}

Wie finde ich zur Laufzeit heraus von welchem Typ ein “Type Parameter” ist?

Hier die Lösung:

1
2
3
4
5
6
7
8
9
10
11
12
public class Dada<T> {
 
    private Class<T> typeOfT;
 
    @SuppressWarnings("unchecked")
    public Dada() {
        this.typeOfT = (Class<T>)
                ((ParameterizedType)getClass()
                .getGenericSuperclass())
                .getActualTypeArguments()[0];
    }
...

Die FAQ zu Java Generics bei Angelika Langer finde ich wirklich gelungen.