Archive for September, 2005

Wenn eine Software von vermeintlichen Göttern gemacht wird…

…muss noch lange nichts göttlichen herauskommen. So geschehen auch bei einer nicht näher genannten Blog-Software, die auch der eine oder andere MVP einsetzt:

  • Upload über “Insert Image” funktioniert nicht, stattdessen erfolgt ein Verweis auf die lokale(!) Adresse
  • TrackBack-Funktionalität ist schlecht implementiert (Stichwort: TrackBack-Autodiscovery-mit-tatsächlicher-URL-Vergleich)
  • Ständig Fehler beim Hinzufügen oder Editieren von Beiträgen
  • Keine funktionierende Email-Autoimport-Funktionalität

Manchmal entzaubern sich bestimmte Dinge halt von selbst.

JBoss und Microsoft kooperieren

JBoss und Microsoft wollen miteinander kooperieren. Ziel der Kooperation: JBoss soll besser auf Windows laufen und Windows-Services (Active Directory, etc.) nutzen können. Meine persönliche Meinung in Kurzform: Nutzt beiden! :-)

Golem hat noch etwas mehr an Infos darüber:

Kleiner Tipp, falls keine Emails ankommen: Email-Adresse überprüfen!

Das ist mir am Sonntag vor die Linse meines JASJAR (SCNR) gelaufen:

Schlechte Beratung?

Jemand ist da ziemlich schlecht beraten worden – oder wusste es gar nicht besser?

Gut in Seattle angekommen, wenig geschlafen, aber dafür tatkräftig!

Ja, so könnte man meinen derzeitigen Zustand beschreiben. Schließlich bin ich erst gegen 01.00 Uhr Ortszeit ins Bett und stand um 05.30 Uhr Ortszeit im Bett… Ich habs geahnt – es kann schließlich nicht immer so perfekt laufen, wie in LA… Naja, wird es halt ein Kaffeetag. ;-)

Was schön ist: Eine stabile (drahtgebundende) Internetverbindung mit genügend großer Bandbreite (sowas um 1 MBit / s). Also habe ich mir schnell den Media Player Classic installiert und höre mein Berliner Lieblingsradio Radio1 (http://www.radio1.de) derzeit als Livestream. So kann man durchaus arbeiten!

Übrigens: Wer mal in Seattle ist, sollte unbedingt dem W Hotel einen Besuch abstatten, denn allein das Design der Lobby ist echt einen Blick wert!

.NET Summercamp 2005 in der Uni Leipzig

Ich war gestern und heute auf dem .NET Summercamp in Leipzig, einer wirklich netten Veranstaltung rund um .NET. Ich bin kurzfristig für den einen oder anderen Speaker eingesprungen und habe dort drei Sessions gehalten. Die Veranstaltung war zwar recht klein, aber die Teilnehmer waren sehr interessiert. Es hat Spaß gemacht, mal eben kurzfristig drei Sessions zu halten – gerne wieder! :-)

Session “Unit Testing 2.0″

Die Slides zur Session “Unit Testing 2.0 – Unit-Tests mit NUnit und dem Visual Studio Test Framework”, die kurz in das Unit-Testing unter .NET einführen, können hier heruntergeladen werden.

Session “Industrialisierung, Software Factories und mehr – neue Ansätze in der Software-Entwicklung”

Die Slides zur Session “Industrialisierung, Software Factories und mehr – neue Ansätze in der Software-Entwicklung”, die in stark verkürzter Form einige aktuelle Ansätze einer effizienteren Software-Entwicklung vorstellen, können hier heruntergeladen werden.

Session “Kommunikation: Java und .NET”

Die Slides zur Session “Kommunikation – Java und .NET” vom “.NET Summercamp” in Leipzig, die in (sehr) kurzer Form diverse Szenarien des Datenaustauschs zwischen Java und .NET (und andersrum) skizzieren gibt es hier.

Jetzt Geld tauschen: Mit 100,– EUR zum Dollar-Millionär!

Achtung, die Reisebank hat ein Sonderangebot: Mit 100,– EUR wird man zum Dollar-Millionär:

Mit 100,-- EUR zum $$-Millionär!

http://www.reisebank.de/currencycalc.php?cust=2&lang=de&docalc=1&from=30&amount=100&to=160

 

