Alphanum Algorithm

Der Alphanum Algorithm bietet eine alternative (bessere?) Sortierung für Zeichenketten mit gemischten Zahlen an:







Traditional  Alphanum
z1.doc

z10.doc

z100.doc

z101.doc

z102.doc

z11.doc

z12.doc

z13.doc

z14.doc

z15.doc

z16.doc

z17.doc

z18.doc

z19.doc

z2.doc

z20.doc

z3.doc

z4.doc

z5.doc

z6.doc

z7.doc

z8.doc

z9.doc
z1.doc

z2.doc

z3.doc

z4.doc

z5.doc

z6.doc

z7.doc

z8.doc

z9.doc

z10.doc

z11.doc

z12.doc

z13.doc

z14.doc

z15.doc

z16.doc

z17.doc

z18.doc

z19.doc

z20.doc

z100.doc

z101.doc

z102.doc


Der Alg. ist für Java über den AlphanumComparator (LGPL) implementiert.

Labels:

Fluent Interface-based API für Java Reflection: FEST-Reflect

FEST-Reflect is a Java library that provides a Fluent Interface-based API that simplifies the usage of Java Reflection, resulting in improved readability and type safety. It supports class loading, access to static inner classes constructors, methods and fields, and more!

Die Aufrufen sind dann hübsch kompakt:

Steht zur Compilezeit etwa

  String name = names.get(8);


wird mit FEST-Reflect daraus



  String name = method("get").withReturnType(String.class)
.withParameterTypes(int.class)
.in(names)
.invoke(8);

Ein paar weitere Beispiele:


  Person person = constructor().withParameterTypes(String.class)
.in(Person.class)
.newInstance("Yoda");

method("setName").withParameterTypes(String.class)
.in(person)
.invoke("Luke");

field("name").ofType(String.class)
.in(person)
.set("Anakin");

List<String> powers = field("powers").ofType(new TypeRef<List<String>>() {})
.in(jedi)
.get();

Labels:

Ehrlicher Kommentar: "Swing 2: Pissing in the Wind"

Elliott Hughes hat unter http://elliotth.blogspot.com/2009/02/swing-2-pissing-in-wind.html einen ehrlichen (bösen) Kommentar zu Projekt Swing 2 abgegeben. Mit der Kritik kann ich im Wesentlichen anschließen. Vielleicht ist aus diesem Grund auf der Homepage http://kenai.com/projects/swing2/ auch noch kein einziger Topic aufgeführt und Quellcode verfügbar. War vermutlich nur 'ne verrückte Idee, denn ein Fork macht wenig Sinn und eine Intergration im Kern der Java SE ist nötig. Zum Weiterlesen über Swing 2:

Labels:

Dead Code Detector (DCD)

Von der Webseite https://dcd.dev.java.net/:

If you are a developer or a team leader, Dead Code Detector (DCD) simply finds never used code in your Java/JEE applications. Deleting dead code helps to reduce cost of maintenance and to improve quality of code, and as a side effect it improves code coverage metrics of tests by deleting code that can't be tested.  Provide a directory of compiled classes, a jar or a war file in the UI and DCD lists suspects of dead code. Dead code found can be private, package-private and even protected or public. Unread local variables, self assignments, toString on String and useless initializations are also detected. Please remember that dead code found by DCD is just suspects. DCD can not detect that reflection or other is used: ask to people who know your application and don't complain if you don't. You can read the usage manual to know how to launch and use DCD or check the FAQ if you have questions. The search is very fast (2000 classes/s on warm files) and made by static analysis of compiled classes without running the application or loading classes. DCD uses the library ASM (licence open source, BSD) from ObjectWeb/OW2 to do the job.

Die letzte Version ist DCD 1.1 und vom 13.2.2009. Das Tool lässt sich auch über Java Web Start starten:

https://dcd.dev.java.net/screenshot.png

Labels:

PHP mit Quercus + Tomcat + Eclipse Java Web-Projekt

  1. Lade das WAR-Archiv http://quercus.caucho.com/download/quercus-3.2.1.war von http://quercus.caucho.com/.
  2. Packe der WAR-Archiv aus.
  3. Lege in Eclipse ein Dynamic Web Project (etwa unter dem Namen php) an.
  4. Verbinde es mit Tomcat. (Tomcat kann über Eclipse neuerdings auch automatisch heruntergeladen werden.)
  5. Kopiere aus dem ausgepackten Quercus-WAR das WEB-INF in das WEB-INF vom Eclipse-Web-Projekt (3 Jars in lib und web.xml)
  6. Kopiere images und index.php aus dem ausgepackten Quercus-WAR in WebContent
  7. Starte Tomcat in der Eclipse-View
  8. Gehe im Browser auf http://localhost:8080/php/

Labels: ,

SONAR in neuer Version

Sonar http://sonar.codehaus.org/ (SONAR is a code quality management platform, dedicated to continuously analyze and measure technical quality, from the projects portfolio to the class method.) ist nun in der Version 1.6. Den besten Eindrück über das LGPL-Tool gibt die Webseite mit Beispiel-Metriken: http://nemo.sonar.codehaus.org/. Es gibt auch ein Hudson-Plugin für Sonar.

