madcats[welt]

Lagebericht

Filme: The Dark Knight (DVD), Ratatouille (iPod)

Serien: House MD Season 4 (iPod), Kir Royal (DVD)

Buch: Stefan Aust – Der Baader-Meinhof-Komplex

iTunes: Coldplay – Life in Technicolor, U2 – City of Blinding Lights

Spiele: World of Warcraft (Mac), GTA IV (PC), Warfare Inc. (iPod), Super Mario Galaxy (Wii)

Kabarettisten des Jahres: Monika Gruber (Hauptsach‘ gsund), Simone Solga (Kanzlersouffleuse)

MacBook Pro Erfahrungsbericht #1

Wie versprochen, hier nun der erste Erfahrungsbericht:

Allgemeines

Zwei Tage sind um und ich bin begeistert. Von den Kinderkrankheiten ist nichts zu merken. Es wurde aber ohnehin mit der neuen Firmware ausgeliefert und das Update auf MacOS X 10.5.6 letzte Woche, dürfte auch dazu beigetragen haben, dass keine Probleme aufgetreten sind

MacOS X macht durch die stärkere Hardware und das größere Display erst richtig Spaß. Leider fehlt noch ein Mini Displayport-Adapter auf HDMI, so dass ich das MacBook an meinen Monitor anschließen kann. Spätestens Mitte Januar sollten aber welche verfügbar sein, da Apple die Schnittstellen-Spezifikation allen Herstellern kostenlos zur Verfügung stellt.

Dann mit dem MacBook-Display auf 1440×900 und 1920×1200 auf dem 24″-Monitor, dürfte mein normaler Windows-Rechner arge Konkurrenz bekommen. Allerdings habe ich via Bootcamp nun auch Vista 64 drauf.

Die Installation lief problemlos und kaum langsamer, als auf dem PC. Die anschließende Update-Orgie dauerte mit Service Pack1 und allem drum und dran gute drei Stunden. An der Hardware sollte es aber kaum gelegen haben, obwohl das MacBook nur eine Platte mit 5.400 RPM hat – evtl. tausche ich sie noch gegen eine 7.200er aus.

Arbeit

Arbeiten mit Netbeans gestaltet sich unter OS X genauso komfortabel wie unter Windows. Dank SVN musste ich nur einen Checkout machen und hatte die kompletten Ruby- und Sapphire-Projekte sofort verfügbar. So kann ich jetzt endlich im Zug an Sapphire weiterarbeiten und kann es zuhause einfach ins SVN stopfen. (Gut, das wäre mit dem PowerBook auch gegangen, aber Netbeans lief darauf kaum arbeitstauglich.)

Allein durch die Touch-Gesten, macht es einfach sehr viel Spaß. Fürs Programmieren braucht man definitiv keine Maus mehr: das meiste läuft eh über die – sehr gute – Tastatur, die dank Hintergrundbeleuchtung in dunklen Umgebungen das Tippen erleichert, und alles andere funktioniert perfekt mit dem Multitouch-Trackpad.

Zum vertikalen und horizontalen Scrollen benutzt man einfach zwei Finger. Zoomen und Drehen von Bildern funktionuert wie beim iPhone/iPod touch. Drei Finger um sich iPhoto oder Preview durch die einzeln geöffneten Dateien zu bewegen. Vier Finger nach unten, um Exposé zu öffen; vier Finger nach oben, um Exposé zu schließen, oder falls es geschlossen ist, alle aktive Programme des Spaces zur Seite zu schieben, um den Schreibtisch freizulegen. Außerdem öffnet sich mit vier Fingern horizontal ein Task-Wechsel-Menü.

Apple hat hier sicher noch lange nicht alle Möglichkeiten ausgeschöpft und es werden mit weitere OS X-Versionen sicher noch mehr Gesten folgen. Dazu erleichtert einem die Glasoberfläche das Navigieren erheblich. Bisher habe ich kein Trackpad benutzt, das den Finger ähnlich gut und präzise gleiten lässt. Ingesamt kann man sagen, dass eine Maus komplett überflüssig geworden ist, so lange man nicht pixelgenau arbeiten muss.

Spielen