Warum Faxgeräte keine Faxe empfangen, wenn die Farbpatrone leer ist…

…entzieht sich völlig meinem Verständnis. Zur Erklärung: Ich habe hier ein HP Photosmart 2600, eine nette Kombination aus Fax, Drucker, Scanner und Kopierer. Das lief bisher auch einwandfrei, aber jetzt kann ich nicht mehr drucken, weil die Farbpatrone alle ist (die Schwarz-Patrone ist noch gefüllt). Okay, das kann ich vielleicht verstehen, obwohl ich schon das seltsam finde – dann soll er es halt in Schwarz-Weiss ausgeben…

Noch besser aber ist: Auch das Empfangen von Faxen funktioniert nun nicht mehr. Offensichtlich erwartet HP ernsthaft, dass ich eine der zehn Personen weltweit bin, die Farbfaxe empfängt. Okay, vielleicht kann man in den Einstellungen was ändern? Nö, kann man nicht – die erscheinen gar nicht erst, sondern auf dem Display (ja, das Teil hat ein Farbdisplay!) gibt es nur die Meldung, dass die Farbpatrone fehlerhaft sei und entfernt werden solle. Jut, als erfinderischer und kreativer Problemlöser, der ich nunmal bin, denke ich mir, dass über den Druckertreiber und dessen Einstellungsmenü was zu regeln sei. Natürlich nicht! Keine Änderungen… :-(

Wie wäre es dann damit, die Patrone einfach zu entfernen? Keine Chance – dann ist zwar die Fehlermeldung mit der fehlerhaften Patrone weg, dafür aber erscheint nun die Meldung, man möge doch bitte eine Farbpatrone einlegen…

Also, fassen wir zusammen: Farbpatrone alle (und ich kann gerade nicht weg, weil ich eine Paketlieferung erwarte) - kein Drucken, Faxen, Scannen oder Kopieren mehr möglich.

Danke, HP!

Übrigens: Bin ich der Einzige, den das an manches Verhalten manch anderer Software erinnert…? Software, die nicht mehr funktionieren möchte, wenn eine einzige (am Besten optionale oder einfach nur unwichtige) Komponente nicht mehr funktioniert?

Bei Software ist sowas immer ein Zeichen für einfach nur schlechte Programmierung, denn Software und Lösungen müssen robust sein – und sollten auch laufen, wenn bestimmte Module nicht mehr funktionieren. Das wäre ja sonst, als ob bei einer Web-Applikation ein Bild nicht gefunden werden kann und deshalb die komplette Applikation nicht mehr liefe – klar wäre es schöner mit Bild, aber es geht nunmal auch ohne…

Cache! Cache! Cache!

Manchmal gibt es solche Tage, an denen mehrere Fragen aufkommen, auf die es nur eine sinnvolle Antwort gibt: NEHMT DEN CACHE!

Beispiel: Da versucht jemand, ein SqlCommand in den ViewState(!) zu serialisieren. Auf die Frage, warum er das mache, antwortet er, dass er versuche die Performance zu steigern. Abgesehen davon, dass ein SqlCommand nicht serialisierbar ist, hätte es absolut keinen Sinn, es im ViewState abzulegen, denn dann müsste das serialisierte Objekt zum Client übertragen und von diesem wieder zurückgesendet werden. Bedeutet im Klartext: Die Applikation würde subjektiv noch viel langsamer werden, als dies zuvor der Fall war. Stattdessen sollte viel lieber Caching eingesetzt werde – wobei es relativ egal ist, ob es sich um Output- oder Application Data-Caching handelt. Ersteres kommt in Frage, wenn ein größerer Teil der Applikation nahezu statisch sein soll – letzteres dagegen, wenn eher die Daten gecachet werden sollen. Egal, welche Variante zum Einsatz kommt: Caching ist hier die Lösung!

Zweites Beispiel: Jemand will Inhalte anderer Seiten abrufen und darstellen (und darf das auch). Wird bei jeder Anforderung ein entsprechender WebRequest erzeugt, dauert das jedesmal cirka vier oder fünf Sekunden, die schon spürbar sind. Der verwendete Lösungsansatz war, auf Threadings auszuweichen, was aber das Problem nicht wirklich lösen dürfte. Viel sinnvoller erscheint es, die Daten (so sie nicht benutzerspezifisch sind) einmal einzulesen, für eine gewisse Zeit zu cachen und anschließend über ein CacheItemRemovedCallBack erneut laden zu lassen – vielleicht 1x alle 15 Minuten…?

Also: Statt immer komplexere Szenarien zu erforschen, Dinge beim Client abzulegen oder Sache bei jedem Request neuzuladen, empfiehlt es sich viel mehr, Sachen zwischenzuspeichern und zu cachen. Erhöht die Performance und verbessert die Skalierbarkeit einer Applikation!

PDC: LINQ, Atlas und .NET 3.0

Der zweite “richtige” Tag der PDC ist noch nicht komplett vorbei, aber es lässt sich schon einiges feststellen: Der Zug geht so langsam richtig ab. Anders Hejlsberg hat C# 3.0 und das LINQ-Projekt vorgestellt – sehr beeindruckend und sehr spannend und: Sehr auf dem .NET-Framework 2.0 aufbauend! Bedeutet im Klartext: Beim derzeitigen Stand ist LINQ (Language integrated Query) als AddOn für C# und VB.NET denkbar, zumindest aber wird es beim nach .NET 2.0 folgenden Major-Release dabei sein.

Das Prinzip dabei: Queries (analog zu SQL-Statements, sogar die Syntax ist fast identisch) werden direkt in C# oder VB geschrieben und können nicht nur auf Datenbanken, sondern auf beliebige Daten angewendet werden. Das Ganze macht gewaltig Gebrauch von neuen Framework-Features wie etwa Generics, anonyme Methoden und -Klassen, sowie Lambda-Expressions. Das Ganze braucht ein wenig, bis man sich da reingeschaut hat, aber nach kurzer Zeit wird es verdammt interessant, denn es spart im Endeffekt ungeheuer viel Entwicklungsaufwand und sorgt für deutlich mehr Flexibilität. Die LINQ-PDC-Bits sind ab sofort unter http://msdn.microsoft.com/netframework/future/linq abrufbar und werden ganz definitiv eines der wichtigsten Features im nächsten Framework nach 2.0 werden.

Eine Query-Expression kann zukünftig so aussehen:

var newVar =
   from c in Customers
   where c.Name == “Karsten”
   select new {c.Name, c.Age};

Ebenfalls neu in C# 3.0: Object- und Collection-Initializer. Diese nützliche Erweiterung erlaubt es, beim Erzeugen einer Instanz eines Objekts gleich die Werte von Properties mitzusetzen – ohne dies speziell über einen Konstruktor oder danach im Code machen zu müssen. Bezogen auf Collections können gleich Objekte mit übergeben werden – auch sehr praktisch, insbesondere deshalb, weil viel Schreibaufwand vermieden kann.

Ein weiteres Feature in C# 3.0: Local Variable Type Inference. Langer Name, praktisches Feature: Statt bei Generics stets den Typ doppelt angeben zu müssen, kann dies zukünftig unterbleiben. Statt

Dictionary dic = new Dictionary();

kann nun zukünftig

var dic = new Dictionary();

geschrieben werden. Dem hier verwendeten var-Schlüsselwort kommt übrigens bei C# 3.0 auch im Hinblick auf LINQ besondere Bedeutung zu…

Auch neu und auf den ersten Blick gewöhnungsbedürftig: Anonyme Typen. Im Grunde sind das normale Klassen, nur haben die halt keinen Klassen-Namen. Das Konzept kennt man schon von Java – es ist sehr flexibel, andererseits kann es sehr verwirrend werden, denn in letzter Konsequenz kann mit einer Variable zukünftig so gearbeitet werden:

var newVar = new { c.Name, c.Age };
Console.WriteLine(newVar.Name);
newVar.Age = 24;

Die Variable c ist dabei die Instanz eines beliebigen Objekts. Der Kompiler geht nun hin und erzeugt einen neuen anonymen Typ mit den Feldern Namen und Age (die Information hat er vom Objekt, dessen Werte zugewiesen werden sollen) und weisst deren Werte zu. Vorteil: Das Ganze ist typsicher und wird durch die Entwicklungs-Umgebung unterstützt (Auto-Completion, etc.).

Ebenfalls ein Schwerpunkt im Web-Bereich: ATLAS (oder wie der Kenner sagt: XMLHTTP), einem Framework, um die Arbeit mit Web-Applikationen zu erleichtern und aus Benutzer-Sicht komfortabler zu machen. Es gibt einen neuen ATLAS-Projekttyp für VS 2005 bzw. VWDE. Größter Vorteil von ATLAS: Es wird browserunabhängig sein. Es gibt ATLAS-fähige Web-Controls und Erweiterungen, die die Arbeit mit ATLAS erleichtern sollen. Grundsätzlich bleibt aber der Nachteil: Ist JavaScript aus, geht nix mit ATLAS… Mehr dazu dann morgen oder in den nächsten Tagen…

Zuletzt noch ein Wort: .NET 3.0 gibt es schon jetzt: WinFX (“Avalon”) wird intern als .NET 3.0 bezeichnet. Das nächste .NET-Major-Release wird dann wahrscheinlich nicht 3.0, sondern 3.01 oder 3.1 sein. Wer also .NET 3.0 schon vor .NET 2.0 einsetzen möchte, sollte sich WinFX besorgen… ;-)

