Christian's WeblogAktuelles um mich, das Zend Framework und PHP Allgemein2010-08-27T19:57:25+02:00INMON Enterprise CMShttp://blog.muench-worms.de/de/startseite.10.html?news_list[feed]=1&news_list[format]=atomchristian@muench-worms.denospam@example.comhttp://www.example.comchristian@muench-worms.de2010-08-11T07:59:33+02:002010-08-11T13:19:06+02:00http://blog.muench-worms.de/de/artikel.12.html?news_details[id]=84Christian Münchnospam@example.comhttp://www.example.comDiese 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.2010-05-23T14:08:51+02:002010-05-23T14:30:13+02:00http://blog.muench-worms.de/de/artikel.12.html?news_details[id]=83Christian Münchnospam@example.comhttp://www.example.comDas 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 installierenZum 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.soDa 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.2010-02-27T11:43:48+01:002010-03-14T22:48:12+01:00http://blog.muench-worms.de/de/artikel.12.html?news_details[id]=81Christian Münchnospam@example.comhttp://www.example.comBeim 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=1024MDanach "kurz" das ZendStudio neu starten.Und schon sollte der der Debugger wieder debuggen.2010-01-30T14:49:55+01:002010-03-14T22:48:40+01:00http://blog.muench-worms.de/de/artikel.12.html?news_details[id]=80Christian Münchnospam@example.comhttp://www.example.comDer Reference GuideDas 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.KomponentenZend_Barcode, von Mickael PerraudZend_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
BradyEin 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 BradyDer 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 BennewitzAlle 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 BradyUnterstützung des Pubsub Protokoll zur Echtzeitverarbeitung von
XML-Feeds.Zend_Feed_Writer, von Pádraic BradyNach 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 WeidnerWie der Name besagt filtert die Klasse "boolean" Werte.Zend_Filter_Compress/Decompress, von Thomas
WeidnerDie 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 WeidnerDer 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
RoestEinfache Factory-Methode zum Erzeugen von Log-Adaptern.Zend_Log_Writer_ZendMonitor, von Matthew Weier
O'PhinneyEin neuer Log-Adpater zum direkten loggen in einen Zend Server.
Der Zend Server stelle Echtzeit die Log-Informationen dar.Zend_Markup, von Pieter KokxDie 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 BradyDer 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
KaisDeveloperGarden 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 MarronUnterstützung der Microsoft LiveDocs Plattform.Zend_Service_WindowsAzure, von Maarten
BalliauwZugriff auf die Microsoft Cloud Plattform Azure.Zend_Validate_Barcode,Zend_Validate_Callback,Zend_Validate_CreditCard,Zend_Validate_PostCode, von Thomas
WeidnerEine 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.FazitInsgesamt 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.2009-05-01T14:25:12+02:002010-03-14T22:48:51+01:00http://blog.muench-worms.de/de/artikel.12.html?news_details[id]=79cmuenchnospam@example.comhttp://www.example.comDas 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_LoaderDer 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:FormsPluginsModelsDbTablesServicesView HelperView FilterZend_ApplicationZend_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_ControllerDie 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-segmentsZend_ReflectionDas 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 Änderungenhttp://devzone.zend.com/article/4524-Zend-Framework-1.8.0-ReleasedZend_Tool, contributed by Ralph SchindlerZend_Application, contributed by Ben Scholzen and Matthew Weier
O'PhinneyZend_Loader_Autoloader and Zend_Loader_Autoloader_Resource,
contributed by Matthew Weier O'PhinneyZend_Navigation, contributed by Robin SkoglundZend_CodeGenerator, by Ralph SchindlerZend_Reflection, Ralph Schindler and Matthew Weier
O'PhinneyZend Server backend for Zend_Cache, contributed by Alexander
VeremyevZend_Service_Amazon_Ec2, contributed by Jon WhitcraftZend_Service_Amazon_S3, Justin Plock and Stas MalyshevIncorporated Dojo 1.3Added support for arbitrary Dojo Dijits via view helpersZend_Filter_Encrypt, contributed by Thomas WeidnerZend_Filter_Decrypt, contributed by Thomas WeidnerZend_Filter_LocalizedToNormalized and _NormalizedToLocalized,
contributed by Thomas WeidnerSupport for file upload progress support in Zend_File_Transfer,
contributed by Thomas WeidnerTranslation-aware routes, contributed by Ben ScholzenRoute chaining capabilities, contributed by Ben ScholzenZend_Json expression support, contributed by Benjamin Eberlei
and Oscar RealesZend_Http_Client_Adapter_Curl, contributed by Benjamin
EberleiSOAP input and output header support, contributed by Alexander
VeremyevSupport for keyword field search using query strings,
contributed by Alexander VeremyevSupport for searching across multiple indexes in
Zend_Search_Lucene, contributed by Alexander VeremyevSignificant improvements for Zend_Search_Lucene search result
match highlighting capabilities, contributed by Alexander
VeremyevSupport for page scaling, shifting and skewing in Zend_Pdf,
contributed by Alexander VeremyevZend_Tag_Cloud, contributed by Ben ScholzenLocale support in Zend_Validate_Int and Zend_Validate_Float,
contributed by Thomas WeidnerPhonecode support in Zend_Locale, contributed by Thomas
WeidnerZend_Validate_Db_RecordExists and _RecordNotExists, contributed
by Ryan MaugerZend_Validate_Iban, contributed by Thomas WeidnerZend_Validate_File_WordCount, contributed by Thomas
Weidner2009-03-03T11:26:01+01:002010-03-14T22:49:03+01:00http://blog.muench-worms.de/de/artikel.12.html?news_details[id]=78cmuenchnospam@example.comhttp://www.example.comAus 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?2009-02-20T13:38:34+01:002010-03-14T22:49:16+01:00http://blog.muench-worms.de/de/artikel.12.html?news_details[id]=77cmuenchnospam@example.comhttp://www.example.comDas 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#Tools2009-01-02T12:12:32+01:002010-03-14T22:49:43+01:00http://blog.muench-worms.de/de/artikel.12.html?news_details[id]=75cmuenchnospam@example.comhttp://www.example.comDas 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.2008-12-24T23:40:26+01:002010-03-14T22:50:06+01:00http://blog.muench-worms.de/de/artikel.12.html?news_details[id]=74cmuenchnospam@example.comhttp://www.example.comDiese 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.2008-12-13T19:33:40+01:002010-03-14T22:50:22+01:00http://blog.muench-worms.de/de/artikel.12.html?news_details[id]=73cmuenchnospam@example.comhttp://www.example.comDa 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