Sonntag, 13. September 2009

Azureus auf AMD64 (x86_64)

Azureus verweigert unter einem 64-Bit-Linux den Dienst mit der Meldung, dass ihm das 32-Bit SWT unter 64-Bit nicht passt. Zur Abhilfe lädt man das 64-Bit SWT herunter und ersetzt mit der darin enthaltenen swt.jar diejenige von Azureus. Aktuell (12. Juni 2009) ist die URL für SWT diese hier:

http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.5-200906111540/swt-3.5-gtk-linux-x86_64.zip

Da die Zeit vergeht und diese Seiten bestehen bleibt, hier der Weg zur jeweils aktuellsten Version:
  1. Auf der SWT-Seite unter "Releases - Stable" den Link "more..." anklicken
  2. dort unter "SWT Binary and Source" den Link "Linux (x86_64/GTK 2) verwenden.

Donnerstag, 3. September 2009

BASE Reisevorteil oder Reisenachteil?

Gerade mal die Preise fürs Ausland bei BASE geprüft: es gibt Reisevorteil, Reisevorteil Plus, International. Der Reisevorteil hört sich ganz gut an, also prüfen wir mal die Preise:
  • Reisevorteil: 0,75€ + 0,29€/Minute, Taktung 60/60
  • Reisevorteil Plus: 0,75€ + 0,29€/Minute, Taktung 60/60
  • International: 0,51€/Minute, Taktung 30/1
Hmm, wenn man sich das mal als Grafik anschaut, dann sieht das so aus (Zeit in Sekunden):

Bis 191 Sekunden (3 Minuten 11 Sekunden) ist der International mit der Ausnahme eines kleinen Fensters günstiger. Kurz mal "hallo wir sind gut angekommen" sagen kostet sogar nur 1/3. Der Reisevorteil hilft also nur Dauertelefonierern. Dann mal die eingehenden Anrufe anschauen:
  • Reisevorteil: 0,29€/Minute, Taktung 60/60
  • Reisevorteil Plus: 0,29€/Minute, Taktung 60/60
  • International: 0,22€/Minute, Taktung 1/1 (!!!)
Hier versteckt sich der Vorteil so gut, dass ich ihn gar nicht sehen kann:

Dann aber bestimmt bei den SMS-Preisen:

Und da ja!!! Ich spare beim Reisevorteil Plus tatsächlich 0,04€ pro SMS! Wer im Ausland also nur SMS versendet, der hat tatsächlich einen Vorteil. Nur darf niemand anrufen, denn dann schwindet der Vorteil wie Eis in der Sonne.
Bleiben nur noch die Datenverbindungen für Surfen und MMS, die Paketierung ist hier weniger wichtig, insbesondere, wenn es ums Surfen geht. Hier die Preise für 1MB Datentransfer:

Ist man in einem der Reisevorteilsländer, dann lohnt sich der Reisevorteil Plus mit einem knappen Euro / MB, wenn man unbedingt Mails abrufen und versenden muss.

Samstag, 29. August 2009

MMS mit Android G1 und E-Plus/BASE/Blau O2/Fonic/Simply

Nach langer Zeit endlich funktionierende Einstellungen bei Android-Hilfe gefunden:

Für E-Plus/BASE/Blau:

###############
APN #1 für Internet...
###############

Name: internet
APN: internet.eplus.de
Proxy: Nicht festgelegt
Port: Nicht festgelegt
Nutzername: eplus
Passwort: eplus
Server: Nicht festgelegt
MMSC: Nicht festgelegt
MMS-proxy: Nicht festgelegt
MMS-port: Nicht festgelegt
MCC: 262
MNC: 03
APN-Type: default

###############
APN #2 für MMS........
###############

Name: mms
APN: mms.eplus.de
Proxy: Nicht festgelegt
Port: Nicht festgelegt
Nutzername: mms
Passwort: eplus
Server: Nicht festgelegt
MMSC: http://mms/eplus
MMS-proxy: 212.23.97.153
MMS-port: 8080
MCC: 262
MNC: 03
APN-Type: mms

Für O2/Fonic/Simply (Dank an raudi!)

###############
APN für Internet und MMS
###############

