Windows Home Server 2011 auf dem Lenovo D400

22 09 2011

Ich habe sehr gute Erfahrungen mit meinem Lenovo D400 Windows Home Server gemacht, der bei mir als NAS und Backup-System dient. Als NAS leistet er gute Dienste, weil er Daten mit über 50MB/s anliefern kann und sich vor allem mit dem Add-In LightsOut automatisch in den Stand-By begibt, wenn kein Rechner an ist und auch wieder aufwacht, wenn es was zu tun gibt. 30W rund um die Uhr mitlaufen lassen ist nicht so nach meinem Geschmack.

Viel besser aber ist die automatische Datensicherung meiner Windows-Rechner. Täglich wird im Hintergrund eine Datensicherung gemacht, die sogar einstellbar weit in die Vergangenheit zurückversioniert. Versehentlich irgendwelche wichtigen Daten gelöscht, fällt aber erst zwei Monate später auf? Kein Problem, einfach eine der älteren Sicherungen öffnen und die Daten wieder rausfischen. Das ganze ist sogar recht Datensparsam, weil identische Daten nur einmal gespeichert werden. Fünf Rechner mit Windows 7 mit je 20 Versionierungsständen sichern die identischen Systemdateien also nur einmal und nicht hundertfach. Das ganze geht ohne irgendwelches Zutun der User, genau so, wie man sich das wünscht. Die tägliche Sicherung bremst den Rechner auch nicht übermäßig aus, man muss keine Programme beenden und sie dauert meist nur wenige Minuten. So ists recht.

Der erste Windows Home Server unterstützte ein auf den ersten Blick cooles Feature namens Drive Extender, bei dem die Freigaben automatisch auf alle angeschlossenen Festplatten verteilt wurden. Praktisch, weil man dann beliebig Festplatten nachstecken konnte und die Freigaben einfach mitwuchsen. Man konnte sogar pro Freigabe anweisen, dass die Daten auf mindestens zwei Platten vorhanden sein sollen, falls mal eine ausfällt. Der Nachfolger Windows Home Server 2011 hat dieses Feature einfach gestrichen, was einerseits ärgerlich ist, andererseits aber einen guten Grund hat: Stimmt mit dem Drive Extender irgendwas nicht, wird die Sache haarig. Genau das ist uns bei einem Home Server passiert (nicht bei meinem zu Hause), wir mussten also die Daten manuell (an einem anderen Rechner) von den beiden Platten zusammenkopieren und den Server komplett neu aufsetzen. Dabei sind etliche Daten abhanden gekommen, die wir auf dem System abgelegt hatten, nachdem der Drive-Extender-Dienst nicht mehr gestartet werden konnte. Ärgerlich, aber immerhin ist uns der Defekt früh genug aufgefallen. Da der Drive Extender offenbar sogar Microsoft zu mulmig ist und wir Ärger damit hatten, haben wir die Gelegenheit ergriffen, auf dem Lenovo D400 direkt mal den neuen WHS 2011 aufzuspielen. Die Lizenz kostet nur noch 40€, das ist ein überschaubares Investment.

In einer der letzten c't-Ausgaben gab es eine Anleitung, wie man den Acer easyStore H340 auf den WHS 2011 migriert, die man vollständig analog auch für den Lenovo D400 anwenden kann (er ist mit den H340 weitgehend baugleich). Man findet aber auch im Netz genug Anleitungen, die den Vorgang erläutern. Kurz gesagt: Ein USB-Stick mit diskpart bootbar machen, den Inhalt der Windows Home Server 2011 DVD da drauf kopieren, eine cfg.ini-Datei mit bestimmten Einstellungen für die bedienungslose Installation darauf ablegen, geleerte Platte in den untersten Slot stecken, den Stick in einen der hinteren USB-Slots stecken, Server anschalten, eine Stunde dem lustigen Blinken zusehen, fertig. Alternativ kann man für 15€ ein Slotblech mit VGA-Buchse bei eBay kaufen und die Installation interaktiv durchziehen, das Ergebnis ist identisch, denn auch dabei kann man die später unabänderliche Arbeitsgruppe "WORKGROUP" nicht ändern (habe ich danach an meinem eigenen Lenovo D400 ausprobiert). Damit muss man also leben.

Nach der Installation muss man den neuen Home-Server-Connector auf allen Clients aufspielen und eine neue (verbilligte) LightsOut-Lizenz muss auch her), alles nicht grundlegend neu. Erwähnenswert ist, dass der Ersatz für den Drive Extender in meinen Augen viel besser ist: Der Home Server wendet die Clientsicherungstechnik einfach auch auf sich selbst an und macht zweimal täglich eine Datensicherung von wählbaren Ordnern auf die zweite Platte, die wahlweise auch eine externe Platte sein darf. So hat man als Benefit auch eine Versionierung der gesicherten Freigaben, was ein Vorteil gegenüber der kaputten Situation ist, dass Freigaben auf dem Server jede versehentliche Löschung gleich auf alle Platten verteilt.

Leider fällt einem schnell auf, dass der Stand-By-Modus nicht funktioniert. Eine kurze Recherche später hatte ich die Lösung: Man muss die ganzen Intel-Treiber installieren, dann darf man endlich einen Stand-By auslösen. Leider wacht der Server immer sofort wieder auf, also noch weiter suchen: Es fehlt noch ein Treiber für die LED-Ansteuerung. Also mit folgenden Treibern läuft bei mir auch der Stand-By mit dem Lenovo D400, man braucht dazu:

  • Den Intel Grafiktreiber für den 945er Chipsatz (bei mir Version 15.12.75.4.64.1930 für Windows 7 64-Bit : "Treiber für Intel® Grafik-Media-Beschleuniger für Windows* 7 64")
  • Den Intel ICH7 RST-Treiber (bei mir Version 10.1.0.1008 vom 15.12.2010 für Windows Server 2008 R2 Standard: "Intel® Rapid-Storage-Technik")
  • Das Intel INF-Update-Utility (bei mir Version 9.2.0.1030 vom 21.04.2011: "INF-Update-Utility - Hauptsächlich für Intel® 6er, 5er, 4er, 3er und 900er Chipsätze")
  • Den Marvell Yukon 88E8071 Treiber für Windows Server 2008 R2 64 Bit (bei mir Version 11.41.3.3 vom 17.02.2011)
  • Den LED-Treiber von einem großartigen engagierten Entwickler, den man in diesem Forum bekommt. Wichtig ist, nach der Installation in der Konfigurationsdatei den Hardware-Erkennungsmodus auf den Acer H340 zu zwingen, sonst wird der D400 nicht erkannt. Readme lesen!

Etwas über 50€ und ein Arbeitstag später hat man also einen aktuellen Windows Home Server ohne fehleranfälligen Drive Extender auf der alten und sehr günstigen Hardware. Wer unbedingt die Drive-Extender-Features haben will, kann eins der beiden verfügbaren Add-Ons benutzen, aber ehrlich gesagt ist mir das zu gefährlich und ich komme mit dem aktuellen Modus super klar: Schlicht, stabil und von überschaubarer Komplexität, beim Thema Storage mache ich keine Experimente mit reingefummelten Tricksereien.