Der Mac-Client von World of Warcraft ist toll. iTunes ist voll integriert (Hey Blizzard, das geht auf dem PC sicher auch). WoW läuft sehr flüssig, aber leider ist die Geforce 9600M GT mit den neuen Schatten etwas überfordert – man muss ihr aber zu Gute halten, dass selbst die Radeon HD 4870 dabei ordentlich schuften muss. In den nächsten Tagen werde ich unter Vista noch weitere Spiele testen. Außer Blizzard liefert ja dummerweise niemand OS X-Versionen mit.

Fazit

Normale Notebooks mit dieser Hardware mögen deutlich billiger sein, aber Features wie das Multitouch-Trackpad und so viele andere Dinge – und wenn es nur die zwei ausklappbaren Haken zum Kabelaufrollen am Netzteil sind – machen den Preisunterschied mehr als wett. Diese ganzen Kleinigkeiten erleichtern einem die tägliche Arbeit und auch die Freizeit. Der oft ausgesprochene Satz, dass Apple-User nur auf das Design abfahren, mag schon teilweise stimmen. Trotzdem wissen auch viele dies alles zu schätzen. Man merkt einfach, dass Apple bei vielem weiterdenkt, als der Rest und dafür bin ich auch gerne bereit mehr zu zahlen.

Die PC-Konkurrenz hinkt bei Design, Usability, Innovation und selbst der Musikauswahl für Werbung meilenweit hinterher. Der stetig steigende Markanteil von Macs bzw. MacOS X, zeigt doch, dass viele Windows und seine Macken satt haben.

Ich will hier Windows nicht verdammen. Mit XP bin ich seit sieben Jahren sehr zufrieden, aber man kann vieles besser machen und Apple zeigt wie man das anpacken kann. Immerhin hat Microsoft wohl eingesehen, dass Vista ein gigantischer Schuss in den Ofen war und bügelt hoffentlich mit Windows 7 vieles wieder aus. OS X ist zwar in vielen Belangen überlegen, aber in einigen auch nicht und Konkurrenz hat noch keinem geschadet.

Generationswechsel

MacBook Pro

Mein treues PowerBook G4 12″ geht nun in Rente bzw. zum nächsten Besitzer über. Wie man unschwer erkennen kann, ist sein Nachfolger ein heute gekauftes MacBook Pro 15″.

Ein Core 2 Duo mit 2,4 GHz ist schon ein anderes Kaliber, als ein G4 mit 1,33 GHz. Leopard lief zwar noch brauchbar, aber viele Dinge dauerten einfach zu lange, um damit vernünftig arbeiten zu können. Dazu kam die niedrige Auflösung von 1024×768. Gerade fürs Programmieren ist das zu wenig.

Bisher überzeugt das MacBook Pro auf ganzer Linie. Das Display ist brillant und dank LED-Hintergrundbeleuchtung auch sofort auf voller Helligkeit. Tastatur und Trackpad sind perfekt – besonders die Multitouch-Gesten machen es einem einfach, auf eine Maus zu verzichten.

Kurz gesagt: ein Traum und zwar nicht nur für Apple-Fans.

In den nächsten Tagen werde ich über weitere Erfahrungen mit dem MacBook Pro schreiben.

P.S.: An dieser Stelle noch herzlichen Dank an die Mitarbeiter des Apple Stores in München, die im Gegensatz zu ihren Kollegen in diversen Elektronikmärkten, wirklich Ahnung haben und jedem Kunden gegenüber aufgeschlossen sind. Davon können sich viele Einzelhändler eine gehörige Scheibe abschneiden.

Array-Objekte in PHP

Bekanntlich sind Arrays in PHP keine Objekte, wie es z.B. in C# oder Java der Fall ist. Dennoch ist es mit den Interfaces und vorgefertigten Klassen der Standard PHP Library (SPL) möglich, eine Klasse zu entwerfen, die sich wie ein Array verhält. Das mag überflüssig oder überdimensioniert erscheinen, aber ich halte es für ein gutes Beispiel, welche Dinge die SPL möglich macht:

<?php

class MyArray implements ArrayAccess, Countable, Iterator {
    
    private $data = array();
    public $length = 0;
    private $position = 0;
    private $keys = array();

