Mittwoch, 31. August 2011

Quo Vadis UI

noch nie war es so wichtig, wie heute, ein User-Interface anzubieten, das von den meisten Benutzern intuitiv zu bedienen ist. In einer Zeit, in denen internetfähige Computer in fast jedem Haushalt zu finden sind, ergibt sich mit "den meisten" eine ganz andere Zielgruppe, als vor zehn oder zwanzig Jahren. Heute soll jeder mit dem technischen Gerät zurecht kommen, ganz gleich ob mit oder gänzlich ohne Computerkenntnisse. Das führt zu schicken und gut bedienbaren Oberflächen, die so weit wie möglich vom technischen Level abstrahiert werden. Ganz gleich ob Unity, Gnome3 oder OSX, Ahnung sollte man am besten nicht haben, das verwirrt nur. So manche Umgestaltung ist nämlich nur mit Unvoreingenommenheit und nicht mit technisch strukturiertem Denken oder entsprechender Erfahrung nutzbar. Schade, bietet doch die nähe zur Technologie auch immer eine gewisse Effizienz. Ich bin ehrlich gespannt, wo der Weg hingeht und welche Kehrtwendungen noch vonnöten sind. Das derzeitige Angebot moderner UI erscheint mir viel mehr für den Übergang zu etwas anderem geschaffen, als der Weisheit letzter Schluss.

Freitag, 19. August 2011

HTML5 let's start die Zweite

Ein paar Linktips zu HTML5 habe ich ja vor einiger Zeit schon mal verbloggt. Interessant ist auch das H5BP-Projekt (HTML5 Boilerplate), das kürzlich die Version 2 erreicht hat. H5BP eignet sich als Vorlage für neue Projekte. Es ist nahezu alles enthalten, was man so standardmäßig braucht. Da wären zum Beispiel Styles, die ein einheitliches Browserverhalten erzielen oder das jQuery minified, aber auch noch vieles mehr. Für den Projektstart auf jeden Fall einen Blick wert.

H5BP-Projekt

Montag, 15. August 2011

MiG Layoutmanager für SWT/Swing/JavaFX

Ich kannte ihn noch nicht, scheint aber wohl total Toll zu sein, was die Lesbarkeit und Handhabung anbelangt. Muss ich mir mal merken, für den Fall, dass ich mal wieder eine UI basteln muss.

MigLayout - Java Layout Manager

Mittwoch, 3. August 2011

Hello World Ausgabe beim Compilieren

Das coolste Hello World Beispiel ist mir heute untergekommen, funktioniert aber nur in der Windows-Console.

Zuerst mit einem Texteditor eine Datei anlegen und die folgende innere Klasse einfügen:
class Con {
    String hi = "Hello World";
}
Anschließend das ganze auf der Console compilieren.



Für die Ausgabe ist ein MS-DOS Relikt zuständig, das alle Dateien, deren Name mit CON beginnen, anstelle ins Dateisystem, auf die Console schreibt.

via Vanilla Java

Dienstag, 2. August 2011

Methoden verständlich anlegen

Nicht selten benötigt eine Methode mehrere Parameter, um ihre Aufgabe zu verrichten. Gerade bei Ergänzungen, für die eine Methode nur geringfügig anders ablaufen soll, neigen viele dazu, einfach ein Boolean- oder Integer-Flag anzuhängen. Das verhindert unnötig redundanten Code, vermindert aber die Lesbarkeit. Das ist bei der Methodensignatur noch nicht weiter wild. Deklarations-Beispiel:
void doSomething(Document doc, String name, String value, boolean ignoreCase) wird aber beim Aufruf interessant, da bei den Flag-Parametern häufig keine Variable auf seiten des Aufrufers verwendet wird. Aufruf-Beispiel: doSomething(doc, name, value, true). Kommen solche Konstruktionen zustande, ist im Aufruf nicht erkennbar, wofür das Parameter steht. Besonders schlimm wird es, wenn sich solche Parameter häufen.

Als Lösung würde es sich anbieten, für den Aufruf zuvor eine Variable mit passendem Namen zu deklarieren, so dass der Aufrufparameter erkennbar wird. Aufruf-Beispiel: doSomething(doc, name, value, ignoreCase). Die Lesbarkeit wird damit verbessert, jedoch eine eigentlich nicht benötigte Variable deklariert, die ausschließlich durch den Methodenaufruf Verwendung findet.

Am ehesten würde aber vermutlich die Deklaration von Konstanten sinn machen, um die Lesbarkeit zu verbessern. So könnten für das Beispiel die Konstanten DO_IGNORE_CASE und DO_NOT_IGNORE_CASE mit dem jeweiligen boolean deklariert werden, so dass der Aufruf letztlich so aussieht: doSomething(doc, name, value, DO_IGNORE_CASE).

Am meisten hat es sich bewährt, anstelle eines weiteren Parameter, eine neue Methode anzulegen, die den Flag-Parameter im Namen trägt. Deklarations-Beispiel: void doSomethingIgnoreCase(Document doc, String name, String value). Damit werden unnötige Schnörkel, wie Variablen-Deklarationen vermieden und sowohl Lese- als auch Schreibfluss gefördert. Es ist nämlich auch beim schreiben angenehmer die passende Methode auszusuchen, anstelle mit den Flag-Parametern zu hadern. Leider ist diese Möglichkeit nicht in jedem Fall praktikabel oder Möglich. Dann würde ich am ehesten die Konstanten-Schreibweise bevorzugen.

Freitag, 29. Juli 2011

OpenVPN-Clientverbindung als Windows-Dienst