P.S. Die versionierten Clientsicherungen gehen bei der Umstellung natürliuch flöten und die Daten in den Freigaben muss man auch in irgendeiner Form sichern und später wieder aufspielen. Ich hatte es bei meinem eigenen Server leicht, denn alles passte auf die Systemplatte, so dass ich die nach dem Entfernen der zweiten Platte im alten Home Server einfach rausziehen und mit allen Daten drauf beiseite legen konnte. Nach der Installation auf den nun freien zweiten Platte (im untersten Slot) konnte ich die Daten einfach umkopieren und die alte Systemplatte als Sicherungsplatte einrichten.


5 Monate mit dem Dell Streak - Eine Grabesrede

07 05 2011

Nachdem ich dreieinhalb Monate mit einem hässlichen Sprung im Display meines Dell Streak gelebt habe (mehr dazu hier), habe ich mich doch mal getraut, ein Ersatzdisplay für 60€ inkl. Versand in Hong-Kong zu bestellen. Das kam heute und ich habe mich natürlich sofort an den Einbau gemacht. Im Internet gibt es gute Anleitungen (Streak auseinanderbauen und Streak Display tauschen) und das nötige Werkzeug war beim Ersatzdisplay dabei, sollte also schaffbar sein. Ist es auch, nur leider kommt auf dem Display nun kein Bild, was sich sicher mit einem erneuten Auseinanderbauen beheben ließe. Das spare ich mir aber, denn beim fummeligen lösen der Klebestellen habe ich leider auch die Anbindung der Funktionstasten (Home, Zurück, Menü) abgerissen, was sich nicht ohne weiteres fixen lässt. Mist, ein teures Grab nach nur fünf Monaten.

Ich könnte nun für 340€ inkl. Versand einfach ein neues Streak bestellen, aber ich habe mich für ein HTC Desire HD für 404€ inkl,. Versand entschieden. Warum? Nach meinem sehr positiven Ersteindruck kann ich nun ein paar weitere Eigenschaften des Streak aufzählen, die mitunter durchaus lästig sind.

Mein Gerät war wohl ein Montagsgerät und hatte von Anfang an die Macke, dass es bei leichtester mechanischer Belastung einfach neustartete. Das ließ sich auf ein Minimum reduzieren, indem ich die beiden Kontakte des Akkudeckels mit einem kleinen Draht kurzschloss. Fummelig, aber funktionierte meistens. Trotzdem startete es gelegentlich beim in die Jackentasche stecken einfach neu, was wahrscheinlich daran lag, dass ich das Drähtchen nur um die Kontakte gewickelt und nicht festgelötet hatte. Insgesamt verschmerzbar, aber jedes Mal ein Stich ins Besitzerherz.

Ärgerlicher war da schon, dass das riesige 5"-Display ein unhandlich großes Gerät bedingt. Am wenigsten stört mich das beim Telefonieren, selbst wenn ich nicht, wie unterwegs fast immer, mit dem Headset telefoniere. Das sieht halt doof aus, funktioniert aber prima. Im Winter war das alles auch kein Problem, denn meine Jackentasche ist groß genug. Jetzt bei gutem Wetter aber merke ich, dass ein so großes Gerät in der Hosentasche schon aufträgt. Das wäre auch noch OK, wenn ich mir dabei nicht Sorgen um die mechanische Belastung machen würde, denn ein Bein ist nun mal rund und Hosentaschen eng. Auch verschmerzbar, denn auf 5" surft es sich hervorragend. Auch als Navi in der mit 45€ nicht ganz billigen Autohalterung hat es sich hervorragend gemacht. Leider kann man 5" nicht sinnvoll hochkant betreiben, weil es dann für zwei Hände zu schmal, für eine Hand aber zu breit ist. 5", einen Tacken zu groß.

Mit dem Transport in der Hosentasche kommt aber noch ein lästiger Aspekt meines Geräts ins Spiel: Wenn ich es nah am Körper mit dem Display zum Körper hin transportiert habe, reagierte danach der Touchscreen für ein paar Sekunden bis Minuten nicht oder nur seeehr sporadisch. Entsperren oder Gespräche annehmen ging dann nicht. Auch damit konnte ich leben, indem ich es – riskant, riskant – nur mit dem Display vom Körper weg transportiert habe. Ich glaube, die Körperwärme war hier das Problem.

Das war noch nicht alles: Der Kopfhörerausgang rauscht so laut, dass Musik auf leisestmöglicher Einschlaf-Lautstärke gerne mal vom Rauschen überdeckt wird. Wenigstens ist das ein angenehmes unauffälliges Rauschen, damit konnte ich also auch leben. Ich weiß nicht, ob der letzte Punkt alle Android-Telefone betrifft, aber gelegentlich haben vor allem Google Maps und manchmal auch der Browser das Telefon so ausgelastet, dass die Musik stark stotterte und das Telefon fünf Minuten lang gar nicht mehr reagierte, auch nicht auf das Pause-Kommando für die Musik, die derweil weiterstottert. Das kam zwar nicht so häufig vor (alle zwei bis drei Wochen mal), aber das war der für mich nervigste Aspekt an der ganzen Streak-Experience. Irgendwas lag da im Argen.

Das alles sind neben den im Ersteindruck beschriebenen Lästigkeiten wie dem PDMI-Ladeanschluss gute Gründe, nicht erneut ein Streak zu kaufen. Momentan 340€ inkl. Versand sind zwar überschaubar und mein Car-Kit war auch nicht billig, aber die Gefahr, wieder so ein Montagsgerät zu bekommen, ist gegeben und die anderen Kritikpunkte hinterlassen in der Summe ein lediglich gemischtes Bild. Den endgültigen Todesstoß hat sich Dell aber selber gegeben, denn das Service-Angebot für einen Display-Tausch in Höhe von 350€ ist eine unfassbare Dreistigkeit, ich bin deswegen immer noch nachhaltig sauer auf Dell. Dass ein Display mal kaputt geht passiert, besonders, wenn es mit 5" eine so große Angriffsfläche bietet. Dass aber eine Reperatur fast den Neuwert erreicht bzw. inzwischen sogar darüber liegt, ist schlicht nicht zu rechtfertigen. Keine Ahnung, ob HTC das anders handhabt, aber Dell hat mich diesbezüglich schwer enttäuscht.

Trotzdem mochte ich mein Streak und bin ein wenig traurig, dass es mich nur fünf Monate begleiten durfte. Alles in allem ein tolles Gerät mit dem besonderen Etwas. Ruhe sanft.