Name: internet
APN: internet.interkom.de
Proxy: Nicht festgelegt
Port: Nicht festgelegt
Nutzername: mms
Passwort: eplus
Server: Nicht festgelegt
MMSC: http://10.81.0.7:8002
MMS-proxy: 82.113.100.6
MMS-port: 8080
MCC: 262
MNC: 07
APN-Type: mms

Dienstag, 25. August 2009

GWT Compiler beschleunigen

Der GWT-Compiler erzeugt aus dem Java-Quellcode für verschiedene Browser JavaScript und zwar für jede Sprache eine eigene Datei. Die Browser mit Kennungen sind:
  • ie6: IE 6 und 7
  • ie8: IE 8
  • gecko: Mozilla
  • gecko1_8: Firefox
  • safari: Safari
  • opera: Opera
Hat man jetzt 5 Sprachen, dann erzeugt der Compiler 6 * 5 = 30 JavaScript-Dateien. Dies dauert eine ganz schöne Weile. Während der normalen Entwicklung testet man üblicherweise nur mit einem Browser und in einer Sprache. Über die Modul-spezifische .gwt.xml kann man dies Einstellen:
  1. Folgenden Eintrag machen:
    <set-property name="user.agent" value="gecko1_8">
  2. Die Optionen
    <extend-property name="locale" values="de">
    auskommentieren.
Damit baut mein GWT-Projekt statt in 1,5 Minuten in 15 Sekunden, lohnt sich also. Nur vor einem Release nicht vergessen, alles wieder zurückzustellen, sonst gucken die Benutzer mit dem falschen Browser in die Röhre.

Freitag, 24. April 2009

Das schnellste Dateisystem für USB-Sticks

Ich habe mal getestet, wie schnell die unterschiedlichen Dateisysteme auf meinem Transcent 64 GB USB-Stick sind. Hierzu habe ich den Stick jeweils mit dem entsprechenden Dateisystem formatiert und dann mein NetBeans-Projektverzeichnis mit viel Quellcode und Bibliotheken auf den Stick kopiert und mit sync sichergestellt, dass es auch geschrieben war. Danach das Verzeichnis wieder gelöscht, wieder sync und ein zweites Mal draufkopiert. Hier das Ergebnis mit Zeiten in Minuten:Sekunden:






DateisystemKopieren 1LöschenKopieren 2
ReiserFS1:170:061:14
XFS2:200:272:15
EXT33:100:083:03
EXT23:130:193:26


Wie man sieht ist ReiserFS deutlich schneller als die anderen. Schade eigentlich, dass Hans Reiser jetzt im Gefängnis sitzt.

Dienstag, 31. März 2009

Glassfish, JDBC und DB/2

Der JDBC-Treiber von IBM für DB/2 hat es in sich: normale Verbindungen über den DriverManager funktionieren, aber der Zugriff über eine DataSource - was der Glassfish macht - bricht ab mit einer Fehlermeldung in der Art

Caused by: com.ibm.db2.jcc.a.SqlException: jcc10389122453.51.90
Beim Laden der nativen Bibliothek db2jcct2,
java.lang.UnsatisfiedLinkError: no db2jcct2 in java.library.path ist ein Fehler aufgetreten: ERRORCODE=-4472, SQLSTATE=null

Dies kommt daher, dass der Treiber standardmäßig als Typ-2-Treiber eine native Bibliothek nachladen will. Ich hab es selbst nach Kopieren von 36 MB Bibliotheken nur geschafft, dass er nicht mehr über fehlende Bibliotheken meckert, dafür aber mit einem Segmentation Fault abstürzt. Die Lösung für das Problem ist es dem Treiber zu sagen, dass er ein Typ-4-Treiber sein soll. Beim DriverManager reicht hierfür die Angabe des Ports in der URL. Bei der DataSource muss man die Methode "setType(4)" aufrufen:

DB2DataSource dB2DataSource = new com.ibm.db2.jcc.DB2DataSource();
dB2DataSource.setDriverType(4);
dB2DataSource.setServerName("192.168.1.194");
dB2DataSource.setPortNumber(50000);
dB2DataSource.setUser("XXX");
dB2DataSource.setPassword("YYY");
dB2DataSource.setDatabaseName("ZZZ");
dB2DataSource.setSysSchema("XYZ");
dB2DataSource.getConnection();

