Samstag, 24. Dezember 2011
Spenden beim Shoppen
Inzwischen ist die Weihnachts-Großeinkaufszeit zwar vorbei, aber ich wollte trotzdem gern noch auf die Seite Bildungsspender.de aufmerksam machen. Affiliate-Programme sind bestimmt den meisten bekannt. Wird ja auch viel von Bloggern genutzt, die auf diesem Weg ein paar Euro für Produktempfehlungs-Links bekommen. Genauso ist das bei Bildungsspender.de, bloß, dass man sich dort einen Verein, eine Schule oder Kita etc. aussuchen kann, die dann die Provision des eigenen Einkaufs als Spende erhält. Feine Sache eigentlich.
Donnerstag, 22. Dezember 2011
Jampal - Java auf dem Desktop 6
Und weiter geht es mit der Serie "Java auf dem Desktop". Dieses mal mit Jampal, einem Schlanken Java-Musikplayer und Tag-Editor. In der Kategorie "Einfach und Effizient" ist bei Musik-Playern irgendwann eine Lücke aufgetaucht, die Winamp, Audacious und Konsorten mit wachsenden Fähigkeiten nicht mehr bedienen können. Hier springt Jampal in die Bresche. Die Benutzeroberfläche präsentiert sich denkbar einfach als Liste zu spielender Tracks mit den gewohnten Steuerelementen zum Abspielen.
In den Einstellungen lassen sich noch verschiedene Fein-Anpassungen vornehmen. So lässt sich auch der Mixer auswählen, was bei Verwendung des Paketes java-6-sun notwendig ist, damit überhaupt etwas aus den Lautsprechern kommt. Mit dem Paket java-6-openjdk funktionierte das bei mir automatisch.
Ebenfalls sehr gelungen ist die MP3-Tag-Integration. Tags lassen sich nicht nur Anzeigen und sind suchbar, sondern mit dem Tag-Editor auch bearbeitbar. Die Bibliothek-Dateien sind einfache Textdateien, die sich auch in jede Tabellenkalkulation einlesen lassen. Hinter der einfachen Oberfläche verstecken sich etliche Funktionen, die nur entdeckt werden wollen.
Mehr zum Thema Jampal beim Trompetenkäfer und auf der Jampal-Projektseite
In den Einstellungen lassen sich noch verschiedene Fein-Anpassungen vornehmen. So lässt sich auch der Mixer auswählen, was bei Verwendung des Paketes java-6-sun notwendig ist, damit überhaupt etwas aus den Lautsprechern kommt. Mit dem Paket java-6-openjdk funktionierte das bei mir automatisch.
Ebenfalls sehr gelungen ist die MP3-Tag-Integration. Tags lassen sich nicht nur Anzeigen und sind suchbar, sondern mit dem Tag-Editor auch bearbeitbar. Die Bibliothek-Dateien sind einfache Textdateien, die sich auch in jede Tabellenkalkulation einlesen lassen. Hinter der einfachen Oberfläche verstecken sich etliche Funktionen, die nur entdeckt werden wollen.
Mehr zum Thema Jampal beim Trompetenkäfer und auf der Jampal-Projektseite
Dienstag, 20. Dezember 2011
Mint Personalisierung
Inzwischen habe ich etwas Zeit gehabt mich an das neue Gnome 3 zu gewöhnen. Mir fehlte noch die Dropbox, die sich aber inzwischen ziemlich einfach per apt-get install dropbox installieren lässt. Ich kenne das noch umständlicher. Nur starten wollte sie nicht automatisch, was mit einem dropbox autostart behoben werden kann.
Dann mochte ich eigentlich immer gern das Wetter-Applet im Panel. Das gibt es auch für Gnome 3 mit der Gnome-Shell-Wetter-Extension. Das kommt zwar nicht als Debian-Paket, aber lässt sich trotzdem leicht installieren. Die WOEID, die es für den Standort braucht, lässt sich am einfachsten mit dem Yahoo-Wetterdienst ermitteln. Einfach über die Webseite den eignen Standort ermitteln. Die Zahl am Ende der URL ist die WOEID. Den Rest einfach nach Anleitung.
Dann mochte ich eigentlich immer gern das Wetter-Applet im Panel. Das gibt es auch für Gnome 3 mit der Gnome-Shell-Wetter-Extension. Das kommt zwar nicht als Debian-Paket, aber lässt sich trotzdem leicht installieren. Die WOEID, die es für den Standort braucht, lässt sich am einfachsten mit dem Yahoo-Wetterdienst ermitteln. Einfach über die Webseite den eignen Standort ermitteln. Die Zahl am Ende der URL ist die WOEID. Den Rest einfach nach Anleitung.
Montag, 12. Dezember 2011
Auf neuen Wegen
Inzwischen ist mit dem neuen Mint auch Gnome3 auf meinem Rechner angekommen. Vieles ist neu und will entsprechend konfiguriert werden. Die für mich wichtigsten Sachen:
Browser und Mail-Client habe ich gern im Autostart. Der Dialog für die Autostart-Programme wurde allerdings versteckt und lässt sich nur noch mit gnome-session-properties aufrufen.
Häufig genutzte Programme habe ich gern direkt im Panel. Das geht nun mit der Extension Frippery Panel Favorites, die alle als Favoriten markierten Programme im Panel anzeigt. Da kann ich gut mit leben.
Der HPlip-Treiber für meinen Multifunktionslaser ist nichts für schwache Nerven. Etwas wehrhaft braucht es einen kleinen Workaround, um ihn zur Mitarbeit zu bewegen. Erst später habe ich gemerkt, dass es hplip inzwischen auch in den Paketquellen gibt.
Mehr war erst mal nicht. Scheint mir alles weniger schlimm, als angenommen, mit dem neuen Gnome.
Browser und Mail-Client habe ich gern im Autostart. Der Dialog für die Autostart-Programme wurde allerdings versteckt und lässt sich nur noch mit gnome-session-properties aufrufen.
Häufig genutzte Programme habe ich gern direkt im Panel. Das geht nun mit der Extension Frippery Panel Favorites, die alle als Favoriten markierten Programme im Panel anzeigt. Da kann ich gut mit leben.
Der HPlip-Treiber für meinen Multifunktionslaser ist nichts für schwache Nerven. Etwas wehrhaft braucht es einen kleinen Workaround, um ihn zur Mitarbeit zu bewegen. Erst später habe ich gemerkt, dass es hplip inzwischen auch in den Paketquellen gibt.
Mehr war erst mal nicht. Scheint mir alles weniger schlimm, als angenommen, mit dem neuen Gnome.
Freitag, 2. Dezember 2011
Bei "Linux und Ich" gibts was zu holen..
..und zwar etliche Preise wie Fachbücher, Abos und Hardwaresachen. Der Hauptpreis ist die schicke, kleine Computerbox Cirrus7.

Meine bisherige sieht übrigens so aus:

Ein gutes altes ThinkCentre von IBM. Funktioniert tadellos, ist aber keine Schönheit und macht bei HD auch schon mal schlapp.
via Linux und Ich

Meine bisherige sieht übrigens so aus:

Ein gutes altes ThinkCentre von IBM. Funktioniert tadellos, ist aber keine Schönheit und macht bei HD auch schon mal schlapp.
via Linux und Ich
Mittwoch, 30. November 2011
Was ist neu in Java 7
Bei heise Developer gibt es eine Artikelserie, die das Neue in Java 7 sehr anschaulich zusammenfasst.
Teil 1 – Produktivität Teil 2 – Performance Teil 3 – Allgemeingültigkeit Teil 4 – Integration
Donnerstag, 24. November 2011
Unsigned Datatypes
Da James Gosling der Meinung war, nicht-vorzeichenbehaftete, primitive Datentypen würden die Sprache unnötig verkomplizieren, gibt es bis dato nur die vorzeichenbehafteten. Darüber lässt sich vortrefflich diskutieren. Zum Beispiel macht der negative Zahlenbereich bei Listen keinen Sinn. Interessant ist das auch beim Unicode-Char, der eigentlich einem unsigned 16-Bit-Wert entspricht bzw. als solcher behandelt wird (1). Mit ein bisschen Bit-Opration kommt man aber durchaus an den Unsigned-Wert heran (2). Komfortabel ist allerdings anders. Dafür habe ich neulich die sehr nette, kleine Bibliothek jouu gefunden, die sich dem Thema sehr elegant annimmt. Wenn man nicht um die Operation mit unsigned Datentypen herumkommt, bietet sich damit eine gut lesbare Alternative.
Referenzen:
1) White Paper - The Java Language Environment
2) unsigned : Java Glossary
Referenzen:
1) White Paper - The Java Language Environment
2) unsigned : Java Glossary
Mittwoch, 26. Oktober 2011
Rechnen mit Zeitangaben
Klein aber sehr nützlich ist die TimeUnit-API, die im Grunde nur aus einer Enum-Klasse besteht. Die Idee das Thema derart simpel auszugestalten ist unschlagbar.
via Thomas Muchs Java Blog und java.net weblogs
via Thomas Muchs Java Blog und java.net weblogs
Sonntag, 16. Oktober 2011
Steve Jobs - Verehrung und Kritik
Verehrung und Abneigung, beides vereinte Steve Jobs stets auf sich. Ein visionärer Geist und ein knallharter Geschäftsmann. Während Richard Stallman froh über Steves Abtreten ist, wird ihm postum ein eigener Feiertag gewidmet. Kaum jemand, der mit seiner Meinung hinterm Berg hält und viele die sich Fragen, ob dies alles wirklich gerechtfertigt ist. Da wird argumentiert, dass Jobs eine neue Gadget und Benutzerführungsära einleutete, der zunächst kaum ein Konkurent etwas entgegenzusetzen hatte, dem aber fleißig nachgeeifert wurde. Inzwischen können wir selbst auf den billigen Tablet- und Smartphone-Derivaten herumwischen und alles ist superintuitiv. Anwendungen lassen sich nur noch über die hauseigenen Online-Stores Installieren, was nicht nur lukrativ ist, sondern auch über Inhalte bestimmen lässt. Folge ist eine privatwirtschaftliche Zensur nach amerikanischem Moralempfinden. Merken tut man davon freilich wenig. Ebenso unauffällig ist die Verdongelung der Hardware, die gemeinsam mit den Nutzungsbedingungen die Einhaltung einiger Open-Source-Lizenzen unmöglich macht. Manche Geräte wurden durch fest verbaute Akkus deutlich in ihrer Lebensdauer beschnitten oder sind mit einem modernen iTunes nicht mehr zur Zusammenarbeit zu bewegen. Die Innvoation geht schließlich weiter und altes hat da keinen Platz.
Jobs hatte Ideen, er hatte Charisma, war Perfektionist, Verkäufer und nicht zuletzt auch Techniker. Er schaffte es eine Firma aufzubauen, die heute als eine der wertvollsten weltweit gilt. Er erdachte Geräte, die eine Vielzahl von Menschen bezaubert und fasziniert. Mit dem was er tat, schaffte er es aber auch an die 39. Stelle der Forbes-Liste. Kritiker, wie Verehrer haben genügend Argumente, denn Jobs hat viel bewegt. Mit einer Schwierigkeit haben Kritiker allerdings schwer zu kämpfen und hinterlassen mit jedem Argument einen schalen Geschmack. Es gehört sich eigentlich nicht schlecht über Tote zu sprechen.
Jobs hatte Ideen, er hatte Charisma, war Perfektionist, Verkäufer und nicht zuletzt auch Techniker. Er schaffte es eine Firma aufzubauen, die heute als eine der wertvollsten weltweit gilt. Er erdachte Geräte, die eine Vielzahl von Menschen bezaubert und fasziniert. Mit dem was er tat, schaffte er es aber auch an die 39. Stelle der Forbes-Liste. Kritiker, wie Verehrer haben genügend Argumente, denn Jobs hat viel bewegt. Mit einer Schwierigkeit haben Kritiker allerdings schwer zu kämpfen und hinterlassen mit jedem Argument einen schalen Geschmack. Es gehört sich eigentlich nicht schlecht über Tote zu sprechen.
Sonntag, 2. Oktober 2011
JBidwatcher - Java auf dem Desktop 5

