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

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.

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

Mittwoch, 9. Februar 2011

Java Abschussbereit

Java-Anwendungen abschießen für Dummies. Tante Heise schreibt
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:

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.

Montag, 7. Februar 2011

WLAN-Lunchbox zum Mitnehmen

PirateBox_2-0_Case3
PirateBox Photo-Gallery
Es gibt ja schon seit längerem diverse Bastelprojekte, die Standardrouter zu etwas neuem umfunktionieren. Das PirateBox-Projekt finde ich aber besonders charmant. Die Box verspricht anonymes Filesharing und basiert auf OpenWrt, das auf einem Buffalo-Router läuft. Ein tolles Mitbringsel also. Die Teile für die Konstruktion sind für unter 100 Euro zu beschaffen. Einzig das Akku schlägt mit nochmal einem knappen Hunderter zu Buche.

Die Bauanleitung gibt es im PirateBox-Wiki.