Ein Desire HD kaufe ich übrigens deswegen, weil ich nach den Erfahrungen mit einem 5" Gerät ein 4,3" Display für den Sweet-Spot halte. Zudem war ich mit meinen bisherige HTC-Geräten soweit sehr zufrieden, weil sie aus dem miesen Windows Mobile noch einiges herausholen konnten und die Hardware stets sehr robust und gut verarbeitet war. Auch das Desire, das ich neulich gekauft habe, gefällt mir richtig gut, die Sense-Oberfläche macht richtig Spaß. Das Google Nexus S war ein weiterer heißer Kandidat und mit 340€ sogar deutlich günstiger. Vor allem aber kommen da regelmäßig und zeitnah Android-Updates. zudem mag ich das leicht nach innen gebogene Display. Aber das 4,3" Display hat dann doch das Rennen gemacht.

P.S. Die Tage wird das Car-Kit bei eBay auftauchen und auch das defekte Gerät (mit dem nagelneuen Tauschdisplay), wenn ich weiß, ob und wie ich es löschen kann. Wer vorher zuschlagen will, meldet sich, ich mache einen fairen Preis.


Kleines Google Kalender Backup Script in PHP

01 03 2011

Seit ich ein Android-Smartphone besitze, verwalte ich meine Termine aus Bequemlichkeit im Google Kalender. Das funktioniert prima und Google schützt auch gut vor versehentlich gelöschten Einträgen, aber um Backups möchte ich mich trotzdem zusätzlich noch mal selber kümmern. Das klappt auch recht einfach, weil Google von allen angelegten Kalendern .ics-Dateien unter einer geheimen privaten URL anbietet. Die muss man nur regelmäßig herunterladen und abspeichern. Eine kurze Suche fördert dieses Shell-Script ans Tageslicht, das ich flugs nach PHP portiert habe. PHP deswegen, weil Shellscripte unter Windows nicht funktionieren und ich Windows-Batch-Scripte unglaublich kompliziert finde. Ein PHP Interpreter ab Version 5.3 für Windows muss nur heruntergeladen und mit zwei kleinen Änderungen an der php.ini angepasst werden, fertig ist die Laufzeitumgebung. Keine Installation systemweiten Krams, portabel auf allen Plattformen, läuft sogar auf jedem normalen Webspace. Zugriff auf PHP hat also im Grunde so ziemlich jeder. Davon abgesehen kenne ich mich mit PHP am besten aus.

Nun zum Script selbst. Der spannende Teil sind folgende cURL-Anweisungen, alles drumherum kümmert sich um Konfiguration und die Schleife über alle Kalender.

$ch = curl_init($url);
$fh = fopen($filename, 'w');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // only needed with https:// URLs
curl_setopt($ch, CURLOPT_SSLVERSION, 3); // only needed with https:// URLs
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // only needed with https:// URLs
curl_setopt($ch, CURLOPT_FILE, $fh);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
curl_close($ch);
fclose($fh);

Howto: Google Calendar PrivatadresseWenn man die Standard-URLs benutzt, die Google einem als private Adresse gibt, braucht man nicht mal die drei SSL-Einstellungen. Für mich kommt ein Download ohne SSL aber nicht in Frage, dazu muss man nur das Protokoll der privaten Kalender URLs auf https:// umstellen. Diese URLs bekommt man in den Kalendereinstellungen des jeweiligen Kalenders, wie im Screenshot zu sehen ist.

Das vollständige Script inkl. Readme.txt gibt es hier, die Lizenz ist cc-by-sa. Unter Windows lässt sich das leicht als geplanter Task einrichten. Ich habe dazu einen Ordner in den Eigenen Dateien erstellt, das angepasste Script hinein und eine aktuelle PHP 5.3 Distribution in den Unterordner php gelegt. Im Taskplaner rufe ich nun sonntags die dortige php-win.exe auf und übergebe den vollen Pfad des Backup-Scripts als einzigen Parameter. Das Script erzeugt stets einen Unterordner mit Datum und Uhrzeit und legt alle konfigurierten Kalender dort ab. Dank PHP kann man das auch auf einem Webserver oder generell überall machen, wo PHP ab 5.3 mit cURL läuft.

Viel Spaß damit.

Ach ja, bevor Fragen aufkommen: Die Google Kontakte lassen sich auf diese Weise nicht herunterladen. Wenn man mit Cookies in cURL hantieren will, kann man sich bei Google einloggen und ein Backup der Kontakte saugen. Aber das ist nicht ganz trivial. Alternativ kann man die Google Data API anzapfen, das ist gut dokumentiert, aber liefert die Daten nur in einem ATOM-XML-Format.


Mein Dell Streak Ersteindruck

20 12 2010

Ich darf mitspielen! Rückblickend frage ich mich, wie ich es so lange mit Windows Mobile 6 aushalten konnte, aber seit zwei Wochen bin ich endlich stolzer Besitzer eines Dell Streak. Android ist eine Wohltat, man muss nicht mal mehr Minderwertigkeitskomplexe gegenüber iPhone-Nutzern haben, im Gegenteil. Nun mal einige Ersteindrücke vom Gerät.

Die Größe ist genau richtig. Nicht so groß, dass es nicht mehr transportabel wäre oder man damit nicht mehr mit einer Hand telefonieren könnte; aber eben auch groß genug, dass die Bedienung der Apps richtig Spaß macht. Ich bin sogar so weit, dass ich morgens nach dem Aufstehen alle Standardkommunikationstasks (Mails, Twitter, Google Reader, ein paar Newsseiten) noch im Bett erledige und meinen Hauptrechner im Zweifel gar nicht mehr starten muss. Gleiches gilt für das ins Bett gehen, wo ich meinen Rechner auch nicht mehr zwingend noch mal anwerfen muss. Das würde alles auch auf einem iPhone oder einem HTC Desire gehen, aber mit dem Dell auf 5" macht es regelrecht Spaß. Ich empfinde es, von der groben Peinlichkeit mal abgesehen, auch nicht als unpraktisch, damit zu telefonieren. Trotzdem werde ich unterwegs meistens ein Headset benutzen, weil ich ja sowieso außer Haus stets Musik oder Podcasts auf den Ohren habe.

Apropos Headset: Das mitgelieferte Ohrkanal-Headset klingt gar nicht so übel und sitzt auch recht bequem. Überraschung. Trotzdem habe ich mir als allererstes ein Headset gekauft (noch bevor das Gerät da war). Erstes Ärgernis: Das iPhone hat eine andere Belegung am vierpoligen 3,5mm Headsetanschluss, laut Wikipedia belegt das iPhone Masse und AUX falsch herum. Na prima. Gut für mich, dass ich das Headset direkt an einen dankbaren iPhone/MacBook Besitzer weitergeben konnte. Nur findet man aber tatsächlich kein Headset mit der "richtigen" Belegung, weil sich fast alle Hersteller auf das iPhone kaprizieren. Nun habe ich das Creative HS-730i bestellt, das bringt nämlich einen 3,5mm Klinken-Adapter für Nokia-Telefone mit, was mir die leise Hoffnung beschert, dass die "Nokia-Belegung" die "richtige" Belegung ist, die übrigens auch mein altes HTC Touch HD nutzt. Solange muss das Originalheadset aushalten.