PDC: Microsoft zeigt neues Office 12 und “verschenkt” T-Mobile MDA Pro

Heute war der erste Tag der PDC. Interessant war es, soviel kann man hier definitv sagen. Bill Gates zeigte in seiner Keynote… ja, was eigentlich? Im Wesentlichen außer Office 12 nichts wirklich Neues – nur wurde sehr deutlich darauf hingewiesen, dass Microsoft in seinen Produkten offene Standards (XML, SOAP, RSS, etc.) sehr extensiv nutzt. Und, dass mit Windows Vista alles besser wird – man ist nach den Präsentationen geneigt, es zu glauben, denn Vista wurde sehr vielfältig und ausführlich verwendet.

Die Highlights (bzw. die interessanten Sachen) von heute in ungeordneter Reihenfolge:

  • Die Vista-Sidebar ist wieder da (und sie ist gut geworden, diesmal!)
  • Es wird zukünftig einen zentralen “RSS-Store” geben, in den alle RSS-Feeds einfließen können (nicht müssen) und der von Outlook und der Desktop-Suche durchsucht werden kann
  • Überhaupt wirkt das neue Office 12 sehr viel durchdachter als bisher, denn das Bedienkonzept wurde radikal umgestellt (und es wirkt sehr produktiv)
  • Offenheit und Konvergenz im Sinne einer sehr weitreichenden Kooperation diverser Komponenten (Sharepoint, Powerpoint, Outlook, Word) und im Sinne verteilter Architekturen (Stichwort: SOA) wird noch viel wichtiger als bisher
  • SOA (Service Oriented Architecture) wird eines der Hauptthemen der Zukunft
  • Avalon als Presentation Layer ist sehr genial, aber IMHO noch zwei bis drei Jahre vom Massenmarkt weg
  • Es gibt eine neue Tab-Erweiterung im IE, die die Inhalte aller geöffneten Tabs neben- und untereinander in Miniatur-Form darstellt (sehr nützlich, sollte es auch für den FF geben)
  • Die Integration von SQL 2005 und XML ist sehr sehr sehr interessant!

