Mittwoch, 13. Mai 2009

Freie Icons für freie Software

icon_imageWer seine Software mit einer Benutzeroberfläche versieht, benötigt das Eine oder Andere Icon. Problematisch ist hierbei immer die Lizensierung. Die Zeit in der sich niemand daran gestört hat, wenn man halt irgendwelche Bilder aus dem Web genommen hat, sind lange vorbei. Andererseits gibt es für Entwickler von freier Software heutzutage einen Pool an qualitativ hochwertigen und freien Bildern. Hier noch ein paar Quellen mit zumeist CCL oder GPL Lizensierten Icons.


Icon Finder: http://www.iconfinder.net
Tango Desktop Projekt: http://tango.freedesktop.org
famfamfam: http://www.famfamfam.com
Wikimedia Iconsets: commons.wikimedia.org


[Update]

Eine weitere Suchmaschine für freie Icons: http://www.iconlet.com

[Update 2]

Flavours IconSet: http://www.smashingmagazine.com/2009/01/23/friday-freebies-flavours-icon-set-and-cute-tweeters-icon-set/

You can freely use it for both your private and commercial projects.

Flavour Extended IconSet: http://www.addictedtocoffee.de/

Montag, 11. Mai 2009

Google Collections

Die Google Collections bieten inzwischen eine recht ansehnliche und interessante Auswahl an. Besonders interessant für Caching Funktionen ist die MapMaker Klasse. Die bringt nämlich gleiche eine Unterstützung für Soft- und Weak Referenzen sowie eine zeitliche Haltegrenze mit.

Softreferenzen gibt es seit Java 1.2 und werden so lange vom Garbage Collector verschont, wie sie nicht anderweitig referenziert werden und der Speicher ausreicht. Wird der Speicher knapp, werden die über Softreferenzen referenzierten Objekte weggeräumt.

Weakreferenzen gibt es ebenfalls seit Java 1.2. Die von Weakreferenzen referenzierten Objekte werden immer dann vom Garbage Collector entfernt, wenn die referenzierten Objekte an keiner anderen Stelle mehr referenziert werden. Grundsätzlich gilt für die Soft- wie auch für die Weak Referenz, dass nur weggeräumt wird, wenn keine "stärkere" - also "normale" Referenz mehr vorhanden ist.

Der Timeout für Objekte in der MapMaker Klasse ist interessant, wenn auch nicht so locker einsetzbar, wie man auf den ersten Blick zu meinen glaubt. Der Timeout wird nämlich in einem statischen Zeitrahmen vergeben. Man kann also festlegen, das ein Objekt für eine fixe Zeit von z.B. 10 Minuten gehalten werden soll. Das macht aber nur dann wirklich sinn, wenn die Anwendungslogik das hergibt - man also weiß, dass Objekte tatsächlich nach einer bestimmten Zeit mit hoher Warscheinlichkeit nicht mehr benötigt werden. Werden die Objekte auch nach der fixen Zeit doch noch benötigt, heißt das, dass diese neu gebaut werden müssen. Interessant wird der MapMaker vor allem in Kombination mit Weak- und Soft Referenzen. Man kann also z.B. festlegen, dass Objekte nur so lange im MapMaker verweilen, wie sie keine "stärkeren" Referenzen mehr haben, jedoch auch nicht länger als 10 Minuten.

Benötigt man nur eine HashMap mit Weak Referenzen, bietet sich übrigens auch die java.util.WeakHashMap an, die es seit Java 1.4 gibt.

Beispiel:


 ConcurrentMap graphs = new MapMaker()
.concurrencyLevel(32)
.softKeys()
.weakValues()
.expiration(30, TimeUnit.MINUTES)
.makeComputingMap(
new Function() {
public Graph apply(Key key) {
return createExpensiveGraph(key);
}
});

Links: Google Collections, MapMaker (Javadoc)

Dienstag, 5. Mai 2009

case default:

Wird ein Programmierer Monate oder gar Jahre später gefragt, weshalb er Dinge so implementiert hat, wie sie später geworden sind, hat man eine gute Chance auf die Antwort "Das ist historisch so gewachsen". Mögliche Interpretationen dieser Antwort könnten diese sein:

1. Ich habe nicht mehr die geringste Erinnerung an diesen Code.
2. Das wurde damals aus Zeitdruck so hingeschludert und später hat sich keiner mehr dran getraut.
3. Keine Ahnung - das habe ich damals mal eben aus dem Internet kopiert und refaktorisiert.
4. Damals hielt ich das für eine gute Idee - später nicht mehr.
5. Inzwischen haben da so viele Leute dran rumgeschrieben, dass ich nicht mehr dir geringste Ahnung habe, was da überhaupt passiert.
6. Das war saukompliziert - machs doch besser!

Warum man immer Klammern setzen sollte

Häufiger treffe ich auf Code, bei dem sich der Programmierer zu schade war ein if durch Klammern einzugrenzen. Mir als gewohnten Klammersetzer fällt das beim Querlesen nicht selten erst auf den zweiten Blick auf. Ich kann mich gut an einen Fall erinnern, in dem ich eine Zeile an eben solch einem klammerlosen if einfügte und die Ergänzung in den nicht vorhandenen Klammern verortet sah. Anschließendes Wundern vorprogrammiert. Hier noch ein Beispiel - Welcher Fall trifft in der zweiten Ausgabe zu?



if (a)
if (b)
System.out.println("a und b sind true");
else
System.out.println("What is here?");

Sonntag, 3. Mai 2009

Links

The Java CIFS Client Library (jCIFS) ist eine Javaimplementierung des CIFS/SMB Netzwerkprotokolls.

Java Native Access (JNA) erlaubt die Verwendung nativer Bibliotheken ohne den ganze JNI Rattenschwanz. Neben Windows wird auch Linux und OSX unterstützt. Als Alternative - allerdings nur mit Windows Support - gibt es noch die Native Library Linker (nlink) Bibliothek.

furbelow kann man sich aus dem SVN Repository bei Sourceforge auschecken. Die Klassen sind gut dokumentiert und bestehen aus einm Zoo nützlicher Dinge für den Swingschrauber.

Und zuletzt noch einen Link zum Swingworker Blog, auf dem es allerlei nützliche Controls gibt. Darunter die Komponenten JWizard, JTitleSeparator, JPopupButton und die JMonthBox.