Das war es leider noch nicht an Stecker-Inkompatibilitäten. Der Dock-Anschluss vom Dell Streak ist angelblich ein PDMI-Anschluss, eine standardisierte Schnittstelle mit USB 2.0, 3.0, Displayport und allerlei analogen und digitalen Soundausgängen. Das ist sehr cool an sich, aber leider ist das Streak das erste und bisher einzige Gerät mit diesem Anschluss. Herzlichen Glückwunsch, denn dadurch gibt es keine Kabel oder Docks von Drittanbietern und das Original USB- und Ladekabel von Dell kostet inkl. Versand 33€! WTF? Für 15€ mehr bekommt man das Kabel plus KFZ-Halterung, was gar keine so schlechte Idee ist, denn das Display ist größer und besser als das von meinem TomTom Go 720T. Mal überlegen.

Dass ich nur ein Kabel habe, ist aber nicht ganz so schlimm, denn das Streak hält bei geringer Nutzung locker zwei Tage durch und auch bei Vielnutzung komme ich damit gut über den Tag. Gut. Nicht so gut sind die Neustarts bei geringer mechanischer Belastung im Akkubetrieb. Wenn man das Gerät in zwei Händen hält und leicht gegeneinander verdreht, startet es reproduzierbar neu. Man muss es also wie ein rohes Ei behandeln und selbst wenn man es in der Jackentasche hat und sich in der Bahn hinsetzt, löst man solche Neustarts manchmal schon aus. Ein Anruf bei der sehr guten Dell Hotline brachte mich nicht weiter, man bot mir eine Reperatur an, aber einen Monat kann ich nicht auf meinen neuen Liebling verzichten. Also habe ich das gemacht, was mir als erstes in den Sinn gekommen ist: Der Akkudeckel schließt zwei Kontakte kurz, die mir sofort verdächtig waren. Sie etwas heraus zu biegen brachte nichts, aber ein dünnes Drähtchen als Überbrückung stellte die Neustarts sofort ab. Heureka und Glück gehabt. Jetzt bin ich rundum glücklich.

Die genannten Kritikpunkte sind schon alles, was ich auszusetzen habe/hatte. Ich bin wirklich ausgesprochen zufrieden mit dem Gerät, auch der Preis stimmte und lag knapp unter den 410€ netto, bis zu denen man so ein Gerät sofort von der Steuer absetzen kann. Für den Originalpreis von 550-600€ hätte ich es übrigens nicht gekauft, weil ich nicht so viel für ein Telefon ausgeben möchte. So ist es die für seinen Einsatzzweck perfekte Lösung.

P.S. Erste App-Empfehlungen für Android: Die Kontakte-Synchronisation mit Thunderbird klappte auf Anhieb prima mit dem MyPhoneExplorer. Auf dem Gerät sind Google Reader, TweetDeck, K-9 Mail, KeePassDroid und Google Maps ein Muss, aber auch Google Goggles macht riesigen Spaß und mit Google Listen habe ich eine superbe Podcast-Losung gefunden. Listen richtet sich mit einer eigenen Kategorie im Google Reader ein, so dass man seine Podcasts am Desktop abonnieren und verwalten kann. Das Programm beachtet die Gelesen-Markierungen und lädt Dateien in der Warteschlange automatisch im WLAN herunter. Bedienung über Bluetooth im Auto klappt super, übrigens auch mit dem Standard-Musikplayer. Es funktioniert einfach alles bisher, ich fühle mich angekommen, es lebe Android.

Nachtrag 04.01.2010: Ich habe ein Headset gefunden, das brauchbar klingt, sich bequem trägt und von der Steckerbelegung her (sogar ohne einen der mitgelieferten) Adapter ans Streak passt: Das Creative HS-730i. Fehlt nur noch ein bezahlbares Dock oder ein Zweitladekabel, das nicht 33€ kostet. Dieses Billig-Dock wäre die Lösung, ist aber noch immer nicht lieferbar. Sowieso nervt der PDMI-Anschluss. Dass nur Dell den beim Streak einsetzt ist ärgerlich, aber viel nerviger ist, dass er sich nur schlecht blind einstecken lässt und man zum Aufladen immer das eigene Kabel dabei haben muss. Einfach ein Mini- oder Micro-USB-Kabel ausleihen ist also nicht.


Java muss gehen

03 11 2010

Ich mochte die Java-Runtime noch nie, in letzter Zeit aber hat das Java-Plugin im Browser die Führung übernommen (von Flash und dem Adobe Reader), was die Ausnutzung von Sicherheitslücken angeht. Also ist eines klar: Java muss endlich mal aus meinen Browsern verschwinden, vorzugsweise gleich vom ganzen System. In Opera benutze ich sowieso schon den PlugIn-Blocker, den man in opera:config aktivieren kann und der alle PlugIns erst nach einem Aktivierungsklick auf einen Platzhalter startet. Das betrifft dann auch das Adobe Reader PlugIn, Flash und Silverlight. Bequem, aber irgendwie habe ich das Gefühl, dass einige PlugIns trotzdem einfach so starten (möglicherweise, wenn sie in einem iframe geladen werden). Im Firefox kann man PlugIns einfach deaktivieren, aber nach einem Update von Java war selbiges im Firefox wieder aktiv. Also auch hier nur eine halbe Lösung. Java muss also vom System verschwinden, die Browser sollen keine PlugIns sehen.

Leider stehen der systemweiten Deinstallation von Java einige Hürden entgegen, allen voran ein paar unersetzliche Java-Programme wie Netbeans und der JDownloader. OpenOffice meckert ohne Java auch herum, läuft dann aber trotzdem. Ich habe das alles lösen können, als Notiz eine kurze Beschreibung, worauf es ankommt:

1. JavaPortable

Dankenswerterweise gibt es bei portableapps.com eine portable Version von Java, die aktuell gehalten wird und sich bequem und fix installieren lässt. Ich habe ein Sammelverzeichnis für portable Programme, dort landet gleich auch Java. Soweit kein Problem, Java findet sich jetzt unter D:\ProtableApps\Java (das sind Backslashes, keine Pipes, liegt am Font).

2. JDownloader und andere Java-Programme, die als .jar kommen

Der JDownloader ist ein klassisches Java-Programm, das direkt als .jar kommt und mit einem einfachen Aufruf gestartet werden kann. Man legt in so einem Falle einfach irgendwo eine neue Verknüpfung an und trägt ins Zielfeld D:\PortableApps\Java\bin\javaw.exe -jar D:\PortableApps\Jdownloader\JDownloader.jar ein, in das Feld "Ausführen in:" kommt D:\PortableApps\Jdownloader. Die Pfade müssen natürlich der Situation angepasst werden und ggf. jeweils in Anführungszeichen gepackt werden, wenn Leerzeichen darin vorkommen. Dann wählt man der Optik halber das Symbol der JDownloader.exe aus und speichert die Verknüfpung ab. Das wars schon, JDownloader läuft jetzt ganz entspannt und hat sogar den Vorteil, dass man die Verknüpfung an die Taskleiste von Windows 7 anheften kann, was mit der JDownloader.exe daran scheitert, dass man nur den Starter anheften kann und für das laufende Programm ein zweiter Eintrag in der Taskleiste erscheint. Heftet man das laufende Programm an, hat es nur ein fieses Platzhalter-Symbol, wenn es nicht läuft.

