O2 Prepaid Surfstick unter Mac OS X installieren

Nachdem Alice von der Telefónica gekauft wurde, gab es für uns treue Alice-Kunden einen O2-Surfstick zur Begrüßung, da anscheinend auch O2 von dem spanischen Telekommunikationsriesen gekauft wurde. Eigentlich sollte der Surfstick gratis sein, aber die Nachfrage war sehr groß und sah gab es bereits am Abend keine kostenlosen Sticks mehr.

Inzwischen hat man sich bei O2 überlegt, dass die Leute mit Alice-Surfstick-Gutschein den Stick wenigstens günstiger erhalten sollen, nämlich für 20 € statt 40 €. Klingt fair, da auch noch 5 Tagesflatrate dabei sind. Also habe ich mir dieses Angebot Heute gekauft.

Anekdote 1:
Der Surfstick kostet normalerweise 39,99 €. Der Alice-Gutschein gibt 20 € Rabatt - macht: 19,99 €. Das Problem war, dass in der Kasse des O2 Shops der rabattierte Preis mit 19,90 € eingetragen war. Bei der Eingabe der Coupon-Nummer zeigte die Anwendung nur eine Fehlermeldung: Der Rabatt für diesen Rabattcoupon darf 20 € nicht überschreiten. Tjaaa, der Surfstick war einfach 9 Cent zu günstig. Ende vom Lied: Der freundliche O2-Verkäufer sprach mit seinem Teamleiter, der auch keine Lösung wußte. Nun buchen die beiden das am Montag nach, da Heute (Samstag) auch niemand mehr im Servicecenter sitzt. Egal - ich hab den Stick bekommen.

Ab nach Hause, den Mobile Partner installiert und gestartet. PIN eingetippt, Guthaben-Code eingetippt, Verbinden gedrückt - und? Nix passiert. Ich mach es kurz: Der O2 Support war zwar sehr freundlich und sehr schnell, hatte allerdings keine Ahnung von Macs. Die Infos, die ich bekam brachten mich aber zum Problem und nun kann ich stolz diesen Blog-Eintrag über UMTS via O2-Surfstick schreiben:

  • Mobile Partner vom Stick installieren
  • Systemeinstellungen -> Netzwerk
  • Hier bekommt man eine Informationsmeldung, dass ein neues Modem erkannt wurde: 'Found modem Huawei'. Tipp-Topp, da dies der Hersteller des Sticks ist
  • Auf das neue Modem klicken
  • Telefonnummer: *99# eingeben
  • Benutzer und Passwort leer lassen
  • Jetzt kommt der wichtige Teil: Weitere Optionen klicken
  • Hersteller: Andere
  • Modell: HUAWEI Mobile Connect auswählen (hier ist nämlich standardmäßig ein Apple-Modem ausgewählt)
  • Fehlerkorrektur und Komprimierung im Modem aktivieren deaktivieren

Falls das noch nicht funktioniert, muss als Passwort null eingegeben werden.

Netzwerkeinstellungen HUAWEI Modem

Modemauswahl in Mac OS X

Nach diesem Hick-Hack funktionierte mein Stick und der riesengroße Vorteil ist, dass man jetzt über die Modem-Funktion von Mac OS X die An- und Abwahl machen kann.

Hier mal die Geschwindigkeit:
O2 Surfstick Geschwindigkeit

Zum Schluss noch Anekdote 2:
Nachdem meine ganzen Verbindungsversuche scheiterten, bekam ich eine O2 SMS, dass meine Tagesflatrate nicht aktiviert werden konnte und ich deshalb eine 3,50 € Gutschrift erhalten solle. Keine 3 Minuten später bekam ich noch eine SMS von O2 mit der Warnung, dass mein Guthaben auf unter 4 € abgesunken sei! Irgendwie hat es O2 mit Cent-Beträgen und Warnmeldungen.


Gemischtes Encoding einer Datei reparieren

Gestern habe ich eine Stunde lang verzweifelt versucht eine SQL Datei in die Datenbank einzufahren, die verschiedene Zeichensätze in der Datei hatte.

Mit file lässt sich die Kodierung einer Datei überprüfen, allerdings liefert sie in meinem Fall nur:

