18.04.2007 - Zend_Db_Table in Javascript

Da hat sich wieder jemand einige Gedanken gemacht, wie man es einem erleichtern kann, in AJAX Applikationen, mit Zend_Db_Table zu arbeiten. Dieser Jemand ist war und ist Maurice Fonk. In seinem Blog beschreibt er sein JsTable getauftes Projekt, wie folgt:

JsTable is a Prototype class that allows you to work with Zend_Db_Table objects directly from Javascript. It has mechanisms for basic communication with a server that holds the ‘real’ models. It gets it’s information in Json, either synchronously or asynchronously.

Ich finde dieses Projekt sehr interessant, jedoch hat es, wie schon im Artikel beschrieben und im ersten Kommentar von Greg noch einige Sicherheitsprobleme, wodurch ich derzeit noch jedem davon abrate es zu nutzen. Testen kann man es aber für den öffentlichen Einsatz ist es meiner Meinung noch nicht geeignet. Ich habe mir das für das Projekt mal ein Lesezeichen angelegt und ich werde auch die Diskussion in der Zend Framework Mailinglist verfolgen.


14.03.2007 - Bug Report ZF-1018 fixed

18

In der Revision 3916 des Zend Frameworks wurde der, von mir gemeldete, Bug gefixed. Beim Testen von Zend_XmlRpc_Server hatte ich das Problem, dass meine Requests nicht angenommen wurden. Fehler war dahingehend, dass alle Parameter als "void" gekennzeichnet wurde und dem war eben nicht so und zudem gibt es keine Fuktionen/Methoden mit mehr als einem "void" in der Parameterliste. Nach langem hin und her kam heraus, dass der Fehler daran liegt, dass ich bei den phpDoc´s in meinem Code mehrere Leerzeichen zwischen dem Tag und dem Datentyp bzw. der Beschreibung geschrieben habe. Die Lösung war dann schnell geschaffen, denn es fehlten lediglich an 4 Stellen im Code in regulären Ausdrücken jeweils ein "+" (Plus).

Dahingehend ein Danke an Matthew Weier O'Phinney, der diesen Bug heute Mittag gefixed und ins SVN eingespielt hat.


11.03.2007 - Fedora: smolt

39

Seit einiger Zeit werden vom Fedora Project Informationen vom PC gesammelt. Hört sich nun schlimmer an als es ist. Im Gegensatz zu Microsofts Windows wird es bei Fedora nur mit expliziter Zustimmung gemacht und man bekommt auch eine URL wo man seine Daten einsehen kann. Dieses Sammeln der Informationen ist für die (Weiter-)Entwicklung von einem Betriebssystem, aber auch von allen anderen Softwareprodukten, sehr nützlich, denn so kann man sehen, wo man mehr Arbeit in die Entwicklung stecken soll und wo die Entwicklung schon gut funktioniert. Ich habe meine Daten jedenfalls auch mal für das Projekt hochgeladen und ich hoffe, dass es noch einige mehr machen.


06.03.2007 - Wo bin ich!?

Gute Frage, aber derzeit habe ich nicht viel zu erzählen und ich arbeite grade öfters an einer neuen Version des Blogs und versuche den Blog in den nächsten 1-2 Monaten auf einen Stand zu haben, dass man ihn auch mal Live testen kann. Derzeit sitze ich an einem XML-RPC Backend für die Administration, jedoch will die Zend_XmlRpc_Server Klasse meine Requests nicht so handhaben, wie ich es will und von daher hakt es da ein wenig. Zudem musste ich vor paar Tagen Anpassungen an meinem Code machen, da z.B. Zend_Filter::Int() nun zu Zend_Filter_Int::filter() geworden ist und das musste erstmal ausgebessert werden.

Ich werde mal schauen, ob ich in nächster Zeit vielleicht mal öfters über die Neuerungen an meinen Blog berichte, denn da sind doch schon einige spannende Sachen bei.


22.02.2007 - Zend Framework 0.8.0 ist da

18