3. OpenOffice/LibreOffice

OpenOffice bzw. LibreOffice meckert beim ersten Start, wenn keine Java-Runtime am Start ist, lässt sich aber unter Extras->Optionen->OpenOffice.org->Java ohne weiteres mit der portablen Runtime bekannt machen. Ich bin mir aber gar nicht sicher, ob das überhaupt notwendig ist, denn auch ohne Java scheint OpenOffice/LibreOffice ganz normal zu funktionieren.

4. NetBeans

Netbeans benötigt normalerweise ein ganzes JDK, da kommt man um eine systemweite Installation nicht herum. Will man es nur für die PHP-Enwicklung (oder andere Java-freie Sprachen) benutzen, reicht aber auch eine portable JRE. Nur scheitert die Installation ohne systemweites Java. Hilfsweise kann man ein bereits installiertes NetBeans umstellen oder die plattformunabhängige Version hernehmen, der Trick ist der gleiche: Im etc-Ordner der Installation gibt es eine netbeans.conf, die eine Zeile für den Pfad der JRE enthält. Den schnell umgestellt (Pfad natürlich wieder anpassen), und NetBeans startet wieder:

netbeans_jdkhome="D:\PortableApps\Java"

Bei meinen ersten Versuchen bin ich daran gescheitert, dass hier das Java-Hauptverzeichnis angegeben werden muss und nicht das Unterverzeichnis bin mit dem Java-Binary.

Fazit

So, meine Browser sind nun zuverlässig befreit vom Java-PlugIn und ich kann wieder ruhig schlafen; meine wichtigen Java-Programme laufen nach kurzem manuellem Eingriff trotzdem wie zuvor. Alles wird gut. Schlimm genug, dass Browser Sicherheitslücken haben, aber sowieso nie benutze PlugIns wie Java werden immer wieder vergessen, erfahren keine oder zu späte Updates und sind alle paar Wochen erneut ein spannender Zoo von Zero-Day-Exploits. Die Antwort kann nur lauten: Weg damit. Und Java im Browser werde ich nicht vermissen.

P.S. Bei der Gelegenheit habe ich übrigens auch gleich den Adobe Reader entsorgt und durch SumatraPDF ersetzt, ein simples Frontend für Ghostscript, das zur einfachen Anzeige völlig reicht und zudem super schlankt ist. Nachteil ist, dass das Markieren von Text damit nicht wirklich komfortabel klappt (Strg gedrückt halten und einen Rahmen aufziehen, der darunter liegende Text wird dann irgendwie unvorhersehbar markiert). Das kann ich aber zumeist verschmerzen. Flash wird bei mir sowieso in allen Browsern grundsätzlich geblockt (Opera blockt alle PlugIns bis auf Widerruf, FlashBlock erledigt das in Firefox und Chrome dank einer einfachen Whitelist sogar noch viel eleganter).

Nachtrag 19.11.2010: Wenn man JDownloader auf die angegebene Weise mit einem portablen Java verheiratet, kann man .dlc-Dateien leider nicht mehr per Doppelklick im JDownloader öffnen. Man muss dazu die Dateizuordnungen manuell ändern, was wiederum in Windows 7 nicht mehr mit den klassischen Bordmitteln geht. Die alte Oberfläche zur genaueren Dateizuordnung gibt es sein Vista nicht mehr, man muss also in der Registry hacken oder das tolle Tool ExtMan benutzen, das in etwas die alte von XP gewohnte Oberfläche wieder bringt. Tolles Tool und ein prima Ziel für PayPal-Spenden. Für den JDownloader muss man den Eintrag für .dlc-Dateien editieren und folgende "Anwendung für diesen Vorgang" zuordnen (wie immer: Pfade anpassen): D:\PortableApps\Java\bin\javaw.exe -jar D:\PortableApps\Jdownloader\JDownloader.jar "%1". Dann klappt auch der Start per Doppelklick wieder. Für die visuellen Typen habe ich dazu mal zwei Screenshots gemacht:

.dlc-Dateien mittels ExtMan mit JDownloader verknüpfen Schritt 1.dlc-Dateien mittels ExtMan mit JDownloader verknüpfen Schritt 2


Wordpress hat schlimmen Code, andere aber auch

07 09 2009

Wer ernsthaft beruflich oder auf hohem Niveau in seiner Freizeit mit PHP arbeitet und älter als 15 ist, dem stehen wahrscheinlich beim Blick in den Quellcode von Wordpress die Haare zu Berge. Code is art ist ein wunderschöner Wordpress-Slogan, der in dem Kontext aber wirklich mehr als unangebracht ist. Schlimmer als der zusammengezimmerte Kern von Wordpress, der aktuell mal wieder mit einem notdürftigen Flicken gegen den grassierenden Wordpress-Wurm repariert wurde, sind aber die meisten PlugIns. Viele sind offenbar von blutigsten PHP-Anfängern schnell und ergebnisorientiert runterprogrammiert worden, was von Wordpress ja geradezu provoziert wird und was auch großen Anteil an der Beliebtheit des Systems trägt. Jeder ahnungslose Anwender kann mit ein paar Zeilen PHP-Code schnell das erreichen, was er gerade braucht. Das erinnert mich an meine Anfänge mit PHP im Jahr 2001 mit dem damals herausragenden phpBB 1.4. Hier war im Grunde alles hartkodiert und wenn einem irgendwas nicht gefiel, hackte man irgendwie im Quellcode herum. Ein Templatesystem wurde erst mit Version 2 eingeführt und auch hier hackte man noch alle möglichen MODs in das System, was ein Update praktisch unmöglich machte. Folge waren haarsträubende Sicherheitslücken, die nicht gestopft wurden. Wordpress vermeidet dieses Modding immerhin mit einem sehr flexiblen PlugIn-System, der Zugang für Dilettanten und Anfänger wurde dadurch aber noch einfacher. Das Ergebnis sehen wir zur Zeit, Gerrit van Aaken hat das schon zusammengefasst: Bei Wordpress hilft nur ein schmerzhafter Neuanfang, so wie TYPO3 das momentan auch vollzieht und wie phpBB das auch schon zwei mal hinter sich hat.