hdl.sql: Non-ISO extended-ASCII English text, with very long lines

Non-ISO ist nicht das, was man lesen möchte, wenn man Datenbanken importiert. Zum Glück habe ich hier ein schönes Shell-Skript gefunden, was die Datei 1a nach UTF-8 kodiert. Dazu wird eine Mischung aus recode und sed verwendet.

Im Anschluss liefert file nun den korrekten Wert:

hdl-utf8.sql: UTF-8 Unicode English text, with very long lines

Vielen Dank dafür.


Selbstsigniertes SSL Zertifikat für Tomcat und APR erstellen

Im letzten Blog-Eintrag zeigte ich, wie man die Tomcat-Native-Libraries mit APR installieren kann. Soll dazu SSL verwendet werden, benötigt der APR-Connector dazu ein PEM-kodiertes SSL-Zertifkat.

Ein selbstsigniertes Zertifikat lässt sich relativ leicht selbst erstellen.

Zunächst wird ein privater Schlüssel erzeugt:
openssl req -new -out tomcat.csr -keyout tomcat.pem
Generating a 1024 bit RSA private key
.......................................++++++
.++++++
writing new private key to 'tomcat.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Hamburg
Locality Name (eg, city) []:Hamburg
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Timo Meinen
Organizational Unit Name (eg, section) []:localhost
Common Name (eg, YOUR name) []:localhost
Email Address []:timomeinen@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Anschließend liegen zwei Dateien im Verzeichnis: Der private Schlüssel tomcat.pem und der Certifikation-Request tomcat.csr.

Mit dem folgenden Befehl kann man ein unverschlüsseltes Zertifikat erzeugen:
openssl rsa -in tomcat.pem -out tomcat.key
Enter pass phrase for tomcat.pem:
writing RSA key

Der letzte Schritt ist die Selbstsignierung des Zertifikates. Dieses kann dann gemeinsam mit dem privaten Schlüssel in Tomcat konfiguriert werden:
openssl x509 -in tomcat.csr -out tomcat.crt -req -signkey tomcat.key
Signature ok
subject=/C=DE/ST=Hamburg/L=Hamburg/O=Timo Meinen/OU=localhost/CN=localhost/emailAddress=timomeinen@gmail.com
Getting Private key

Die .csr und die .pem Datei kopiert man nun an einen geeigneten Platz z.B.
cp tomcat.* /Applications/apache-tomcat-6.0.26/conf/

Die Konfiguration in Tomcats server.xml ist schnell gemacht:

<connector port="8443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
SSLCertificateFile="/Applications/apache-tomcat-6.0.26/conf/tomcat.crt"
SSLCertificateKeyFile="/Applications/apache-tomcat-6.0.26/conf/tomcat.pem"
SSLPassword="changeit"
clientAuth="optional" SSLProtocol="TLSv1"/>

Der Unterschied zur Konfiguration mit einem Keystore sind die drei Anweisungen SSLCertificateFile, SSLCertificateKeyFile und SSLPassword. Sie werden hier erklärt.

Nun kann Tomcat von APR und OpenSSL profitieren.

Eine schöne Übersicht über das Thema SSL-Zertifakte erstellen gibt es u.a. in Jian Fang's Wiki.


Apache Tomcat Native Libraries unter Mac OS X installieren

Vor knapp zwei Wochen wurde die neue Tomcat Version 6.0.26 veröffentlicht. Zeitgleich wurden die Tomcat-Native-Libraries auf die Version 1.1.20 aktualisiert. Tomcat-Native verbindet die Apache Portable Runtime mit dem Web-Container. Dies bringt höhere Stabilität, höhere Performanz und die Möglichkeit OpenSSL im Tomcat bentuzen zu können.

Hier ist eine Anleitung, um die Native-Libraries unter Mac OS X zu installieren:

Zunächst muss APR installiert werden, was am leichtesten über MacPorts:
sudo port install apr

Auch die tomcat-native gibt es als Port, allerdings nur in der alten Version 1.1.14, die mit der aktuellen Tomcat Version nicht mehr kompatibel ist. Daher gibt es nun zwei Möglichkeiten:

  1. Einen Port-Patch einspielen: Tomcat-Native-1.1.20 Patch
  2. Die Libraries selbst kompilieren

