Dienstag, 30. November 2010

Pixel aus BufferedImage auslesen

An die Pixel eines BufferedImage kann man ganz einfach gelangen. Den Sniplet brauchte ich vor Ewigkeiten mal und habe ihn gerade wiedergefunden. Super einfach eigentlich:

public static void main(String[] args) {
        try {
            final BufferedImage img =  ImageIO.read(new File("images/example.jpg"));
            final int w = img.getWidth();
            final int h = img.getHeight();
            final int pixels[] = new int[w * h];

            img.getRGB(0, 0, w, h, pixels, 0, w);
            
            for (int i = 0; i < pixels.length; i++) {
                System.out.println("R:" + ((pixels[i] >> 16) & 0xff) + " G:"
                        + ((pixels[i] >> 8) & 0xff) + " B:" + (pixels[i] & 0xff));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Schreibweise für String-Concatenation

Das man mal einen String zusammensetzen will, kommt ja häufig vor und ist einfach. Beispiel:
String s = "[Attribute: " + getQualifiedName() + "=\"" + value + "\"]"; 
Daran gibt es ansich auch nicht viel zu mäkeln, außer eben, dass diese Schreibweise, je nach Länge, schnell unübersichtlich aussieht. Viel netter ist es eigentlich, den StringBuilder mit seiner Kettenschreibweise zu verwenden.
String s = new StringBuilder()
            .append("[Attribute: ")
            .append(getQualifiedName())
            .append("=\"")
            .append(value)
            .append("\"")
            .append("]")
            .toString();
Wenn man nun ganz korrekt sein will, kann man außerdem abschätzen, wie groß der String werden könnte, und dem StringBuilder gleich die dazu passende Größe mitgeben, so dass er möglichst selten mitwachsen muss. Merklich performanter dürfte keine der beiden Lösungen sein, da der Hotspot-Compiler das String-Concatenieren ohnehin optimiert, wenn er es denn kann. Probleme hingegen gibt es da schnell mal in Schleifenkonstrukten. Ist die Logik zum String bauen umfangreicherer, empfiel sich ohnehin immer der StringBuilder bzw. der StringBuffer, wenn man das synchronisierte Derivat braucht, oder kein Java 1.5 zur Verfügung hat, was hoffentlich selten geworden ist.

Donnerstag, 25. November 2010

jsoup: Java HTML Parser

Das hier gehört in die Kategorie: Muss ich mir merken. Eine Java-API, die von sich behauptet, Wildbahn-HTML parsen zu können. Mit anderen Worten, dass Ding soll recht fehlertolerant sein.Zur Projektseite geht es hier: http://jsoup.org/

via Schockwellenreiter

PR-Aktionen im Web 2.0 und wie man sie besser nicht umsetzt

Aral hat gerade eine Werbeaktion laufen, bei der sie jedem ein belegtes Baguettbrötchen schenken, der Fan ihrer Facebookseite wird. Das ist eine Variante von Marketing, der ich durchaus etwas abgewinnen kann. Einzig bei der Umsetzung hätte Aral wohl auf erfahrenere Entwickler zurückgreifen sollen. Anfangs funktionierte das ganz gut. Bis auch ich darauf aufmerksam wurde, war der Traffic auf die Gutscheinapp vermutlich schon in die Höhe geschnellt. Ich werde also erstmal nur von einer weißen Seite begrüßt. Ein Blick auf die Aral-Pinnwand offenbart, dass der Mob die Ankündigung mit passenden Kommentaren flutet. Im Hintergrund scheint fleißig gewerkelt zu werden und nach einiger Zeit scheint das mit dem Gutschein wieder zu klappen. Einzig ungewöhnlich ist die anschließende Meldung:

insert into aral_coupon_user (id, coupon_id, facebook_uid, used_barcode) VALUES (785, 102, '100000112611741', '981035092500') Duplicate entry '785' for key 1

Die sieht so aus, als könne die Gutscheinnummer, die da generiert wurde, nicht in die Datenbank geschrieben werden, weil ein Constraint verletzt wurde. Wenn die Nummern, die da generiert werden, nicht im Nachhinein reproduzierbar sind, werden sicher einige Gutscheinausdrucker ihre Freude haben, wenn sie für den Gutscheincode keine Aralbemme ausgeliefert bekommen. Jedenfalls lassen sich nun beliebig viele Gutscheine mit unterschiedlichem Code generieren. Das wird wohl darauf hinauslaufen, dass entweder Aral bis Jahresende fleißig Futter rausrückt, oder der PR-Schuss nach hinten losgeht. Die Empörung ist bei der Web2.0- und vor allem der Schnäppchenmacher-Zielgruppe erfahrungsgemäß groß, wenn versprochenes nicht eingehalten wird.

Inzwischen funktioniert das ganze übrigens gar nicht mehr und man bekommt eine Sperrseite. Das dürfte wohl die Reißleine sein, die da gezogen wurde.

Und die Moral von der Geschichte? Wenn man eine Anwendung online stellt, bei der mit einer Menge Anfragen zu rechnen ist, empfiehlt sich ein Stresstest. Und wann ist mit vielen Anfragen zu rechnen? Auf jeden Fall immer dann, wenn es was kostenloses gibt.

Facbook-App von Aral,

Dienstag, 23. November 2010

Upgrade von Mint Isadora auf Julia

Heute war zeitlicher Spielraum zum Basteln. Dabei habe ich gleich mal mein Mint auf die nächste Version aktualisiert. Natürlich mittels APT-Distupgrade. Was bei Ubuntu ganz ordentlich funktioniert, ist bei Mint etwas kritischer. Das Paket für das Mint-Menü hat sich ein wenig geziert, und ich musste nachhelfen. Alles weitere hat sich von allein erledigt. Das ganze Prozedere verlief dieses Mal angenehm ereignislos.

Erster Bug nach dem Neustart: die Icons im Mint-Menü waren auf zwei Pixel zusammengeschrumpft. Das lies sich aber mit ein paar Klicks im dazugehörigen Konfigurationsdialog beheben. Etwas hakeliger war es da mit der Kalendererweiterung Lightning, für die es zwar ein Update gab, aber nicht für die X86_64 Architektur. Da hat der automatische Pluginupdater vom Thunderbird irgendwie daneben gegriffen. Aber nach ein wenig Sucharbeit war auch das schnell erledigt.

Summa Summarum ging alles recht flott. Trotzdem finde ich Rolling-Releases irgendwie netter.

Samstag, 20. November 2010

Ubuntu Desktop-Tuning

Als ich mal mein Home-Verzeichnis von der flotten SSD auf meine lahme, Caviar-Green umgelegt hatte, gab es einen unschönen Nebeneffekt. Nämlich der, dass Anwendungen plötzlich für mehrere Sekunden hingen. Das fand ich wenig nachvollziehbar, weil die Platte ja sooo langsam auch wieder nicht war. Ich habe die Änderung einige Zeit später wieder Rückgängig gemacht und nicht weiter darüber nachgedacht. Heute bin ich über einen Artikel gestolpert, der für einen späten AHA-Effekt sorgte.

http://everflux.de/ubuntu-desktop-tuning-mit-elevatordeadline-1681/

Mein Rechner bekommt jetzt mal diese beiden Zeilen spendiert:
echo "noop" | tee /sys/block/sda/queue/scheduler
echo "deadline" | tee /sys/block/sdb/queue/scheduler


*Update 23.11*
Bis dato hat sich kein Beschleunigungsgefühl einstellen wollen. Im Gegenteil hatte ich sogar wieder die Ersten Anwendungshänger seit langem. Die Zeilen fliegen wohl wieder raus.

*Update 22.12*
Zum Thema SSD-Tuning findet sich bei Zockertown noch ein interessante Beitrag.

*Update 27.03.12 *
Zum Thema SSD-Trim unter Linux aktivieren auf jeden Fall mal bei loggn.de reinschauen.

Mittwoch, 17. November 2010

Darktheme für Eclipse

Eigentlich bin ich mit der Farbgebung der Eclipse-Editoren ganz zufrieden und habe auch nie das Bedürfnis gehabt daran etwas zu ändern. Bis ich vor kurzem über ein Textmate-Farbschema gestolpert bin, dass ich unbedingt mal ausprobieren musste. Zwar werde ich es wohl nicht in Dauergebrauch nehmen, finde es aber trotzdem eine sehr nette und vor allem angenehme Variante, die es auf jeden Fall wert ist, ausprobiert zu werden. Leider sieht der Editor anschließend wie ein Alien in der Eclipse-IDE aus, da das Farbschema der restlichen UI beim alten bleibt.

Vor dem Ausprobieren empfiehlt es sich die alte Konfiguration zu sichern. Das geschieht über den Eclipse Preference-Exportwizard im Menü File->Export. Anschließend kann man mittels File->Import den Preference-Importwizard auf das neue Colortheme loslassen.

Das Farbschema kann man bei blog.ronnyristau.de downloaden.

Dienstag, 16. November 2010

Web Designers vs. Web Developers

Klischees sind was schönes. Ich liebe sie. Es ist zwar eigentlich jedem klar, dass die nie komplett passen und die Ausnahme die Regel ist, aber man fühlt sich immer so schön bestätigt, wenn mal wieder eines passt. Ich kenne die Zusammenarbeit mit Grafikdesignern gut. Ich bin immer ausgezeichnet mit ihnen ausgekommen. Interessant wird es aber immer dann, wenn ein Kompromiss gefunden werden will, weil die Idee des Designers technisch nicht oder nur mit Klimmzügen realisierbar ist. Ich hatte auch schon Diskussionen, weil der Entwurf nicht pixelgleich unter IE und Firefox umgesetzt werden konnte.

Der hier deckt zwar bei weitem nicht alles ab, ist aber irgendwie passend:


free website builder
Web Designers vs Web Developers is brought to you by Wix.com
You are most welcome to share this infographic with your audience.

via sixrevisions

Montag, 15. November 2010

Kostenlose SciFi

Der Chiphersteller Intel ist ja durchaus dafür bekannt, dass er die Marketingklaviatur hervorragend beherrscht. Das Buch "Über morgen" gehört, wie ich finde, zu einer sehr netten PR-Aktion. Bekannte Autoren schreiben Kurzgeschichten und Intel gibt noch Links zu den, im weitesten Sinne, behandelten Intel-Technologien dazu. Außerdem noch ein paar Seiten Unternehmensinformationen zum Abschluss. Alles in allem eine coole Aktion, bei der der Nutzwert für den Leser definitiv passt.

Das Buch gibt es als Podcast zum hören, sowie im EPUB- und PDF-Format im Intel newsroom.

via lesen.net

Samstag, 13. November 2010

Flash Mob Gone Wrong by Tom Scott

“The whole world turns upside down in ten years, but you turn upside down with it.” - Spider Robinson, 1977



Das ist natürlich alles Fiktion. Die einzelnen Bestandteile befinden sich aber verdächtig nahe an der Realität, so dass nur zu sagen bleibt: Möglich wäre es.

Donnerstag, 11. November 2010

Buchempfehlung - Aus dem Tagebuch eines Bughunters

Ich hatte neulich die Gelegenheit etwas Zeit beim Fachbuchhändler Lehmanns in der IT-Ecke zu verbringen. Ich war überrascht, wie nett es dort inzwischen geworden ist. Es gibt Leseecken und Kaffee und man kann sich voller Muße und in aller Ruhe umsehen. Ich hatte einige interessante Bücher in der Hand, wovon mich aber eines im Nachhinein besonders angesprochen hat. Natürlich ein Fachbuch, aber mal eines, das man ganz locker lesen kann. Das Buch erzählt über die Arbeit und das Vorgehen eines Bughunters, über seine Werkzeuge und natürlich werden die verschiedenen Sicherheitslücken beleuchtet, die Software so enthalten kann. Das Buch ist unterhaltsam und lehrreich zugleich. Für Softwareentwickler unbedingt empfehlenswert, nicht etwa, weil es die coole Techniken beschreibt, die man vielleicht für das nächste Projekt nutzen könnte, sondern viel mehr das Verständnis für das tägliche Tun fördert. Das ganze ist natürlich etwas C-Lastig, aber auch für Java- und Scriptprogrammierer verständlich.


Aus dem Tagebuch eines Bughunters - Wie man Software-Schwachstellen aufspürt und behebt

E-Mailadresse validieren nach RFC822 mal anders

Und zwar mittels regulärem Ausdruck. Reguläre Ausdrücke gehören im Javabiotop nicht unbedingt zur Best Practice, in PHP und Perl trifft man sie aber häufiger. Einer der Gründe wird wohl mit der oft schlechten Lesbar- und Wartbarkeit zusammenhängen. Wer das richtig beherrscht, der kann da aber einiges mit zaubern. Ein Beispiel hierfür ist ein Ausdruck für die Validierung von E-Mailadressen gemäß RFC822. Ein wahres Monster! Die Java-Pattern-Api scheint aber gut damit zurechtzukommen (Im Gegensatz zum Syntaxhighlighter, deshalb gibt es den Code heute in Plain).

String regexp = "(?:(?:\\r\\n)?[ \\t])*(?:(?:(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[\\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*|(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)*\\<(?:(?:\\r\\n)?[ \\t])*(?:@(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[\\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*(?:,@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[\\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*)*:(?:(?:\\r\\n)?[ \\t])*)?(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*\\>(?:(?:\\r\\n)?[ \\t])*)|(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)*:(?:(?:\\r\\n)?[ \\t])*(?:(?:(?:[^()<>@,;:\\\\\".\\[\\]\\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*|(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)*\\<(?:(?:\\r\\n)?[ \\t])*(?:@(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*(?:,@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\]\\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*)*:(?:(?:\\r\\n)?[ \\t])*)?(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*\\>(?:(?:\\r\\n)?[ \\t])*)(?:,\\s*(?:(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*|(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)*\\<(?:(?:\\r\\n)?[ \\t])*(?:@(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*(?:,@(?:(?:\\r\\n)?[\\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*)*:(?:(?:\\r\\n)?[ \\t])*)?(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*\\>(?:(?:\\r\\n)?[ \\t])*))*)?;\\s*)";
boolean matches = Pattern.compile(regexp).matcher("Mark Mustermann <email@email.de>").matches();
System.out.println(matches);

via Unite-IT

Donnerstag, 4. November 2010

Wie in den guten, alten Zeiten des Web

Erinnert sich noch jemand an die guten alten Zeiten des Web? Zuerst hat AOL die Haushalte mit Online-CDs geflutet und nicht viel später wurde der Webspace-Anbieter Geocities zu einer der größten Anlaufstellen für private, selbst gebastelte HTML-Seiten, die so ein gewisses Feeling hatten. Dieses Feeling kann man sich mit dem Geocities-izer zurückholen.