Nun will ich nicht so viel auf Wordpress rumhacken, wenn ich es selber gar nicht benutze. Im Grunde ist das System großartig, wenn man die miese Codebasis ignoriert. Ich will auf etwas ganz anderes hinaus, nämlich die Codequalität von Serendipity-PlugIns. Wann immer ich ein Seitenleisten-PlugIn installiert habe, musste ich dessen Code bearbeiten, weil die HTML-Ausgabe standardmäßig schlimm aussah oder gar fehlerhaft war. Das PlugIn-System von S9Y ist auf den ersten Blick recht kompliziert, was totale Dilettanten vom PlugIn schreiben abhält; das ist schon mal gut. Trotzdem ist die Codequalität der PlugIns oft eher mäßig. Fast überall wird zum Beispiel der HTML-Code mit echo direkt da ausgegeben, wo er anfällt, natürlich mit irgendwelchem HTML-Code drumherum, den der Autor gerade für angemessen hielt. Kein Wunder also, dass der Output nicht immer angemessen ausfällt. Ich habe vor einiger Zeit ein eigenes Seitenleisten-PlugIn für Twitter geschrieben, weil das alte u.a. genau dieses Problem zeigte. Ein Kernfeature meines PlugIns war der Einsatz einer Templating-Engine. Die zu implementieren war PHP-seitig ein Kinderspiel für jeden halbwegs erfahrenen PHP-Programmierer. Die Frage ist nun, warum zur Hölle von den paar offiziell verfügbaren PlugIns noch fast keines so ein Templating-System mitbringt? Es täte S9Y wirklich immens gut, wenn sich mal jemand hinsetzen würde und ein paar der PlugIns auf den aktuellen Stand bringen würde. Also zumindest eine Templating-Engine einbauen und die Ausgabe entsprechend anpassen, aber auch manch andere Routine könnte mal überarbeitet werden. Gegenüber Wordpress ist das Jammern auf hohem Niveau, aber auch S9Y ist merklich in die Jahre gekommen, vor allem seine PlugIns.

Wenn ich sowas lese, pflege ich zu antworten, derjenige soll nicht jammern, sondern selber anpacken. Das gilt auch für mich, sicher. Allerdings habe ich immens schlechte Erfahrungen mit meinem Twitter-PlugIn gemacht. Das einzige konstruktive Feedback kam vom unglaublich engagierten Chefprogrammierer selber, der mir meinen ursprünglich geplanten Arbeitsaufwand mit Änderungswünschen um das Mehrfache aufgeblasen hat. Am Ende war das neue PlugIn wirklich großartig geworden, ich bin richtig stolz darauf. Die ganzen angeforderten Änderungen kreisten alle um funktionale Anpassungen an das alte PlugIn, so dass mein neues PlugIn alle Funktionen des alten hatte, nur eben diesmal in gut. Dann kam das Problem: Es gab kein Feedback von Dritten und stattdessen hat mir ein ätzender Troll auch noch ans Bein gepisst und einen extra Thread im Forum aufgemacht, um mich als Schnösel zu dissen (weil ich PHP4 Nutzer, die PHP4 Kompatibilität einfordern, als Ewiggestrige bezeichnet habe und er sich davon angesprochen fühlte). Ich habe mein Engagement für S9Y daraufhin nach ein paar Tagen Diskussion eingestellt, denn für kostenlose und gute Programmierarbeit möchte ich echt alles andere haben als von irgendwelchen undankbaren Typen beschimpft zu werden. Mein PlugIn ist übrigens nie im Repository erschienen und stattdessen gibt es ein funktional wirklich krasses anderes PlugIn; hoffentlich ist wenigstens meine Arbeit da eingeflossen und war nicht völlig umsonst. Wie auch immer: Ich werde keine Arbeit mehr zu S9Y beitragen; wenn ich etwas neu baue, reiche ich das im Forum ein und wenn sich niemand drum kümmert, soll mir das egal sein.


Nur halb so schlimm: Eigene Short-URLs

05 09 2009

Vor einiger Zeit habe ich gefordert, dass größere und oft bei Twitter verlinkte Seiten eigene kurze URLs für ihren Content anbieten. Neulich erst habe ich mir dann Gedanken gemacht, wie man Short-URLs und so verüberflüssigen kann. Auf diese große Lösung mag ich nicht warten, aber zumindest bei der kleinen Lösung kann ich mit gutem Beispiel voran gehen. Also habe ich gerade schnell ein kurzes Script geschrieben, das kurze URLs für mein Blog in die vollen URLs umsetzt. Zum Beispiel lautet für diesen Eintrag die kurze URL http://spackblog.de/668, was mit 23 Zeichen deutlich kürzer ist als die verdammt lange volle URL und vor allem kürzer als 30 Zeichen, ab denen Twitter ungefragt mit bit.ly verkürzt.

Ich hatte eine Weile überlegt, diese Funktionalität als Serendipity-PlugIn zu veröffentlichen, aber das habe ich aus verschiedenen Gründen nicht gemacht. Ein Grund ist, dass mich ein undankbarer Vollspacko im S9Y-Forum angesaugt und als Schnösel bezeichnet hat, als ich mein letztes PlugIn dort vorgestellt habe. Ich will da gar nicht genauer drauf eingehen, Folge ist jedenfalls, dass meine Lust auf die extra Arbeit für ein S9Y-PlugIn dadurch doch sehr gesunken ist. Ein weiterer Grund ist, dass der generierte Link irgendwo im Template und noch mal im Header positioniert werden muss, damit es Sinn macht. Das kann ein PlugIn nicht flexibel alleine regeln. Man könnte den Link allenfalls dort hinpacken, wo momentan auch die Tags sind, aber das gefällt sicher nicht jedem. An die .htaccess des Blogs, oder wenn dieses in einem Unterverzeichnis steckt auch an die .htaccess der Domain muss man auch noch ran. Spricht alles gegen ein PlugIn. Sowas gehört in meinen Augen sowieso in den S9Y-Core.

Das Script funktioniert super simpel. Alles fängt mit einer Anweisung in der .htaccess an, die alles, was nach kurz-URL aussieht an das Script weiterreicht:

RewriteEngine On
RewriteBase /
RewriteRule ^(e|a|c)?([0-9]+)/?$ s9y_shorturl.php?type=$1&id=$2 [NC,L]

Man kann schon sehen, dass das Script auch kurze URLs für Kategorien und Autoren unterstützt. Der spannende Teil im Script selber ist die Datenbankabfrage, die die kurze URL aus der Datenbank ausliest:


// open a database-connection
$dbh = new PDO('mysql:host=' . $db_server . ';dbname=' . $db_database, $db_user, $db_pass);

