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 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: 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

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.

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!

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

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.