Da das selber kompilieren unter Mac OS X nicht schwierig ist, zeige ich diesen Weg:

Paket herunterladen und entpacken:
http://tomcat.apache.org/download-native.cgi
tar xf tomcat-native-1.1.20-src.tar.gz
cd tomcat-native-1.1.20-src/jni/native/

Mit configure alles konfigurieren:
./configure --with-apr=/usr/local/apr --with-java-home=$JAVA_HOME --with-ssl=/usr
Wer kein SSL benötigt kann einfach --without-ssl angeben.

Kompilieren und installieren:
make
sudo cp .libs/libtcnative* /usr/lib/java/

Wenn man nun den Tomcat startet, kann man in den Log-Meldungen prüfen, ob die Native-Library geladen wird:
/Applications/apache-tomcat-6.0.26/bin/catalina.sh run
19.03.2010 09:20:21 org.apache.catalina.core.AprLifecycleListener init
INFO: Loaded APR based Apache Tomcat Native library 1.1.20.
19.03.2010 09:20:21 org.apache.catalina.core.AprLifecycleListener init
INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].

Sollte es zu einer Fehlermeldung kommen, dass der Poller nicht erstellt werden konnte, muss die pollerSize im Connector angepasst werden:
19.03.2010 09:20:41 org.apache.tomcat.util.net.AprEndpoint allocatePoller
INFO: Failed to create poller with specified size of 8192

<connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
pollerSize="1024" >>

Wird kein SSL benutzt ist man nun fertig. Ansonsten ist die SSL Konfiguration in den Connector-Eintragen in der server.xml bei APR-Nutzung anders:

APR Connector configuration
Tomcat SSL howto

Möchte man auf den APR-SSL support verzichten, kann auch einfach das protocol überschrieben werden:

< -- Define a blocking Java
SSL Coyote HTTP/1.1 Connector on port 8443 -->
protocol = "org.apache.coyote.http11.Http11Protocol"
port="8443"

< -- Define a non-blocking Java
SSL Coyote HTTP/1.1 Connector on port 8443 -->
protocol = "org.apache.coyote.http11.Http11NioProtocol"
port="8443"

Hier noch ein kleiner Grund, warum sich der Aufwand lohnt: Unsere aktuelle Web-Anwendung it.projektwerk.com startet ohne APR in ca. 25 Sekunden. Mit APR in 15 Sekunden.


Find all JUnit tests in a project

In einem Kundenprojekt haben wir verschiedene Kategorien von Tests eingeführt: Unit-Tests, Integration-Tests und Selenium-Tests. Da die Tests unterschiedliche Konfigurationen erfordern (z. B. Selenium Server starten) und auch die Testausführung unterschiedlich lang ist, wollten wir diese Tests in Testsuiten von JUnit aufnehmen.

Testsuiten haben einige Vorteile, so lässt sich die Testreihenfolge festlegen (auch wenn Tests prinzipiell unabhängig voneinander sein sollten, kann es bspw. dazu genutzt werden Testdaten in das System einzufahren). Ein weiterer Vorteil besteht darin, dass Testsuiten von allen IDEs und Buildsystemem gestartet werden können. IntelliJ IDEA erlaubt keine regulären Ausdrücke bei der Auswahl der Tests, was dazu führt, dass man die *IntegrationTest.java nicht getrennt von den *Test.java Klassen ausführen kann. Stattdessen müssen immer Einstiegsklassen in die Tests angegeben werden.
Maven, genauer das Surefire-Plugin, dagegen unterstützt nur eine Filterung auf Dateiebene über die Include-Filter.
Testsuiten sind gewönliche Java-Klassen die mit @Suite annotiert werden. Diese Java-Klasse kann nun von allen IDEs und Build-Systemen als Startpunkt für die Tests genutzt werden.


@RunWith(Suite.class)
@Suite.SuiteClasses({
UserUnitTest.class,
AnotherUnitTest.class
})
public class UnitTestSuite {}