Ich benutze schon länger OpenVPN um ins Firmennetz zu kommen. Bisher habe ich das mit OpenVPN GUI gemacht, dass mich immer brav nach dem Passwort für den Schlüssel gefragt hat, bevor es die Verbindung aufbaute. Wenn man das Passwort als Klartext-Datei ins OpenVPN-Config-Verzeichnis ablegt und in der Client-Konfiguration darauf verweist, kann man die OpenVPN-Client-Verbindung auch als Dienst starten.

Dazu einfach die Zeile askpass passwort.txt in die .ovpn eintragen und die passwort.txt gleich daneben legen. In der ersten Zeile der passwort.txt einfach das Passwort eintragen und fertig.

Die Nummer mit der Klartext-Passwort-Datei ist allerdings ein Sicherheitsproblem.

Mittwoch, 27. Juli 2011

Speicheranalyse von Java-Anwendungen mit MAT

Eclipse mit MAT
Ich benutze in den meisten Fällen die VisualVM, wenn ich mir das Speicherverhalten einer Java-Anwendung ansehen möchte. Nach dem Motto: Andere Programmierer, andere Tools, wurde mir heute der Memory Analyzer (MAT) empfohlen, den es als RCP-Anwendung sowie als Eclipse-Plugin gibt. Ich habe es mal mit dem Plugin versucht, dass auf meinem Eclipse 3.6 auch problemlos installiert. Einen großen Abhängigkeitszoo gibt es zur Abwechslung mal nicht.

MAT erlaubt die Analyse von Speicherabbildern, kann aber nicht, so wie VisualVM, eine Anwendung live untersuchen. Dafür kann MAT mit vielen Analyse-Funktionen punkten. Die Dokumentation ist ganz ordentlich, so dass man sich in recht kurzer Zeit mit den Funktionen vertraut machen kann. Auf mich macht das ganze einen sehr brauchbaren Eindruck.

Donnerstag, 14. Juli 2011

Ubuntu: Lautstärke-Schrittweite einstellen

Ein paar ordentlich Desktop-Lautsprecher haben den Weg auf meinen Schreibtisch gefunden. Der Anschluss erfolgt über USB, was mehrere Vorteile mit sich bringt. Die Boxen bringen gleich eine Fernbedienung mit, die unabhängig vom Rechner funktioniert und doch die Lautstärke des Systems und nicht nur die, der Lautsprecher selbst regeln kann. Das ist ungefähr so, wie beim Lautstärkeregler auf der Tastatur. Außerdem gewinnt die Soundqualität, weil das Signal erst in der Soundkarte der Boxen zu einem analogen gewandelt wird.

Unerträglich hingegen ist die Lautstärke-Schrittweite, die bei Ubuntu mit 6% vorkonfiguriert ist. Es tönt also immer ein bisschen zu leise oder ein bisschen zu laut aus den Lautsprechern. Ändern lässt sich das mit dem gconf-editor unter /apps/gnome_settings_daemon/volume_step. Ich habe das mal auf 2% runtergeregelt.

Mittwoch, 13. Juli 2011

Einfacher LRU-Cache in Java

Manchmal geht es erstaunlich einfach und man muss nur wissen, wie. Jedenfalls freue ich mich über alles, was einfach und ohne Zusatzbibliothek einsatzfähig gemacht werden kann. So zum Beispiel einen LRU-Cache (least recently used). Den kann man gut benutzen, wenn man einen Cache braucht, der jedoch nicht uneingeschränkt wachsen darf. Dafür lässt sich eine LinkedHashMap verwenden, der eine Maximalgröße verpasst wird. Die Objekt-Instanzen in der LinkedHashMap rutschen mit jedem weiteren, hinzugefügten Eintrag weiter nach Hinten. Die im Beispiel implementierte Methode removeEldestEntry sorgt dann dafür, dass die letzten, und somit auch die ältesten Einträge, die über die Maximalgröße hinausreichen, weggeworfen werden. Einträge wiederum die via get angefordert wurden, wandern praktischer Weise auch gleich wieder nach vorne, was dazu führt, dass sie länger im Cache verbleiben.

Hier also die versprochene Klasse. An Einfachheit wirklich kaum zu übertreffen:

/**
 * Provides support for a LRU (least recently used) cache.
 * This cache is not thread safe and would need to wrap with Collections.synchronizedMap() if thread safety is needed.
 */
public class LRUCacheMap<K, V> extends LinkedHashMap<K, V>{
    
    private final int maxSize;
    
    /**
     * @param maxSize maximum number of entries.
     */
    public LRUCacheMap(final int maxSize) {
        super(maxSize * 4 / 3, 0.75f, true);
        this.maxSize = maxSize;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
        return size() > maxSize;
    }
}

via Vanilla Java

Freitag, 8. Juli 2011

Hibiscus - Java auf dem Desktop 4

Schon lange kein Geheimtipp mehr, aber erst kürzlich bei Version 2.0 angekommen. Das Online-Banking-Programm Hibiscus ist inzwischen die quasi Standard-Open-Source-Lösung für das deutsche Onlinebanking mit HBCI. Bei mir hat Hibiscus damals mein Starmoney/Wine abgelöst. Der kostenpflichtige Update-Zwang von Starmoney war unerträglich, so dass ich glücklich war, etwas alternatives zu haben.

Für eine Homebanking-Anwendung natürlich naheliegend und ideal zum Testen, ist die Spenden-Schaltfläche links unten. Eine kleine Anerkennung für den Entwickler, dessen Software in häufiger Nutzung ist, sollte ja eigentlich drin sein.

Hibiscus bei heise