Christian's Weblog Aktuelles um mich, das Zend Framework und PHP Allgemein 2010-08-27T19:57:25+02:00 INMON Enterprise CMS http://blog.muench-worms.de/de/startseite.10.html?news_list[feed]=1&news_list[format]=atom christian@muench-worms.de nospam@example.com http://www.example.com christian@muench-worms.de <![CDATA[Erfahrungen mit den Magento Enterprise Edition 1.9 Updates]]> 2010-08-11T07:59:33+02:00 2010-08-11T13:19:06+02:00 http://blog.muench-worms.de/de/artikel.12.html?news_details[id]=84 Christian Münch nospam@example.com http://www.example.com Diese letzten zwei Wochen hatte ich das "Vergnügen" zwei Magento Shops auf die Version 1.9 der Enterprise Edition zu hiefen. Ich möchte hier einige Erfahrungen zusammenfassen. Die neue Version enthält nicht mehr den mit in Version 1.8 eingeführten verschlüsselten Code. Es muss also kein IonCube Encoder Modul mehr auf allen Plattformen installiert werden. Man hat also bei Varien (oder wie es neuerdings heisst Magento Inc.) festgestellt, dass der eingeschlagene Weg schlecht war und die Entwickler und Administratioren einfach nur genervt hatte. Magento kämpft immer wieder um Performance. Bei mittelgroßen Systemen mag die Performance eines einfachen Root-Servers noch ausreichen. Im Enterprise Bereich wo die Begriffe Cluster, Load Balancing, etc. eine Rolle spielen muss man einfach sagen ist Magento zu langsam. Aus diesem Grund führt die neue Version einen Full-Page Cache ein. Allerdings keinen wirklichen, dess es gibt doch noch eine Menge dynamik in der Seite. Der neue Cache teilt die Webseite in dynamische und nicht dynamische Bereiche ein. Über eine cache.xml die in jedem Modul liegen bekommt Magento mitgeteilt wie es einen Block im Layout behandeln soll. Jedem Block kann ein eigenes Cache Model zugewiesen werden da z.B. eine Kategorie anders als ein persönlicher Begrüßungstext zu handhaben ist. Das hört sich auf den ersten Blick gut an. Allerdigns zeitgt die Praxis, dass man nun noch weniger versteht was im System passiert. Der Block selbst könnte ebenfalls noch vom Standard-Block-Caching gecached sein. Eine Dokumentation fehlt wie immer. Man muss sich das Wissen durch durchsichten des Codes aneigenen. Das kann so nicht sein. Ein System mit >1 Mio. Zeilen Code kann nicht jedesmal neu gesichtet werden. Ebenfalls neu ist ein Manager für Kunden- und Kunden-Adress-Attribute. Es lassen sich jetzt analog zum gewohnten Anlegen z.B. bei den Produkten die Attribute direkt über eine GUI anlegen. Das klingt auch wieder schön. Der negative Part (und mal wieder nicht in einer einzigen Zeile erwähnt) ist, dass vorher über die API von Magento angelegte Attribute nicht richtig migriert werden. Die Attribute werden dann zwar im neuen Manager angezeigt. Allerdings kann man nicht speichern. Und was noch besser ist... sind Attribute z.B. im Checkout eingebaut, dann werden diese nicht mehr gespeichert und zwischen Quote / Adressen usw. weitergereich. Es sind nämlich jetzt mindestens 5 Tabellen im Spiel in denen nun Daten fehlen da nicht korrekt migriert wurde. Die Attribute müssen nun einzelnen Formularen mit Elementen und Fieldsets zugewiesen werden (gilt nur für die Enterprise Editon). Die Lösung des Problems ist auf Datenbankebene die Attribute zu bearbeiten und zwar die Spalte "is_used_definied" in der Tabelle "eav_attribute". Dies kann auch gerne über ein Update Script eines eigenen Moduls geschehen. Danach ist das Speichern über den neuen Manager möglich und Magento erstellt die notwendigen Einträge in einen Tabellen. Das Speichern im Checkout funktioniert dann ebenfalls. Umgestellt wurde auch die Speicherung der Bestellungen. Diese sind nun komplett flach. Das heisst, das man sich ebenfalls um die Anlage seiner Attribute die in den Bestellungen hinzugefügt wurden selbst kümmern muss. Das wird wie erwartet nicht von Magento übernommen. Besonder schön ist, die nicht eingehaltene Abwärtskompatibilität. Warum kann man etwas nicht fertigstellen und dann auf den Markt werfen? Oder alte Features wenigstens für einen Release als Deprecated markieren? Immerhin bietet PHP die Möglichkeit mittels des Werfens einer E_DEPRECATED Warnung. Abwärtskompatibel? Das sieht anders aus! Eine Bitte an Magento: Nicht nur neue Features auf den Markt werfen sondern auch mal was dokumentieren. Es kann doch nicht sein, dass man es nicht hinbekommt einen Migration Guide für die Entwickler bereitzustellen in dem die groben API Änderungen enthalten sind. <![CDATA[D-Bus unter PHP nutzen]]> 2010-05-23T14:08:51+02:00 2010-05-23T14:30:13+02:00 http://blog.muench-worms.de/de/artikel.12.html?news_details[id]=83 Christian Münch nospam@example.com http://www.example.com Das unter Linux benutzte D-Bus System wird meistens via Python angesteuert. Man kann D-Bus allerdings auch mit PHP über die PECL Extension "dbus" nutzen. Im folgenden Artikel beschreibe ich kurz wie man mit PHP das Notizprogramm Tomboy ansteuern kann und alle Notizen auslesen kann. DBus für PHP installieren Zum Starten muss zuerst über den PECL Installer das PHP Modul installiert werden. Ich nutze das aktuelle Ubuntu Linux 10.04 mit installiertem PHP. Unter Ubuntu sollte der PECL Installer bereits vorinstalliert sein. Ansonsten kann dieser mit dem PEAR Installert ausgeliefert werden. Auf der Konsolte genügt der Aufruf von "pecl install dbus" damit dieser die C-Quelldateien läd und über phpize das PHP Modul konfiguriert und kompiliert. Wenn alles durchgelaufen ist wurde eine neue Shared Objekt Datei "dbus.so" erstellt. Unter Windows wahrscheinlich "dbus.dll". Diese muss in der php.ini Datei registriert werden. Hier einfach die folgenden Zeilen in die php.ini (am besten im dafür vorgesehenen Bereich in der php.ini) eintragen: extension = dbus.so Da ich php-cli nutze muss keine Webserverkonfiguration neu geladen werden wodurch wir hier mit der Installation von DBus für PHP schon fertig sind. Das Beispielprogramm <?php if (!extension_loaded('dbus')) { die('Extension dbus is not loaded'); } $dbus = new Dbus(Dbus::BUS_SESSION, true); $tomboy = $dbus->createProxy( 'org.gnome.Tomboy', '/org/gnome/Tomboy/RemoteControl', 'org.gnome.Tomboy.RemoteControl' ); $noteTitles = $tomboy->ListAllNotes(); // gibt ein DBusArray Objekt zurück foreach ($noteTitles->getData() as $noteUri) { //echo $noteTitle = $tomboy->GetNoteTitle($noteUri); // Ausgeben des Titels echo $tomboy->GetNoteContents($noteUri); // Ausgeben der kompletten Notitz } Wer selbst ein wenig mit DBus und Tomboy spielen möchte findet eine Beschreibung der Tomboy Api in einem Artikel von Ryan Paul. Der Code ist dort allerdings in Python. Ein Mapping der Methoden ist aber durchaus in kurzer Zeit möglich. Kleiner Tipp zum selber programmieren: Die Desktop-Notfications lassen sich auch sehr leicht in die eigene Anwendung integrieren. Viel Spass beim Ausprobieren. <![CDATA[Memory Limit in Zend Studio 7.1.1 für Debugger/Profiler erhöhen]]> 2010-02-27T11:43:48+01:00 2010-03-14T22:48:12+01:00 http://blog.muench-worms.de/de/artikel.12.html?news_details[id]=81 Christian Münch nospam@example.com http://www.example.com Beim Debuggen / Profile mit ZendStudio gerät man schnell an Grezen. Zum Beispiel wenn man die Kategorieseite des Magento Shops profiled. Wer hier auch Probleme hat und ein wenig RAM im Rechner für PHP bereitstellen kann sollte die php.ini des Debuggers anpassen. Diese findet Ihr im Verzeichnis "./plugins/org.zend.php.debug.debugger.linux.x86_64_5.3.7.v20091116/resources/php5/php.ini" des Studio Installation (bei mir aktuelle Version 7.1.1). Dort einfach das memory_limit setzen. z.B. memory_limit=1024M Danach "kurz" das ZendStudio neu starten. Und schon sollte der der Debugger wieder debuggen. <![CDATA[Die Version 1.10.0 des Zend Frameworks vorgestellt]]> 2010-01-30T14:49:55+01:00 2010-03-14T22:48:40+01:00 http://blog.muench-worms.de/de/artikel.12.html?news_details[id]=80 Christian Münch nospam@example.com http://www.example.com Der Reference Guide Das Handbuch hat ein komplett neues Kapitel bekommen das Anfängern den Einstieg erleichtern soll. Das Kapitel gibt praktische Tipps für den Umgang mit Basiskomponenten wie z.B. der View, Session oder zum Thema Authentifizierung. Alles ist mit kleinen Codebeispielen unterlegt. Hier gilt dem gesamten Zend Framework Team ein Dank. Das Kapitel eignet sich in Kombination mit dem Quick Start Tutorial um z.B. neue Mitarbeiter mit dem neuen Framework vertraut zu machen. Eine tolle Sache ist auch, dass nun die vorherigen Versionen ebenfalls als Handbuch zur Auswahl stehen. Dies minimiert Verwirrungen, wenn einmal an einem älteren Projekt gearbeiter werden muss. Ein kurzer Blick in das alte Handbuch kann hier Wunder wirken. In diesem Zug wurde auch der DocBook Renderer auf PhDumgestellt. Es wird nun kein xsltproc mehr gebraucht. Die DocBook Engine kann komplett über PEAR nachinstalliert werden. Der Rendervorgang konnte durch den Umstieg auch beschleunigt werden da nun auch einzelne Teile des Handbuchs einzeln kompiliert werden können. Komponenten Zend_Barcode, von Mickael Perraud Zend_Barcode ist als komplett neue Komponete in das Framework gekommen. Es stehen einige Barcode-Format zur Verfügung. Mittels Renderer-Klassen kann ein Barcode in verschiedenen Formaten generiert werden. Zur Zeit kann der Barcode als Bild oder in ein PDF generiert werden. Zend_Cache_Backend_Static, von Pádraic Brady Ein neues Cache Backend ist wie immer dazugekommen. Der Static-Cache dient vorallem dazu generierte Seiten zu statifizieren. Dies ist vorallem für Anwendungen wie ein CMS interessant. Der Cache wird mit einem Pfad zu einem öffentlichen Verzeichnis initialisiert. Danach kann über eine Änderung in der .htaccess Datei eine Seite komplett aus dem Cache ausgeliefert werden. Leider ist das neue Cache Backend zur Zeit nicht im Handbuch beschrieben. Zend_Cache_Manager, von Pádraic Brady Der Cachemanager standardisiert den Zugriff auf verschiedene Cache Instanzen in der Anwendung. Zudem ist es über das Bootstrapping nun möglich verschiedene Caches über eine Konfiguration auf einen Schlag zu erstellen. Ein weiterer Vorteil ist, das die Cache Instanzen nun erst bei wirklichen Zugriff erstellt werden. Dies sorgt für eine verbesserte Performance. Zend_Exception, von Marc Bennewitz Alle Klassen die von Zend_Exception angeleitet wurden habe nun die Möglichkeit eine vorangegangen Exception zu erhalten. Diese Funktionalität wurde in PHP 5.3 eingeführt und wird über Zend_Exception auf für PHP 5.2 simuliert. Zend_Feed_Pubsubhubbub, von Pádraic Brady Unterstützung des Pubsub Protokoll zur Echtzeitverarbeitung von XML-Feeds. Zend_Feed_Writer, von Pádraic Brady Nach dem Reader gibt es nun auch den Writer. Der Writer kann News-Feeds erzeugen. Die neuen Komponente dient als Ersatz für die Komponente Zend_Feed_Builder. Zend_Filter_Boolean, von Thomas Weidner Wie der Name besagt filtert die Klasse "boolean" Werte. Zend_Filter_Compress/Decompress, von Thomas Weidner Die Filter sind zum komprimieren und de-komprimieren von Daten gedacht. Es stehen folgende Methoden zur Verfügung: bz2, gz, lzf, rar, tar, zip. Die jeweiligen Methoden setzen die entsprechenden Bibliotheken in PHP vorraus. Achtung! Nicht alle Adapter unterstützen die gleichen Eingabedaten. So können nicht alle Adapter "Strings", "Dateien" oder "Verzeichnisse" verarbeiten. Zend_Filter_Null, von Thomas Weidner Der Nullfilter ist vorallem dafür gemacht bestimmte Leereingaben wie z.B. einen Leerstring in NULL umzuwandeln. Das ist wichtig, wenn die Daten eines Formulars direkt in eine Datenbanktabelle geschrieben werden sollen und die entsprechende Spalte NULL erwartet. Zend_Log::factory(), von Mark van der Velden und Martin Roest Einfache Factory-Methode zum Erzeugen von Log-Adaptern. Zend_Log_Writer_ZendMonitor, von Matthew Weier O'Phinney Ein neuer Log-Adpater zum direkten loggen in einen Zend Server. Der Zend Server stelle Echtzeit die Log-Informationen dar. Zend_Markup, von Pieter Kokx Die komplett neue Komponente besteht aus einer Parser und einem Renderer. Das Ziel ist es z.B. Texte mit bestimmter Syntax wie einem Wiki-Code zu verarbeiten. Über den Renderer soll dies auch in die andere Richtung Möglich sein. Momentan wird BBCode unterstützt. Zend_Oauth, von Pádraic Brady Der OAuth Standard dient vorallem zur Authentifizierung von Anwendungen zueinander. Ein Beispiel für den Einsatz von OAuth ist eine Anwendung die sich mit Twitter verbindet und Daten austauscht. Die neue Komponente lag schon längere Zeit im Incubator und sollte somit Stabil sein. OAuth ist eine klassische Web 2.0 Komponente deren Einsatz wahrscheinlich in Zukunft noch mehr an Bedeutung gewinnen wird. Hoffentlich wird die Komponente besser gepflegt als z.B. Zend_OpenId was nicht mehr dem Stand der Technik entspricht. Zend_Serializer, von Marc Bennewitz Über den Serializer können PHP Typen abgelegt und wiederhergestellt werden. Das Format der Serialisieren ist über Adapter steuerbar. So steht z.B. ein Adapter zur Auswahl der das exportieren eines PHP Objekt über AMF gestattet damit Flash das Objekt importieren kann. Zend_Service_DeveloperGarden, von Marco Kais DeveloperGarden ist eine von der Deutschen Telekom bereitgestellte Plattform mit Diensten aus dem Telekommunikationsumfeld. Über DeveloperGarden können z.B. SMS mittels des T-Online SMS Gateway verschickt werden. Auch das Aufbauen von Voice-Calls ist über den Webservice möglich. Zend_Service_LiveDocx, von Jonathan Marron Unterstützung der Microsoft LiveDocs Plattform. Zend_Service_WindowsAzure, von Maarten Balliauw Zugriff auf die Microsoft Cloud Plattform Azure. Zend_Validate_Barcode, Zend_Validate_Callback, Zend_Validate_CreditCard, Zend_Validate_PostCode, von Thomas Weidner Eine ganze Liste von neuen Validatoren stammen von Thomas Weidner. Die Kompontenten sind die logische Folge anderer Komponenten. Der Kreditkartenvalidator ist wahrscheinlich der erste Ableger der neuen Varien (die Firma hinter dem Magento-Shop) und Zend Kooperation. Zend_Pdf Hier konnte die Geschwindigkeit beim Auslesen von PDF Dokumenten um bis zu 40% gesteigert werden. Fazit Insgesamt macht das neue Zend Framework (wie fast immer) einen sehr guten Eindruck. In der Zwischenzeit wird fieberhaft am Konzept der Version 2.0 gearbeitet die dann auch Namespaces unterstützen wird und >= PHP 5.3 vorraussetzen wird.Bleibt abzuwarten ob es noch ein ZF 1.11.0 geben wird. <![CDATA[Manege frei für das Zend Framework 1.8]]> 2009-05-01T14:25:12+02:00 2010-03-14T22:48:51+01:00 http://blog.muench-worms.de/de/artikel.12.html?news_details[id]=79 cmuench nospam@example.com http://www.example.com Das neue Framework 1.8 ist nun raus... *freu* Hier eine grobe Liste meiner Erfahrungen mit der Version 1.8 die ich seit einer Woche benutze. Die Liste ist nicht vollständig soll aber trotzdem einen kurzen Überblick über neue Dinge in der Version 1.8 geben. Für mich besonders auffällig ist das Bestreben aus dem Zend Framework jetzt wirklich ein Framework zu machen. Die Kritik dass, es nur reine Sammlung von PHP Klassen wäre kann nun seit der Version 1.8 nicht mehr gelten. Komponenten wie Zend_Application und Zend_Tool bieten nun auch Scaffolding, was man vielleicht aus Rails kennt. Im Hintergrund nutzt Zend_Tool die neue Komponente Zend_CodeGenerator, welche "on the fly" PHP Code generieren kann. Ergänzt wird diese durch den vereinfachten lesenden Zugriff via Zend_Reflection (Beispiel am Ende des Artikels). Zend_Loader Der alte Autoloader "Zend_Loader::autoloader" der über "Zend_Loader::registerAutoload" registriert wurde ist nun als deprecated markiert. Man sollte nun den neuen Zend_Loader_Autoloader nutzen. Die API Änderung ist nicht sehr schon, dafür entschädigt der neuen Autoloader mit einigen neuen Funktionen. So lassen sich nun Namespaces definieren. Beispiel: // Register autoloader require_once 'Zend/Loader/Autoloader.php'; $autoLoader = Zend_Loader_Autoloader::getInstance(); $autoLoader->registerNamespace('Inmon_'); Es lassen sich sogar Autoloader aus anderen Frameworks verwenden: Beispiel ezComponents: $autoloader->pushAutoloader(array('ezcBase', 'autoload'), 'ezc'); Toll ist auch der neue Resource Loader, der Plugins, Helper, Models, Formulare usw. laden kann. Dieser kann z.B. in einer Bootstrap Klasse innerhalb eines Module initialisiert werden. Dafür bietet Zend_Application die neue Klassen Zend_Application_Module_Bootstrap. Die Bootstrap sollte direkt im Modul-Verzeichnis liegen. Beispiel einer Modul-Bootstrap für ein Admin-Modul: 'Admin', 'basePath' => dirname(__FILE__), )); return $autoloader; } } Zend_Application sucht in jedem Modul nach der Klasse Bootstrap. Wird diese gefunden werden alle "_init" Methoden automatisch ausgeführt. Im vorherigen Fall wird der Autoloader für das Modul initalisiert. Der Autoloader initialisiert alle Pfade selbständig. Der Zend_Application_Module_Autoloader kann von Haus aus folgende Resourcen laden: Forms Plugins Models DbTables Services View Helper View Filter Zend_Application Zend_Application ist eine neue Komponente die es erlaubt die Initialisierung und den Zugriff auf Resourcen wie z.B. Datenbankverbindungen, Helper usw... zu standadisieren. Die Komponente erlaubt es eigene Resourcen zu definieren und deren Konfiguration in einer Zend_Config zu verwalten. Es stehen bereits einiges Standard-Resourcen wie z.B. FrontController, View, Router, Db, Layout, Translate, Session bereit. Nutzt man Zend_Application durchgängig kann man Resourcen die man in verschiedenen Anwendungen verwendet erneut benutzen. Es ist zudem möglich die Module der Anwendung über Zend_Application zu konfigurieren. Dies wird intern durch die Resource Zend_Application_Resource_Modules durchgeführt. Achtung!: Damit diese initialisiert wird muss in der Konfiguration ein Eintrag für die Resource bestehen. In meinem Fall muss folgender Eintrag in der Ini Datei (funktioniert auch mit XML) stehen. ; Modules resource -> Ohne diesen Eintrag werden die Module-Konfiguration nicht geladen! resources.modules = ; Beispiel für das Überschreiben einer Datenbank Konfiguration innerhalb eines Moduls... ; Dies wird nur für das Modul "mymodule" durchgeführt mymodule.resources.db.params.dbname = "meine_datenbank" Die Komponente kapselt alle Resourcen in kleinere "Bootstraps" die von einer "großen" Bootstrap Klasse angesteuert werden. Durch die neue organistation der Resourcen ist es jetzt auch Möglich für einen Cronjob nur bestimmte Resourcen zu laden. Was auffällt ist, dass man sich auch Gedanken über Abhängigkeiten gemacht hat. Eine genauere Beschreibung würde hier den Rahmen sprengen. Das Handbuch http://www.framework.zend.com/manual/de/zend.application.html gibt hier die restlichen Möglichkeiten preis. Zend_Controller Die Routen unterstüzten nun das Übersetzen von Parametern mittels Zend_Translate. Siehe hierzu: http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.routes.standard.translated-segments Zend_Reflection Das Paket stellt einen Wrapper zur PHP Reflection API dar. Es lässt sich vereinfacht auf Information zugreifen. Beispiel (Methoden Eltern-Klasse innerhalb einer Klasse): $reflectionClass = new Zend_Reflection_Class(__CLASS__); print_r($reflectionClass->getParentClass()->getMethods()); Offizielle Liste der Änderungen http://devzone.zend.com/article/4524-Zend-Framework-1.8.0-Released Zend_Tool, contributed by Ralph Schindler Zend_Application, contributed by Ben Scholzen and Matthew Weier O'Phinney Zend_Loader_Autoloader and Zend_Loader_Autoloader_Resource, contributed by Matthew Weier O'Phinney Zend_Navigation, contributed by Robin Skoglund Zend_CodeGenerator, by Ralph Schindler Zend_Reflection, Ralph Schindler and Matthew Weier O'Phinney Zend Server backend for Zend_Cache, contributed by Alexander Veremyev Zend_Service_Amazon_Ec2, contributed by Jon Whitcraft Zend_Service_Amazon_S3, Justin Plock and Stas Malyshev Incorporated Dojo 1.3 Added support for arbitrary Dojo Dijits via view helpers Zend_Filter_Encrypt, contributed by Thomas Weidner Zend_Filter_Decrypt, contributed by Thomas Weidner Zend_Filter_LocalizedToNormalized and _NormalizedToLocalized, contributed by Thomas Weidner Support for file upload progress support in Zend_File_Transfer, contributed by Thomas Weidner Translation-aware routes, contributed by Ben Scholzen Route chaining capabilities, contributed by Ben Scholzen Zend_Json expression support, contributed by Benjamin Eberlei and Oscar Reales Zend_Http_Client_Adapter_Curl, contributed by Benjamin Eberlei SOAP input and output header support, contributed by Alexander Veremyev Support for keyword field search using query strings, contributed by Alexander Veremyev Support for searching across multiple indexes in Zend_Search_Lucene, contributed by Alexander Veremyev Significant improvements for Zend_Search_Lucene search result match highlighting capabilities, contributed by Alexander Veremyev Support for page scaling, shifting and skewing in Zend_Pdf, contributed by Alexander Veremyev Zend_Tag_Cloud, contributed by Ben Scholzen Locale support in Zend_Validate_Int and Zend_Validate_Float, contributed by Thomas Weidner Phonecode support in Zend_Locale, contributed by Thomas Weidner Zend_Validate_Db_RecordExists and _RecordNotExists, contributed by Ryan Mauger Zend_Validate_Iban, contributed by Thomas Weidner Zend_Validate_File_WordCount, contributed by Thomas Weidner <![CDATA[Meine Facebook Abmeldung]]> 2009-03-03T11:26:01+01:00 2010-03-14T22:49:03+01:00 http://blog.muench-worms.de/de/artikel.12.html?news_details[id]=78 cmuench nospam@example.com http://www.example.com Aus beruflichen Gründen benötige ich einen Facebook Zugang um Anwendungen zu entwickeln und zu testen. Beim Ausprobieren dachte ich mir "Wo kann ich eigentlich einen Zugang wieder löschen bzw. deaktivieren"? Das geht ganz einfach. Unter "Einstellungen" in der Hauptnavigation und dann unter "Kontoeinstellungen" gibt es ganz unten den Link "Konto deaktvieren". Das geht ja einfach dachte ich. Dann mache ich das doch mal. Doch das Abmelden wird einem nicht leicht gemacht. Als erstes bekommt man in das Gewissen geredet "Die folgenden Freunde werden dich vermissen". Das störte mich aber nicht weiter, da ich innerhalb von Facebook nicht viel mache. Also quasi nichts. Also weiter... Kein Problem. Als nächstes noch den Grund der Abmeldung angegeben mit einem Vermerk, dass dies Facebook eigentlich nichts angeht. Danach noch die Abmeldung mit einem Captcha bestätigt. Doch was dann? Werden wirklich alles Daten deaktiviert? Bei mir kam jedenfalls eine schöne Fehlermeldung. Also nix mit der einfachen Deaktivierung. Schade. Aber wer wird schon was böses Denken? <![CDATA[Gebt dem IE6 den Gandenstoß!]]> 2009-02-20T13:38:34+01:00 2010-03-14T22:49:16+01:00 http://blog.muench-worms.de/de/artikel.12.html?news_details[id]=77 cmuench nospam@example.com http://www.example.com Das der IE6 jeden Web-Entwickler nervt ist nichts neues. Aber was soll man machen, wenn der "Browser" immer noch 10-20% Marktanteil hat? Viele Benutzer wissen nicht, dass es überhaupt andere Browser wie die installierte Krüppelsoftware aus dem Hause Microsoft gibt. Aus diesem Grund hat sich jetzt eine Intiative gegen den IE6 gegründet. Eine ausführliche Beschreibung ist in einem Artikel auf http://www.gulli.com/news/norwegen-internet-explorer-6-2009-02-20/" target="_blank">gulli.de zu finden. Inzwischen gibt es auch ein Wiki der Initaitive. Dort kann man ein Stück Code (CSS-Conditional-Comment) kopieren, dass jedem IE6 Benutzer ein kleines Fenster mit einem Update-Hinweis einblendet. Inwischen gibt es auch z.B. ein Plugin für Wordpress und Drupal, dass die Integration vereinfacht. Ich habe dieses Weblog auch mit dem Code-Schnipsel ausgestattet. Hier der Link zum Wiki: http://ie6.forteller.net/index.php?title=Main_Page#Tools <![CDATA[Bundestrojaner V1.0 fertiggestellt]]> 2009-01-02T12:12:32+01:00 2010-03-14T22:49:43+01:00 http://blog.muench-worms.de/de/artikel.12.html?news_details[id]=75 cmuench nospam@example.com http://www.example.com Das Bundeskriminalamt hat die erste Version der Software fertiggestellt. Jetzt fragt sich natürlich jeder. Läuft die Spionagesoftware auch auf meinem Rechner? Die Antwort ist JA ... ... sagt zumindest Jörg Zierke. Und der ist immerhin der Chef des Bundeskriminalamts. In einem Interview des Sterns sagt er nämlich das der Aufwand beachtlich ist "weil wir jeweils eine eigene Software entwickeln müssen". Diese "Remote Forensic Software (RFS)" sei "eine Software, die immer nur für den Einzelfall erarbeitet wird, ein Unikat, das speziell auf die Rechner-Umgebung eines Verdächtigen zugeschnitten wird." Also wie kann ich mir das in der Praxis vorstellen? Also als erstes versucht ein Ermittlerteam mit einem Netzwerk-Scanner zu erkennen welches Zielsystem vorhanden ist. Dann wird eine spezielle Software für mein (erkanntes) Betriebssystem geschrieben. Also in meinem Falle ein schönes natives Linux Programm. Aber wie kommt das jetzt auf meinen Rechner? Auch hier gibt es eine Antwort von Herrn Zierke. Er sagt das es auch möglich wäre "die Software online über das Internet auf den Computer aufzuspielen". Aha ... da bin ich doch mal gespannt. Kommt dann eine E-Mail mit gefälschtem Absender und einem Anhang? Man darf gespannt sein. Und wie kommen die Daten dann wieder aus meinem Netzwerk raus? Wahrscheinlich gibt es bald ein Update des Bundestrojaners und dann wird Herr Zierke uns das bestimmt in einem Interview melden. <![CDATA[Inkonsistente Interfaces in PHP5]]> 2008-12-24T23:40:26+01:00 2010-03-14T22:50:06+01:00 http://blog.muench-worms.de/de/artikel.12.html?news_details[id]=74 cmuench nospam@example.com http://www.example.com Diese Woche konnte ich eine neue Erkenntnis über die Interfaces von PHP5 erhalten. Ich bin immer davon ausgegangen, dass die Interfaces in PHP5 sehr strikt gehandhabt werden. Als ich im Code der Zend Framework Form Komponente stöberte fiel mir auf, dass innerhalb der Formular Elemente beim Validieren von Daten die isValid Methode der Validatoren aufgerufen wurden. Soweit nichts besonderes. Die Zend Validatoren implementieren das Interface Zend_Validate_Interface. Diese gibt genau drei Methode vor, die zu implementieren ist. Unteranderem die besagte "isValid" Methode die in den Formularen genutzt wird. Diese Methode hat die folgende Signatur. public function isValid($value); Wie man erkennen kann wird genau ein Parameter übergeben. Würde man einen zweiten Parameter übergeben würde dies zu einem "Fatal Error" führen, da das Interface anders definiert wurde. Doch was mich nun wunderte war, dass innerhalb der Formular-Validierung einfach zwei Parameter an isValid übergeben wurden. Nach einem kleinen Testprogramm musste ich feststellen, dass PHP in keiner Weise streng mit den Parametern umgeht. Sobald weitere Parameter folgen und diese mit einem Wert vorbelegt sind ignoriert PHP diese. Beispiel: public function isValid($value, $foo = null, $bar = 123); Die PHP Core-Entwickler haben sich diese krücke wohl gebaut da PHP keine Polymorphie untersützt. Dies ist schlecht da man sich so nicht 100% auf die Interfaces verlassen kann. Die grundsätzlichen Parameter sind dann zwar vorhanden, aber die Sub-Klassen können bei bedarf weitere Parameter übergeben bekommen. Das ist aus meiner Sicht wirklich inkonsistenz. Aber darüber lässt sich sicherlich streiten. Gleiches gilt auf die Workarounds zum Nachbilden von Polymorhie mittels der PHP Funktion "func_get_args" Hoffen wir auf PHP 5.3 - Vielleicht tut sich hier noch ein wenig. <![CDATA[Innerhalb eines View-Helper einen anderen Helper nutzen]]> 2008-12-13T19:33:40+01:00 2010-03-14T22:50:22+01:00 http://blog.muench-worms.de/de/artikel.12.html?news_details[id]=73 cmuench nospam@example.com http://www.example.com Da ich immer mal wieder mitbekomme das einige nicht wissen wie man innerhalb eines View Helpers einen anderen Helper aufrufen bzw. nutzen kann gebe ich hier ein kurzes Beispiel. Wichtig ist das man die eigene Klasse von Zend_View_Helper_Abstract ableitet. Das ist wichtig da die Basisklasse die Eigenschaft "view" bereitstellt und die Methode setView(). Die Methode ist wichtig da diese via "Setter-Injection" befüllt wird. Das heisst das die Funktion automatisch die View innerhalb der Methode "_getPlugin" in der Zend_View Klasse übergeben bekommt. Man muss sich also nicht mehr um das übergeben der View kümmern. Einfacher geht's eigentlich nicht. Wie komme ich jetzt aber zu meinem anderen View Helper? Das ist jetzt ganz einfach. View Helper können direkt über ein View Objekt aufgerufen werden da intern via __call() der entsprechende Helper aufgerufen wird. Beispiel für einen Helper: require_once 'Zend/View/Helper/Abstract.php' class MyModule_View_Helper_MyHelper extends Zend_View_Helper_Abstract { public function myHelper() { return $this->view->partial('myfile.phtml', array('foo' => 'bar')); } } Was passiert hier? Die View ist bereits übergeben und kann so intern benutzt werden. Das Property \"view\" hält das Objekt. Der Partial Helper wird direkt über das View Objekt instanziert. Intern benutzt die Zend_View den PluginLoader und läd bei bedarf den entsprechenden Helper. Das kann uns aber egal sein. Wir brauchen nur die richtige Basis-Klasse ableiten