Donnerstag, 22. September 2011
Technische Podcasts - Update
Inzwischen ist der Beitrag mit den (überwiegend deutschsprachigen) technischen Podcasts kontinuierlich angewachsen. Grund also, hier noch einmal auf meinen Beitrag Technische Podcasts hinzuweisen. Ein dickes Danke geht noch an windvilla für den Stapel an Ergänzungen. Wer noch interessante Podcasts kennt, bitte in die Kommentare damit.
Montag, 19. September 2011
UTF-8 Erkennen
Will man Text im UTF-8 Format einlesen, kann es mitunter eine gute Idee sein zu testen, ob der vorliegende Text überhaupt in UTF-8 vorliegt. Die ersten drei Bytes können schon einen ersten Hinweis darüber geben, da UTF-8 die Definition eines Byte order mark (BOM) erlaubt. Die Vorliegenden bytes, aus denen später ein String entstehen soll, kann also vorab mit einem
Die BOM-Markierung ist aber leider nicht zwingend und deshalb nur ein Anhaltspunkt. Alles weitere lässt sich aber auch nach der Codierung noch herausfinden. UTF-8 definiert einen Replacement-Character, der immer dann Verwendung findet, wenn ein unbekanntes Zeichen vorliegt. Enthält ein String einen Replacement-Character, war die UTF-8 Codierung nicht die richtige. Eine Abfrage kann mit einem einfachen
if(bytes.length > 3 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF)
geprüft werden.Die BOM-Markierung ist aber leider nicht zwingend und deshalb nur ein Anhaltspunkt. Alles weitere lässt sich aber auch nach der Codierung noch herausfinden. UTF-8 definiert einen Replacement-Character, der immer dann Verwendung findet, wenn ein unbekanntes Zeichen vorliegt. Enthält ein String einen Replacement-Character, war die UTF-8 Codierung nicht die richtige. Eine Abfrage kann mit einem einfachen
if(s.indexOf('\uFFFD') == -1)
erfolgen. Der Character '\uFFFD' ist hierbei der Replacement-Character.
Freitag, 9. September 2011
Analogie zur Softwareentwicklung
Sprichwörter und Analogien können helfen eine Problemsituation zu pointieren und somit klarer und verständlicher zu machen. So erinnerte mich das Sprichwort "Wenn man nur einen Hammer hat, sieht jedes Problem irgendwann wie ein Nagel aus" an die Wahl von Programmiersprache und Entwicklungs-Framework.
Manchmal passt das präferierte Framework oder die Lieblingssprache nicht gut zu der Aufgabenstellung. Man kann mit einem Hammer eben gut Nägel einschlagen und - gesetzt dem Fall man hat einen Zimmermannshammer - auch wieder ziehen. Wenn es jedoch ans Sägen geht, wird es kniffelig. Aber kein Problem für den im Hämmern geübten Softwareentwickler. Mit trauter Sicherheit werden die Bretter in passende Stücke gehackt. Das Ergebnis ist funktional - was will man mehr?
Einfach CSV
Weil mir auch immer wieder mal ein CSV-Import oder Export unterkommt, will ich mir fürs nächste Mal die Bibliothek Super Csv merken. Mehr im Blog der Holisticon AG.
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
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
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:

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
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:
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:
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:
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 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
Die Nummer mit der Klartext-Passwort-Datei ist allerdings ein Sicherheitsproblem.
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 |
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.
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
Hier also die versprochene Klasse. An Einfachheit wirklich kaum zu übertreffen:
via Vanilla Java
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

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
Montag, 27. Juni 2011
Swing Star Rating Panel
![]() |
Star Rating |
StarRater starRater = new StarRater(5, 3.61, 3); starRater.addStarListener(new StarRater.StarListener() { public void handleSelection(int selection) { // a new number of stars has been selected do something... } }); add(starRater); // add the component to the container...
Download Star Rating Source-Code by NOBLE MASTER DEVELOPER’S BLOG
Freitag, 24. Juni 2011
Shape Collage - Java auf dem Desktop 3
Shape Collage ist ein Java-Desktop-Tool, das ich schon länger auf der Platte habe und irgendwie extrem interessant finde, aber ehrlich gesagt noch nie ernsthaft nutzen konnte. Mit Shape Collage lassen sich eine Vielzahl von Bildern zu einer beliebigen Form zusammensetzen. Dafür gibt es ein paar vordefinierte Formen oder man greift selbst zum Griffel und skizziert die Zielform selbst. Das Ganze ist eine kommerzielle Anwendung, die man aber auch in einer brauchbaren Demoversion herunterladen kann.
Donnerstag, 23. Juni 2011
9 Gründe kein iPhone 5 zu kaufen
Und ja, es ist wahr. All die coolen Features wurden von Steve ignoriert und haben es nicht ins iPhone 5 geschafft. Das zehnte Feature, bevor ich das iPhone kaufen würde, wäre ein offenes Betriebssystem. Ich fürchte, bevor es dazu kommt, kann es die anderen 9 Sachen.
via BRAAAAAAAAAAAAAINZ!!!!
via BRAAAAAAAAAAAAAINZ!!!!
Mittwoch, 22. Juni 2011
Buntes für Eclipse
Vor einiger Zeit habe ich ja schon mal was zum Thema Color-Themes und Eclipse geschrieben. Das ganze ist inzwischen eine ganze Ecke weiter und man kann richtig schicke Themes basteln oder einfach eines von den vielen fertigen benutzen. Richtig schick das Ganze!
Eclipse Color Themes
Eclipse Color Themes
Montag, 20. Juni 2011
MyJgui - Java auf dem Desktop 2
Wenn ich mal an eine MySQL-Instanz ran muß, dann ist üblicher Weise phpMyAdmin die erste Wahl. Deutlich effizienter geht es aber immer noch mit einer zünftigen Desktop-Anwendung, wo wir dann bei MyJgui wären. Das Tool steht unter GPLv2 und bringt so im groben und ganzen das Nötigste mit, um den Überblick über seine Datenbank zu behalten und ein paar SQL-Queries abzusetzen. Wer von den Tools der großen kommerziellen verwöhnt ist, wird MyJgui zwar als puristisch empfinden, es taugt aber durchaus was und lohnt einen Blick.
Ebenfalls ein Java-Tool für Datenbank-Design, aber leider nicht Open-Source, ist das Aqua Data Studio. Eigentlich darf man das nur zum Ausprobieren herunterladen und soll es dann kaufen, bekommt aber trotzdem eine uneingeschränkte Vollversion.
Ebenfalls ein Java-Tool für Datenbank-Design, aber leider nicht Open-Source, ist das Aqua Data Studio. Eigentlich darf man das nur zum Ausprobieren herunterladen und soll es dann kaufen, bekommt aber trotzdem eine uneingeschränkte Vollversion.
Freitag, 17. Juni 2011
Auch kleine Änderungen besser Testen
Was ein kleines Leerzeichen an der passenden Stelle anrichten kann... na am besten bei bumblebee weiterlesen. Die Moral aus der Geschichte ist auf jeden Fall "Besser Testen". Ansonsten hat man die Hähme vollständig auf seiner Seite.
Samstag, 11. Juni 2011
JShot - Java auf dem Desktop 1

Den Anfang macht JShot, was nicht nur ein Tool für die Erstellung von Screenshots ist, sondern eine Vielfalt an nützlichen Funktionen integriert, die für Erklärungszwecke nützlich sind. So lässt sich der Screenshot mit der Pfeil- oder Textmarkerfunktion aufbereiten, darin malen oder texten. Das Ergebnis kann anschließend per FTP, ImageShack, Skype, Twitter, Picasa, Dropbox oder Minus veröffentlicht werden. Das ideale Tool also, um mal eben einen Screenshot zu einer Erklärung dazuzulegen.
JShot ist zwar kostenlos, leider jedoch nicht Open-Source.
via MakeTechEasier
Freitag, 10. Juni 2011
It's Tooltime
Bill zeigt auf seinem Youtube-Kanal, wie Hardware funktioniert. Dafür nimmt er sie auseinander und erklärt das Zusammenspiel der einzelnen Komponenten. Wirklich sehr anschaulich.
via Kraftfuttermischwerk
via Kraftfuttermischwerk
Montag, 16. Mai 2011
Die intern-Methode der String-Klasse
Die Klasse java.lang.String besitzt eine intern-Methode, um an die String-Referenz zu gelangen, die für den String-Wert im Java-Cache abgelegt wurde. Das ist nützlich, wenn ein String durch
Dieses hier hingegen ist true
Wird ein neu gebauter String später häufig verglichen, so kann es sich lohnen die intern-Methode zu verwenden, um unnötige operationen beim Stringvergleich zu vermeiden.
Interessant ist übrigens, dass das Java-Framework selbst ebenfalls davon gebrauch macht, um den Vergleich mit equals gleich ganz zu vermeiden. In der Klasse java.lang.Class findet sich zum Beispiel folgende Methode, die aber nur deshalb sicher funktioniert, weil die getName-Methode der Klasse java.lang.Field garantiert, immer einen interned-String zurückzugeben.
*Update 19.5.11*
Links: mindprod, enicholas
new
erzeugt, oder mittels StringBuilder zusammengefügt wurde. Dann nämlich ist der String nicht aus dem Javainternen-Cache abrufbar. Das hat zur Folge, dass zum Beispiel bei der Verwendung von equals der tatsächliche Inhalt der Zeichenketten verglichen werden muss, was unperformanter ist, als der einfache Referenzvergleich, der sonst als erstes von der equals-Methode ausgeführt wird. Zur Verdeutlichung: das folgende Beispiel ergibt false"foo" == new StringBuilder().append("f").append("oo").toString()
Dieses hier hingegen ist true
"foo" == new StringBuilder().append("f").append("oo").toString().intern()
Wird ein neu gebauter String später häufig verglichen, so kann es sich lohnen die intern-Methode zu verwenden, um unnötige operationen beim Stringvergleich zu vermeiden.
Interessant ist übrigens, dass das Java-Framework selbst ebenfalls davon gebrauch macht, um den Vergleich mit equals gleich ganz zu vermeiden. In der Klasse java.lang.Class findet sich zum Beispiel folgende Methode, die aber nur deshalb sicher funktioniert, weil die getName-Methode der Klasse java.lang.Field garantiert, immer einen interned-String zurückzugeben.
// Helpers for fetchers of one field, method, or constructor private Field searchFields(Field[] fields, String name) { String internedName = name.intern(); for (int i = 0; i < fields.length; i++) { if (fields[i].getName() == internedName) { return getReflectionFactory().copyField(fields[i]); } } return null; }
*Update 19.5.11*
Links: mindprod, enicholas
Montag, 9. Mai 2011
Auskommentierter Code
Auskommentierter Code ist absolut nichts seltenes. Aber wie oft ist er eigentlich noch nützlich? Vor allem, wenn es Code ist, den man nicht selbst per Kommentarzeichen aufs Altenteil geschickt hat. Als ich als Entwickler anfing, sagte mir mal ein erfahrenerer Kollege, auskommentierter Code sei so eine Art Code-Dokumentation und würde für sich selbst stehen. Ich konnte damit nie viel anfangen und weiß heute, dass das quatsch ist. Der Auskommentierte Code sagt nämlich kaum etwas aus, sondern stört viel mehr den Lesefluss. In den meisten Fällen weiß ich nämlich nicht einmal, warum der Code auskommentiert wurde. War er defekt? Unperformant? Hat er Seiteneffekte Produziert? Wurde er vielleicht zum Testen auskommentiert und sollte später wieder rein? Das könnte natürlich auch dazugeschrieben werden, was mir aber in den seltensten Fällen untergekommen ist. Ich stehe mitlerweilen auf dem Stand, dass das Versionierungssystem viel besser für Altcode geeignet ist als Kommantarloser Kommentarcode. Im Versionierungssystem lässt sich das alte Codefragment in seinem originalen Lebensraum begutachten, was viel mehr Aussagekraft besitzt, als etwas loses.
Das schönste sind aber Stellen, die für Verwirrung sorgen. In einem Projekt habe ich eine Codestelle, an der seit 2007 steht:
Ebenfalls häufig anzutreffen sind auskommentierte stellen wie
Zum Glück nicht ganz so häufig, aber leider auch nicht selten, sind die Verquickungen von Auskommentierten und funktionalem Code. Da habe ich gerade ein aktuelles Beispiel vor mir. Ich nehme an, so etwas entsteht, wenn man mal eben etwas ausprobieren will. Ob die Kommentarzeichen nur vergessen wurden oder das
Das schönste sind aber Stellen, die für Verwirrung sorgen. In einem Projekt habe ich eine Codestelle, an der seit 2007 steht:
TODO: Das muss noch ausprogrammiert werden
. Das ist natürlich ein Hinweis, mit dem kein Mensch mehr etwas anfangen kann. Scheinbar hat sich an der bestehenden Funktionalität keiner mehr gestört.Ebenfalls häufig anzutreffen sind auskommentierte stellen wie
alert("hier")
oder System.out.println("message +" " + id")
. Das sind dann Überreste, die beim Debugging gebraucht wurden und schlicht vergessen wurden, wobei "vergessen" gut gemeint ist. Ich habe schon Code gehabt, wo ich ein Minnimum von mindestens zwei auskommentierten Debugg-Meldungen pro Methode hatte. Das stört dann sehr beim Lesen und ich kann dem auch nichts praktisches mehr abgewinnen.Zum Glück nicht ganz so häufig, aber leider auch nicht selten, sind die Verquickungen von Auskommentierten und funktionalem Code. Da habe ich gerade ein aktuelles Beispiel vor mir. Ich nehme an, so etwas entsteht, wenn man mal eben etwas ausprobieren will. Ob die Kommentarzeichen nur vergessen wurden oder das
return
an dieser Stelle einfach falsch gewesen ist, lässt sich leider nicht mehr so einfach herausfinden. else if (document.multiBox.id != formDiv.id){
// return;
}
Samstag, 7. Mai 2011
Python Lesestoff
Lesestoff für Python Einsteiger. Die Python Special Edition 1 vom Full Circle Magazine ist eine Zusammenfassung der Serie „Programming in Python“ der Ausgaben 35 bis 42.
via menzer.net
via menzer.net
Swing-Bibliothek Japura
In letzter Zeit habe ich mal wieder ein bisschen was mit Swing gemacht. Dafür wollte ich eine Multiselect-ComboBox-Komponente, die ich in dem noch jungen Swing-Framework Japura (LGPL) gefunden habe. Auch nach ein bisschen Herumprobieren gefällt mir Japura gut. Einiges an Features hat noch platz, dafür sind die Komponenten nicht überfrachtet und eigene Änderungen sind ebenfalls schnell eingepflegt. Einzig die Dokumentation beschränkt sich auf einige Beispiele auf der Webseite während die Code-Dokumentation gegen null tendiert. Neben verschiedenen Komponenten, bringt Japura auch ein paar nützliche Klassen, zum Beispiel für Controller/View-Aufbauten oder für Hintergrundprozesse mit.
Donnerstag, 5. Mai 2011
Einstieg in die Arbeit mit regulären Ausdrücken
Wenn man jemandem die Arbeit mit regulären Ausdrücken näher bringen oder erklären möchte, gibt es da die ganz klassische Klick-Lernschwelle - also jene Lernschwelle an der man es plötzlich verstanden hat, es also Klick gemacht hat. Dazu ist es nützlich als erstes zu verstehen, wie die Ausdrücke funktionieren. Dazu habe ich kürzlich etwas gefunden, was zum Spielen einlädt und bei dem gleich praktische Beispiele produziert werden können. Nämlich den regular expression generator txt2r. Der erzeugt zwar ein Perl-Script, aber das soll nicht weiter stören. Der reguläre Ausdruck lässt sich ohne weiteres daraus zusammensetzen.
Wenn dann genügend zusammengeklickt wurde, sollten die Ausdrücke verfeinert werden. Dafür ist zum einen eine Übersicht sehr nützlich, wie sie in der Java-Klassendokumentation vorliegt, als auch ein Editor, der einem zeigt, welcher Teil der Zeichenkette bei Veränderungen des Ausdrucks noch passt und welcher nicht. Da hat mir der Online-Editor RegExr sehr gute gefallen. Die zuvor mit txt2r zusammengeklickten Ausdrücke können hier nämlich 1a erweitert und verändert werden.
Wenn dann genügend zusammengeklickt wurde, sollten die Ausdrücke verfeinert werden. Dafür ist zum einen eine Übersicht sehr nützlich, wie sie in der Java-Klassendokumentation vorliegt, als auch ein Editor, der einem zeigt, welcher Teil der Zeichenkette bei Veränderungen des Ausdrucks noch passt und welcher nicht. Da hat mir der Online-Editor RegExr sehr gute gefallen. Die zuvor mit txt2r zusammengeklickten Ausdrücke können hier nämlich 1a erweitert und verändert werden.
Mittwoch, 4. Mai 2011
Linktips
Software-Kanban im Einsatz: Ein handliche Einführung in Kanban für den Einsatz in der Softwareentwicklung.
Addition mit Grazie: Magische Quadrate in der Mathematik. Wozu der Mensch das braucht erschließt sich wahrscheinlich nur Mathematikern, aber interessant ist es trotzdem.
Softwaremetriken: Zyklomatische Komplexität: Die McCabe-Metrik in verständlicher Kürze. Absolut Lesenswert!
Addition mit Grazie: Magische Quadrate in der Mathematik. Wozu der Mensch das braucht erschließt sich wahrscheinlich nur Mathematikern, aber interessant ist es trotzdem.
Softwaremetriken: Zyklomatische Komplexität: Die McCabe-Metrik in verständlicher Kürze. Absolut Lesenswert!
Montag, 18. April 2011
Regexp-Tutorial
Die Grundlagen von regulären Ausdrücken sollte man als Entwickler eigentlich beherrschen. Trotzdem kenne ich viele, denen das völlig abgeht. Über Sinn und Unsinn lässt sich auch vortrefflich diskutieren, trotzdem begegnen sie einem immer wieder. Deshalb der Linktip: regexp-evaluator.de mit klasse Stoff zum Reinlesen.
Samstag, 16. April 2011
Neue Hardware: Ein HP CM1415fn color MFP
Mein alter Multifunktionslaserdrucker, ein Brother 7440N hat mir gute Dienste geleistet, muss aber nun aufs Altenteil. Leider nur drei Jahre hat er durchgehalten, weshalb ich mich auch nicht erneut für einen Brother entschieden habe. Der Linuxsupport war in Ordnung, die kurze Lebensdauer nicht.
Weil die Linuxunterstützung für mich unabdingbar ist und die Preisliga nicht allzu hoch angesiedelt sein sollte, habe ich beim HP CM1415fn color MFP zugegriffen. Ein Farblaserdrucker, den ich inzwischen schon auf Herz und Nieren durchtesten konnte. Ich bin insgesamt zufrieden, aber von vorne.
Für den Linuxtreiber gibt es von HP das OpenSource-Projekt HPLIP. Die Installation ist zwar nicht DAU-Geeignet, aber mit dem Installationsprogramm nicht weiter schwierig. Einzig bei meinem Linux-Mint musste ich bei der Distributionserkennung behaupten, ich hätte ein Ubuntu, dann klappt es auch mit den Abhängigkeiten, die der Treiber nachinstallieren will.
Das Ergebnis hat mich sehr überrascht. Der Drucker funktioniert auf Anhieb und das Scannen via XSane klappt ebenfalls sofort (und alles im Netzwerk). HPLIP bringt auch gleich ein Programm mit, das sich im Panel verankert und Informationen, wie Tonerstand, Status etc. ausgibt.
Für die Installation unter Windows gibt es einen "Minimalmodus". Es graute mir nämlich schon vor den vielen, für mich unnützen Programmen, die HP meiner Erfahrung nach mitbringt und die sich gern irgendwo im System verankern und natürlich auch beim Booten mitgestartet werden müssen. Davon ist - Dank dieser Minimaloption - angenehmer Weise nichts zu sehen.
Der Drucker selbst ist selbst für ein Multifunktionsgerät ein ziemliches Monster. Mein Brother war deutlich kompakter, konnte aber zugegebener Maßen auch keine Farbe. Die Schublade fürs Papier ist ziemlich wackelig. Der Rest wirkt wertig verarbeitet. Die Geräuschkulisse, die beim Drucken entsteht, ist laut und klingt teils, als würde das Gerät gleich auseinander fallen.
Ansonsten bietet der Drucker eine Menge Funktionen. Scannen kann er auf einen USB-Stick, aber leider nicht auf einen FTP-Server, wie mein Brother vorher. Was mir neu war, sind Apps für den Drucker. Ich brauche sie nicht und habe sie nicht weiter beachtet. Auch die Funktion, dass der Drucker auf E-Mails bei einem HP-Mailkonto lauscht, benötige ich eher nicht. ich wollte das mal antesten, bin aber leider bereits bei der Anmeldung gescheitert, weil der "Weiter"-Button auf der HP-Anmeldeseite nicht funktionieren wollte.
Mein Fazit: Wenn auch zu laut, für die Preisliga ein ordentliches Gerät mit guter Linux-Unterstützung.
*Update 20.4.2011*
Wie mir inzwischen aufgefallen ist, gibt der Drucker hin- und wieder ein kurzes, deutlich vernehmbares Geräusch von sich, wenn er eine Weile im Standby ist. Was der da genau tut erschließt sich mir nicht.
*Update 30.9.2011*
Jetzt habe ich den Drucker schon eine ganze Weile. Weil der Drucker so geschätzt alle 12 Stunden aus dem Standby erwacht und seinen Motor ein bisschen drehen muss, habe ich ihn meistens ganz aus. Nervig ist dabei aber, dass die Zeit bis er wieder einsatzbereit ist, echt lang ist. Zwei Minuten sind es gewiss, bis ich dann endlich mal Scannen oder Kopieren kann. Ausdrucke nimmt er schon früher entgegen. Es ist auch nicht so, dass das Display blockieren würde. Ich komme in den Scan- oder Kopierdialog, bekomme dann aber eine Fehlermeldung. Auch das ist nervig. Warum lässt mich HP da auf dem Display rumpatschen, wenn das ganze Ding eh noch nicht soweit ist? Der Scan auf USB erfolgt übrigens nur in jpg. Da war ich mit PDF bei anderen Herstellern auch schon mal besseres gewöhnt. Im Ergebnis habe ich nach einem Scan also eine Bilddatei pro Seite anstelle eines PDF-Containers. Das sind alles Kleinigkeiten, die aber irgendwie die Liebe zum Detail missen lassen. Als Fehlkauf würde ich das ganze nicht einstufen, aber Softwaremäßig hätte ich HP da mehr zugetraut. Wenn wieder mal eine Anschaffung ansteht, werde ich mehr auf das Angebot von Brother gucken. Die Brotherfirmware meines alten war jedenfalls brauchbarer.
Dienstag, 12. April 2011
Sortieralgorithmen mit ungarischen Volkstänzen erklärt
Trockene Theorie, wie so einen Sortieralgorithmus, mittels ungarischer Folklore zu erklären, ist schon eine klasse Idee. Schließlich gehört das zum Handwerkszeug. Wie sonst kann man fachkompetent entscheiden, welcher Algorithmus zu welchen Daten passt.
Mehr davon gibt es beim i-Programmer.
via Minds Delight
Mehr davon gibt es beim i-Programmer.
via Minds Delight
Samstag, 9. April 2011
BerlinExpertDays Zusammenfassung
Die letzten zwei Tage habe ich ja die Hörsaalbank gedrückt und verschiedenen Vorträgen gelauscht. Der Themenmischmasch war bunt und die meisten Sprecher ohne Einschlafgefahr hörbar. Sehr interessant fand ich die Variante, einen Vortrag, der eigentlich für eine halbe Stunde länger konzipiert war, einfach schneller abzunudeln.
Zusammenfassend kann man einen Trendfaden durch die verschiedenen Themen entdecken. Zwar scheint Agile Softwareentwicklung allgemein bekannt und auch akzeptiert, der Nachholbedarf in Umsetzung und Einführung jedoch ungebrochen zu sein. Weiter scheint man einhellig der Meinung, dass NoSQL auch im Serverbereich, stark im kommen ist. NoSQL ist auf jeden Fall ein spannendes Thema, in das man derzeit gut einsteigen kann.
Zusammenfassend kann man einen Trendfaden durch die verschiedenen Themen entdecken. Zwar scheint Agile Softwareentwicklung allgemein bekannt und auch akzeptiert, der Nachholbedarf in Umsetzung und Einführung jedoch ungebrochen zu sein. Weiter scheint man einhellig der Meinung, dass NoSQL auch im Serverbereich, stark im kommen ist. NoSQL ist auf jeden Fall ein spannendes Thema, in das man derzeit gut einsteigen kann.
Dienstag, 5. April 2011
Eclipse-Code-Template für Logger
Ein Eclipse-Code-Template will ich noch zum besten geben. Nämlich eines für den Javaeigenen Logger, das ich vorhin schnell zusammengestrickt habe:
Siehe auch Eclipse-Code-Template über eine Map iterieren
Und einiges nützliches gibt es auch wieder beim Stackoverflow.
Logger.getLogger(${enclosing_type}.class.getName()).log(Level.WARNING,
"${cursor}",${exception_variable_name});
${logger:import(java.util.logging.Logger)}
${level:import(java.util.logging.Level)}
Siehe auch Eclipse-Code-Template über eine Map iterieren
Und einiges nützliches gibt es auch wieder beim Stackoverflow.
Freitag, 1. April 2011
Eclipse-Code-Template über eine Map iterieren
Über eine Map iterieren ist nicht weiter schwierig. Eine besonders einfache Variante, wenn man Key- und Value beim iterieren haben möchte, habe ich vor gut zwei Jahren mal gepostet. Weil ich das hin- und wieder brauchen konnte, habe ich mir ein Eclipse-Code-Template dafür erstellt.
Einfach unter
Weiter habe ich im Feld Name for eingetragen, damit sich das in die übliche Liste einfügt, die ich beim Code-Completion nach Eingabe von for erhalte. Also im Java-Editor unter einer Map-Deklaration ein for und anschließend Ctrl+Space eingeben.
Einfach unter
Window-Preferences
auf der linken Seite Java->Editor->Templates
auswählen und ein neues Template mit folgendem Inhalt anlegen. ${:import(java.util.Map.Entry)} for (Entry<${keyType:argType(map,0)},${valueType:argType(map,1)}> entry : ${map:var(java.util.Map)}.entrySet()) { ${keyType} key = entry.getKey(); ${valueType} value = entry.getValue(); ${cursor} }
Weiter habe ich im Feld Name for eingetragen, damit sich das in die übliche Liste einfügt, die ich beim Code-Completion nach Eingabe von for erhalte. Also im Java-Editor unter einer Map-Deklaration ein for und anschließend Ctrl+Space eingeben.
Dienstag, 29. März 2011
Passwörter hashen, salzen, speichern
Vor einiger Zeit habe ich mich ja schon mal über Passwörter in Webanwendungen ausgelassen. Eigentlich ist ohnehin Konsens, dass Passwörter nicht im Klartext in die Datenbank geschrieben werden sollten. Besser ist es einen Hash aus dem Passwort zu erzeugen, der dann nur noch beim Authentifizieren verglichen wird. Weil beim Knacken von Passwörtern aber auch auf Fertig-Hashes zurückgegriffen werden kann, macht es Sinn einen weiteren, zufälligen Wert zum Hashen des Passworts hinzuzuziehen - den Salt. Der Salt muss zwar ebenfalls bei jeder Authentifizierung bereit stehen und gespeichert werden, trotzdem erschwert der Salt das Knacken. Der Salt wird für jedes Passwort zufällig erzeugt, so das selbst die Hashes identischer Passwörter unterschiedlich sind. Um das an einem Beispiel zu zeigen, habe ich mal was vorbereitet (Die Hilfsmethoden- und Klassen folgen am Ende des Beitrags):
public SaltedPass flavorWithSalt(String passwd) throws Exception {
final Random rand = new Random();
final MessageDigest m = MessageDigest.getInstance("MD5");
final byte[] salt = new byte[12];
rand.nextBytes(salt);
m.update(salt);
m.update(passwd.getBytes("UTF8"));
byte hash[] = m.digest();
return new SaltedPass(toHex(salt), toHex(hash));
}
Der Methode
Für die Authentifizierung ist die Passworteingabe im Klartext und der Salt erforderlich. Beides ergibt wieder einen Hash, der mit dem gespeicherten Hash verglichen wird. Sind die Hashes identisch, ist die Authentifizierung erfolgreich.
public boolean validate(String passwd, SaltedPass flavored) throws Exception {
final MessageDigest m = MessageDigest.getInstance("MD5");
final byte[] salt = fromHex(flavored.salt);
m.update(salt);
m.update(passwd.getBytes("UTF8"));
byte hash[] = m.digest();
if(toHex(hash).equals(flavored.hash)) {
return true;
}
return false;
}
Damit das ganze compiliert, sind noch die Methoden zum Wandeln der Byte-Arrays in ihre hexadezimale String-Representation und zurück, sowie die Klasse
private String toHex(byte[] bytes) {
final StringBuilder result = new StringBuilder(bytes.length * 2);
for (int i = 0; i < bytes.length; i++) {
result.append(Integer.toHexString((0x000000ff & bytes[i]) | 0xffffff00).substring(6));
}
return result.toString();
}
public static byte[] fromHex(String hexString) {
final char[] hex = hexString.toCharArray();
final int length = hex.length / 2;
final byte[] raw = new byte[length];
for (int i = 0; i < length; i++) {
int high = Character.digit(hex[i * 2], 16);
int low = Character.digit(hex[i * 2 + 1], 16);
int value = (high << 4) | low;
if (value > 127) {
value -= 256;
}
raw[i] = (byte) value;
}
return raw;
}
private class SaltedPass {
private String salt;
private String hash;
SaltedPass(String salt, String hash) {
this.salt=salt;
this.hash = hash;
}
public String toString() {
return "salt:" + salt + " hash:" + hash;
}
}
Und zuletzt noch die Main-Methode zum Ausprobieren:
public static void main(String[] args) throws Exception {
String pass = "testpass";
SaltedPass flavorWithSalt = new SaltTrialout().flavorWithSalt(pass);
System.out.println(flavorWithSalt);
boolean validate = new SaltTrialout().validate(pass, flavorWithSalt);
System.out.println(validate);
}
Update 30.3.11
Source zum Download
public SaltedPass flavorWithSalt(String passwd) throws Exception {
final Random rand = new Random();
final MessageDigest m = MessageDigest.getInstance("MD5");
final byte[] salt = new byte[12];
rand.nextBytes(salt);
m.update(salt);
m.update(passwd.getBytes("UTF8"));
byte hash[] = m.digest();
return new SaltedPass(toHex(salt), toHex(hash));
}
Der Methode
flavorWithSalt
wird das gewünschte Benutzerpasswort im Klartext übergeben. Die Methode generiert einen Zufallswert, der als Salt verwendet und beim Hashen einbezogen wird, sowie den Hash selbst. Die Anwendung darf nur den zurückgegeben Hash und den Salt speichern.Für die Authentifizierung ist die Passworteingabe im Klartext und der Salt erforderlich. Beides ergibt wieder einen Hash, der mit dem gespeicherten Hash verglichen wird. Sind die Hashes identisch, ist die Authentifizierung erfolgreich.
public boolean validate(String passwd, SaltedPass flavored) throws Exception {
final MessageDigest m = MessageDigest.getInstance("MD5");
final byte[] salt = fromHex(flavored.salt);
m.update(salt);
m.update(passwd.getBytes("UTF8"));
byte hash[] = m.digest();
if(toHex(hash).equals(flavored.hash)) {
return true;
}
return false;
}
Damit das ganze compiliert, sind noch die Methoden zum Wandeln der Byte-Arrays in ihre hexadezimale String-Representation und zurück, sowie die Klasse
SaltedPass
, die als Dataholder dient, erforderlich. private String toHex(byte[] bytes) {
final StringBuilder result = new StringBuilder(bytes.length * 2);
for (int i = 0; i < bytes.length; i++) {
result.append(Integer.toHexString((0x000000ff & bytes[i]) | 0xffffff00).substring(6));
}
return result.toString();
}
public static byte[] fromHex(String hexString) {
final char[] hex = hexString.toCharArray();
final int length = hex.length / 2;
final byte[] raw = new byte[length];
for (int i = 0; i < length; i++) {
int high = Character.digit(hex[i * 2], 16);
int low = Character.digit(hex[i * 2 + 1], 16);
int value = (high << 4) | low;
if (value > 127) {
value -= 256;
}
raw[i] = (byte) value;
}
return raw;
}
private class SaltedPass {
private String salt;
private String hash;
SaltedPass(String salt, String hash) {
this.salt=salt;
this.hash = hash;
}
public String toString() {
return "salt:" + salt + " hash:" + hash;
}
}
Und zuletzt noch die Main-Methode zum Ausprobieren:
public static void main(String[] args) throws Exception {
String pass = "testpass";
SaltedPass flavorWithSalt = new SaltTrialout().flavorWithSalt(pass);
System.out.println(flavorWithSalt);
boolean validate = new SaltTrialout().validate(pass, flavorWithSalt);
System.out.println(validate);
}
Update 30.3.11
Source zum Download
Montag, 28. März 2011
Kostenlose E-Book Software zum lesen und bearbeiten
Trotz des mageren Buch-Angebots werden E-Books auch in Deutschland allmählich populärer. Ich nenne seit letztem Jahr ein Pocketbook 902 mein eigen. Deshalb heute ein paar Software-Tips für Programme, die sich inzwischen als nützlich erwiesen haben.
Beim Thema E-Book muss man natürlich mit Calibre den Anfang machen. Eine Software zum Verwalten und Konvertieren von E-Books. Calibre ist wohl das prominenteste Programm, wenn es um E-Books geht. Eine freie alternative für Verwaltung und Konvertierung gibt es wohl nicht, was ich schade finde, weil mir die Software nicht besonders gefällt. Sie ist weder besonders intuitiv, noch sonderlich gut in der Handhabung. Füttert man Calibre mit Büchern, werden diese indiziert und in ein eigenes Verzeichnis abgelegt. In das Verzeichnis gucken möchte man lieber nicht. Will man seine Bücher in eine eigene Verzeichnishierarchie ablegen, kann man Calibre als Verwaltungstool im Grunde vergessen.
Das für Lesegeräte geläufigste Buchformat ist wohl Epub. Das Format fühlt sich nicht an einen festen Textfluss gebunden und besteht im Wesentlichen aus einer Ansammlung von HTML, CSS und XML-Dateien.
Zum Überführen von Inhalten in das Epub-Format hat sich für mich Sigil als der ideale Arbeitsbegleiter erwiesen. Sigil ist so etwas, wie ein WYSIWYG-Editor für epubs. Inhalte finden so per Copy&Paste ihren Weg in das Epub, so das ich sie später locker auf dem Pocketbook lesen kann. Auch sonst bringt Sigil alles mit, was für die Epub-Erstellung so notwendig ist.
Wenn man ein paar Bücher sichten, oder mal eben am Arbeitsplatz ohne Lesegerät lesen möchte, ist Lesesoftware für den Desktop nötig. Hier führt wohl FBReader wieder die Bekanntheitsliste an. Man merkt aber sehr deutlich, dass FBReader eigentlich nicht für den Desktop, sondern für Lesegeräte gedacht ist. Weil ich die Software unhandlich fand und manche epubs auch nicht so recht mit FBReader wollen, habe ich mangels alternative auf das Firefox-Plugin EPUBReader zurückgegriffen. Vor einiger Zeit bin ich dann noch auf die Lesesoftware Coolreader gestoßen. Ähnlich wie FBReader ist Coolreader eigentlich für Lesegeräte gedacht, das Interface ist aber besser für den Desktopeinsatz geeignet. Heute bin ich noch auf die Lesesoftware Lucidor aufmerksam geworden. Lucidor enthält außerdem eine ganz ordentliche Katalogfunktion, die aber nur Epub-Dateien abdeckt. Ansonsten würde ich Lucidor die beste Desktoptauglichkeit attestieren. Außerdem gibt es noch das Lucidor-Firefox-Plugin, was ich aber noch nicht testen konnte.
Zuletzt noch ein Lesetip. Wer auf dem Laufenden bleiben will, sollte am besten den Feed von lesen.net abonnieren.
Links:
Verwaltung und Konvertierung: Calibre
Epub-Authoring: Sigil
Lesesoftware: FBReader, EPUBReader, Coolreader, Lucidor
Beim Thema E-Book muss man natürlich mit Calibre den Anfang machen. Eine Software zum Verwalten und Konvertieren von E-Books. Calibre ist wohl das prominenteste Programm, wenn es um E-Books geht. Eine freie alternative für Verwaltung und Konvertierung gibt es wohl nicht, was ich schade finde, weil mir die Software nicht besonders gefällt. Sie ist weder besonders intuitiv, noch sonderlich gut in der Handhabung. Füttert man Calibre mit Büchern, werden diese indiziert und in ein eigenes Verzeichnis abgelegt. In das Verzeichnis gucken möchte man lieber nicht. Will man seine Bücher in eine eigene Verzeichnishierarchie ablegen, kann man Calibre als Verwaltungstool im Grunde vergessen.
Das für Lesegeräte geläufigste Buchformat ist wohl Epub. Das Format fühlt sich nicht an einen festen Textfluss gebunden und besteht im Wesentlichen aus einer Ansammlung von HTML, CSS und XML-Dateien.
Zum Überführen von Inhalten in das Epub-Format hat sich für mich Sigil als der ideale Arbeitsbegleiter erwiesen. Sigil ist so etwas, wie ein WYSIWYG-Editor für epubs. Inhalte finden so per Copy&Paste ihren Weg in das Epub, so das ich sie später locker auf dem Pocketbook lesen kann. Auch sonst bringt Sigil alles mit, was für die Epub-Erstellung so notwendig ist.
Wenn man ein paar Bücher sichten, oder mal eben am Arbeitsplatz ohne Lesegerät lesen möchte, ist Lesesoftware für den Desktop nötig. Hier führt wohl FBReader wieder die Bekanntheitsliste an. Man merkt aber sehr deutlich, dass FBReader eigentlich nicht für den Desktop, sondern für Lesegeräte gedacht ist. Weil ich die Software unhandlich fand und manche epubs auch nicht so recht mit FBReader wollen, habe ich mangels alternative auf das Firefox-Plugin EPUBReader zurückgegriffen. Vor einiger Zeit bin ich dann noch auf die Lesesoftware Coolreader gestoßen. Ähnlich wie FBReader ist Coolreader eigentlich für Lesegeräte gedacht, das Interface ist aber besser für den Desktopeinsatz geeignet. Heute bin ich noch auf die Lesesoftware Lucidor aufmerksam geworden. Lucidor enthält außerdem eine ganz ordentliche Katalogfunktion, die aber nur Epub-Dateien abdeckt. Ansonsten würde ich Lucidor die beste Desktoptauglichkeit attestieren. Außerdem gibt es noch das Lucidor-Firefox-Plugin, was ich aber noch nicht testen konnte.
Zuletzt noch ein Lesetip. Wer auf dem Laufenden bleiben will, sollte am besten den Feed von lesen.net abonnieren.
Links:
Verwaltung und Konvertierung: Calibre
Epub-Authoring: Sigil
Lesesoftware: FBReader, EPUBReader, Coolreader, Lucidor
Freitag, 25. März 2011
HTML5 let's start
Die Spielwiese für HTML5 wird allmählich größer und weil ich immer noch gern ausprobiere, habe ich mal ein paar Sachen zusammengesucht.
Für den Start eines HTML5-Projektes ist der HTML5-Templategenerator Initializr hervorragend geeignet. Der Code ist super, um schon mal was zum durchstarten zu haben. Das, was der da generiert, sieht codeseitig durchweg gut aus und könnte so manch einen HTML-Schrauber noch inspirieren.
Im weiteren kann man sich ein wenig auf HTML5 & Friends oder html5rocks umsehen. Beides sind Demo-Seiten, die zeigen wollen, was in HTML5 alles drin steckt. Zuletzt kann man dann auch noch ein bisschen niedriger stapeln und die etwas einfacheren Demos von html5demos durchprobieren.
Der Weg ist eindeutig: Es wird interaktiver und bunter. Dem ist ja bereits so, seit Google mit seinen Mailreader gezeigt hat, wie eine Browseranwendung aussehen kann. Jedenfalls warten eine menge technische Spielereien darauf ausprobiert zu werden.
Für den Start eines HTML5-Projektes ist der HTML5-Templategenerator Initializr hervorragend geeignet. Der Code ist super, um schon mal was zum durchstarten zu haben. Das, was der da generiert, sieht codeseitig durchweg gut aus und könnte so manch einen HTML-Schrauber noch inspirieren.
Im weiteren kann man sich ein wenig auf HTML5 & Friends oder html5rocks umsehen. Beides sind Demo-Seiten, die zeigen wollen, was in HTML5 alles drin steckt. Zuletzt kann man dann auch noch ein bisschen niedriger stapeln und die etwas einfacheren Demos von html5demos durchprobieren.
Der Weg ist eindeutig: Es wird interaktiver und bunter. Dem ist ja bereits so, seit Google mit seinen Mailreader gezeigt hat, wie eine Browseranwendung aussehen kann. Jedenfalls warten eine menge technische Spielereien darauf ausprobiert zu werden.
Bilder im Batch konvertieren und verarbeiten
Heute mal wieder eine Programm, das mir gut gefällt. Der Bildkonverter XnConvert ist zwar nicht OpenSource aber es gibt ihn kostenlos und vor allem für alle gängigen Betriebssysteme - sogar als 64bit-deb, was bei unfreier Software sonst gerne mal fehlt. Die Stärke des Programms liegt ganz klar in der komfortablen Oberfläche, weil Batch-Konvertierung unter Linux ja sonst nicht so spannend ist. Mit der Bash und ImageMagick hat man ja eigentlich schon alles, was man so für die Massenkonvertierung brauchen könnte.
Neben der Formatkonvertierung kann XnConvert aber noch mehr, was es auch erst richtig interessant macht. Es erlaubt nämlich den Einsatz von Filtern, mit denen zum Beispiel Texte eingebettet, EXIF-Daten gelöscht oder Bildmasken aufgesetzt werden können. Die Filterauswahl ist umfangreich und gut handhabbar. Alles in allem macht das Programm einen runden Eindruck.
via stadt-bremerhaven
Neben der Formatkonvertierung kann XnConvert aber noch mehr, was es auch erst richtig interessant macht. Es erlaubt nämlich den Einsatz von Filtern, mit denen zum Beispiel Texte eingebettet, EXIF-Daten gelöscht oder Bildmasken aufgesetzt werden können. Die Filterauswahl ist umfangreich und gut handhabbar. Alles in allem macht das Programm einen runden Eindruck.
![]() | |
XnView v1.0 |
Donnerstag, 24. März 2011
HTML5 von Stefan Münz
Das HTML5-Buch von Stefan Münz und Clemens Gull ist draußen. Das Buch kann vollständig online gelesen werden. Fairer Zug, wie ich finde. Das schafft zudem den Vorteil der Online-Durchsuchbarkeit. Das Buch gibt es auf http://webkompetenz.wikidot.com/docs:html-handbuch
via golem
via golem
Mittwoch, 23. März 2011
HTML generieren mit rendersnake
An APIs und Systemen, die HTML auf den Bildschirm bringen, herrscht ja kaum ein Mangel. Ob XSL generiert oder per JSP erzeugt, für beinahe jeden Geschmack ist was dabei. Kürzlich bin ich auf das renderSnake-Projekt aufmerksam geworden. Damit lässt sich HTML mittels Kettenschreibweise (Fluent-Pattern) erzeugen. Ich würde den Einsatz an der Stelle verorten, wo JSP nicht gemocht wird und reine Servlets auch nicht wirklich hübsch anzusehen sind, wenn sie HTML ausgeben sollen. Bestimmt fällt dem einen oder anderen aber noch was besseres ein.
Mit renderSnake sieht das ganze dann zum Beispiel so aus:
Auf jeden Fall eine interessante Lösung, weil zum einen die durchgängige Schreibweise einen gut lesbaren Code erzeugt, zum anderen maximale Flexibilität erhalten bleibt, eben weil man den Java-Code-Scope nie verlässt. Somit stehen auch die gewohnten Refactoring-Tools weiter zur Verfügung, die es zwar auch für JSP gibt, meiner Meinung nach aber an das Eclipse-Refactoring für Java nicht herankommen.
Interessant wäre noch, wie gut das Zusammenspiel mit CSS aussieht bzw. wie man das ausgestalten könnte. Dazu habe ich zumindest nichts vorgegebenes gefunden. Aber man kann ja auch selber noch kreativ werden.
via Dark Views
related java.dzone.com, philemonworks.wordpress.com
project renderSnake
Mit renderSnake sieht das ganze dann zum Beispiel so aus:
public void renderOn(HtmlCanvas html) throws IOException { html .div(id("search")) .form( id("search-form") .method("POST") .action(this.getClass().getName())) .write("Search ") .input(name("search-text").type("text"))._input() ._form() ._div(); }
Auf jeden Fall eine interessante Lösung, weil zum einen die durchgängige Schreibweise einen gut lesbaren Code erzeugt, zum anderen maximale Flexibilität erhalten bleibt, eben weil man den Java-Code-Scope nie verlässt. Somit stehen auch die gewohnten Refactoring-Tools weiter zur Verfügung, die es zwar auch für JSP gibt, meiner Meinung nach aber an das Eclipse-Refactoring für Java nicht herankommen.
Interessant wäre noch, wie gut das Zusammenspiel mit CSS aussieht bzw. wie man das ausgestalten könnte. Dazu habe ich zumindest nichts vorgegebenes gefunden. Aber man kann ja auch selber noch kreativ werden.
via Dark Views
related java.dzone.com, philemonworks.wordpress.com
project renderSnake
Dienstag, 22. März 2011
Java einfach modernisiert mit Lombok

@Getter @Setter
Annotation. Gleichermaßen lässt sich anstelle vom ewigen hochgereich von checked Exceptions einfach die @SneakyThrows
Annotation einsetzen, die den Compiler austrickst, so dass man bei Bedarf auf die Behandlung von checked Exceptions an der Stelle ihres Auftretens verzichten kann. Diese und weitere Features sorgen aufgeräumteren Code, der den Blick aufs Wesentliche schärft. Alles in allem sicher Geschmackssache, aber mir gefällts.
Freitag, 18. März 2011
Entwicklung des Browsermarktes
Sehr hübsch visualisiert. Zwar fehlt der Mosaic, aber ansonsten spiegelt das die Entwicklung im Browsermarkt gut wieder. Man muss es aber auch miterlebt haben, um wirklich etwas damit anfangen zu können. Wie wichtig Netscape damals war und wie der Explorer aufgeholt hat, einfach nur, weil er bereits vorinstalliert war. Ich weiß noch, ein wichtiges Netscape-Feature bestand darin, dass man das Laden der Bilder manuell anstoßen konnte - also erst, wenn man die Seite gesichtet hatte und wusste, dass es sich lohnt darauf zu warten. Das waren noch Zeiten.
via shah3d.com
via shah3d.com
Donnerstag, 17. März 2011
BerlinExpertDays
Am 7. und 8. April sind die BerlinExpertDays. Ich werde aller Voraussicht nach hingehen. Es gibt auf jeden Fall etliche interessante Themen.
Montag, 28. Februar 2011
HTML Verarbeiten mit jsoup
In den letzten Tagen hatte ich häufiger mit der Verarbeitung von HTML-Daten zu tun. Zum einen sollten Inhalte aus fremden HTML-Seiten extrahiert, zum Anderen sollten HTML-formatierte Eingaben gesäubert werden. Dabei kam mir sehr gelegen, dass ich vor einiger Zeit schonmal über die jsoup-Bibliothek geblogged hatte, die ich bei dieser Gelegenheit auch ausprobieren wollte. Um das Ergebnis vorweg zu nehmen, jsoup funktioniert großartig.
Die API ist extrem einfach gehalten. Man erzeugt einfach via
Was man unbedingt machen sollte, wenn man HTML-Eingaben verarbeitet bzw. überhaupt Eingaben verarbeitet, die vielleicht irgendwann wieder auf die HTML-Oberfläche gelangen könnten, ist sie zu säubern. Tut man das nicht, hat man schnell eine Sicherheitslücke (Stichwort Cross-Site-Scripting). Für genau diesen Fall bringt jsoup eine Methode mit, die alles kritische aus der HTML-Eingabe entfernt. Was kritisch ist, lässt sich mittels Whitelist auch selbst definieren, die Basic-Whitelist ist aber schon recht gut überdacht und deckt die gängigen Formatierungstags ab. Der Aufruf mit Basic-Whitelist ist auch hier wieder denkbar einfach:
Die Whitelist lässt sich fein granular steuern. Sowohl an Tags, als auch an Attribute und deren Inhalt wurde gedacht. Außerdem mag ich die Kettenschreibweise einfach gern:
Ein paar Beispiele finden sich im jsoup Cookbook.
jsoup.org
Die API ist extrem einfach gehalten. Man erzeugt einfach via
Jsoup.parse(html);
ein org.jsoup.nodes.Document, das man dann wiederum nach allen Elementen einer Klasse, eines bestimmten Tag-Typs etc. abfragen kann.Was man unbedingt machen sollte, wenn man HTML-Eingaben verarbeitet bzw. überhaupt Eingaben verarbeitet, die vielleicht irgendwann wieder auf die HTML-Oberfläche gelangen könnten, ist sie zu säubern. Tut man das nicht, hat man schnell eine Sicherheitslücke (Stichwort Cross-Site-Scripting). Für genau diesen Fall bringt jsoup eine Methode mit, die alles kritische aus der HTML-Eingabe entfernt. Was kritisch ist, lässt sich mittels Whitelist auch selbst definieren, die Basic-Whitelist ist aber schon recht gut überdacht und deckt die gängigen Formatierungstags ab. Der Aufruf mit Basic-Whitelist ist auch hier wieder denkbar einfach:
Jsoup.clean(html, Whitelist.basic())
Die Whitelist lässt sich fein granular steuern. Sowohl an Tags, als auch an Attribute und deren Inhalt wurde gedacht. Außerdem mag ich die Kettenschreibweise einfach gern:
Whitelist w = new Whitelist().addTags("a", "b", "blockquote") .addAttributes("a", "href") .addProtocols("a", "href", "ftp", "http", "https", "mailto") .addProtocols("blockquote", "cite", "http", "https") .addEnforcedAttribute("a", "rel", "nofollow");
Ein paar Beispiele finden sich im jsoup Cookbook.
jsoup.org
Linktips
HTML5 Rocks - Ein paar super Beispiele, teils mit Links, wo die Technik in freier Wildbahn zu begutachten ist. Stöbern lohnt.
20 Software Developing Best Practices - Eine der üblichen Listen mit dem "Aha, das kenne ich"-Effekt, den man dann mit dem eigenen, manchmal schludrigen Umfeld in Verbindung bringen kann. geht mir zumindest irgendwie so.
Software Antipatterns : The Golden Hammer - Wenn wir schon bei dem "Aha"-Effekt sind, darf das "Golden Hammer"-Pattern bzw. Antipattern natürlich nicht fehlen.
Sandboxie - Ein Windows-Programm, das ich mir merken will. Ich bin bisher noch nicht zum testen gekommen, da es mir aber schon mehrfach beim Meckern über Windows ans Herz gelegt wurde, sollte ich das vielleicht irgendwann mal tun. Man kann damit einzelnen Programmen in einer Sandbox laufen lassen.
Computer Repair with Diagnostic Flowcharts - Super Flowcharts für die Rechner-Diagnose, wenn mal was nicht läuft. Bisher bin ich zwar mit meinem Hardware-Grundverständnis auch ohne immernoch erfolgreich gewesen, aber aus irgendeinem Grund mag ich diese Flowcharts.
20 Software Developing Best Practices - Eine der üblichen Listen mit dem "Aha, das kenne ich"-Effekt, den man dann mit dem eigenen, manchmal schludrigen Umfeld in Verbindung bringen kann. geht mir zumindest irgendwie so.
Software Antipatterns : The Golden Hammer - Wenn wir schon bei dem "Aha"-Effekt sind, darf das "Golden Hammer"-Pattern bzw. Antipattern natürlich nicht fehlen.
Sandboxie - Ein Windows-Programm, das ich mir merken will. Ich bin bisher noch nicht zum testen gekommen, da es mir aber schon mehrfach beim Meckern über Windows ans Herz gelegt wurde, sollte ich das vielleicht irgendwann mal tun. Man kann damit einzelnen Programmen in einer Sandbox laufen lassen.
Computer Repair with Diagnostic Flowcharts - Super Flowcharts für die Rechner-Diagnose, wenn mal was nicht läuft. Bisher bin ich zwar mit meinem Hardware-Grundverständnis auch ohne immernoch erfolgreich gewesen, aber aus irgendeinem Grund mag ich diese Flowcharts.
Donnerstag, 24. Februar 2011
Verrücktes im Unicode 6
Seit der deutsche Wikipedia-Admin an Berühmtheit gewonnen hat, ist die Begrifflichkeit Inkludist und Exkludist nahezu jedem halbwegs Netzaffinen geläufig. Während im deutschen Wikipedia die Exkludisten herrschen, nimmt man es andernorts nach dem Motto "Speicherplatz ist genügend vorhanden" gelassener. Zugegeben, das Beispiel fängt in dem Moment an zu hinken, wo internationales mit nationalem verglichen wird. Wir Deutschen sind da eben sehr speziell, was Genauigkeit, Ordnung bis hin zur Pedanterie anbelangt.
Erheblich mehr Inkludisten gibt es offensichtlich beim Unicode-Konsortium. Der Eindruck drängt sich bei einem genaueren Blick in den neuen Unicode 6-Standard geradezu auf. Beispiel gefällig?
Beginnen wir mit der Kategorie Miscellaneous Symbols And Pictographs, die mitunter schon etwas speziellere Zeichen, wie die Freiheitsstatue oder die Japanischen Inseln vorhält.
...
Weiter geht die Exkursion in den Bereich unverzichtbarer, japanischer Emojis.
...
Und das war noch bei weitem nicht alles, was die nächste Unicode-Version zu bieten hat. Einen guten Überblick kann man sich im Unicode 6.0 Versioned Charts Index verschaffen. Mit dabei sind übrigens nicht nur solche Symbole, die wir in Wing- und Webdings schon immer vermisst haben, sondern auch sprachliche Ergänzungen aus dem afrikanischen Raum, wie Mandäisch, Batak und Brahmi.
Weil ich zwar Pedant, aber auch bekennender Inkludist bin, finde ich das natürlich Klasse. Leider wird es wohl noch ein wenig dauern, bis Unicode 6 eine Verbreitung gefunden hat, die es einem erlaubt die Zeichen daraus gefahrlos zu nutzen.
Zuletzt aber noch mein Favorit 'PILE OF POO' (U+1F4A9).

Mehr auch bei heise.
Erheblich mehr Inkludisten gibt es offensichtlich beim Unicode-Konsortium. Der Eindruck drängt sich bei einem genaueren Blick in den neuen Unicode 6-Standard geradezu auf. Beispiel gefällig?
Beginnen wir mit der Kategorie Miscellaneous Symbols And Pictographs, die mitunter schon etwas speziellere Zeichen, wie die Freiheitsstatue oder die Japanischen Inseln vorhält.





Weiter geht die Exkursion in den Bereich unverzichtbarer, japanischer Emojis.





Und das war noch bei weitem nicht alles, was die nächste Unicode-Version zu bieten hat. Einen guten Überblick kann man sich im Unicode 6.0 Versioned Charts Index verschaffen. Mit dabei sind übrigens nicht nur solche Symbole, die wir in Wing- und Webdings schon immer vermisst haben, sondern auch sprachliche Ergänzungen aus dem afrikanischen Raum, wie Mandäisch, Batak und Brahmi.
Weil ich zwar Pedant, aber auch bekennender Inkludist bin, finde ich das natürlich Klasse. Leider wird es wohl noch ein wenig dauern, bis Unicode 6 eine Verbreitung gefunden hat, die es einem erlaubt die Zeichen daraus gefahrlos zu nutzen.
Zuletzt aber noch mein Favorit 'PILE OF POO' (U+1F4A9).

Mehr auch bei heise.
Sonntag, 20. Februar 2011
Bibliothek JavaEventing
Bei Client-Anwendungen habe ich häufiger die Erfahrung gemacht, dass man irgendwann irgendwelche Listener oder Observer-Pattern implementiert, weil irgendeine Aktion, eine andere auslösen soll. Die AWT-Eventlistenerklassen in java.awt lassen sich zwar gut verwenden, um so etwas für die Anwendung zu bauen, aber etwas fertiges wäre natürlich schöner. Abhelfen will da die Bibliothek JavaEventing. Vielseitig und leichtgewichtig verspricht JavaEventing zu sein. Auf den ersten Blick scheint sie mir vor allem eines zu sein, nämlich simpel. So bekommt man mit dem EventManager eine Klasse, an der man kurzerhand seine Listener einhängen und auslösen kann. Arbeitet man Multithreaded, gibt es auch hierfür Helfer, wie zum Beispiel einen Auslöser, der erst startet, wenn die Verarbeitung des vorherigen Events abgeschlossen ist. Ich würde meinen, dass man da einiges geschenkt bekommt, was man sonst auf die Schnelle vielleicht schlechter implementiert hätte.
Computers – A Chronological Timeline
Meine ersten Computerkontakte lagen so ungefähr in der Mitte der Neunzehnhundertachziger. Die Zeit der Personal Computer eben. Die Tapete lässt zwar diverse Computermodelle vermissen, was wohl dem Platz geschuldet ist, vermittelt aber trotzdem einen guten Eindruck, wie die technische Entwicklung so vonstatten gegangen ist.
via kraftfuttermischwerk
via kraftfuttermischwerk
Mittwoch, 9. Februar 2011
Java Abschussbereit
Java-Anwendungen abschießen für Dummies. Tante Heise schreibt
*Update 16.02.11*
Das Java-Update 1.6_24 behebt den Bug. via heise
via heise.de
Die Umwandlung des Literals "2.2250738585072012e-308" in eine Gleitkommazahl führt zu einer Endlosschleife in Java, in dessen Folge die CPU voll ausgelastet wird.Das musste ich natürlich ausprobieren. Leider klappt das auf meiner Linux-Kiste mit meiner 64-Bit OpenJDK Server VM ziemlich gut. Einfach
new Double("2.2250738585072012e-308")
ausführen und schon steht die JVM. So etwas dürfte halbwegs zielgerichtet in eine Webanwendung einschleusbar sein.*Update 16.02.11*
Das Java-Update 1.6_24 behebt den Bug. via heise
via heise.de
Dienstag, 8. Februar 2011
for-Schleifenperformance über eine Liste
Frisch gefunden - eine Schleifenvariante, bei der wohl jemand meinte noch ein bisschen Performance rauskitzeln zu wollen:
Häufiger sieht man das so:
Die zweite Version ruft für jeden Durchlauf die size-Methode der Liste auf. Das wollte der Schreiber der ersten Version wohl sparen, wie ich finde zu lasten der Lesbarkeit. Wenn man das auf Grund sehr vieler zu erwartender Durchläufe tatsächlich sparen möchte, könnte man natürlich auch einen Zweizeiler daraus machen, was wohl auch die geläufigere Form ist:
Die Schleife rückwärts laufen zu lassen, wäre eine weitere Idee (keine besonders gute, wie ich finde), den Methodenaufruf zu sparen. Auch hier erfolgt die Initialisierung nur ein einziges mal und wir sparen sogar die zweite Variable:
Meiner Meinung nach, lohnt die Einbuße der Lesbarkeit in diesem Fall nicht. Die size-Methode gibt nur den Wert einer Instanz-Variablen zurück, was nicht viel kostet. Bei wenigen hundert Durchläufen jedenfalls kaum messbar und definitiv nicht fühlbar.
In dem gefundenen Fall bearbeitet die Schleife übrigens eine Liste mit ungefähr einer Hand voll Einträgen.
for (int i=0, j=list.size(); i < j ; i++) {...
Häufiger sieht man das so:
for (int i=0; i < list.size(); i++) {...
Die zweite Version ruft für jeden Durchlauf die size-Methode der Liste auf. Das wollte der Schreiber der ersten Version wohl sparen, wie ich finde zu lasten der Lesbarkeit. Wenn man das auf Grund sehr vieler zu erwartender Durchläufe tatsächlich sparen möchte, könnte man natürlich auch einen Zweizeiler daraus machen, was wohl auch die geläufigere Form ist:
int len = list.size();
for (int i=0; i < len; i++) {...
Die Schleife rückwärts laufen zu lassen, wäre eine weitere Idee (keine besonders gute, wie ich finde), den Methodenaufruf zu sparen. Auch hier erfolgt die Initialisierung nur ein einziges mal und wir sparen sogar die zweite Variable:
for (int i=list.size()-1; i>=0; i--) {...
Meiner Meinung nach, lohnt die Einbuße der Lesbarkeit in diesem Fall nicht. Die size-Methode gibt nur den Wert einer Instanz-Variablen zurück, was nicht viel kostet. Bei wenigen hundert Durchläufen jedenfalls kaum messbar und definitiv nicht fühlbar.
In dem gefundenen Fall bearbeitet die Schleife übrigens eine Liste mit ungefähr einer Hand voll Einträgen.
Die Suchmaschine und Ich
Seit Google (anfangs noch als Geheimtipp) mit den besten Ergebnissen punkten konnte, nutze ich die Googlesuche. Inzwischen hat sich viel getan und dennoch ist Google noch immer eine, wenn nicht die meist genutzte Suchmaschine. Einzig, die Popularität hat auch seine Kehrseite. Das Ranking hat inzwischen wirtschaftliche Bedeutung, was zu massenhaften Manipulationen und einer neuen Berufsgruppe, des SEO geführt hat, die einem die eigene Webpräsenz auf die vorderen Plätze hievt. Das bedeutet aber nicht zwingend, dass die Relevanz für die Suchbegriffe der Seite auch tatsächlich gegeben sind. Ich denke da an eine Vielzahl kommerzieller Seiten, die bei einer Vielzahl von Begriffen ganz vorne mit dabei sind. Anfangs waren das die Virenschleudern und Abofallen mit ihren Linkfarmen, später dann Ebay, Dooyoo oder Chiao, heute ist Idealo, Guenstiger und Wikipedia ganz vorne.
Eigentlich gilt für mich schon fast, dass die ersten Plätze zu den Ergebnissen gehören, die für mich am wenigsten relevant sind. Will ich nämlich etwas nachschlagen, dann kann ich das auch gleich bei Wikipedia tun. Will ich einen Preisvergleich, ist mir auch da etwas passendes geläufig.
Leider zieht das Relevanz zu Popularität-Verhältnis immer dort nicht mehr, wo die Popularität so hoch ist, dass die Kenntnis darüber bereits zur Allgemeinbildung des Thema Web gehört. Hier gilt nämlich, wenn ich bei Amazon nachlesen möchte, kann ich dieses direkt dort tun und brauche keinen überflüssigen Eintrag in der Suchliste. Zu diesem Zweck habe ich irgendwann mal das Firefox-Plugin OptimizeGoogle installiert. Das bietet unter anderem eine Blacklist für Google-Suchergebnisse, in die alle Verdächtigen eingetragen werden können. Insgesamt hat das Plugin eine ganze Menge nützlicher bis netter Tweaks.
Aktuell bin ich noch auf die Suchmaschine DuckDuckGo aufmerksam geworden. Ich muss zugeben, die erste seit langem, die mir auf Anhieb sympathisch ist. DuckDuckGo weist nämlich einen hohen Nerdfaktor auf. Die Suchmaschine präsentiert sich so karg, wie Google zu seinen besten Zeiten, verspricht aber "We don't track you!". Hinzu kommt eine neue Idee namens !Bang. !Bangs erlauben die Suche anderer Seiten auszulösen und so wird mit der Suchanfrage "!a lunchbox" die Amazon-Ergebnisseite mit passendem Suchbegriff zurückgeliefert. Außerdem gibt es noch ein paar praktische Funktionen, wie zum Beispiel die Abfrage von Wolfram Alpha. Zuletzt gibt es für die Puristen auch eine Version, die ganz ohne visuelle Spielereien auskommt - nämlich die DuckDuckGo Lite-Version.
Eigentlich gilt für mich schon fast, dass die ersten Plätze zu den Ergebnissen gehören, die für mich am wenigsten relevant sind. Will ich nämlich etwas nachschlagen, dann kann ich das auch gleich bei Wikipedia tun. Will ich einen Preisvergleich, ist mir auch da etwas passendes geläufig.
Leider zieht das Relevanz zu Popularität-Verhältnis immer dort nicht mehr, wo die Popularität so hoch ist, dass die Kenntnis darüber bereits zur Allgemeinbildung des Thema Web gehört. Hier gilt nämlich, wenn ich bei Amazon nachlesen möchte, kann ich dieses direkt dort tun und brauche keinen überflüssigen Eintrag in der Suchliste. Zu diesem Zweck habe ich irgendwann mal das Firefox-Plugin OptimizeGoogle installiert. Das bietet unter anderem eine Blacklist für Google-Suchergebnisse, in die alle Verdächtigen eingetragen werden können. Insgesamt hat das Plugin eine ganze Menge nützlicher bis netter Tweaks.
Aktuell bin ich noch auf die Suchmaschine DuckDuckGo aufmerksam geworden. Ich muss zugeben, die erste seit langem, die mir auf Anhieb sympathisch ist. DuckDuckGo weist nämlich einen hohen Nerdfaktor auf. Die Suchmaschine präsentiert sich so karg, wie Google zu seinen besten Zeiten, verspricht aber "We don't track you!". Hinzu kommt eine neue Idee namens !Bang. !Bangs erlauben die Suche anderer Seiten auszulösen und so wird mit der Suchanfrage "!a lunchbox" die Amazon-Ergebnisseite mit passendem Suchbegriff zurückgeliefert. Außerdem gibt es noch ein paar praktische Funktionen, wie zum Beispiel die Abfrage von Wolfram Alpha. Zuletzt gibt es für die Puristen auch eine Version, die ganz ohne visuelle Spielereien auskommt - nämlich die DuckDuckGo Lite-Version.
Montag, 7. Februar 2011
WLAN-Lunchbox zum Mitnehmen
![]() |
PirateBox Photo-Gallery |
Die Bauanleitung gibt es im PirateBox-Wiki.
Donnerstag, 27. Januar 2011
Programmiererwitz
Viele Programmiererwitze haben die Eigenschaft, nicht komisch zu sein. Der hier hat aber was. Noch mehr gibt es übrigens hier.
Eine Frau bittet ihren Mann zum Supermarkt zu gehen:
Lieber Mann, gehe bitte zum Supermarkt und kaufe ein Brot. Sollten Sie Eier haben, bringe 6 mit.
Der Mann geht los und kommt nach einer Weile mit 6 Laiben Brot wieder wieder:
Frau: Oh verdammt, wieso hast Du sechs Brote mitgebracht?
Mann *unschuldig*: Sie hatten Eier vorrätig.
via Reizzentrum
Eine Frau bittet ihren Mann zum Supermarkt zu gehen:
Lieber Mann, gehe bitte zum Supermarkt und kaufe ein Brot. Sollten Sie Eier haben, bringe 6 mit.
Der Mann geht los und kommt nach einer Weile mit 6 Laiben Brot wieder wieder:
Frau: Oh verdammt, wieso hast Du sechs Brote mitgebracht?
Mann *unschuldig*: Sie hatten Eier vorrätig.
via Reizzentrum
Dienstag, 25. Januar 2011
8 Regeln für den totalen Stillstand in Unternehmen
Firmen- und Projektrealität zielgenau auf den Punkte gebracht. Mir sind einige der genannten Obskuritäten so oder so ähnlich auch schon untergekommen.
Gruyere - Anleitung zum Hacken
Mit Sicherheitslücken in der eigenen Anwendung ist es so, wie mit schweren Krankheiten - die haben auch immer nur die Anderen. So oder so ähnlich scheinen mir etliche Entwickler zu denken. Zumindest habe ich das bereits häufiger so mitbekommen. Die Anwendung funktioniert, die Zeit ist knapp - was soll man da Zeit mit der Anwendungssicherheit vergeuden. Vielen Entwicklern erscheint der Hack der eigenen Anwendung eher wie ein theoretischer Fall, der sowieso nie vorkommt. Vor allen Dingen ist die Gefahr sehr abstrakt, weil der Entwickler selbst zwar einige gefahren kennt, aber zumeist null Erfahrung damit hat, wie einfach so ein Anwendungshack sein kann. Besonders kritisch ist das natürlich bei offenen Webanwendungen.
Dagegen helfen will das Projekt Gruyere, das eine löchrige Python-Anwendung bereitstellt, sowie Tips und Anleitungen für verschiedene Hacks, wie zum Beispiel Cross Site Scripting oder SQL-Injections. Betätigt man sich nämlich mal selbst als Hacker, dürfte das den Blick für die eigene Entwicklertätigkeit deutlich schärfen.
Dagegen helfen will das Projekt Gruyere, das eine löchrige Python-Anwendung bereitstellt, sowie Tips und Anleitungen für verschiedene Hacks, wie zum Beispiel Cross Site Scripting oder SQL-Injections. Betätigt man sich nämlich mal selbst als Hacker, dürfte das den Blick für die eigene Entwicklertätigkeit deutlich schärfen.
Montag, 24. Januar 2011
Empfehlung AS-Auto Replace
Das Windows-Programm AS-Auto Replace benutze ich inzwischen schon einige Jahre. Heute ist mir aufgefallen, dass das Programm bereits bei Version 1.4 angekommen ist. AS-Auto Replace ist ein Tool zum Suchen und Ersetzen über Dateigrenzen hinweg. Das Programm kommt eher schlicht und ohne große Features daher, ist aber sehr flott. Kurzum, seit Version 1.0 mein ständiger Begleiter, wenn es um XML-Dateien geht (meistens jedenfalls), in denen eine Zeichenkette, gegen eine andere auszutauschen ist.
Samstag, 22. Januar 2011
Lorem ipsum Generator
Mir geht es bei der Entwicklung nicht selten so, das neue Eingabemasken beim Testen mit Text in der Qualität von "shfjhsdgjkdfjg" befüllt werden. Das sieht natürlich nicht wirklich hübsch aus und wirkt vor allem an Stellen, wo mehr Text verarbeitet werden darf, nicht besonders präsentativ. Im Printbereich gibt es da schon seit mehreren Jahrhunderten eine Lösung. Dort wird nämlich auf "Lorem ipsum" als Platzhalter- bzw. Blindtext zurückgegriffen. Zu Beginn war der Text noch für die Präsentation von Schriftzeichen gedacht, heute verwendet man ihn aber auch, wenn zwar ein Layout zu bauen, jedoch noch kein echter Text vorhanden ist. Das kann natürlich auch uns Entwicklern dienlich sein, wenn es darum geht, die Anwendung während der Entwicklung mit irgendwelchen Texten zu füttern. Erst kürzlich bin ich wieder in eben diese Verlegenheit gekommen, und glatt über den Lorem ipsum-Generator gestolpert. Der Generator erzeugt Platzhaltertext in beliebiger Wort- und Absatzzahl.
Bei der Entwicklung von Webinterfaces drängt sich natürlich der Einsatz eines passenden plugins für diesen Zweck auf. Dafür gibt es natürlich auch gleich mehrere. Ich habe es mal mit dem Dummy Lipsum ausprobiert. Das Plugin tut ziemlich exakt, was es soll. Mal sehen, ob es sich auch dauerhaft als zweckdienlich erweist.
*Update 28.04.11*
Ein ausgezeichneter Online-Blindtextgenrator findet sich auch hier: http://www.blindtextgenerator.de/
Bei der Entwicklung von Webinterfaces drängt sich natürlich der Einsatz eines passenden plugins für diesen Zweck auf. Dafür gibt es natürlich auch gleich mehrere. Ich habe es mal mit dem Dummy Lipsum ausprobiert. Das Plugin tut ziemlich exakt, was es soll. Mal sehen, ob es sich auch dauerhaft als zweckdienlich erweist.
*Update 28.04.11*
Ein ausgezeichneter Online-Blindtextgenrator findet sich auch hier: http://www.blindtextgenerator.de/
Abonnieren
Posts (Atom)