// prepare the statement
$stmt = $dbh->prepare('SELECT permalink
  FROM s9y_permalinks
  WHERE type = :type
    AND entry_id = :entry_id
  LIMIT 1');

// execute the statement
$stmt->execute(array(':type' => $type, ':entry_id' => $entry_id));
  
// read the returned urlpart
$urlpart = $stmt->fetchColumn();

// close the database-connection
$dbh = null;

// redirect the user with a 301 status code (moved permanently)
header('Location: ' $blog_base_url . $urlpart, true, 301);
exit;

Der Rest vom Script besteht aus Fehlerbehandlung und Variablen-Vorbereitung, die ich hier mal weg lasse. Der ganze Code findet sich im Nachtrag zum Download. Damit ist der erste Teil schon fertig, der die kurzen URLs auflöst. Für die kurzen URLs werden einfach die von Serendipity vergebenen IDs genutzt, der Parameter type kann übrigens 'entry', 'category' oder 'author' sein. S9Y führt eine eigene Tabelle für die Zuordnung von IDs und URLs, die man nur abfragen muss.

Der zweite Teil ist leider Handarbeit im Template. Man muss dazu an der Stelle, wo der Link auftauchen soll folgenden Code in der entries.tpl platzieren: <a href="http://SHORTURL_DOMAIN/{$entry.id}">http://SHORTURL_DOMAIN/{$entry.id}</a>. SHORTURL_DOMAIN muss natürlich durch die jeweilige URL ersetzt werden, in meinem Fall ist das tatsächlich eine andere Domain als die, auf der das Blog läuft. Ich habe zusätzlich noch in der index.tpl im Headerbereich im {if $entry.id} Block einen Short-URl Autodiscovery Link eingefügt, wie er hier beschrieben ist.

Das ganze arbeitet extrem simpel und macht genau das, was es soll: Wenn jemand meinen Blog bei Twitter und Co. verlinken will, kann jetzt meine 23 stellige Kurz-URL hernehmen und sich so den Scheiß mit den verkürzten URLs sparen, bei denen man nicht weiß, wohin sie eigentlich linken. Alle Seiten sollten solche eigenen Kurz-URLs haben, dann wäre das mit Twitter nur noch halb so schlimm.

Nachtrag 24.02.2011: Weil eine Anfrage nach dem vollen Code kam, habe ich den mal hübsch gemacht und zum Download bereit gestellt. Das Script selber hat außer PHP 5.1 mit PDO keine Abhängigkeiten und stört auch andere Scripte nicht, solange sich die Rewrite-Regeln in der .htaccess vertragen. Wer ganz sicher gehen will, betreibt das alleine auf einer (Sub-)Domain. Viel Spaß damit. Ach ja, Lizenz ist cc-by-sa, das sollte genug Freiheiten lassen.


Vista entlarvt schlecht programmierte Programme

08 04 2009

Ich habe heute den ganzen Tag Vista plus etliche Programme auf einem iMac 24" installiert. Entgegen landläufiger Meinungen hatte ich nur bei einem Programm Probleme, die auf Vista zurückzuführen waren. Oder anders herum: Vista entlarvt die miese Programmierung dieses Programms derart schonungslos, dass sein Entwickler (der inzwischen aufgegeben hat) zum Start von Vista einen Jammerbrief über dieses böse Vista an seine Kunden mit Wartungsauftrag geschickt hat. Dieses Gejammer ist unfassbar peinlich, weil das Programm seit etlichen Jahren schon nicht sauber funktioniert. Unter anderem arbeitet es schon immer ohne sinnvollen Grund nur mit Administratorrechten. Ich kenne den genauen Grund zwar nicht, aber das ist auch völlig egal, denn offensichtlich bestünde dieses Problem bei halbwegs sauberer Programmierung nicht. Aber das ist nicht der einzige Fehler. Das Programm ist ein Musterbeispiel, wie man etwas nicht machen sollte; ergonomisch und programmiertechnisch einfach nur katastrophal.

Ich hätte glatt Lust, mal einen Screencast zu machen, wo ich dieses Stück Software-Dreck en Detail zeige. Was mein Kunde mir über die Jahre schon an Geld bezahlt hat, damit ich die Probleme so gut es geht behebe, ist wirklich immens. Übrigens habe ich auch für die mehrfache Neuinstallation eines HP-Druckertreibers schon so viel Geld in Rechnung gestellt, dass man gleich zwei der problemlosen Brother Geräte hätte kaufen können, mit dem wir diesen HP OfficeJet dann endlich ersetzt haben. Was soll ich sagen: Inzwischen gibt es dort neben dem uralten HP LaserJet 4L nur noch drei Brother-Geräte und keins davon hat jemals für unnötigen Supportaufwand gesorgt. Ein Traum, kann ich nur sagen: Drucker ans Netz, CD rein, ein paar Minuten lang den Installationsassistent laufen lassen (der fragt, ob man nur Drucker- und Scannertreiber oder die ganze Software haben will), fertig. Sogar der "Scannen an" Knopf am Gerät funktioniert sofort wie er soll und im Gegensatz zur Höllen HP-Software sogar dauerhaft. Danach kann man die Geräte schlicht vergessen, so wie es sein soll. Den kleinen Monochrom-Laserdrucker habe ich tatsächlich seit seiner Installation vor einigen Jahren nur zum woanders hinstellen mal anfassen müssen. Ich frag schon gelegentlich nach, ob der überhaupt noch benutzt wird, weil ich nichts davon höre. Ja wird er, täglich.


Lustige DSL-Problemsuche: IPv6 und Speedport W 502V

19 09 2008

Puh. Heute war ein problematischer Tag: Es fing schon doof an, weil mir der Alex dankenswerterweise Starthilfe geben musste, weil ich gestern das Licht in meinem Auto angelassen habe. Das Warnpiepsen hatte ich wohl ignoriert, ärgerlich. Dann habe ich eine Stunde an einer Telefonanlage gebastelt, weil DSL und Telefon nicht mehr liefen, nachdem ich gestern die Verkabelung angefasst hatte. Das Telefon lief schnell wieder: Eine Lötstelle war gebrochen, das hatte der Betroffene nach kurzer telefonischer Instruktion sogar selbst beheben können. Ich war beeindruckt. Aber das DSL lief trotzdem nicht, also Außeneinsatz. Auch direkt am Hausanschluss im Keller und mit getauschtem Kabel und anderem Modem gab es keine Synchronisation. Irgendwann hatte ich alle Variablen durchprobiert und rief bei der Telekom an. Ich rufe ja nicht mehr beim Provider an, bevor ich alle Variablen durchprobiert habe, siehe hier. Aha, OK, ich resette mal eben Ihren Port… geht es jetzt wieder? Ja, läuft; na toll, hätte ich da mal früher angerufen. Aber ich hatte an dem Kabel ja rumgefummelt gestern und sowieso ist die Konstruktion da reichlich fragil, weil historisch gewachsen: Analoganschluss durch zwei Adern eines mehradrigen Kabels in einen anderen Raum in die Fritzbox, von da ISDN zurück durch ein anderes vieladriges Kabel zur Telefonanlage, die neben dem Hausanschluss hängt. Alles nur, weil der Hausherr vor vielen Jahren eben (für seine Zeit vorausschauend) nur vieladrige geschirmte Drähte gezogen hat und keine Ethernet-Verkabelung, so dass die Fritzbox in das Zimmer mit den Computern muss.

Danach gerade noch rechtzeitig zu meiner zweiten Verabredung geschafft, schon wieder DSL. Dieses mal gründlich verzögerter Wechsel von 1&1 zur Telekom mit neuem Router. Ein Speedport W 502V. Schnell angeschlossen, Zugangsdaten rein, die alten WLAN-Parameter wieder eingestellt und ab dafür. Hab ich gedacht, denn auf zwei von vier Testrechnern war der Netzzugang unfassbar zögerlich. Egal ob WLAN oder Kabel, egal ob Internet oder die Konfigurationsseite vom Router, Seitenaufrufe zögerten alle erst mal etliche Sekunden, bevor dann alles sofort da war. Keine Personal Firewall, nix. Was, außer einem Haufen Software ist auf diesen beiden Notebooks anders? Was ist ungewöhnlich? Zwei Stunden später bin dann ich auf des Rätsels Lösung gekommen: Auf beiden Rechnern war Microsoft IPv6 für Windows XP installiert. Ich weiß nicht wieso, aber es war da. Schnell mal deaktiviert und siehe da: Es fluppte wieder einwandfrei.

Mein technischer Erklärungsansatz: Der alte Router hatte mit IPv6 nichts am Hut, der neue schon und so verteilte er per DHCP auch fröhlich IPv6-Adressen und DNS-Einstellungen. An sich vorbildlich und fortschrittlich. Nur leider hat das wohl dazu geführt, dass die Browser jede DNS-Anfrage erst mal via IPv6 gestellt und erst nach einem Timeout auf IPv4 zurückgeschaltet haben. Eine recht plausible Erklärung in meinen Augen, oder bietet jemand einen besseren Ansatz?

So oder so, ich weiß schon, warum ich solche Sachen eigentlich nicht mehr anbiete und mich auf Web-Projektgeschäft und -Beratung konzentriere. Klar kitzelt es mich noch immer sehr, solche Probleme zu lösen, aber ich muss Geld verdienen. Und niemand bezahlt nach meiner Erfahrung gerne dreistellige Beträge für ein paar Stunden Knobelarbeit an kleinen Detailproblemen. Mein krassester Fall war mal ein nicht mehr startender Rechner, bei dem sich nach einem langwierigen Virenscan herausstellte, dass alle .exe-Dateien auf der Platte befallen waren. Allein diese Diagnose hat inklusive Abholen und allem drum und dran ein paar Stunden gedauert. Dann alle Daten retten, die nicht befallen waren (natürlich wie immer gaaaaaaaanz wichtige Daten und kein Backup) und das System sauber neu aufgesetzt mit möglichst allen alten Programmen und Daten. Natürlich war keine Windows XP Home OEM CD dabei (Keine Ahnung, find ich nicht, das hier ist alles, was ich hab), also musste die auch noch besorgt bzw. per kleinem Hex-Editor-Eingriff an einem Image erstellt werden. Schon ein komisches Gefühl, aus den einschlägigen Quellen eine zur vorliegenden Seriennummer passende Windows CD zu saugen und zu modifizieren, obwohl man genug Windows XP CDs da hat, nur eben nicht für die Home-OEM-Edition. Insgesamt habe ich also über einen Arbeitstag intensiv an dem Rechner gearbeitet, dessen Wert meinen normalen Tagessatz bei weitem unterschritt. Für das Geld hätte man sich einen schicken neuen Rechner anschaffen können, also habe ich nur zwei Arbeitsstunden berechnet. Im Nachhinein ärgere ich mich ein wenig darüber, aber das Problem ist ja, dass die Kosten hier in keinem Verhältnis zum Nutzen standen. Also kann ich entweder viel weniger Geld nehmen und trotzdem langen Gesichtern gegenüber stehen, was reichlich bescheuert ist, oder eben etwas machen, wo ich meine gewünschten und angesichts meiner Leistung und Expertise angemessen Stundensätze realisieren kann. Man bezahlt nun mal lieber für ein neues Bad als das gleiche Geld für die Behebung eines Rohrbruchs.

Warum ich trotzdem gelegentlich noch Computerservice für Privatleute mache, obwohl ich daran viel zu wenig oder oft auch gar nichts verdiene, bzw. sogar draufzahle, wenn man in Opportunitätskosten denkt? Weil ich ein paar alte Kontakte nicht einfach abbrechen möchte und die Leute haben ja sonst niemanden und ich hab so ein gutes Herz… Also letztlich fürs Karmakonto, denn Dankbarkeit ist eine echt schöne Währung. Und nebenbei reizen mich gelegentlich auch die kniffligen Probleme, vor allem, wenn ich sie dann gelöst bekomme und auch weil ich sie lösen kann. Come get some, bastard bugs!


Spaßige Seiteneffekte Wut

05 06 2008

Gerade arbeite ich an einem mehr oder weniger zeitkritischen Projekt, das in Symfony entwickelt wird. Ich habe zwar das Symfony-Buch vor etwa einem Jahr gelesen (statt meine Thesis anzufangen), aber gearbeitet habe ich damit noch nie. Das ändert sich jetzt unter gewissem Druck. Morgen habe ich mittags einen Termin mit meinem Auftraggeber und bin noch nicht wirklich weit gediehen. Warum? Zwei lustige Probleme mit dem halbfertig angelieferten Datenmodell haben mich heute beinahe den ganzen Tag gekostet:

1. VARCHAR-Feldtypen brauchen (zumindest in MySQL) eine definierte Länge. Ich hatte die im Modell vorgegebenen Feldtypen einfach übernommen. Zwar hatte ich mich gewundert über die fehlende Längenangabe, aber hab mir nichts weiter dabei gedacht. Ahnungslos laufe ich also mit Propel los und schaffe es nicht, mein Modell damit umzusetzen, die Fehlermeldungen waren leider auch wenig hilfreich. Irgendwann bin ich dann drauf gekommen. Naja, hätte ich wissen müssen.

2. Man sollte Tabellen nicht order nennen! Um diese Erkenntnis zu erlangen, habe ich quasi den restlichen Tag gebraucht. Propel baut problemlos sein Modell damit auf und MySQL legt eine solche Tabelle auch ohne Murren an, nur scheitert jede Anfrage mit dem Tabellennamen irgendwo im SELECT mit einem SQL-Syntaxfehler. Eigentlich klar, ist ORDER doch ein SQL-Schlüsselwort, weswegen auch die Syntax-Hervorhebung von Notepad++ an solchem SQL-Code scheitert. Dieser Effekt hat mich letztlich auch auf die Lösung gebracht, als ich mir die von Propel generierte lib.model.schema.sql doch noch mal genauer angeguckt habe. Also flugs die Tabelle umbenannt, das Schema neu generiert und zack, das Adminmodul funktioniert endlich ohne Probleme.

Zu meiner Verteidigung muss ich anführen, dass beide Problemursachen nicht auf meinem Mist gewachsen sind, sondern schon mit meiner Modell-Vorlage ins Haus kamen, die allerdings ins Blaue hinein geschrieben waren und nicht validiert. Das habe ich leider gemerkt…

P.S. Symfony ist wirklich genial. Zwar habe ich heute nur mit dem Model-Layer gearbeitet, aber auch hier merkt man schon, wie ausgefeilt das ganze Framework ist. Es wird mir eine Freude sein, tiefer in die Entwicklung einzusteigen.

P.P.S. Sehr hilfreich für häufige Model-Rebuilds ist übrigend dieses Script, das einen Dump der Datenbank macht, das Modell neu aufbaut und die Daten danach wieder einspielt. Das Symfony-Standardverhalten bei einem model-build ist nämlich, alle Tabellen zu löschen und neu anzulegen, was leider die darin enthaltenen Daten entsorgt.