    public function __construct() {
        $args = func_get_args();
        
        if(count($args) > 0) {
            foreach ($args as $key => $value) {
                $this->data[$key] = $value;
                $this->length++;
            }
            
            $this->keys = array_keys($this->data);
        }
    }

    public function __destruct() {
        unset($this->data);
    }

    public function __set($offset, $value) {
        return null;
    }

    public function __call($method, $args) {
        return null;
    }

    public function offsetExists($offset) {
        return isset($this->data[$offset]);
    }

    public function offsetGet($offset) {
        return $this->data[$offset];
    }

    public function offsetSet($offset, $value) {
        $this->data[$offset] = $value;
        $this->length++;
        $this->keys = array_keys($this->data);
    }

    public function offsetUnset($offset) {
        unset($this->data[$offset]);
        $this->length--;
        $this->keys = array_keys($this->data);
    }

    public function count() {
        return $this->length;
    }

    public function rewind() {
        $this->position = 0;
    }

    public function next() {
        $this->position++;
    }

    public function key() {
        return $this->keys[$this->position];
    }

    public function current() {
        return $this->data[$this->key()];
    }

    public function valid() {
        if($this->position < $this->length) {
            return true;
        }
        
        return false;
    }
}

?>

Interface ArrayAccess:

  • offsetExists()
  • offsetGet()
  • offsetSet()
  • offsetUnset()

Diese Methoden sorgen dafür, dass man das Objekt wie ein ganz normales PHP-Array benutzen kann, d.h. eine Einträge hinzufügen, ausgeben oder löschen.

Interface Countable:

  • count()

Wie der Name schon sagt, gibt die Methode count() einfach nur die Anzahl der aktuellen Array-Items aus.

Interface Iterator:

  • rewind()
  • next()
  • key()
  • current()
  • valid()

Wer vor PHP 4 schon anbord war, wird diese PHP-Funktionen sicher noch kennen, um assoziative Arrays über eine while()-Schleife zu iterieren. Und nichts anderes machen auch die entsprechenden Methoden. Nur sorgen sie in diesem Fall dafür, dass man das Array-Objekt mit foreach() durchlaufen kann.

Zusätzlich sind die magischen Methoden __set() und __call() leer implementiert, so dass man die Eigenschaft $length nicht überschreiben kann und nicht beabsichtigte Methodenaufrufe verhindert werden. Der Konstruktor ermöglicht außerdem wie bei array() beim Initialisieren Werte in das Array zu schreiben.

Quo vadis, PHP?

Vor knapp zwei Jahren habe ich mir diese Frage im Eintrag »Sorgenkind PHP« schon einmal gestellt. Seit dem hat sich leider kaum etwas getan: PHP 5.2 war 2006 die aktuellste Version und ist es immer noch, obwohl man damals davon ausging, dass PHP 6 im Laufe des Jahres 2007 erscheinen würde.

Die Entwicklung geht nur schleppend voran. Eigentlich sollte letzte Woche die finale Version 5.3 erscheinen, aber stattdessen kam nur die Alpha 3. Nun wird erste Quartal 2009 als Termin genannt. Momentan glaube ich eher, dass dann erst die Beta-Phase beginnt. An PHP 6 ist momentan gar nicht zu denken.

Sicher bringt 5.3 auch schon viele Neuerungen, u.a. Namespaces und Geschwindigkeitssteigerungen von bis zu 30%, aber langsam bin ich das Warten leid. Probleme wie die nicht einheitliche Namensgebung von integrierten Funktionen/Methoden und Klassen, nicht durchgängige Objektorientierung im Core und in vorhandenen Extensions und vor allem viele sicherheitsrelevante Dinge wie die Typisierung von skalaren Variablen bzw. Parametern oder bessere Möglichkeiten, Benutzereingaben zu kontrollieren, fehlen PHP einfach.

Zwar gibt es für viele dieser Probleme Lösungen durch Frameworks, Extensions oder Tricks. Wirklich zufriedenstellend ist das aber nicht. Andere Sprachen haben dieses Features von Haus aus implementiert und entwickeln sich ständig weiter.

