Wow! James Gosling verlässt Sun

Von seinem neuen Blog http://nighthacks.com/roller/jag/entry/time_to_move_on:

Yes, indeed, the rumors are true: I resigned from Oracle a week ago (April 2nd). I apologize to everyone in St Petersburg who came to TechDays on Thursday expecting to hear from me. I really hated not being there. As to why I left, it’s difficult to answer: just about anything I could say that would be accurate and honest would do more harm than good. The hardest part is no longer being with all the great people I’ve had the privilege to work with over the years. I don’t know what I’m going to do next, other than take some time off before I start job hunting.

Unentscheidbarkeit für Java-Programmierer

Es wird niemals eine Software geben, die sich eine andere Software anschaut und entscheidet, ob sie etwas bestimmtes macht.
In der theoretischen Informatik gibt es das Halteproblem.
Man kann kein Programm schreiben, das sich ein anderes beliebiges Programm anschaut und nach endlich vielen Schritten erkennt, ob es hält.
(Es kann auch interpretiert werden, aber man hat nicht beliebig Zeit. Wenn ein Programm exakt 10 Jahre läuft, kann man das nicht „testen“, da der Test ja auch 10 Jahren dauert.)
Nehmen wir an es gibt ein Programm
bollean willStop( char[] program )
das entscheidet, ob ein anderes Programm endet.
So sollte folgendes true ergeben:
willStop(„return“);
willStop(„for(int i=0;i<100000000;i++)print(i);“);
und folgendes false:
willStop(„while(true);“);
Eine zweites Methode:
void reverser( char[] program ) {
while ( willStop( program ) )
  out.println( „willStop will stop“ );
}
Umgangssprachlich:
– Wenn willStop() true liefert, endet reverser() nicht.
– Wenn willStop() false liefert, endet reserver().
Frage: Was passiert bei folgendem Aufruf?
void reverser( „void reverser(char[]…“ );
Ausgefaltet:
void reverser( char[] program ) {
while ( willStop( „void reverser(char[]…“ ) )
  out.println( „willStop will stop“ );
}
Stoppt reserver(), hat willStop(„void reserver…“) aber false gegeben. Aber warum ergibt willStop() dann false? Die Funktion stoppt doch? (Umgekehrtes gilt auch.)
Durch diesen Widerspruch muss die Annahme falsch sein, dass es willStop() überhaupt gibt.
 
Aus dem Seminar: Codeanalyse mit FindBugs, PMD, Checkstyle und JDepend

Release von JProfiler 6.0

Während man die Profiler TPTP und den NetBeans Profiler als Standards im Open-Source Umfeld bezeichnen kann, so ist das auf der kommerziellen Seite JProfiler und YourKit Java Profiler 8.0. Die ej-technologies GmbH stellt mit dem JProfiler nun ein Tool vor, das interessante Neuigkeiten bietet. Ein Trend ist die Zuwendung zu einem Tool welches Möglichkeiten bietet Thread-Locks zu visualisieren, was es klarer Hinweis ist, dass Entwickler um die parallele Programmierung nicht mehr rumkommen und Hilfe bei der Optimierung der (gedachten) Optimierung benötigen.

Neu ist auch die Darstellung, welche Locks wie oft angefragt werden:

Auch folgende Darstellung ist neu und von einem Klassiker inspiriert, der Dateigrößen erstmalig so darstellte. Nun ist das auf die Ausführungszeiten und Speicherverbrauch angewendet. Eine wunderbare Idee:

Latitude/Longitude distance in Java

public class LongLatUtils
{

/**

* Calculates the great circle distance between two points on the Earth. Uses the Haversine Formula.

*

* @param latitude1 Latitude of first location in decimal degrees.

* @param longitude1 Longitude of first location in decimal degrees.

* @param latitude2 Latitude of second location in decimal degrees.

* @param longitude2 Longitude of second location in decimal degrees.

* @return Distance in meter.

*/

public static double distance( double latitude1, double longitude1, double latitude2, double longitude2 )

{

double latitudeSin = Math.sin( Math.toRadians(latitude2 - latitude1) / 2 );

double longitudeSin = Math.sin( Math.toRadians(longitude2 - longitude1) / 2 );



double a = latitudeSin * latitudeSin

+ Math.cos( Math.toRadians(latitude1)) * Math.cos(Math.toRadians(latitude2) ) * longitudeSin * longitudeSin;



double c = 2 * Math.atan2( Math.sqrt(a), Math.sqrt(1 - a) );



return 6378137 * c;

}





/**

* Converts latitude and longitude from degrees, minutes, and seconds in decimal degrees.

*

* @param degrees

* @param minutes

* @param seconds

* @return Latitude and longitude in decimal degrees.

*/

public static double convertDegreesMinutesSecondsToDecimalDegrees( int degrees, int minutes, int seconds )

{

return degrees + minutes/60. + seconds/3600.;

}



// public static void main(String[] args)

// {

// System.out.println( convertDegreesMinutesSecondsToDecimalDegrees(38, 53, 23 ));

// System.out.println( distance(38.898556, -77.037852, 38.897147, -77.043934));

// }

}

Projekte und Pakete aus den langtools

Achtung! Nur gültig in für JDK 6, in JDK 7 gibt es Umbenennungen.

Die langtools von Java sind die bekannten Kommandozeilenprogramme wie javac, jar, javap, … Die Quellen kann man sich zum Beispiel aus dem Mercurial Repository holen. Für Java 6 liefert http://hg.openjdk.java.net/jdk6/jdk6/langtools/ den Zugriff auf die Sourcen. Sie lassen sich auch in einem Rutsch (zip) beziehen. Im Verzeichis src/share/classes beginnen die Pakete:

  • com.sun.javadoc. Die Java Doclet-API, also nur Schnittstellen etwa um Pakete, Variablen oder Typen zu beschreiben
  • com.sun.mirror. Mirror API repräsentiert Konstrukte eines Java-Programms wie Klassen, Modifizierer. Anweisungen und Ausdrücke werden nicht repräsentiert. Wird in Java 7 verschwinden, denn dort gibt es mit javax.lang.model (seit Java 6) einen Ersatz. Die Mirror API wurde in Java 5 für das APT eingeführt, aber nie standardisiert
  • com.sun.source.tree. Repräsentiert den AST (abstract syntax trees) eines Java-Programms vom Java-Compiler. com.sun.source.util. Utility-Klassen für den AST
  • javax.annotation.processing. Um Annotation-Prozessoren zu beschreiben
  • javax.lang.model.Element, javax.lang.model.type, javax.lang.model.util. Deklarationen, für Typen, die Meta-Daten aus einem Java-Programm beschreiben, etwa Modifizierer oder Generics-Typen. In erster Linie für APT
  • com.sun.tools.apt.*. Annotation Processing Tool (apt). Greift auf javax.lang.model zurück
  • com.sun.tools.doclets.internal.toolkit. Implementierung des Standard-Doclets
  • com.sun.tools.javadoc. Implementierung des Schnittstellen aus com.sun.javadoc
  • com.sun.tools.javac.*. Java-Compiler
  • com.sun.tools.javah. C Header and Stub File Generator
  • sun.tools.javap. Der Java Class File Disassembler.

Wenn man ein Beispiel programmieren möchte, muss man tools.jar in den Klassenpfad aufnehmen. Dann kann man schon loslegen. So nutzt folgendes Programm die Datenstrukturen von javap, und ist somit der Java-Quellcode-Gegenspieler von Reflection.

import java.io.*; 
import sun.tools.javap.*;
public class MyJavap 
{ 
  static String filename = "bin/MyJavap.class";
  public static void main( String[] args ) throws FileNotFoundException 
  { 
    ClassData classData = new ClassData( new FileInputStream( filename ) );
    for ( FieldData field : classData.getFields() )
       System.out.println( field.getType() + " " + field.getName() );
    for ( MethodData method : classData.getMethods() )
      System.out.println( method.getName() + method.getParameters() ); 
  } 
}

Ausgabe:

java.lang.String filename 
<clinit>() 
<init>() 
main(java.lang.String[])

Die API um Programmcode zu beschreiben ist komplizierter. Folgendes Programm baut einen internen Baum auf und lässt ihn über die komfortablen print()-Funktionen ausgeben:

import javax.tools.DiagnosticCollector; 
import javax.tools.JavaCompiler; 
import javax.tools.JavaFileManager; 
import javax.tools.JavaFileObject; 
import javax.tools.StandardJavaFileManager; 
import javax.tools.ToolProvider;
import com.sun.tools.javac.code.Flags; 
import com.sun.tools.javac.code.TypeTags; 
import com.sun.tools.javac.tree.JCTree; 
import com.sun.tools.javac.tree.TreeMaker; 
import com.sun.tools.javac.tree.JCTree.JCAnnotation; 
import com.sun.tools.javac.tree.JCTree.JCBlock; 
import com.sun.tools.javac.tree.JCTree.JCClassDecl; 
import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; 
import com.sun.tools.javac.tree.JCTree.JCExpression; 
import com.sun.tools.javac.tree.JCTree.JCModifiers; 
import com.sun.tools.javac.tree.JCTree.JCStatement; 
import com.sun.tools.javac.tree.JCTree.JCTypeParameter; 
import com.sun.tools.javac.tree.JCTree.JCVariableDecl; 
import com.sun.tools.javac.util.Context; 
import com.sun.tools.javac.util.List; 
import com.sun.tools.javac.util.ListBuffer; 
import com.sun.tools.javac.util.Name; 
import com.sun.tools.javac.util.Name.Table;
public class BuildSomeCode 
{ 
  public static void main( String[] args ) 
  { 
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
    DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>(); 
    StandardJavaFileManager fm = compiler.getStandardFileManager( diagnostics, null, null );
    Context context = new Context(); 
    context.put( JavaFileManager.class, fm );
    TreeMaker maker = TreeMaker.instance( context ); 
    Table table = new Table();
    ListBuffer<JCTree> methods = new ListBuffer<JCTree>();
    JCModifiers mmods = maker.Modifiers( Flags.PUBLIC | Flags.STATIC ); 
    Name mname = Name.fromString( table, "test" ); 
    JCExpression retType = maker.TypeIdent( TypeTags.VOID ); 
    ListBuffer<JCVariableDecl> params = new ListBuffer<JCVariableDecl>(); 
    ListBuffer<JCStatement> stmts = new ListBuffer<JCStatement>(); 
    JCBlock methodBody = maker.Block( 0, stmts.toList() ); 
    methods.append( maker.MethodDef( mmods, mname, retType, List.<JCTypeParameter> nil(), 
                                     params.toList(), List.<JCExpression> nil(), methodBody, null ) );
    JCModifiers cmods = maker.Modifiers( Flags.PUBLIC ); 
    Name cname = Name.fromString( table, "Test" ); 
    JCClassDecl classDef = maker.ClassDef( cmods, cname, List.<JCTypeParameter> nil(), null, 
                                           List.<JCExpression> nil(), methods.toList() );
    ListBuffer<JCTree> classDefs = new ListBuffer<JCTree>(); 
    classDefs.append( classDef );
    JCCompilationUnit compilationUnit = maker.TopLevel( List.<JCAnnotation> nil(), null, 
                                                        classDefs.toList() );
    System.out.println( compilationUnit ); 
  } 
}

Das ergibt:

public class Test { 
    public static void test() { 
    } 
}

Zum Weiterlesen:

Java Web App Deployment Advice für JavaSE 6u10

Seit dem Update u10 von Java 6 ist eine neue Möglichkeit hinzukommen, Java-Applets und Web-Start Anwendungen in HTML zu deklarieren. Statt sich wie bisher mit <applet>, <object> Tags rumzuärgern, oder einen Konverter über die HTML-Datei drüber laufen zu lassen, kann man eine JavaScript Biblitothek von Sun verwenden. Die Technik stellt http://java.sun.com/javase/6/docs/technotes/guides/jweb/deployment_advice.html vor. Es wird dann:

<script src=“[…]/deploy.js“>
Deploy.applet(„app.jar“,“com.bla.App“,“1.5+“);
</script>

JavaFX 1.1 veröffentlicht

Unter der Homepage http://java.sun.com/javafx/ kann man nun die neue Version JavaFX 1.1 beziehen. Neuerungen sind:

Key Release Components

  • Official support for JavaFX Mobile
  • Language improvements
  • Performance and stability improvements

JavaFX 1.1 SDK

  • JavaFX Mobile Emulator enables developers to begin creating advanced and expressive mobile content.
  • Desktop Runtime update improves performance and stability.
  • Better support is provided for developing mobile or desktop applications from the same code base.

JavaFX 1.1 Platform Features

  • Support for "full screen" applications
  • Improved support for applications that need to access resources across multiple domains
  • Standard navigation method for cross-device content

Documentation

JavaFX 1.1 Language

  • Addition of all Java numeric types (float, double, long, int, short, and byte) to the type system
  • Sequence performance and footprint optimizations
  • Dynamic footprint optimizations in animations

1.6.0_12

Neues Update von Java 6. Die Änderungen listet http://java.sun.com/javase/6/webnotes/6u12.html auf. Interessante Änderungen sind der 64-Bit Browser Support for Java Plugin and Java Webstart:

  • This release supports the New Java Plugin and Java Webstart on AMD64 architecture, on Windows platforms. A Java offline installer (JRE and JDK) is provided. Note, if you use 32-bit and 64-bit browsers interchangeably, you will need to install both 32-bit and 64-bit JREs in order to have Java Plug-In for both browsers.

Weiterhin:

  • Limited mixing of heavyweight and lightweight components is supported. Limited mixing means that some components may not be handled perfectly. This includes, but is not limited to, support for non-opaque lightweight components.
  • The Security Warning used with the toplevel windows of an untrusted application has been improved to make it less intrusive and more subtle.
  • Graphics performance improvements for: Anti-aliasing drawing and filing, Non-anti-aliasing transformed rectangles and single wide lines. Java Webstart startup time

Offtopic: Kurzreisebericht für 2 Monate Afrika

Namibia

Ein flächenmäßig großes Land mit unter 2 Millionen Einwohnern sagt schon etwas über die Verteilung aus. Die größte Stadt Namibias und gleichzeitig Hauptstadt ist Windhoek mit etwa 250.000 Einwohnern (im Kern!). Wird es dunkel, ist es leer auf den Straßen und man denkt, eine B-Bombe hätte alle Menschen ausgelöscht. Interessant finde ich in Namibia den Etosha Nationalpark, Swakopmund, Fish River Canyon und die Steinzeichnungen. Wenn man Swakop mit den Dünen gesehen hat und mit dem Quad auch zwischen den Dünen unterwegs ist, kann man sich die Dünen bei Sossusvlei vielleicht sparen; wenn man aber sowieso beim Canyon ist, wird man auf dem Weg nach Swakop dort vorbeikommen. Der Weg ist überwiegend unbefestigt und beschwerlich. Auf der Skeleton-Coast habe ich nur ein Schiffswrack gesehen und die Vorstellung, dass alle paar Meter ein alter rostiger Dampfer liegt, ist falsch. Vor Swakop wird gerade ein Schiff geborgen. Schwimmen ist nur dann möglich, wenn man keine Badewannentemperaturen erwartet, sondern sich auch bei Eiswasser wohlfühlt. Lüderitz ist schön und erinnert an Deutschland in den 50er Jahren, aber auch Swakop besitzt viel deutsches Flair. Walvis Bay muss man nicht gesehen haben, wobei es dort ein nettes Restaurant aus Holzpfählen gibt. Oberhalb von Etoscha ist die Bevölkerungsdichte höher; aus dem Grund findet dort sehr konzentriert Wahlkampf statt, so dass Politiker andere Städte eher vernachlässigen.

Botswana

Von Windhoek aus ist man schnell in Botswana, dort beginnt eine längere Reise. Sie führte mich über das Okavango Delta bis zu Gaborone. Die Hauptstadt des relativ reichen Landes ist aufgeräumt und ordentlich. Drei wichtige Shopping Malls markieren auch schon die Hauptsehenswürdigkeiten. Lonely Planet setzt einen Club und ein Restaurant dort hin, aber beides ist der Bevölkerung absolut unbekannt.

Südafrika/Swaziland/Lesotho/Mozambique

Der Weg von Gaborone nach Südafrika ist kurz. Eine Karte von Südafrika ist hilfreich, denn die DIN A5-Abbildung im Reiseführer ist unzureichend klein. Anders als in Deutschland bekommt man Karten nicht an Tankstellen. Der Kommentar eines Südafrikaners dazu: „Afrika ist eben nicht Europa“.

Die Städte Südafrikas sind von extremen Gegensätzen geprägt. Auf der einen Seite ungepflegte Städte, die mehrheitlich von Schwarzen bewohnt werden und auf der anderen Seite die herausgeputzten Lebensräume der Weißen. In Johannesburg zeigen sich besondere Extreme. Das Zentrum ist von heruntergekommenen Gebäuden geprägt in denen mehrheitlich Schwarze leben, außerhalb liegen chice Gebäude, die durch Zäune von der bösen Außenwelt abgeschirmt sind. Dieses Mal sind es nicht die Armen, die in den äußeren Stadtteilen wohnen, sondern die Reichen. Der Taxifahrer war ein totaler Idiot und wusste keine Adresse. Mit einem Türken, der im gleichen Backpackers untergebracht war, wollten wir zu dem Jazz-Club Kippie’s – laut LP eine absolute Institution – und er fand sie nicht. Nahe an Jo`burg liegt Soweto, was noch einmal eine Nummer ärmer ist.

Pretoria, die Hauptstadt Südafrikas, liegt gleich neben Jo´burg und wirkt völlig anders. Das Gebäude der Universität von Südafrika ist beeindruckend. Nach einer Übernachtung ging es nach Swaziland. Mit dem Minibus, die alle als abgenutzte Fahrzeuge aus China kommen, dann nach Maputo/Mozambique und am nächsten Tag zurück nach Swaziland und direkt wieder nach Südafrika.

Meine gedachte Route von Südafrika nach Lesotho (von Osten nach Westen) war über den Sani Pass, also über den Drakensberg. Die ersten Kilometer ließen sich noch ganz gut fahren, aber dann wurde es eklig. Der Fahrer eines entgegenkommenden 4×4-Autos empfahl mir, diesen Weg in meinem Nissan mit Frontantrieb nicht anzutreten. Also kehrte ich um und fuhr mehr oder weniger um Lesotho herum, um dann im Süden das Land zu betreten. Der Grenzposten überraschte durch seine Einfachheit, und ein Typ mit schlabberigem T-Shirt stempelte den Pass. Von schön geteerten Straßen ging es dann erst einmal ein paar Kilometer über Schotterpiste.

Von Lesotho fuhr ich wieder nach Südafrika, nach Port Elizabeth. Ein (günstiges) Hotel war schwer zu finden. Am nächsten  Tag ging es über die Garden Route nach Cape Town. Der Weg führte durch einige nette Orte wie Mossel Bay, ist aber nicht so zu verstehen, dass man unentwegt an der Küste fährt und eine tolle Aussicht genießt. Meistens ist es langweilig.

Kapstadt mit etwas über 3 Millionen Einwohnern ist lebenslustig und der Tafelberg gibt ihr eine zusätzliche Note. Auf den bekannten Aussichtspunkt kommt man entweder mit der Bahn – dann muss man 1 bis 2 Std. anstehen – oder zu Fuß. Das dauert etwa genauso lange ist aber recht anstrengend. Ich bin nicht ganz nach oben gegangen, da die Wege kurz vor dem Ziel nicht mehr ordentlich markiert sind. Die Aussicht ist aber schon prima. Das Hotel war das Riz, was von der Lage gut an der Waterfront liegt. Von dort kann man nach Robben Island (Nelson Mandelas Gefängnis), aber es ist naiv zu denken, dass man 5 Minuten später im Boot sitzt. Die Anzahl Touristen ist beschränkt und zu meinem Zeitpunkt war die Warteliste eine Woche.

Sambia/Zimbabwe

Als ich aus Windhoek/Namibia in Sambia eintreffe (die Fahrt geht von 18 Uhr abends bis 3 Uhr in der früh), fallen mir drei Dinge auf: Menschen benutzen Fahrräder, es ist deutlich grüner (dass im Januar Regenzeit ist, fällt immer wieder auf) und es lauern überall Moskitos (und dafür hat jede Unterkunft eine Moskitonetz). Der erste Stopp ist Livingstone, der Ort, an dem man die Victoria Falls betrachten kann. Ich entscheide mich aber für den Wasserfall auf der Seite von Zimbabwe, da die Sicht viel beeindruckender ist. Von Sambias Seites aus sieht man nur einen kleinen Teil. Da ich nur ein Single-Entry Visum für Sambia bezahlt habe, musste ich noch einmal 50 USD für ein neues Visum ausgeben. Für Zimbabwe zahlt man 30 USD (kommt aber immer auf die Laune der Beamten an) und 20 USD für den Eintritt. Die Plastiktüte für den Pass hat sich ausgezahlt, denn geht man entlang des Wasserfalls wird man von den gelösten Wasserwolken unglaublich nass. Von Livingstone kommt man in 8 Std. mit dem Bus nach Lusaka, der Hauptstadt. Außer ein paar Malls gibt es hier nichts besonderes zu sehen. In einem Club wimmelte es von Prostituierten und als ich mit dem Taxifahrer darüber sprach, brachte er eine interessante Analogie: „Taxifahrer und Nutten haben eins gemeinsam: Beide verstehen etwas von PR.“ Da hat er wohl recht …

Malawi

Von Lusaka/Sambia wollte ich mit dem Bus nach Lilongwe/Malawi. Direktverbindungen gibt es aber nicht jeden Tag. Also plante ich Etappen. Der erste Bus an den Rand von Sambia hatte 3 Std. Verspätung und kam somit in der Nacht um 4 Uhr an. Das Warten auf die Abfahrt wurde durch fliegende Händler versüßt, die im Minutentakt in den engen Bus kamen und etwas verkaufen wollten: Süßigkeiten, Getränke, Schuhe und Spiegel. Als der Bus losfuhr, kam die Aufforderung, sich doch bitte mit dem Nachbarn zu unterhalten, der könne doch das Leben bereichern. Ein Hotel fand sich leicht für 10 Euro. Bis zur Grenze musste es ein Taxi sein, denn Busse gibt es nicht. Der Taxifahrer jammerte die ganze Zeit, warum Weiße immer so brutal hart mit dem Preis verhandeln. Tja, warum wohl?

Bis zur Grenze ging es schnell. Auf der anderen Seite muss man erst mit einem Taxi in die nächste Stadt fahren und dann einen Minibus nach Lilongwe nehmen. Lilongwe ist eine schmuddelige Stadt, deren Reiz ich in den Tagen nicht erfahren konnte. Im Hotel traf ich mich mit einigen Amerikanern, die hier zusammen mit anderen Nationen das Land und auch die Nachbarländer auf  Einladung der Regierungen bei politischen, sozialen und rechtlichen Fragen beraten. Der Club, in den wir gingen, spielte die ersten Stunden alle Kuschelrock-CDs – die Musikrichtung ist sehr beliebt, genauso wie auch Modern Talking immer noch der Renner ist. Später wurde es dann R&B und ein paar junge Farbige machten sich über unseren Tanzstil lustig.

Von Lilongwe fuhr ich zu der Hauptsehenswürdigkeit des Landes: Dem Malawisee. Das Hotel war direkt am Süßwassersee und auch das Essen des srilankischen Kochs scheint im ganzen Land bekannt. Auf dem Weg nach Tansania machte ich in Mzuzu halt. Nahe der Stadt ist ein Berg, zu dem der frühere Präsident immer zum Lesen ging. Der Ort ist wirklich schön, doch leider sieht man von oben auch eines der größten Probleme des Landes: Die Rohdung des Waldes.

Tansania

Mein eigentliches Ziel in Tansania ist Dar es Salaam. Da der Zug aber nur von Sambia heraus fährt – in Malawi gibt es keine öffentlichen Züge –, fuhr ich morgens nach dem Bus-Gebet mit lauter Gospelmusik von Mzuzu nach Karonga. Vorbei ging es am Kaka-Hotel. (Kaka heißt einfach nur Bruder). In Karonga nahm ich ein Taxi, ging mit 50 USD über die Grenze, lief 1 km bis zu den Minibussen und fuhr weiter nach Mbeya. Nahe Mbeya gibt es eine Bahnstation. Mittlerweile ist die immer wieder von der Pleite bedrohten Bahn soweit, dass Züge nur noch zweimal in der Woche nach Dar es Salaam fahren. Ich hätte 2 Tage warten müssen, und das war es mir nicht wert, da andere Touristen immer wieder von sehr langen Pannen (6 Stunden auf dem Gleis) berichteten. Zum anderen ist durch die Regenzeit die Tierbeobachtung im Nationalpark, den die Bahn mit 40 km/h durchbummelt, wenig attraktiv. Also fuhr ich mit dem Bus. Hätte ich das vorher gewusst, wäre ich von Lilongwe direkt gefahren, denn Mbeya kann man sich wirklich sparen – wobei mir ein deutscher Lehrer die Berge empfohlen hat. Von Mbeya fahren viele Busse am Tag nach Dar es Salaam.

Dar es Salaam, die größte Stadt Tansanias, ist mondäner als die Hauptstädte von Malawi und Sambia. Aufgrund der Meerlage gibt es auch einige kleine Strände. Zu viel Zeit habe ich in der Stadt aber nicht verbracht, da hier Partys selten sind und die Sehenswürdigkeiten sich in Grenzen halten. Am Wichtigsten war das Ticket zur Insel Sansibar. Ein Reiseführer brachte mich auf die Idee, ein Resident-Ticket zu kaufen, was ich dann auch tat – es ist viel günstiger als ein Touristen-Ticket. Es fahren einmal die Schnellfähre in 90 Minuten und eine normale Fähre, die 3 Stunden benötigt. Mit dem Ticket wurde ich nicht kontrolliert, aber es hätte auch anders kommen können. Sansibar überraschte mich mit unglaublichen Gebäuden im Stadtteil Stone Town. Auch Regen überraschte mich am nächsten Tag bei der Spice-Tour (nicht Spice-Girl-Tour!), bei dem es um die lokalen Gewürze ging. Phantastisch.

Kenia

Von Sansibar flog ich dann nach Nairobi. Die Stadt begeisterte mich genauso wie die  Freundlichkeit der Menschen. Ich dachte erst an einen Witz, als der Reiseführer schrieb, die vielen Männer würden Hemden und Anzüge – in der Freizeit! – tragen, doch es ist wahr. Kenianische Männer sind sehr gut gekleidet. Die Frauen sind dezent angezogen und Miniröcke oder bauchfrei ist verpönt. Schockierenderweise war ich gerade vor Ort, als ein schwerer Brand ein Kaufhaus zerstörte. Dabei starben 30 Menschen. Da nur 2 Tage später über 200 Menschen bei einer zweiten Brandkatastrophe starben, waren die Fahnenmasten, etwa in der Festung Fort Jesus in Mombasa, auf Halbmast gesetzt. Die Unfälle markieren die schwersten Brandunfälle in der nahen Geschichte und die Menschen sind frustriert über die Rettungskräfte und Unfähigkeit der Polizei. Im ersten Fall, dem Kaufhausbrand, musste ein Polizeiauto, das eigentlich Demonstranten mit Wasser verscheuchte, das Löschfahrzeug ersetzen. Der zweite Brand ereignete sich, als Menschen mit Dosen, Bechern und Eimern das Benzin eines liegengebliebenden Benzintanklasters  aufsammeln wollten, doch eine Zigarette setze alles in Brand und die Menschen, in Benzin getränkte, verbrannten. Der erste Rettungswagen traf erst eine Stunde später ein.

Sehenswürdigkeiten in Nairobi gibt es nicht so viele, aber hier pulsiert nachts das Leben auf den Strassen, ganz anders als in allen anderen von mir bereisten afrikanischen Ländern. Für den Orphan Wildpark blättert man als Ausländer 12 Euro auf den Tisch, während Einheimische gerade einmal einen Euro zahlen. Da die Weisentiere von klein auf an Menschen gewöhnt sind, konnte ich eine Löwin (durch den Zaun) genauso streicheln wie junge Geparden (Cheetahs). Später im kleinen Giraffe Centre (African Fund for Endangered Wildlife-Kenya) (noch mal 7 €) küssten Giraffen einige Touristen, aber ich ziehe eine weibliche Zunge vor. Der Giraffenzoo ist relativ weit entfernt. Neben dem Zoo kann man ins Museum gehen, jedoch bietet das nicht so viel Neues.

Per Mietwagen bin ich zunächst zu dem nahe liegenden See Naivasha gefahren, mit einem weiteren schließlich von Nairobi nach Mombasa. Das Fahren in Kenia empfinde ich als problemlos und ich lerne schnell die Vorteile des Straßenverkehrs. (Nur vergesse ich oft noch die Tempohügel auf den Straßen …) Vielleicht werde ich im nächsten Leben Matatu-Lenker, also Minibusfahrer, die wie blöd durch die Stadt fahren und sich nur an die allernotwendigsten Verkehrsregeln halten – etwa keine Oma zu überfahren oder den Gebrauch der Hupe. Wäre ich in Deutschland, hätten auch  die Halter der beiden Fahrzeuge, deren Seitenspiegel ich umgeklappt habe, schon längst einen Tanz gemacht. In Kenia wird ein bisschen mit dem Zeigefinger gemahnt, kurz gestöhnt und das war’s dann schon. Die Mataus werben um ihre Kunden etwa mit lauter Disco-Musik. Bei Frauen scheint der Beruf des Sammeltaxifahrers gut anzukommen (das sagten mir die Fahrer…).

Mombasa selbst hat keine nennenswerten Strände. Das Strandleben spielt sich im entfernten Süden und Norden ab. Im Süden sind die besseren Strände, aber das ist mit etwa 20 km auch etwas weiter von der Stadt entfernt und man muss eine Fähre nehmen. Der Norden ist direkt mit der Stadt verbunden und etwa 5 km auswärts, beginnen die großen Hotels den Strand unter sich aufzuteilen. Vom Hotel zum Flughafen wurde es dann noch einmal stressig. Statt 30 Minuten Fahrt kostete mich die Anreise fast 1 Stunde und ich war der letzte, der eincheckte. Die Stadt ist genauso wie Nairobi um 7 Uhr morgens voll, und ich musste schon sehr aggressiv fahren, um zeitig ans Ziel zu kommen. Geschickterweise war dann auch noch eine zentrale Strasse gesperrt, was mir zusätzlichen Nervenkitzel brachte.

FAQ

Wie kann man die Mentalität der Menschen am Besten erleben und etwas über das Land lernen?

a) Mit jedem reden, b) nicht in Hotels, sondern in Hostels übernachten, um mit anderen Reisenden ins Gespräch zu kommen c) die lokalen Zeitungen kaufen. So konnte ich der Zeitung in Malawi entnehmen, dass hartgekochte Eier in der Öffentlichkeit zu essen etwas anstößiges ist. (Eine Erklärung war nicht dabei. Auch der Barkeeper kannte das nicht.)

Fährt man in den Länder rechts oder links?

Überall links, also für uns auf der anderen Straßenseite. Man gewöhnt sich recht schnell dran. Ich fuhr aber oft etwas zu weit links. Lästig war es nur, dass in einem Auto der Blinker rechts und in einem anderen der Blinker links war. Insgesamt bin ich etwa 12.000 km mit dem Auto gefahren und noch keinen Kilometer danach in Deutschland. Mal sehen, wie das klappt …

Kann man in Afrika überall seinen Müll hinschmeißen?

Afrika ist groß! Allerdings findet man oft schlichtweg keine Mülleimer und es bleibt einem kaum etwas anders übrig, als den Müll auf die Strasse zu werfen. Plastikflaschen sind beliebte Sammelobjekte bei Kindern. Wirft man sie aus dem Bus, ist die Flasche nach ein paar Sekunden weggeräumt.

Mit welchen Fluggesellschaften kommt man günstig nach Afrika?

Ich bin mit Air Berlin nach Windoek/Namibia geflogen und mit Condor von Mombasa/Kenia wieder zurück. Das Rückflugticket habe ich 2 Wochen vor der Heimreise gebucht.

Muss man bei der Einreise eine Ausreise-/Weiterreisegenemigung vorzeigen?

Dass musste ich nicht. Es kann aber grundsätzlich passieren, dass ein Beamter nachfragt. Die einzigen, die sich für meine Ausreise interessierten, war Air Berlin. Der Frau hinter dem Schalter habe ich meine Busreise nach Sambia vorgelegt und sie hat mit gesagt, dass das nicht reicht, weil Sambia ja eine Stadt in Namibia ist, ich aber eine Landesausreise benötige. Als ich sie korrigiert habe, dass das ein Land ist, musste sie erst eine Kollegin fragen. Nach 15 Minuten war das auch geklärt.

Wie kann man am besten nach Deutschland telefonieren?

E-plus funktionierte in den meisten Ländern nicht. In Namibia und Südafrika konnte ich zumindest SMS empfangen und telefonieren, aber keine SMS versenden. Davon abgesehen, ist es sehr teuer. Eine Alternative sind lokale SIM-Karten. Die sind sehr günstig (1 bis 2 Euros) und die Preise nach Deutschland OK. Zudem hat es den Vorteil, günstig mit Menschen vor Ort telefonieren zu können. Ich habe beim Zain gekauft, was in vielen afrikanischen Ländern verfügbar ist und was – wenn man es denn braucht – gute Konditionen zu den Nachbar-Zain-Ländern hat. Unglaublich ist das Branding von Zain. Viele Häuser sind in den Zain-Farben gestrichen. Die Marke ist sehr stark und an jeder Ecke kann man Airtime kaufen. Nun muss ich beim Kennenlernen mich nicht mehr nur auf meine Briefmarkensammlung verlassen, sondern kann fragen: "Möchtest du meine SIM-Kartensammlung sehen?"

Gibt es in Afrika etwas Gescheites zu essen?

Es kommt wieder darauf an, wo man ist. In Namibia zum Beispiel ist es sehr trocken und daher ist Gemüse selten (bis auf eine Kürbisart). McDonalds oder Burger King sind nicht zu finden, dafür gibt es Marken aus Südafrika, wie Steers, die Burger verkaufen. Besonders kulinarisch empfand ich die Länder aber nicht. Wer auf geschmacklosen Porridge (Brei) steht, ist aber genau richtig!

Kann man wie in Asien gut (illegale) DVDs kaufen?

Ja. Generell schon. Blu-ray Discs sind sehr verbreitet. Sie kosten dann zwischen 1 und 3 Euro und beinhalten 20 Filme. Es gibt DVDs von Filmen, die gerade im Kino sind. Die DVDs werden aus China importiert.

Sollte man im Moment (Anfang 2009) nach Zimbabwe reisen?

Wohl besser nicht. Beim Grenzübergang traf ich einen Gaswasserscheißemonteur, der nach Sambia reiste, um dort ein paar Lebensmittel zu kaufen, da er sagte, in Zimbabwe sind die Regale leer. Auch Benzin gibt es nicht überall. Wer mit dem Auto fährt, kann also mitunter nicht weiterreisen. Die Viktoria-Fälle MUSS man sich aber in Zimbabwe anschauen. Das ist problemlos. Gleich hinter der Grenze nahe den Wasserfällen stehen ein paar unglaubliche Hotelpaläste – persönlich von Robert M. eingeweiht – die dem Touristen das Elend ersparen. Die Währung ist klar: Dollar. Anfang Februar wurden gleich 6 Nullen gestrichen; mit Trillionen kann man wirklich schlecht rechnen. An jeder Ecke kann man Billionen-Scheine für einen Dollar kaufen. Als Souvenir.

Ist es in Afrika gefährlich?

Kommt drauf an. Gesundheitlich habe ich Lariam zur Malaria-Prophylakse eingenommen. In der Dunkelheit sollte man besser nicht auf die Strasse gehen, wobei Malawi sicher sein soll. Das Zentrum von Johannesburg ist aber ein klares No-Go.

An wen kann ich spenden und dabei sicher sein, dass das Geld auch in Projekte geht, statt in die Administration?

Unterstützt Eva in Kaduha (Rwuanda)! Sie würde gerne einen Klassenraum renovieren (wenn es durch die kaputten Wellblechdächer regnet, kann kein Unterricht stattfinden), ein Kissen für jedes Kind kaufen (bis jetzt teilen sich zwei oder drei Kinder ein Bett; für mehr Betten ist kein Platz), Schulsachen und Spielsachen für die Kinder besorgen, … Mehr unter http://www.eva-in-kaduha.blogspot.com/. Spenden bitte an die Bistumskasse Münster, Konto-Nr. 2000100 BLZ 400 602 65 DKM Münster, Betreff: RTR 001-1.2211.2261 Ruanda, Eva Fischer. Eine Spendenquittung wird gerne ausgestellt.

Heise schreibt: "Bedarf an Java-Experten legt weiter rasant zu"

http://www.heise.de/newsticker/Bedarf-an-Java-Experten-legt-weiter-rasant-zu–/meldung/116871

Ob man bei der Aussage "Die Ausschreibungen im Bereich Java haben seit Jahresbeginn stark zugenommen und im August erstmals das Niveau der entsprechenden Projektangebote für SAP-Experten erreicht" dies auf Stärke von Java zurückführen kann, oder einfach nur auf die gesunkene Anfrage von SAP sei einmal dahingestellt.

Dass es einen "Aufschwung hat auch die Nachfrage nach Spezialisten für C++" gibt, haben wir bei tutego tatsächlich gemerkt, da vermehrt Anfragen nach C++ und insbesondere der Boost-Bibliothek zu verzeichnen ist.

Tja, Neal Gafter geht zu Microsoft

Also mich wundert’s nicht… Von Nealls Webseite http://gafter.com/~neal/:

I work for Microsoft on the dotNet platform languages. To balance my life, my hobby is designing and developing the future of the Java programming language. See, for example, my proposal to add closures to the Java Programming Language. I’ve also been discussing it on my blog.

Also von Sun zu Google und dann zu MS. (Eigentlich hatte MS immer damit zu kämpfen, dass die Mitarbeiter zu Google abwandern.)

Java Tipp: Initialisierung einer Map

Der übliche Weg führt über ein put(), wobei man das unterschiedlich schreiben kann:

Map<String, String> map = new HashMap<String, String>();
map.put( "name", "chris" );
map.put( "email", "a@b.c" );

Oder auch mit einem Exemplarinitialisierer (das ist aber schmutzig in meinen Augen!):

Map<String, String> map = new HashMap<String, String>() {{
  put( "name", "chris" );
  put( "email", "a@b.c" );
}};

Alternative: http://commons.apache.org/collections/api-release/org/apache/commons/collections/MapUtils.html#putAll(java.util.Map,%20java.lang.Object[]). Die API nennt ein Beispiel:

Map colorMap = MapUtils.putAll(new HashMap(), new String[][] {
     {"RED", "#FF0000"},
     {"GREEN", "#00FF00"},
     {"BLUE", "#0000FF"}
});

Die Apache Common Collections sind aber erst einmal nicht generisch!

Für http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Maps.html ist so was wohl geplant, aber bisher noch nicht implementiert.