Ein Highlight noch nebenbei: Microsoft hat zwar keine MDA Pro verschenkt, aber neben mir auf dem Hoteltisch steht ein i-mate JASJAR, der baugleich mit dem MDA Pro ist. Das Teil ist hier (in limitierter Form) für 149,– $$ verkauft worden…

Zwei Nicht-Highlights: Das legendäre Fun-Video war recht langweilig, und Microsoft wird verstärkt per Windows Marketplace in den Markt des elektronischen Software-Vertriebs einsteigen. Besonders “interessant”: Die Seriennummern und andere Informationen, sowie die Software verbleiben auf Microsoft-Servern. Original-Zitat: “Das hilft, wenn man den PC mal neu installieren muss”. Ja, so kann man es auch sehen… ;-)

Email-Adresse schnell überprüfen

Email-Adressen zu validieren kann anstrengend werden, da eine Menge an Überprüfungen notwendig werden:

  • Ist ein @-Symbol vorhanden?
  • Befinden sich Zeichen vor dem @-Symbol?
  • Wenn ja, welche und wieviele?
  • Sind die Zeichen gültig?
  • Befinden sich Zeichen nach dem @Symbol?
  • Wenn ja, welche und wieviele?
  • Sind die Zeichen gültig?
  • Ist eine TopLevel-Domain angegebenen?