PHP verliert mehr und mehr an Anschluss, wird aber trotzdem erfolgreich bleiben. Objektorientierte Programmierung ist kein Muss, Fehler werden großzügig verziehen und selbst der mieseste Schrottcode, liefert noch brauchbare Ergebnisse. Besonders letzteres ist ein Problem, aber zugleich auch der Grund für den anhaltenden Erfolg. Man muss nicht verstehen, was man programmiert, es funktioniert ja meist auch so.

Ich bin dafür, einen zweiten Entwicklungszweig für PHP einzuführen. Der erste wird so weitergeführt wie bisher, also Script-Kiddie-freundlich ausgerichtet und der andere wird von Grund auf neu entwickelt – mit allen Features, die eine moderne objektorientierte Sprache im Hinblick auf dynamische Websites braucht. Damit wären die Probleme gelöst und PHP bleibt trotzdem »einsteigerfreundlich«.

Netbeans

Einige werden sich fragen, warum ich als primärer PHP- und C#-Entwickler nun über eine Java-IDE schreibe: Seit Version 6.5 hat Netbeans eine offizielle PHP-Unterstützung. Zwar bieten das viele Entwicklungsumgebungen, aber wirklich überzeugen konnte ich mich bisher keine. Zumal mein geliebtes UE Studio teilweise auch entsprechende Funktionen bietet.

Netbeans dagegen gefiel mir auf anhieb. Es ist klar strukturiert, nicht überfrachtet und hat eine funktionale grafische Oberfläche. Dazu beherrschaft die Code-Vervollständigung sogar noch CSS und Javascript – bei letzterem werden sogar Browser-Kompatbilitäten der verschiedenen Methoden angezeigt.

Plug-Ins sind für nahezu alle wichtigen Zwecke vorhanden, egal ob C/C++, Ruby, SOA oder CVS/SVN. Außerdem lassen sie sich bequem über das GUI auswählen bzw. verwalten.

Die PHP-Unterstützung ist stellenweise noch etwas holprig. So bietet z.B. das SVN-Modul noch keine Möglichkeit, ein neues Projekt direkt aus einem Checkout zu erstellen. Und es gesellen sich noch ein paar kleinere Bugs dazu. Dennoch kann ich nur empfehlen, Netbeans 6.5 zumindest auszuprobieren. Mit etwas Feinschliff ist genug Potenzial verhanden, eine der besten PHP-IDEs anzubieten. Weiter so, Sun!

Ich habe mich dazu entschlossen, die Weiterentwicklung von Ruby und vor allem Sapphire in Netbeans zu übernehmen. Den bereits vorhandenen Code von Sapphire habe ich gelöscht und das Projekt neu begonnen. Meine bisherigen Konzepte haben sich schnell als nicht praktikabel herausgestellt.

Manchmal hätte ich große Lust, PHP zum Teufel zu jagen und alles mit C# bzw. ASP.NET zu machen, aber ein Windows-Webserver kommt definitiv nicht in Frage. Hierzu werde ich in den nächsten Tagen noch etwas ausführlicher schreiben.

Dies und das

Filme: Serenity, Indiana Jones and the Kingdom of the Crystal Skull, 28 Weeks later

Serien: Firefly, Battlestar Galactica Mini-Series (iPod)

Lesen: Frank Eller – Visual C# 2008, Andrew Stellman & Jennifer Greene – C# von Kopf bis Fuß

iTunes: Saber Rider and the Star Sheriffs OST

Spiele: Warhammer – Mark of Chaos, Die Siedler 6, Drakensang

Programmiersprache des Monats: immer noch C# 3.0.

Weblog des Monats: Girl Developer (Englisch)

Array-Datentypen in C# konvertieren

Anstatt das Ausgangs-Array mit for() oder foreach() durchzulaufen und dabei das Ziel-Array mit den konvertierten Werten zu füllen, bietet C# dafür eine Lösung über die Methode Array.ConvertAll().

int[] IntArray = Array.ConvertAll<string, int>(StringArray, delegate(string Value) {
    return Convert.ToInt32(Value);
});

Als Beispiel habe ich hier das Konvertieren von Strings nach Integer gewählt, welches über die anonyme Callback-Funktion abläuft. Somit läuft es wesentlich eleganter ab und ist durch Generics flexibel gehalten.

Ruby Alpha 3