Labels:

JRuby 1.2.0RC1 Released

Aus den News JRuby 1.2.0RC1 Released:

JRuby 1.2.0RC1 has fixed many many compatibility issues and continued to improve general performance. Highlights:
- Improved Ruby 1.9 support (via --1.9)
  - Compiler now works
  - Almost all of the missing 1.9 methods have been added
- New experimental --fast flag which does more aggressive optimizations
- Large scale compiler and runtime cleanup and performance audit
- Parsing is 3-6x faster now.
- Preliminary android support (Ruboto)
- Rails pathname issue fixed on Windows
- Major bug triage since last release
- 1052 revisions since 1.1.6
- 232 bugs fixed since 1.1.6

Labels:

GWT 1.6 Milestone 2 ist da

Aus der http://groups.google.com/group/Google-Web-Toolkit-Contributors/browse_thread/thread/09ce2144aa8491e6?pli=1:

The GWT team is happy to announce the availability of Google Web Toolkit 1.6 Milestone 2! Binary distributions are available for download directly from the GWT Google Code project. http://code.google.com/p/google-web-toolkit/downloads/list?can=1&q=1.... If you have already tried GWT 1.6 Milestone 1, you may not notice much difference in Milestone 2. Changes have mostly been general polish and various small bug fixes. For the nitty-gritty details of the changes since the previous milestone, see the attached source control commit logs. You can also watch the GWT bug tracker for the most up-to-date list of resolved issues ( http://code.google.com/p/google-web-toolkit/issues/list?can=1&q=statu...). As for doc, the javadoc that comes bundled with the distribution should be up-to-date, but the online Developer Guide ( http://code.google.com/docreader/#p=google-web-toolkit-doc-1-6) is still being tweaked. We anticipate that GWT 1.6 M2 will be the last milestone build for this version. After a few more bugs fixes and a bit more doc, we expect it to be followed soon by a release candidate build. In the meanwhile, please report bugs to the GWT issue tracker (http://code.google.com/p/google-web-toolkit/issues/list) after doing a quick search to see if your issue has already been reported. If you encounter a bug in 1.6 M2 that you think qualifies as a showstopper, we would greatly appreciate it if you'd also reply on this thread to alert the engineering team.

Über weitere GWT-Updates und Produkte hält http://www.ongwt.com/ auf dem Laufenden.

Labels: ,

AXDT - ActionScript3 IDE auf Eclipse Basis

AXDT (Bild 1, Bild 2, Bild 3): Plugin, welches einen ActionScript3 Code-Editor mit dem MTASC Compiler und http://designview.sourceforge.net/ in der Eclipse-IDE zusammenführt. Es gibt (eine bisher nicht so intelligente) Taststaturvervollständigung, rote Kringel bei Fehlern und einfachen einfach Wizard für neue as3- und mxml-Dokumente. Unter http://axdt.blip.tv/ zeigt ein Screencast eine Demo.

Labels: ,

mobile.de nutzt also Tomcat, Spring und Freemarker

Aufruf von http://suchen.mobile.de/fahrzeuge/anbieter-521268-seite81-112.html

macro city [on line 30, column 9 in search/vlisting/listSearchResults.ftl] in user-directive city [on line 76, column 229 in search/vlisting/listSearchResults.ftl] in user-directive rd.html [on line 62, column 9 in search/vlisting/listSearchResults.ftl] ---------- Java backtrace for programmers: ---------- freemarker.template.TemplateException: Error executing macro: city required parameter: resultView is not specified. at freemarker.core.Macro$Context.sanityCheck(Macro.java:181) at freemarker.core.Macro$Context.runMacro(Macro.java:161) at freemarker.core.Environment.visit(Environment.java:537) at freemarker.core.UnifiedCall.accept(UnifiedCall.java:128) at freemarker.core.Environment.visit(Environment.java:196) at freemarker.core.MixedContent.accept(MixedContent.java:92) at freemarker.core.Environment.visit(Environment.java:196) at freemarker.core.Case.accept(Case.java:80) at freemarker.core.Environment.visit

:

:

org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:542) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151) at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:200) at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283) at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:773) at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:703) at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:895) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685) at java.lang.Thread.run(Thread.java:619)

Wenn man in Google nach "org.springframework.web.servlet.view" sucht,  bekommt man auch noch mehr indexierte Webseiten, die diese Fehler aufweisen.

Labels:

Java AMF Client aus BlazeDS ziemlich beschränkt