Erst, wenn all diese Fragen mit “Ja” beantwortet werden können, kann die Email-Adresse als syntaktisch korrekt gelten. Eine Aussage, ob die Adresse tatsächlich existiert, ist damit allerdings nicht getroffen.

Wenn versucht wird, eine derartige Prüfung in gewöhnlichem Code auszudrücken, kommt man schnell an den Punkt, an dem es aufhört lustig zu werden: So cirka zehn bis zwanzig Zeilen Code sind mindestens nötig. Das ist anstrengend und – und das ist das wirklich fiese – völlig unnötig!

Die Lösung für dieses Problem heißt “Regulärer Ausdruck”, oder kurz: Regex. Mit Hilfe eines derartigen Ausdrucks können Texte darauf überprüft werden, ob sie syntaktisch korrekt sind. Eine Liste vieler regulärer Ausdrücke befindet sich in der RegexLib (http://www.regexlib.com). Verwendet werden diese Ausdrücke über die Klasse System.Text.RegularExpressions.Regex, die über diverse statische und nicht-statische Methoden verfügt.

Für die Validierung einer Email-Adresse reicht es aus, sich in der RegexLib einen geeigneten Ausdruck zu besorgen (eine Suche nach “email” sollte schon genug Ergebnisse liefern) und diesen Ausdruck zusammen mit der zu überprüfenden Email-Adresse an die statische Methode IsMatch() der Regex-Klasse zu übergeben:

using System.Text.RegularExpressions;

// …

// Email-Adresse überprüfen
if(Regex.IsMatch(email,
   @”^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|”
   + “
([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|”
   + “(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$”)) {
   // Email ist gültig
} else {
   // Email ist ungültig
}

In VB.NET sieht das so aus:

Imports System.Text.RegularExpressions

‘ ..

‘ Email-Adresse überprüfen
If Regex.IsMatch(email, _
   “^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|” & _
   “([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))” & _
   ”*\w{1,63}\.[a-zA-Z]{2,6}$”) Then
   ‘ Email gültig
Else 
   ‘ Email ungültig
End If

Im Web-Umfeld muss man nicht direkt mit der Regex-Klasse arbeiten. Hier gibt es das RegularExpressionValidator-Control, dessen Eigenschaft ValidationExpression den regulären Ausdruck aufnimmt:

Im Code kann dann per

   Page.IsValid

überprüft werden, ob die Überprüfungen der Validatoren erfolgreich waren.

Welche Variante auch immer genommen wird: Mit Hilfe eines regulären Ausdrucks wird die Überprüfung einer Email-Adresse deutlich leichter und performanter, als ohne. Eines jedoch ist zu bedenken: Eine Überprüfung, ob der Server erreichbar und die Email-Adresse gültig ist (also auf dem Server existiert), kann so nicht vorgenommen werden. Und Umlaute sind in obigem regulären Ausdruck auch nicht vorgesehen - aber das könnte man ja fixen.

R.I.P. PHP

Ei, das wird dem Christian überhaupt nicht gefallen: 40% aller PHP-Entwickler im kommerziellen Umfeld geben an, zukünftig nicht mehr PHP einsetzen zu wollen, meldet die Computerwoche:

Grund dafür sei die mangelhafte Unterstützung seitens der Entwicklungsumgebungen.

Ich persönlich kann das durchaus verstehen, steigert doch eine gescheite Entwicklungsumgebung meine Produktivität enorm: IntelliSense und AutoCompletion, Debugging und Unit-Tests, Load- und Last-Tests, etc. All das gibt es bei PHP nicht – kein Wunder, ist ja auch primär scriptbasiert.

Ich will damit nicht sagen, dass PHP schlecht sei. Ganz im Gegenteil: Abgesehen von seinen Sicherheitslücken ist PHP sogar besser als (klassisches) ASP. Aber für Sprachen und Frameworks wie Java, J2EE und .NET gibt es mittlerweile einfach deutlich bessere und  vor allem ausgereiftere Unterstützung. Die Zeiten, in denen man per vi oder Notepad coden musste, sind glücklicherweise vorbei (wobei es nicht schadet, es trotzdem immer mal wieder zu versuchen, sonst macht man sich komplett von Tools abhängig).

Also: Bessere Entwicklungswerkzeuge + besserer Entwicklersupport + freundlichere Community = mehr Entwickler. Kein Wunder also, dass Java und .NET marschieren!

R.I.P. Tungsten, welcome X30

Ich bin frustriert: Mein Tungsten T5, der erste PDA überhaupt, mit dem ich restlos glücklich war, ist kaputt. Aber nicht, weil das Gerät schlecht war, sondern weil ich so dämlich war und den Organizer so unglücklich aufs Autodach gelegt habe, daß das Display kaputt gegangen ist, als ich die Heckklappe geöffnet habe.

“Okay”, dachte ich mir, “gehst Du los und kaufst Dir den Tungsten nochmal”. Doch das erwies sich als nahezu unmöglich: Nach etwa einer Woche rumlaufen in der Stadt und dem Stöbern in allen möglichen Elektronik-Läden und Fachgeschäften, ist mir einiges klar geworden:

  • Der Markt will offensichtlich keine leistungsfähigen Organizer mit Bluetooth, gutem Display und einer eingängigen Bedienung, sondern PDA-Navi-Kombinationen mit geringer Leistungsfähigkeit, Infrarot-Schnittstelle, miesem Display und schlechter Bedienbarkeit.
  • Die Händler bieten zwar noch hochwertige PDAs an, aber nur zu Verteidigungspreisen. Die sind so hoch, daß man die Geräte fast auf Kredit kaufen (Tungsten T5 für 399,– EUR im MediaMarkt und für 429,– EUR im Kaufhof) muss. Die Gewinnmargen bei PDA-Navi-Kombinationen sind offensichtlich deutlich höher – und der gewöhnliche DAU schaut halt ausschließlich nach dem Funktionsumfang (und nicht danach, wie gut die einzelnen Komponenten sind).
  • Die Händler listen PDAs komplett aus: Saturn bietet heute keine PDAs mehr an, selbst “alte” Acer (N50)- und Palm-Geräte (Tungsten E2, Zire 71, Tungsten T3 und Tungsten T5) sind seit dieser Woche nicht mehr erhältlich.
  • Online einen preiswerten Tungsten T5 zu finden (meiner hatte neu vor sechs Monaten 289,– EUR gekostet) ist fast unmöglich: Bei eBay werden die üblichen linken Nummern gefahren (“Habe drei Stück zum Geburtstag bekommen, und die brauche ich nicht – deshalb keine Rechnung, keine Garantie, kein garnix”) oder auch deutlich höhere Preise genommen (ab cirka 329,– EUR bei einigermaßen vertrauenswürdigen Händlern) und die “gewöhnlichen” Händler sind ebenfalls sehr teuer oder eben einfach nicht vertrauenswürdig.
  • Gleiches gilt für nahezu jeden anderen PDA: Entweder teuer oder aus nicht vertrauenswürdiger Quelle oder ohne Rechnung oder alles zusammen.

Nachdem ich mir also so mein Frustlevel aufgebaut habe, hat es mir heute gereicht: Ich benötige dringend einen PDA, der ein ansprechendes Display mit der Möglichkeit einer querformatigen Darstellung hat. Ebenfalls braucht das Teil Bluetooth (Mobiltelefon und Navi-System koppeln) und entweder einen SDIO-Slot oder eine eingebaute WLAN-Lösung. Preisliche Obergrenze: 300,– EUR inkl. MwSt. Das bedeutet: Es kommen nur noch Palm Tungsten T5, Acer N50 oder Dell Axim X30 WLAN / PAN in Frage. Ich habe mich aufgrund der beschriebenen Situation rund um den Online-Kauf des Tungstens schweren Herzens für einen Axim X30 mit 624 MHz, Bluetooth und WLAN entschieden, denn den gibt es derzeit bei Dell ohne Versandkosten und mit 20% Rabatt, wodurch das Teil billiger als der einfachere X30 mit weniger Power wird.

Meine Suche nach dem idealen PDA ist damit erst mal eingestellt. Vielleicht läuft mir nochmal ein preiswerter neuer Tungsten T5 (oder ein Nachfolger) über den Weg oder das Palm Lifedrive wird um 100,– EUR preiswerter. Dann bin ich wieder bei Palm. Vorläufig aber gilt auch bei PDAs: Big Evil hat mich wieder…