Änderungen gegenüber der Alpha 2:

  • Klasse Config:
    1. Methode delVar() entfernt
    2. Methode delete() hinzufügt:
      Vereinheitlicht das Namensschema und ist in der Lage mehrere Konfigurationsvariablen auf einmal zu löschen.
    3. Magische Methode __toString() implementiert.
      Gibt alle gespeicherten Konfigurationsvariablen mittels _printr() zurück.
    4. Magische Methode __get() gibt nun eine Fehlermeldung zurück, wenn auf eine nicht verfügbare Konfigurationsvariable zugegriffen wird.
    5. Konfigurationsvariablen ScriptName, ScriptDir, ScriptRoot, ScriptURL, TemplateDir, TemplateURL, TemplateName, TemplateDateFormat, TemplateTimeFormat und TemplateDateTimeFormat wurden in die Unterobjekte script und template der Klasse Data zugeorndet. Die Präfixe Template und Script entfallen. Außerdem beginnen die Eigenschaften alle mit Kleinbuchstaben.
  • Klasse MySmarty:
    1. Es ist nicht länger notwendig, die Smarty-Methoden assign() und assign_by_ref() zu verwenden, um Smarty Variablen zuzuweisen. Stattdessen wird über die magischen Methoden __get() und __set() dem Smarty-Objekt der entsprechende Wert übergeben.
    2. Magische Methoden __get(), __set(), __isset() und __unset() implementiert.
      Ermöglichen og. Vereinfachungen, um Smarty mit Variablen zu füttern.
  • Vereinheitlichtes Namensschema aller Konfigurationsvariablen entsprechend og. Änderungen zu Kleinbuchstaben am Namensbeginn.
  • Vereinheitlichte Klassennamen im Core-System.
  • Datenbankschnittstelle über PDO hinzugefügt, Ausnahmen werden über die Klasse PDOException statt DbException gehandhabt.
  • Die verfügbaren Datenbankschnittstellen MySQL, MySQLi und PDO lassen sich über die Konfigurationsdatei anwählen.
  • Markup-Vereinfachungen im Standard-Layout
  • Update auf Smarty 2.6.20 und jQuery 1.2.6
  • Anpassungen aller Klassen und Templates an das neue Namensschema und Smarty-Variablen-Handling.
  • Funktion _jsonencode() wird hinzugefügt, falls PHP 5.2 ohne JSON-Erweiterung kompiliert wurde.
  • Grundsätzliche Funktionalität, um falsch als Spam oder Ham erkannte Kommentare an Akismet zu melden.
  • Weitere kleine Optimierungen und Vereinfachungen der Core- und Modul-Klassen.

Geplante Änderungen bis zur ersten Beta-Version:

  • Wegfall der normalen MySQL-Schnittstelle und Unterstützung für MySQL 4.1.
  • Absicherung über vorbereitete SQL-Abfragen mittels der Methode prepare() von MySQLi bzw. PDO.
  • Namespaces für den Core und die Module, sofern PHP 5.3 verfügbar ist.
  • Admin-Bereich für Kategorien/Tags, Kommentare, Bilder, Texte und Konfigurations-Verwaltung.
  • Neues Tag- und Kategorie-Handling im Admin-Bereich.
  • Spam-Schutz ohne Akismet und Captchas.
  • Module Texts und Images implementieren.
  • Multi-Weblog-Unterstützung über mehrere Domains hinweg.
  • _jsonencode() durch Zend_Json_Encoder::encode() ersetzen.

Snapshot 09/08

Filme: Transformers, John Rambo (einfach nur schlecht)

Serien: House MD Season 4 (ORF1), Battlestar Galacatica Season 1 (DVD)

Lesen: James Luceno – Star Wars: Der Untergang, aktuelles PHP-Magazin

iTunes: Queen & Paul Rodgers – Cosmos Rockin‘, The Ting Tings – Shut up and let me go

Spiele: Warhammer Online, SolFree (iPod touch), Civilization IV

Programmiersprache des Monats: C# 3.o – LINQ rockt einfach!

Und an dieser Stelle noch herzlichen Dank an die Südostbayernbahn für eine kostenlose Woche in der 1. Klasse. War sehr angenehm.