BlazeDS (http://opensource.adobe.com/wiki/display/blazeds/BlazeDS/) ist
the server-based Java remoting and web messaging technology that enables developers to easily connect to back-end distributed data and push data in real-time to Adobe® Flex™ and Adobe AIR™ applications for more responsive rich Internet application (RIA) experiences.
Zunächst habe ich angenommen, das die API symmetrisch ist, also nicht nur Java auf der Serverseite das Protokoll VOLLSTÄNGIG implementiert, sondern auch auf der Clientseite. Ursprünglich gab es gar keine Java-Client-API, aber mit http://opensource.adobe.com/wiki/display/blazeds/Java+AMF+Client ist die Klasse http://livedocs.adobe.com/blazeds/1/javadoc/flex/messaging/io/amf/client/AMFConnection.html dazugekommen.
Using this feature, customers will be able to write and read AMF messages using Java on the client (i.e. no Flash player). This in turn will enable Java applications talk to AMF compliant servers such as BlazeDS, LCDS, or AMFPHP.
Beispiele, wie mit dieser API ein remote-Aufruf gemacht wird, zeigen etwa
  • http://www.infoaccelerator.net/blog/post.cfm/remoting-from-java-to-coldfusion-by-example
  • http://java.dzone.com/news/calling-flex-data-services-piv
Nun interessieren mit RCP-Aufrufe überhaupt nicht, viel interessanter fand ich Messaging-Möglichkeiten über RTMP (http://en.wikipedia.org/wiki/Real_Time_Messaging_Protocol). Doch das gibt es leider in BlazeDS nicht, wie die Doku schreibt:
What this feature is not: 1) It is not full implementation of BlazeDS Actionscript client libraries. It will strictly be a mirror of Flash player's NetConnection but no Channels will be built on top of it. Similarly, no Consumer, Producer, etc. of BlazeDS will be implemented on top. 2) Flash player's NetConnection supports RTMP. AMFConnection will not support RTMP, and hence the name AMFConnection instead of NetConnection.
Vielleicht wird ja http://www.osflash.org/red5 eine vollständige Java-Client-API für  RTMP anbieten.

Labels:

Thema der Woche: Abdecker

Bei der Codeabdeckung geht es darum herauszufinden, wie viel Programmcode ein Test (etwa von JUnit) abläuft. Wirf einen Blick auf

Schreibe einen eigenen Testfall mit JUnit und suche eine Apache-Commons-Bibliothek mit Testfällen aus und lasse ein Coverage-Tool laufen.

http://www.atlassian.com/software/clover/ ist ein kommerziellen Tool. Finde heraus, was Clover im Gegensatz zu den freien Tools für Vorteile hat.

Labels:

macwidgets - Collection of Mac style widgets written in Java

Groovy 1.6 ist da

Unter http://groovy.codehaus.org/ liegt die neue Version von Groovy 1.6. Groovy-Chef-Stratege Guillaume Laforge zählt in seinem Blog die Hauptfeatures auf:

Obviously, 1.6 is a very important milestone for the project, with several great new features and improvements:

  • great runtime performance improvements
  • multiple assignments
  • optional return in if/else and try/catch blocks
  • AST transformations and all the provided transformation annotations like @Singleton, @Lazy, @Immutable, @Delegate and friends
  • the Grape module and dependency system and its @Grab transformation
  • various Swing builder improvements, thanks to the Swing / Griffon (http://griffon.codehaus.org) team
  • as well as several Swing console improvements
  • the integration of JMX builder
  • JSR-223 scripting engine built-in
  • various metaprogramming improvements, like the EMC DSL, per-instance metaclasses even for POJOs, and runtime mixins

Einige Links zu den Konzepten:


Ein deutscher Beitrag dazu: http://it-republik.de/jaxenter/artikel/Groovy-1.6---Mittel-der-Wahl-2198.html

Labels:

Darauf hat die Welt gewartet: Wieder ein neues/altes Web-Framework

Apache Click http://incubator.apache.org/click/ heißt es und läuft ab Java 1.4. Super. Kommt damit 5 Jahre zu spät. Also nix mit Annotationen. Schön XML und so. (Click 0.3 gab es auch schon im März 2005, also ist das Projekt nicht wirklich jung.) Das Wort Ajax taucht auf den ganzen Webseiten nicht auf. Immerhin gibt es eine http://incubator.apache.org/click/docs/click-ide.html auf Eclipse 3.4 Basis. Toll die Antwort auf die Frage "Why develop a new Web Application Framework?" Antwort: "Because the existing frameworks did not meet my needs. Struts doesn't really do much, while Tapestry is too complicated. For a more comprehensive answer please see Why Click." Klar, als ob es nur Struts und Tapestry gibt. Vor 10 Jahren vielleicht. Bei Struts 1.x ist die Zeit schon lange abgelaufen und bei Tapestry 5 hält man sich noch ein wenig mit DI/IoC über Wasser.

Labels: ,

Buchkritik: Pragmatic Unit Testing in Java with JUnit

Andy Hunt, Dave Thomas. The Pragmatic Bookshelf. ISBN 0-9745140-1-2. September 2003. 146 Seiten
Kompaktes und nicht allzu tiefes Buch zu Testkonzepten und dem Testframework JUnit 3.x. Gut gefallen haben mir die Vorstellung des CORRECT-Prinzips (Conformance, Ordering, Range, Reference, Existence, Cardinality, Time), die Kurzvorstellung von Mock-Objekten (hier hätte ich mir allerdings etwas mehr Hinweise gewünscht, wobei immerhin Frameworks wie EasyMock zur Sprache kommen) und die Diskussion, wie die Testbarkeit das Systemdesign (positiv) beeinflusst. Die Codequalität ist in Ordnung, aber Anweisungen wie Integer.valueOf(val).intValue() hätte ich gerne als Integer.parseInt(val) gesehen, denn der Aufbau eines Wrapper-Objekts (lassen wir das Caching aus Java 5 außen vor) ist völlig unnötig (aber immerhin ist die Fabrikmethode noch besser als new Integer(val), denn sie kann immerhin auf die gecachten Wrapperobjekte im JDK zurückgreifen ). Die Namenskonvention von Sun hält der Autor bei Variablennamen nicht ein (argument_list, small_list, naughty_url, num_degrees), wobei er auch kein konsistentes Nicht-Einhalten betreibt (ingredientsText oder exitButton). Größtes Dilemma dieser Ausgabe ist aber ihr Alter, da nicht der JUnit 4.x-Zweig verwendet wird ebenso wenig wie Java 5, also keine Generics oder Annotationen. Mit der relativ flachen Beschreibung ist das Buch heute wenig attraktiv.

Labels:

Sun unterstützt ICEfaces und gibt Woodstock auf

Die Nachricht vom Dezember 2008 ist schon etwas älter, ist aber dennoch eine Meldung wert.

The Woodstock release 4.2 is the last official version of Woodstock that Sun will release. Sun will continue to support its customers that have built on top of Woodstock 4.2. The Project Woodstock code is still available, and community members can still create new features or enhancements.

Damit geht Suns Versuch, eine "Standard"-JSF-Komponenten-Sammlung aufzubauen, auch zu Ende. Nun hat sich Sun von JSF-Komponenten nicht ganz abgekehrt, und unterstützt ICEfaces. ICEFaces steht unter der Mozilla Public License (MPL) und ist mit RichFaces die populärste JSF-Komponentensammlung. Die Demo-Seite zeigt warum. Zudem gab es letzte Jahr eine Auszeichnung.

We are very pleased to announce that ICEfaces has been voted the Best Overall Enterprise RIA Product by the AJAXWorld RIA Conference & Expo 2008 West delegates.

Sun geht es mit dem Schritt zu ICEFaces insbesondere darum, die JSF-Bibliothek in NetBeans gut zu unterstützen. ICEfaces 1.7 wurde schon früh in der Version NetBeans 6.0.1 integriert.

Form Design View

Das ICEfaces Project integration for Eclipse 3.4 unterstützt als Eclipse-Plugin Eclipse 3.4 und ICEFaces 1.7.2SP1.

Es ist auch auch ICEfaces 1.8.0-RC1 now available. Siehe dazu auch http://www.icefaces.org/releasenotes/icefaces-1.8.0-RC1-RN.html.

Labels: ,

emite - Chat-Client und GWT XMPP Bibliothek

Eine tolle GWT-Anwendung/Bibliothek ist http://code.google.com/p/emite/:

Der Chat-Client läuft im Browser als GWT-Anwendung. Über einen Proxy kann dann der Client (Browser) direkt mit dem Xmpp Server sprechen. (Noch ist ein Proxy nötig, siehe http://ejohn.org/blog/cross-site-xmlhttprequest/). Das heißt, emite implementiert das Extensible Messaging and Presence Protocol (XMPP), um über Bidirectional-streams Over Synchronous HTTP (BOSH) die Daten zum Chat-Server zu senden. Da emite auf der einen Seite eine Bibliothek ist und auf der anderen Seiten ein Chat-Client mit der hübschen Gui, lässt sich die Bib. natürlich auch getrennt nutzen; eine Nachricht wird etwas so versandt:

Session session = Suco.get(Session.class);
session.login(XmppURI.uri("me@domain", "myPassword");
Message message = new Message("send this");
session.send(message);

Intern setzt emite auf http://code.google.com/p/suco/ auf. Suco ist ein einfaches DI-Framework für GWT-Applikationen zusammen mit einem Eventing-Framework. (Suco ist nicht Annotationsgetrieben, da kein echtes Reflection mit GWT möglich ist. Mit einem speziellen Builder könnte man da aber was machen. Hm...)

Labels: ,

GWT API's for SmartClient

SmartClient Ajax (http://www.smartclient.com/) ist eine (weitere) Ajax-Bibliothek für RIA-Anwendungen. Die Demos unter http://www.smartclient.com/index.jsp#_Welcome zeigen auch, was man heute von RIA-Frameworks erwartet: Nette Komponenten, Layout-Manager und Data-Binding über diverse Datenquellen. Es geht nicht nur um hübsche Widgets allein und die Optik ist auch nur OK. (Obwohl http://extjs.com/ in meinen Augen immer noch aus optischen Gründen vorne liegt, hat doch SmartClient Ajax einen sehr großen Vorteil: SmartClient Ajax platform now open source under LGPL. Ext JS ist, wenn man es denn kommerziell einsetzten möchte, nicht ganz billig.)

Für die JS-Library gibt es mit http://code.google.com/p/smartgwt/ auch eine GWT-Wrapper SmartGWT. Der Showcase liegt unter http://www.smartclient.com/smartgwt/showcase/, die JavaDoc unter http://www.smartclient.com/smartgwt/javadoc/. SmartGWT liegt wie auch SmartClient Ajax unter der LGPL. Der Port ist mehr oder weniger die (Fleiß)Arbeit einer Person Sanjiv Jivan. Die folgenden Screenshots stammen aus seinem Blog http://www.jroller.com/sjivan/entry/smartgwt_1_0_released:

Miller Columns

Filter Builder

Labels: , ,

NetBeans 7.0 Roadmap und NetBeans 7.0M1/M2

Die Roadmap sieht so aus:

NetBeans Roadmap

Der Development Plan spricht vom 22. Juni, dann soll die finale Version kommen.

Mit NetBeans 7.0M2 ist auch die zweite Version aus dem 7er-Zweig raus.

  • Milestone 1: NewAndNoteworthyMilestone1NB70
  • Milestone 2: NewAndNoteworthyMilestone2NB70
  • Ein paar Impressionen aus den M1 und M2:

    Verbesserte Maven-Unterstützung (super, wo doch jetzt Ivy immer mehr zur Alternative fürs dependency management (nicht builds!!) wird). In den Dialogen, Vervollständigung, Web-Services, ...

    cos.jpg

    add-dep.jpg

    generate_code.jpg

     

    worthy-maven-generate.png

     

    worthy-maven-completion.png

    Viele Neuerungen aus dem PHP-Projekt (netbeans php blog)

    Und Ruby

    Aktualisierung auf JS 1.7

    http://blogs.sun.com/tor/resource/wrong-yield.png

    http://blogs.sun.com/tor/resource/yield-ok.png

     

    http://blogs.sun.com/tor/resource/e4x-completion.png

    Komlettes Redesign unter Mac OS

     

    maclaf.png

    Bessere Unterstützung fürs Profiling:

     

    FitnessViaPartnership/profileme.png

    SVG-Komponenten in NB Mobility

    VMD.png

    Von jHat eine interessante Unterstützung, um im Speicherbaum zumzusuchen.

    OQL_code_completion.png

    Bei der C++-IDE: Unterstützung zum Bau vom Qt-Applikationen, Macro-Expansion (Tooltip), Tastaturvervollständigung, Setter/Getter bauen.

    Vervollständigung bei Grails:

    worthy-groovy-editordynamic.png

    Insgesamt viele Änderungen, wobei die meisten Sachen nicht in der Java-IDE selbst passieren, sondern im Tooling  und in anderen Sprachen.

    Labels:

    Video: Java 7, Modularisierung, Jigsaw, was kommt, was geht, 2010

    Mark Reinhold spricht über Java 7

     

    Geplante Änderungen:

    Wird (wohl) nicht in Java 7 kommen wird:

    • Closures
    • Reified Generics
    • First Class Properties
    • Überladene Operatoren
    • BigDecimal Syntax
    • JSR 295: Beans Binding

    Der Hammer: Java 7 wird Anfang  2010 erwartet.

    Wer mal was inspirierendes hören möchte: Unter http://channel9.msdn.com/posts/Charles/C-40-Meet-the-Design-Team/ sprechen C#-Macher Anders Hejlsberg und weitere C#-Experten über die Zukunft von C# und .NET, insbesondere im Kontext dynamischer Sprachen. Hier läuft man meilenweit vor Java; und das Interview ist schon 1 Jahr alt... Unter http://code.msdn.microsoft.com/csharpfuture geht's es dann mit ein paar Links zur C# 4 und Ideen zu C# 5 weiter.

    Labels:

    Linux Tools Project

    Dass Linux Tools Project fasst verschiedene Projekte wie automake, Valgrind, Systemtrap-Editoren zur Linux-Entwickung zusammen. Von der Eclipse-Webseite:

    The Linux Tools project aims to bring a full-featured C and C++ IDE to Linux developers. We build on the source editing and debugging features of the CDT and integrate popular native development tools such as the GNU Autotools, Valgrind, OProfile, RPM, Systemtap, etc. Current projects include Autotools build integration, a Valgrind heap usage analysis tool, and an OProfile call profiling tool.

    Drei Scrrenshots von New and Noteworthy:

    New OProfile View UI

    Labels:

    Thema der Woche: Pfuschen erwünscht

    In der C-Welt gibt es bisher Wettbewerbe für das verpfuschteste Programm (http://www.ioccc.org/). Unter Java gibt es bisher diesen Obfuscated Contest nicht. Aufgabe: Schreibe nach den offiziellen C-Pfusch-Regeln

    • To write the most Obscure/Obfuscated [C] program under the rules below.
    • To show the importance of programming style, in an ironic way.
    • To stress [C] compilers with unusual code.
    • To illustrate some of the subtleties of the [C] language.
    • To provide a safe forum for poor [C] code. :-)

    ein Java-Programm. Beispiel:

    class _{static long _
    (long __,long  ___) {
    return __==0 ?___+ 1:
    ___==0?_(__-1,1):_(__
    –1,_(__, ___-1)) ;  }
    static  {int _=2 ,___
    = 2;System.out.print(
    "a("+_+','+___+ ")="+
    _ (_,  ___)) ;System.
    exit(1);}}//(C)tutego

    Ich bin gespannt auf das beste (also schlechteste) Java-Programm...

    Labels:

    Java ME Anwendungen nach Android portieren

    Das schafft das J2ME Polish-Projekt Janus + Zusatzbiblitotheken. Heise hat das Produkt kurz in den News vorstellt.

    Labels:

    Zwei interessante GWT-Erweiterungen: Gilead und GWT-SL

    Sind

    Gilead (früher Hibernate4GWT), abgeleitet von "Generic Light Entity Adapter" ist ein interessantes Projekt mit folgendem Konzept:

    transform persistent entities back to simple Plain Old Java Object, by removing code instrumentation and replacing persistent collections with their regular counterpart.

    Kommt zum Beispiel eine JPA-Bean mit Assoziationen mit Eager-fetching rein, kommt ein vollständig geladener Objektgraph raus. Das ist praktisch genau dann, wenn man einen Daten-Service hat, den man von der GWT-Oberfläche zum Holen der Daten nutzt, aber die JPA-Implementierung baut diverse Proxies ein.

    Das SF-Projekt "GWT-Widgets" besteht aus zwei Teilen: Der GWT Server Library (GWT-SL) und der GWT Widget Library. Die GWT-SL ist eine GWT-Spring-Integration. Mit dem GWTRPCServiceExporter können etwa die Spring-POJOs als GWT-Services veröffentlicht werden. Die Doku stellt die Arbeitsweise kurz vor.

    Labels: , ,

    IntelliJ IDEA 8.1

    JetBrains hat eine neue Version ihrer IDE herausgegeben: IntelliJ 8.1. Die Änderungen sind eher unter der Haube (wie Performance Optimierungen) als das groß neue Features implementiert wurden. Dennoch gibt es einiges Neues:

    IntelliJ IDEA Server

    To make all of your favorite settings (keymap, fonts and colors, inspection profiles, etc.) accessible from any computer where you run IntelliJ IDEA, create a JetBrains Account and log in with it to a dedicated JetBrains server at IntelliJ IDEA startup.

    Team Foundation Server integration

    Perform all common VCS functions (commit, update, revert, etc.) from IDE. Create and manage TFS workspaces, merge branches, lock and unlock files, view the changes history, and do more.

    Git integration

    Carry out common VCS operations right from IntelliJ IDEA, plus do Git-specific tasks like cloning of remote repositories, pushing and pulling of local repositories, rebasing (including interactive mode and multiple Git roots), and more.

    Perforce jobs support

    click to enlargeClick to enlarge

    IntelliJ IDEA Perforce integration now lets you list Perforce jobs, view their details and link them to arbitrary changelists. Jobs can be selected and linked directly from the Commit Changes dialog.

    Oracle SQL dialect support

    click to enlargeClick to enlarge

    SQL editor supports Oracle SQL dialect, with completion, validation and highlighting.

    Resin integration

    Resin application server is supported via the dedicated run configuration, with application deployment and debugging (both local and remote).

    Copyright plugin bundled

    Generate copyright headers for any type of source code and let IntelliJ IDEA automatically keep them up-to-date. All it takes is creating a template for the copyright text and specifying the scope to which it should be applied.

    Labels:

    Auswirkung von neuen Sprachkonstrukturen in Java 7 und Project Coin

    Joseph Darcy veröffentlichte schon vor 2 Jahren einen interessanten Blog-Artikel über die Änderungen, die enum mit sich brachte: JSL, Compiler, Bibliotheken, JVM-Spezifikation, usw. Da Sun sich mit dem neuen Modulsystem Jigsaw wohl ganz gut was vorgenommen hat, wird es große Änderungen an der Sprache (wie Closures oder Reified Generics) wohl nicht in Java 7 geben. Dennoch gibt es mit dem aktuellen Project Coin: Small Language Changes for JDK 7 einen neuen Versuch, zumindest einige Features unterzubringen, die mit wenig Aufwand implementiert werden können. Dazu zählen ein switch mit Strings oder die Möglichkeit, multiple Exceptions in einem catch zu fangen.

    Labels:

    Folien zum Einsatz von Annotationen in Spring

    Habe bei SlideShare interessante Folien zum Einsatz von Annotationen in der Spring-Entwicklung gefunden. Zunächst werden allgemeine Annotationen aus dem Java SE und besonders aus dem Java EE-Umfeld vorgestellt. Dann werden JPA und REST im Kontext von Spring an Beispielen erklärt. Zum Schluss folgt noch etwa Spring MVC und wie dort Annotationen die Konfiguration vereinfachen.

    Labels: ,

    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

    Eclipse WTP 3.1M5

    ....ist am 6. Februar veröffentlicht worden. Die News gibt es unter http://www.eclipse.org/webtools/development/news/3.1M5/. Im Überblick: Facets geändert, kein .JETEmitter mehr im Workspace, neues Layout der Java EE Perspektive (Problems and Tasks views have been replaced with the combined Markers view), Überarbeitung des Editors für Tag Library Descriptors, Klassenverfolgung im TLD.

    Updated Java EE Perspective

     

    Armed hyperlink to a Java class

    Natürlich wurde auch etwas gefixed.

    Das WTP 3.1M5 benötigt ebenfalls Eclipse 3.1M5. http://download.eclipse.org/webtools/downloads/drops/R3.1/S-3.1M5-20090206233640/. (Mein erster Eindruck vom Eclipse 3.5M5 Release: Hat Speicherprobleme. Ein Java-Projekt lief bisher immer durch und meldet nun einen dummen Heap-Error. Danach will sich Eclipse schließen.)

    Insgesamt kein großer Wurf. Der Incubator http://www.eclipse.org/webtools/development/news/3.1M5/incubator.php zählt noch etwas auf, aber Dinge wie ordentlicher JAX-WS Wizard fehlen immer noch. Bei NetBeans (http://www.netbeans.org/kb/docs/websvc/jax-ws.html) sieht das so schick aus....

    Labels: ,

    Aptana Studio wird immer größer (Rails, pydev, ...)

    http://www.aptana.com/ find klein an. Erst war es die PHP-IDE auf der Basis von Eclipse, nun ist auch noch die Python-IDE pydev dazugekommen und eine Entwicklungsumgebung für Ruby/Rails und Mobile Web.

    Das Geschäftsmodell bei pydev ist wie folgt: Während der Kern immer noch OpenSource bei http://pydev.sourceforge.net/ bleibt, kommt es kommerzielles Pydev Extensions hinzu. Die Webseite zählt für das Produkt etwa die folgenden Neuerungen auf:

    Für die IDE gibt es unter http://showmedo.com/videos/series?name=PyDevEclipseList zwei Screencasts.

    Labels:

    Thema der Woche: HTTP Header

    Das http://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol überträgt neben dem Content auch über Header wichtige Informationen wie MIME-Typ, Datenlänge oder Caching-Informationen.

    Labels:

    GWT 1.6 Milestone 1

    Der erste Milestone von GWT 1.6 ist unter http://code.google.com/p/google-web-toolkit/downloads/list?can=1&q=1.6.0 verfügbar. In einem Google Group Beitrag werden die Neuerungen genannt:
    *** New Project Structure in GWT 1.6 ***
    One of the biggest changes to GWT 1.6 is a new project structure. The old
    output format has been replaced by the standard Java web app expanded "war"
    format, and the actual directory name does default to "/war". Note that the
    war directory is not only for compiler output; it is also intended to
    contain handwritten static resources that you want to be included in your
    webapp alongside GWT modules (that is, things you'd want to version
    control). Please also note that the "GWTShell" and "GWTCompiler" tools will
    maintain their legacy behavior, but they have been deprecated in favor of
    new "HostedMode" and "Compiler" tools which use the new war output. When 1.6
    is officially released, we will be encouraging existing projects to update
    to the new directory format and to use the new tools to take advantage of
    new features and for compatibility with future GWT releases.
    The sample projects provided in the GWT distribution provide an example of
    correct new project configurations. For more details on the specifics of the
    new project format, please see GWT 1.6 WAR design document (
    http://code.google.com/p/google-web-toolkit/wiki/WAR_Design_1_6).
    A couple of important changes we should highlight here:
    - Projects with server-side code (GWT RPC) must configure a "web.xml" file
    at "/war/WEB-INF/web.xml". This web.xml file must define and publish any
    servlets associated with the web application. See the included DynaTable
    sample. Additionally, server-side library dependencies must be copied into
    "/war/WEB-INF/lib". For example, any GWT RPC servlets must have a copy of
    gwt-servlet.jar in this folder.
    - HTML host pages will no longer typically be located in a GWT module's
    public path. Instead, we'll be recommending that people take advantage of
    the natural web app behavior for serving static files by placing host pages
    anywhere in the war structure that makes sense. For exmaple, you might want
    to load a GWT module from a JSP page located in the root of your web app. To
    keep such handwritten static files separate from those produced by the GWT
    compiler, the latter will be placed into module-specific subdirectories. Any
    page that wishes to include a GWT module can do so via a script tag by
    referencing the GWT-produced "<module>.nocache.js script" within that
    module's subdirectory. As of 1.6, we'll be recommending that only
    module-specific resources used directly by GWT code, such as image files
    needed by widgets, should remain on the public path. See the included
    Showcase sample for some examples of this distinction.
    - When you do need to load resources from a module's public path, always
    construct an absolute URL by prepending GWT.getModuleBaseURL(). For example,
    'GWT.getModuleBaseURL() + "dir/file.ext"'. This advice has not changed, but
    in the past it was easy to be sloppy with this, because the host page and
    GWT module typically lived in the same directory, so using a relative URL
    would usually do the right thing. Now that GWT modules live in a
    subdirectory, you must reference public resources through
    GWT.getModuleBaseURL().
    *** Hosted Mode Enhancements ***
    Although the legacy GWTShell still uses an embedded Tomcat server, the new
    HostedMode runs Jetty instead. There is also a new "Restart Server" button
    on the main hosted mode window. Clicking this button restarts the internal
    Jetty server, which allows Java code changes to take effect on the server
    without having to completely exit and restart hosted mode. This is useful
    when making code changes to RPC servlets, or when serializable RPC types are modified and the server and client are out of sync.
    *** New EventHandler System ***
    Event handlers have been added to replace the old event listeners used by
    Widgets, History, and various other classes. The new system has a few
    differences from the old system:
    - EventHandler methods always take a single parameter: the GwtEvent that the Widget fired. For example, ClickHandler has a single method
    onClick(ClickEvent).
    - Each GwtEvent contains accessors relevant to the event, such as the key
    that was pressed on KeyEvents. Native events provide access to the
    underlying native event object.
    - Each EventHandler defines only one method, so you do not need to create
    empty methods just to satisfy the interface requirements.
    For users who create their own Widgets, you no longer need to manage
    listeners manually. Every Widget has a HandlerManager that manages all of
    its handlers. For native events, such as ClickEvent, just call
    addDomHandler() from within your code to register a handler and sink the
    associated event on the Widget. When the native event is detected, the
    handler will automatically be called. For logical events, such as
    SelectionEvent, call addHandler() and fire the event manually using the
    fireEvent() method.
    You can see examples of EventHandler usage in many of the updated GWT
    widgets and samples, or in new projects created with the new webAppCreator tool.
    You can now trigger a native event on almost any Element. Create a new
    native event using the Document.create*Event() methods, then dispatch it on a specific Element by calling Element.dispatchEvent(). These methods allow you to expand your test coverage in ways that were previously impossible.
    *** New Widgets ***
    DatePicker
    The new DatePicker and DateBox widgets allow your users to select a date
    from a calendar. The Showcase sample provides examples of both of these
    widgets.
    LazyPanel
    The new LazyPanel widget allows you to delay the creation of certain
    sections of your application until they are first accessed, improving
    startup performance. For example, if your application has a seldom used
    "Help" section, you can wrap it in a LazyPanel and create the user interface
    only if and when the user tries to access it. To use the LazyPanel, extend
    the class and override the abstract createWidget() method. The
    createWidget() method will be called the first time you call setVisible() on
    the LazyPanel.

    Labels: ,

    Flamingo 4.0 Swing Ribbon Komponente

    Kirill Grouchnikov schreibt heute in seinem Blog http://www.pushing-pixels.org/?p=1087 über das 4.0 Release von Flamingo, einer Swing Ribbon Komponente. Auf der Haupsteite https://flamingo.dev.java.net/ gibt es weitere Demos.

    Labels: ,

    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

    Eclipse 3.5 M4 und Eclipse 3.5 M5

    Die Neuerungen halten sich auch dieses Mal wieder in Grenzen. Interessanter finde ich:

    Breadcrumbs auch beim Debuggen

    Debug view Breadcrumb

    Debug Breadcrumb Popup Menu

    Debug view Breadcrumb Drop-Down

    Komplettes Renaming auch über Quickfix

    Quick Fix 'Rename in workspace' in Java editor

    Labels: ,

    Buchkritik: Reversing: Secrets of Reverse Engineering

    Eldad Eilam. Wiley. ISBN 0-7645-7481-7. 2005. 619 Seiten

    Thema des Buches ist die Wiederherstellung von übersetztem Code in ein menschenlesbares Format und gleichzeitig der Schutz von diesem Reverse Engineering Verfahren. Das Buch pendelt zwischen grundlegenden Begrifflichkeiten, wie der Erklärung der Arbeitsweise eines Compilers und wofür die Win 32 API gut ist. Auf der anderen Seite beschäftigt es sich mit IA 32 Assembler-Code. Die Zielgruppe ist daher schwer auszumachen. Sicherlich ist für beide etwas dabei. Wer eher grundlegende Begrifflichkeiten sucht, wird sie hier auf jeden Fall finden und sicherlich nicht den Appendix mit den Prozessor-Flags lesen. Wer in IA 32 Assembler dagegen fit ist, findet viele Anregungen zum Reverse Engineering, Disassemblieren sowie Decompilieren. Zu allen Punkten werden freie und kommerzielle Tools aufgeführt. Der Autor ist nicht ideologisch in Open-Source oder freie Software verliebt und schließt daher kommerzielle Produkte nicht aus; oftmals sind die kostenpflichtigen Lösungen leistungsfähiger. Die Fallbeispiele (Kap. 6, Deciphering File Formats und Kap. 8, Reversing Malware) sind realistisch und ausführlich beschrieben und geben einen guten Eindruck in die Arbeitsweise. Schlussendlich ist auch für .NET-Programmierer etwas dabei, und die Ideen zum Schutz gegen Decompilierung finden auch in der Java-Welt ihre Anwendung.

    Labels:

    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 4x4-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.