Der riesengroße Nachteil von Testsuiten ist, dass sie gepflegt werden müssen. Werden neue Tests geschrieben, müssen die Klassen der Suite hinzugefügt werden, da sie sonst vom CI-Server nicht ausgeführt werden. Das führte bei uns im Projekt nach relativ kurzer Zeit dazu, dass einige Testklasse zwar angelegt wurden, aber nicht in der Suite enthalten waren. Zum Glück haben wir die Shell und ein Skript zum Sammeln aller Unit-Tests ist schnell geschrieben:


find src/test/java/ -name '*.java' |
xargs grep -l "@Test" |
xargs grep -L "extends TestSetup" |
xargs grep -L "@RunWith" |
xargs basename |
sed 's/.java/.class,/g' |
sort

Der Phantasie sind natürlich keine Grenzen gesetzt, wie jetzt genau die Tests als Unit-, Integration- oder Selenium-Test erkannt werden. Im Beispiel werden alle Java-Klassen gefunden, die mindestens eine @Test Annotation haben, aber nicht von TestSetup erben und bei denen es sich nicht um Spring-Testcontext-Tests handelt, da diese im Projekt mit @RunWith markiert sind.

Wichtig ist lediglich die geeigneten grep Optionen zu verknüpfen:

  • grep -l: Das kleine L listet alle Treffer
  • grep -L: Findet alle Dateien, die nicht treffen
  • basename: Liefert den Dateinamen, damit er direkt in die Suite-Klasse eingesetzt werden kann
  • sed: Pure Faulheit: Macht aus den .java Endungen .class, damit die Ergebnisse per Copy & Paste eingesetzt werden können

Leider ist immer noch ein manuelles Prüfen der Tests notwendig, selbst wenn uns die Shell-Skripte jetzt alle Klassen liefern. Man könnte also einfach vor jedem Build dieses Skript ausführen, um alle Test-Klassen zu finden.

Gibt es bessere Vorschläge, TestSuiten automatisch zu befüllen? Ich freue mich auf Kommentare.


Catapult goes github

Unser Web-Framework Catapult zieht zu github um.

Bislang war SourceForge.net unsere Heimat. Bekanntermaßen wirkt sf.net leider etwas schwergewichtig, weshalb es uns nun zu github zieht. Ein weiterer Grund ist der Aufbau einer geeigneten Dokumentation. Wir möchten dazu zunächst das github Wiki benutzen. Auch diese Möglichkeit gab es leider bei sf.net nicht. Wir werden in den kommenden Wochen die alten SVN-Repositories auf github migrieren und laden schon jetzt zum gemeinsamen coden ein. Viel Spaß mit Catapult auf github:

Catapult Framework on github


Nerd Test

Mein Nerdstatus:

NerdTests.com says I'm a Cool Nerd.  Click here to take the Nerd Test, get nerdy images and jokes, and write on the nerd forum!


Benz nimmt die Treppe

Am Samstag in Wandsbek fotografiert:

Benz nimmt die Treppe


Motoradgottesdienstverkehrschaos 2008 in Hamburg

Ganz still und heimlich wurden heute Morgen auf der Fruchtallee vor unserer Haustür lustige, orangene, kleine Hütchen aufgebaut. Uns hätte es schon irritieren sollen, dass die Menge der Autos so stark abnahm, aber ich hatte das verminderte Verkehrsaufkommen auf den Sonntag geschoben. Um 15:00 Uhr war die Sache dann klar: Motoradkorso! Ich hab mich extra beeilt und bin auf den Balkon gehetzt, um noch ein Foto ergattern zu können:

Motorradkorso auf der Fruchtallee

Erst 50 Minuten später sollte mir klar werden, dass ich mich nicht so sehr hätte beeilen müssen, denn bis die 40.000 Zweiradfahrer vorbeigefahren waren, dauerte es über eine Stunde. Die Straßen waren völlig gesperrt und die Polizeibeamten empfahlen mir die U-Bahn zu nehmen. 1 Station versteht sich, um die Straße zu überqueren. ;-)


Tolle Ampelschaltung

Eine Ampel in Hamburg zählt die Sekunden bis zur Umschaltung. Das ist doch mal Sinnvoll und hindert die Leute daran, zu früh über die rote Ampel zu laufen.