Seit gestern gibt es ein neues Release des [url=http://framework.zend.com/]Zend Frameworks[/url]. Wenn man sich mal die [url=http://framework.zend.com/changelog]Changelog[/url] anschaut, dann sieht man mal wie da derzeit reingehauen wird um bald endlich die Version 1.0 zu präsentieren. Diese soll, laut Roadmap, Ende März kommen und dann wird das Zend Framework sicherlich nochmal einen großen Schub bekommen, denn dann ist das Framework endlich auf einen Stand, mit dem man produktiv arbeiten können soll. Das wird dahingehend noch sehr viele hinzuziehen, die sich bisher noch nicht getraut haben was damit zu machen, da sich noch zu oft was ändert.

Wenn man sich mal meinen eingesetzte Version des Zend Frameworks anschaut, dann sieht man mal wie alt die Version ist. Ich nutze noch die Version 0.2.0 mit Revision 1478 und aktuell gibt es nun Version 0.8.0 mit Revision um 3500.

Stolz auf diesen Release bin ich auch, da zwei meiner Reports für diese Version beachtet wurden und sogar geschriebener Patch (#ZF-728) für Zend_Log_Adapter_Db eingespielt wurde. Somit gehört mir zumindest schonmal eine Zeile im Code des Zend Frameworks.


08.02.2007 - Privates mal ganz Öffentlich II

Hinweis: Dieser Artikel bezieht sich auf Privates mal ganz Öffentlich.

Aus dem deutschen Zend Framework Forum ging die Diskussion nun in die Mailinglist des Zend Frameworks und das eigentliche Problem hat sich herausgefiltert. Der Fehler ist nicht, dass man private Eigenschaften, die Objekte beinhalten, manipulieren kann, sondern dass bei einem Array-Typecast die protected und private Eigenschaften auch rüberkommen. Bei dem Typecast sollten theoretisch nur als public deklarierte Eigenschaften in einen Array umgewandelt werden, dann würde sich das genauso verhalten wie folgender Code:

<?php

class ForeachTest {
    public 
$a 'test_a';
    protected 
$b 'test_b';
    private 
$c 'test_c';
}

$oForeachTest = new ForeachTest;
foreach (
$oForeachTest as $sKey => $mValue) {
    echo 
$sKey ' => ' $mValue;
}

?>

Bei diesem Code werden nur die öffentlichen (public) Eigenschaften beachtet. Ein Array-Typecast soll sich also genau verhalten und nur die public Eigenschaften beinhalten. Mal schauen was draus wird. Ich hoffe jedoch, dass das anerkannt wird.

a => test_a

08.02.2007 - Privates mal ganz Öffentlich

45

Hinweis: Dieser Artikel wird weitergeführt in Privates mal ganz Öffentlich II.

Programmierern die sich schonmal mit der Objektorientierten Programmierung auseinandergesetzt haben, wissen sicherlich was der Unterschied der verschiedenen Sichbarkeiten (public, protected, private) ist. Diese Sichbarkeiten wurden aus dem Grunde geschaffen um den Zugriff auf einzelne Eigenschaften und Methoden nur für bestimmte Zwecke freizugeben. Für die, die nun noch nicht wissen, was die Sichbarkeiten genau sind, nochmal ein kleiner Exkurs.

Es gibt in PHP und vielen anderen Sprachen drei Sichbarkeiten (andere Sprachen können auch mehr haben). Zu diesen Sichtbarkeiten zählen public (öffentlich), protected (geschützt) und private (privat). Alle Methoden und Eigenschaften in Klassen die als public deklariert sind können innerhalb der Klasse sowie von ausserhalb durch eine Instanz genutzt werden. Sie sind für alle öffentlich verfügbar. Ist eine Methode oder eine Eigenschaft als protected deklariert, so ist sie nur aus der eigentlichen Klasse und allen erbenden Klassen verfügbar. Der Zugriff von aussen ist somit nicht mehr möglich. Als private deklarierte Methoden und Eigenschaften gelten nur in der Klasse, in der sie deklariert wurden.

Bei PHP gab es hinsicht auf die Sichtbarkeit schon einige Diskussionen, aber nun habe ich vor einigen Wochen durch Zufall herausbekommen, wie man an protected und private Eigenschaften kommt. Wenn man nun ein wenig zurückdenkt, so habe ich erklärt, dass sie nur für die eigentliche Klasse und alle erbenden Klassen verfügbar sind. Aufgefallen ist mir dies beim Arbeiten mit der Zend_Config-Klasse bei der ich ein Objekt zu einem Array umwandeln wollte und einfach mal einen Array-Typecast genutzt habe. Primär war mir dabei aufgefallen, dass mir bei einer Ausgabe mittels Zend::dump() bzw. var_dump() irgendwelche Zeichen untergekommen waren, die es sogar verhinderten die Ausgabe in den Zwischenspeicher zu kopieren. Erst dachten wir, dass es an einem falschen Zeichensatz liegt, aber es wird wohl mitunter ein Sicherheitsaspekt sein. Trotz dessen habe ich weitergeschaut und herausgefunden, wie man an, als protected und private deklarierte, Eigenschaften kommt. Am besten kann ich das mit einem Beispiel erklären.

<?php

class Visibility
{
    private 
$privProp;
    public function 
__construct() {
        
$this->privProp = new stdClass;
        
$this->privProp->bImportant true;
    }
    public function 
isImportant() {
        return 
$this->privProp->bImportant;
    }
}

?>

Hier haben wir die Visibility (engl. Sichtbarkeit) Klasse, die eine private Eigenschaft beinhaltet. Beim Erzeugen einer Instanz der Klasse wird im Konstruktor die private Eigenschaft privProp mit einem Objekt der Klasse stdClass gefüllt. Diesem Objekt geben wir dann ebenfalls noch eine Eigenschaft (public) namens bImportant. Sie beinhaltet einen boolschen Wert und ist wichtig für den weiteren Verlauf. Okay, in diesem Beispiel ist diese Eigenschaft eher unwichtig aber wir stellen uns nun einmal vor, dass dort ein wichtiger Status gespeichert wurde, der unbedingt für den weiteren Verlauf benötigt wird. Die Methode isImportant() macht nichts als den Wert der Eigenschaft bImportant zurückzugeben. Wir erwarten nun also, dass die Methode true zurückgibt. Hier nun ein weiteres Beispiel:

<?php

$oVisibility 
= new Visibility;
var_dump($oVisibility->isImportant()); // true

?>

Das hat ja bis dahin super geklappt, die Methode gibt, wie erwartet true zurück. Laut der Definition der Sichtbarkeit müsste man sich in diesem Fall voll und ganz darauf verlassen können, denn solange der Code der Klasse nicht geändert wird, kann da auch nichts passieren. Falsch gedacht, denn genau das können wir nicht. Wir können uns noch nicht mal bei private Eigenschaften darauf verlassen, dass drin steht, was vorher mal drin stand. Man nimmt also die Variable $oVisibility und wandelt das beinhaltete Objekt in einen Array:

$aProperties = (array) $oVisibility;

Eine Ausgabe von $aProperties spare ich mir nun, da es genau bei dieser Ausgabe vorkommt, dass da irgendwelche kryptischen Zeichen drin sind, die es verhindern die Ausgabe im Zwischenspeicher zu speichern. Dies tritt aber nur bei private und protected Eigenschaften auf. Soweit sogut, jetzt müssen wir an die Eigenschaft kommen und sie manipulieren. Einen direkten Zugriff haben wir durch die kryptischen Zeichen nicht, also müssen wir alle Eigenschaften durchlaufen und prüfen, ob wir ein Objekt finden, das eine Instanz der Klasse stdClass ist. Haben wir es gefunden, können wir es manipulieren.

<?php

foreach ($aProperties as $mProperty) {
    if (
is_object($mProperty) && ($mProperty instanceof stdClass)) {
        
$mProperty->bImportant false;
    }
}

?>

So, das wärs schon. Haben wir die Eigenschaft gefunden überschreiben wir die Eigenschaft bImportant durch ein false. Fügen wir diesen Codeblock nun in unser Beispiel ein haben wir ein komplett anderes Bild:

<?php

$oVisibility 
= new Visibility;
foreach (
$aProperties as $mProperty) {
    if (
is_object($mProperty) && ($mProperty instanceof stdClass)) {
        
$mProperty->bImportant false;
    }
}
var_dump($oVisibility->isImportant()); // false

?>

Wieso ist denn nun die Ausgabe von isImportant() nicht mehr true? Ja, wie kommt das wohl? Wir haben sie von aussen manipuliert, ohne die eigentliche Klasse zu verändern. Nun ist die Frage, ob dies wirklich im Sinne der PHP Entwickler ist, dass man trotz der Sichtbarkeit, als private und protected deklarierte Eigenschaften manipulieren kann. Meiner Meinung nach ist das ein Bug und sollte behoben werden.


09.01.2007 - Patch für Zend_Log_Adapter_Db::write()

18

Heute stiess ich beim Zend Framework auf kleinere Probleme, die jedoch einen umständlichen Workaround erforderten. Aufgrund einer falschen Benutzung der Zend_Db_Adapter_Abstract::insert()-Methode konnte man die Zend_Log_Adapter_Db::write()-Methode nicht benutzen und musste sich bisher immer einen Workaround schreiben. Nach einer kleinen Diskussion im deutschen Zend Framework Forum habe ich dies gemeldet und einen Patch geschrieben, der diese Probleme löst.

Mal schauen was sich draus entwickelt.


07.12.2006 - Bug in PHP 5.1.2

Heute habe ich einen kleinen Bug in PHP entdeckt, welcher in späteren Versionen jedoch schon gefixed wurde. Fehler ist nur auf Microsoft Windows XP Prof. SP2 getestet.

<?php

    $test 
= array(
        
'data' => array(
            
'persons' => array(
                array(), array(), array()
            )
        )
    );

    foreach(
$test->data->persons as $aPerson) {
        
// ...
    
}

?>

Wird also versucht auf einen Array zuzugreifen, als wäre es ein Objekt, so stürzt sich PHP mit folgender Meldung über den Jordan:

Die Anweisung in "0x10008f4a" verweist auf Speicher in "0x00000000". Der Vorgang "written" konnte nicht auf dem Speicher durchgeführt werden.

Ich habe diesen Bug in den Versionen 4.4.0, 5.1.4 und 5.2.0 getestet und es scheint ein Fehler in der Version 5.1.2 zu sein. Ein Update hilft also.


22.11.2006 - Javascript Texteditor

Aufgrund eines Contests bei WebmasterPro habe ich mich mal ein wenig hingesetzt und habe einen kleinen, einfachen Texteditor geschrieben, der auf Javascript basiert. Über das, von Firebird, bereitgestellte Backend, soll es später möglich sein, dass die einzelnen Tabs und deren Inhalte gespeichert werden. Derzeit ist es lediglich eine temporäre Speicherung und alles wird nach einer Aktualisierung der Seite (F5) zurückgesetzt. Mal schauen, was in nächster Zeit noch von anderen Usern dem Contest beigetragen wird. Curi hat schonmal angemerkt, dass er gerne einen WYSIWYG-Editor erstellen will, ihm jedoch noch kleine Fragen unbeantwortet sind.


16.11.2006 - System Update

39

So, nun habe ich es auch geschafft mein System auf dem Server auf Fedora Core 6 zu bekommen. Es gab zwar kleinere Probleme, aber der Maik, aus meinem Nachbarbüro konnte mir dabei schnell helfen, sodass ich keine lange Zeit verschwendet habe.


16.11.2006 - MySQL FEDERATED Storage Engine

38

Ich habe mich gestern mal gefragt ob es möglich ist eine View zu erstellen, der Daten aus einem anderem Datenbankserver bezieht (beides MySQL-Datenbanken). Ich habe bei Google gesucht und in einigen Foruen rumgefragt aber ne wirkliche Information bzw. Antwort habe ich nirgends bekommen. Durch die PHPUG-OWL kenn ich Hartmut Holzgraefe, welcher bei MySQL arbeitet und da dachte ich mir mal, dass ich ihn mal fragen könnte. Er meinte, dass es nicht direkt geht, ich jedoch die FEDERATED Storage Engine nutzen könnte. Also habe ich in der MySQL Dokumentation gesucht und auch gefunden.

Was ich vor hatte war folgenden. Ich hatte einige Tabellen in denen Daten stehen zu denen ich gerne Statistiken hätte. Da ich dafür aber keine Views auf der Datenbank-A anlegen wollte, da dies lediglich Statistiken für mich werden sollten, wollte ich eine View erstellen auf Datenbank-B, welcher Daten aus der Datenbank-A bezieht und als View darstellt. Nun zur FEDERATED Storage Engine.

Hier mal ein kleines verständliches Beispiel. Auf Datenbank-A gibt es nun eine solche Tabelle:

CREATE TABLE test_info (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    user VARCHAR(50) NOT NULL,
    info VARCHAR(100) NOT NULL,
    status CHAR(1) NOT NULL,
    PRIMARY KEY (id)
) ENGINE=InnoDB;

Dazu will ich nun eine View, die mir angibt, wie oft die Benutzer in der Tabelle vorkommen. Ein View dafür wäre schnell erstellt:

CREATE VIEW ti_view AS
    SELECT
        user, COUNT(0) AS number
    FROM
        test_info
    GROUP BY
        user
    ORDER BY
        number DESC

Problem ist nun halt, dass die View keine Daten aus fremden Datenbankservern beziehen kann. Dafür gibt es nun die Möglichkeit eine Tabelle mit der FEDERATED Storage Engine zu erstellen. Diese Tabelle (Datenbank-B.test_info) muss genau gleich aussehen, wie die Quelltabelle (Datenbank-A.test_info), jedoch wird als ENGINE=FEDERATED genommen und es wird eine CONNECTION angegeben. Dies sieht nun so aus:

CREATE TABLE test_info (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    user VARCHAR(50) NOT NULL,
    info VARCHAR(100) NOT NULL,
    status CHAR(1) NOT NULL,
    PRIMARY KEY (id)
)
ENGINE=FEDERATED
CONNECTION='mysql://username:password@host:port/database/table';

Wie man vllt. schon erkennen kann, gibt man in CONNECTION die Datenbank-Verbindung an. Wenn diese Tabelle nun erstellt ist, kann man ganz einfach einen Query drauf ausführen und dieser gibt genau die Daten zurück, wie als würde man den Query auf der Datenbank-A ausführen. Nun kann darüber einfach eine View erstellt werden und schon hat man eine View für Daten einer anderen Datenbank.

Hinweis: Die FEDERATED Storage Engine ist nur in den MySQL-Max Paketen verfügbar.


13.11.2006 - Fehler bei der Suche

Aufgrund eines, mir noch nicht bekannten Fehlers, kann derzeit die Suche nicht benutzt werden. Aus irgend einem Grund, kann der Lucene Index nicht erstellt werden (auch nicht als root).

Update: Komischerweise geht es nun wieder. Wird wohl ein temporäres Problem gewesen sein. Konnte auch nach langem Suchen keinen Fehler finden, denn am Skript selbst habe ich schon lange Zeit nichts gemacht und nach dem Update, des Zend Frameworks, lief das Skript ja auch noch. Naja, nun läuft wieder alles so, wie es soll.


07.11.2006 - PHP Update installiert

/blog/image/36

Nach langem rumprobieren habe ich es endlich geschafft PHP5.2 zu installieren. Ich habe bei der Installation auch noch einige Extensions, die ich nicht benötige rausgenommen. Zusätzlich habe ich die Extension Suhosin installiert. Auf der Internetseite wird Suhosin wie folgt beschrieben:

Suhosin is an advanced protection system for PHP installations. It was designed to protect servers and users from known and unknown flaws in PHP applications and the PHP core. Suhosin comes in two independent parts, that can be used separately or in combination. [...]

Weitere Informationen können auf der Internetseite von Suhosin nachgesehen werden.


07.11.2006 - Update des Zend Frameworks

18

So, ich habe nun mal wieder die aktuellste Version des Zend Frameworks eingespielt, da vor kurzem die Version 0.2 veröffentlicht wurde. Bisher habe ich keine Fehler finden können, wie beim letzten Update. Mal schauen ob es da irgendwas gibt, was nicht mehr so läuft wie zuvor. In der ChangeLog konnte ich auch nichts direkt finden, was mich betreffen könnte bzw. sich schecht auswirken könnte.


06.11.2006 - Editor von q-rios.de

/blog/image/34

Mein Administrationsbereich wurde nun ein wenig verbessert und das Eintragen von neuen Einträgen um einiges vereinfacht. Ich habe auf der Seite eines Freundes einen kleinen Editor gefunden und diesen habe ich, ein wenig angepasst, in meine Administration dieses Blogs eingebaut. Es gibt einige andere Editoren auf Javascript-Basis, aber die meisten sind komplex oder nur schwer anzupassen. Der Editor von q-rios ist klein, leicht anpassbar und einfach in die eigene Seite zu implementieren.


13.10.2006 - Suche integriert

29

Ich saß gestern sehr lange dran eine geeignete Lösung zu finden, die Einträge in den Index zu packen, aber derzeit unterstützt der Index noch keine Umlaute, also versuchte ich das ganze irgendwie umzuwandeln, sodass es ANSI ist aber nicht wollte so richtig funktionieren. Also habe ich gestern Abend eine E-Mail in die Zend Framework Mailinglist geschrieben. Vor ca. 1 Stunde kam dann eine E-Mail von Natalie Kather, die für die NorthClick GmbH arbeitet. Die NorthClick GmbH arbeitet an einem CMS in das die Java Lucene Lösung des Zend Frameworks integriert werden soll und dabei hatten sie die selben Probleme wie ich. Sie hat darauf einen Artikel geschrieben, in dem sie erklärt, wie man die Einträge passend für den Index konvertiert. Diese habe ich gemacht und es funktioniert super. Ihr könnt ganz einfach einen nach einem Suchbegriff suchen. Falls ihr ein Suchebgriff in den Titeln der Einträge suchen wollt, dann müsst ihr dem Suchbegriff ein "title:" anhängen. Also:

title:umstellung

Dieser Suchstring findet dann alle Einträge, die im Titel den Begiff "umstellung" haben. Wenn ihr nach aktuellen Einträgen suchen wollt, muss ich euch vorerst noch sagen, dass ich mir noch über das automatische indizieren ein paar Gedanken machen muss. Bis dahin müsst ihr euch erstmal mit den Artikeln vor diesem Eintrag zufrieden geben.


10.10.2006 - Eclipse

30

Da mein Zend Studio seit gestern sehr langsam ist, für einen Dateiwechsel >5 Sekunden braucht und auch das Öffnen von Dateien nicht schneller ist, habe ich mir mal Eclipse 3.1 mit den Plugins phpEclipse und subclipse installiert. Also ich muss sagen, dass ich noch nie so schnell von einer IDE begeistert war, wie jetzt. Ein paar Einstellungen, sodass der Highlighter gut aussah, die 80 Zeichen Grenze rein, kleinere Anpassungen an der Schrift und schon kann man super mit Eclipse arbeiten. Auch sehr gut finde ich das SVN Plugin (subclipse) womit man super easy mit einem SVN Repository arbeiten kann. So macht es sehr viel Spaß zu arbeiten.


09.10.2006 - Suchfunktion

29

Durch mein neustes Buch Suchmaschinen entwickeln mit Apache Lucene und der gegebenen Funktionalität des Zend Frameworks werde ich heute oder in den nächsten Tagen eine Suchfunktion in diesen Blog einbauen. Heute morgen habe ich schon einige Tests vorgenommen und auch mal das Framework selbst auf den neusten Stand gebracht. All diese Änderungen werde ich in den nächsten Tagen mal online stellen und natürlich werde ich hier nochmal einige Informationen zu den Änderungen geben.


27.09.2006 - "Pimp my Rights" des CCC-R

28

Schon vor einiger Zeit hat der CCC-R (Chaos Computer Club Regensburg) eine CD mit freier Musik veröffentlicht. Ich habe schon einige Male davon gelesen, aber erst heute habe ich mir das mal genau angeschaut und die CD auch mal runtergeladen. Die Genres, die auf der CD vorzufinden sind (Heavy Metal, Hip Hop, Pop, Rock, Elektro, ...) sind zwar nicht ganz das, was ich normalerweise höre, aber die Tracks können sich hören lassen.

Die Tracks können einzeln oder als komplette CD, als MP3- oder Ogg-Format heruntergeladen werden. Den Download und den dazugehörigen Artikel des CCC-R findet ihr hier: http://www.ccc-r.de/boycott/