und schon klappt es. Im Glassfish ist dies folgendermaßen einzurichten: man wählt als Datenbank DB/2 aus, ändert die Datasource-Klasse in "com.ibm.db2.jcc.DB2XADataSource" und setzt als Type "javax.sql.XADataSource".



Bei den Properties muss man eine zusätzliche Property "driverType" einfügen und sie auf den Wert 4 setzen:


Hat man das gemacht, wir der Ping grün und das ganz ohne native Bibliotheken. Natürlich nicht vergessen, die Treiberdatei in das lib-Verzeichnis der Glassfish-Domain zu kopieren, damit er ihn überhaupt finden kann.

Freitag, 27. Februar 2009

mod_jk und SSL-Verbindungen hängen

Das Problem

Mehrere Probleme mit einer Ursache: Verbindungen von Apache über mod_jk zu einem JBoss (genauer zu dem darin enthaltenen Tomcat) hängen und SSL Verbindungen wollen sich einfach nicht aufbauen. Das Problem tritt manchmal auf, ein Apache-Neustart oder die Option "JkOptions +DisableReuse" scheinen manchmal zu helfen.

Die Ursache

Die Ursache ist aber eine ganz andere: fehlender Zufall! Linux stellt zwei Geräte zur verfügung, die Zufall liefern: /dev/random und /dev/urandom. Diese greifen beide auf eine Kernel-interne Entropie-Quelle zu, die sich aus recht unvorhersehbaren Ereignissen im System füllt, wie Festplattenzugriffe, Netzwerkaktivität, Tastatur- und Mauseingaben usw. Der Unterschied zwischen den beiden ist, dass /dev/random sich nur auf diese Ereignisse verlässt, während /dev/urandom auch einen Pseudozufallszahlengenerator (PRNG) verwendet. In der Praxis bedeutet dies, dass /dev/random "hängen" kann, wenn zuviel Zufall abgerufen wurde, während /dev/urandom immer ein Ergebnis liefert.

Man kann sich leicht anzeigen lassen, wieviel Zufall der Kernel gerade zur Verfügung hat:

cat /proc/sys/kernel/random/entropy_avail

Mit einem

cat /dev/random

kann man den Zufall auslesen. Der Befehl hängt recht schnell und kann mit Strg-C abgebrochen werden. Eventuell ist das Terminal dann verkonfiguriert, was man durch Eingabe von "reset" wieder korrigiert. Versucht man das Gleiche mit /dev/urandom, so erhält man ständig neue Werte.

Java verwendet standardmäßig /dev/random für java.secure.SecureRandom, was wiederum für SSL-Verbindungen u.ä. verwendet wird. JBoss Seam verwendet es für seine Session-IDs. Gibt es nicht genug Zufall, dann wartet Java auf /dev/random und deshalb teilweise recht lange, bis es weiter geht.

Die Lösung

Hängt ein Prozess aktuell, so muss man für mehr Zufall sorgen, indem man beispielsweise mit einem

ls -lR /

oder

hdparm -t /dev/sda

für Festplattenaktivität sorgt. Besser ist es, den Hänger gar nicht erst auftreten zu lassen. Hierzu muss man Java lediglich anweisen, statt /dev/random einfach /dev/urandom zu verwenden. Dies geht mit einer einfachen Kommandozeilenoption für die JVM:

-Djava.security.egd=file:/dev/urandom

oder direkt im Programmcode mit

System.setProperty("java.security.egd", "file:/dev/urandom");

Der Nachteil dieses Ansatzes ist, dass sich der Zufall von /dev/urandom leichter vorhersagen lässt und damit beispielsweise ein Angriff auf SSL-Verbindungen denkbar ist. Wer hier auf der sicheren Seite bleiben will, der muss über einen Hardware-Zufallszahlengenerator nachdenken. Ein leicht zu realisierender Ansatz ist ein Mikrofon vor einem Lüfter. Die damit aufgenommenen Samples aber noch etwas nachbearbeiten, aber das ist ein ganz anderes Thema.