<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tobis Blog &#187; Zend Framework</title>
	<atom:link href="http://blog.aditu.de/category/zend-framework/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.aditu.de</link>
	<description>Alles rund um Webentwicklung, Fotografie, PHP und weitere interessante Themen</description>
	<lastBuildDate>Wed, 25 Jan 2012 17:30:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>PHP Fat-Free Framework</title>
		<link>http://blog.aditu.de/2011/10/01/php-fat-free-framework/</link>
		<comments>http://blog.aditu.de/2011/10/01/php-fat-free-framework/#comments</comments>
		<pubDate>Sat, 01 Oct 2011 11:10:34 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[selfoss]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[PHP Fat-Free Framework]]></category>
		<category><![CDATA[Routing]]></category>

		<guid isPermaLink="false">http://blog.aditu.de/?p=759</guid>
		<description><![CDATA[Es gibt ja eine ganze Fülle an PHP Frameworks und jedes wartet mit seinen ganz eigenen Vor- und Nachteilen auf. Für rsslounge habe ich das Zend Framework gewählt und bereue diese Entscheidung nicht, denn es bietet eine Vielzahl an sehr nützlichen Funktionen und sorgt für eine saubere und aufgeräumte Struktur. Ein gravierender Nachteil ist allerdings [...]]]></description>
			<content:encoded><![CDATA[<p>Es gibt ja eine ganze Fülle an PHP Frameworks und jedes wartet mit seinen ganz eigenen Vor- und Nachteilen auf. Für <a title="rsslounge der webbasierte RSS Feed Reader" href="http://rsslounge.aditu.de">rsslounge</a> habe ich das <a title="Zend Framework" href="http://framework.zend.com">Zend Framework</a> gewählt und bereue diese Entscheidung nicht, denn es bietet eine Vielzahl an sehr nützlichen Funktionen und sorgt für eine saubere und aufgeräumte Struktur. Ein gravierender Nachteil ist allerdings die Größe und die hohe Anzahl an Dateien, die das Framework mit sich bringt. Für ein Webprogramm, das anderen zur Verfügung gestellt werden soll und die dies dann auf einen eigenen Server hochladen sollen, ist das ziemlich lästig. Hinzu kommt doch eine gewisse Komplexität, wie man beispielsweise am <a title="Cache es was es wolle" href="http://blog.aditu.de/2009/08/20/cache-es-was-es-wolle/">Cachingverhalten</a> sieht.</p>
<p>Für mein neuestes Projekt wollte ich etwas einfaches, das eine saubere Struktur ermöglicht, aber nicht mit tausenden Dateien und riesigem Funktionsumfang daher kommt. Da ich schon vor einiger Zeit auf das <a title="PHP Fat-Free Framework" href="http://fatfree.sourceforge.net/">PHP Fat-Free Framework</a> gestoßen bin, und es einen sehr guten ersten Eindruck hinterlassen hat, habe ich mich entschlossen mir das Framework etwas genauer anzusehen. Sehr schnell war klar, dass es perfekt geeignet ist.</p>
<p><a href="http://fatfree.sourceforge.net"><img class="alignnone size-full wp-image-762" title="PHP Fat Free Framework" src="http://blog.aditu.de/wp-content/uploads/2011/09/logo.png" alt="" width="320" height="136" /></a></p>
<h2>Features</h2>
<p>Das <a title="PHP Fat-Free Framework" href="http://fatfree.sourceforge.net/">PHP Fat-Free Framework</a> verfügt über alle wichtigen Features, die mittlerweile so Standard sind:</p>
<ul>
<li>Routing Mechanismus (sehr einfach auch im MVC Style realisierbar)</li>
<li>Datenbankzugriff (sogar mit einem mini ORM und einem MongoDB mapper)</li>
<li>Template Engine</li>
<li>Schnick Schnack wie: On-the-fly JavaScript/CSS compressor, CAPTCHA generator, OpenID, usw.</li>
</ul>
<p>Die Template Engine konnte mich nicht ganz überzeugen, hier habe ich selbst Hand angelegt, eine kleine Hilfsklasse geschrieben und auf den in PHP integrierten Syntax zurückgegriffen. Ansonsten konnte das Framework in voller Linie überzeugen. Selbst eine Migration um eine Major Version funktionierte mit sehr geringem Aufwand, was mich doch sehr überrascht hat.</p>
<h2>Anforderungen</h2>
<p>Das Framework selbst ist sehr klein und wird mit einer einzigen 55KB großen PHP Datei beworben. Ganz richtig ist das aber nicht: Der Datenbankzugriff und weitere Funktionen wurden in Plugins ausgelagert. Nimmt man den gesamten Funktionsumfang, so hat man 27 Dateien mit einer gesamten Größe von 223 KB, was natürlich immernoch sehr schlank ist.</p>
<p>Ein bestimmter Server ist nicht erforderlich und das Manual bietet Anleitungen für das Umschreiben der URLs für den <a title="Manual mod_rewrite Apache für Fatfree PHP" href="http://fatfree.sourceforge.net/page/routing-engine/sample-apache-configuration">Apache Webserver</a>, <a title="Manual URL Umschreiben in lighttpd" href="http://fatfree.sourceforge.net/page/routing-engine/sample-lighttpd-configuration">lighttpd</a> und <a title="Manual URL Umschreiben nginx" href="http://fatfree.sourceforge.net/page/routing-engine/sample-nginx-configuration">nginx</a>. Einziger Wermutstropfen: Es benötigt mindestens PHP 5.3, was für einen simplen RSS Reader, der möglichst überall laufen soll eine doch recht hohe Anforderung ist. Gleichzeitig liefert diese Anforderung auch zahlreiche Vorteile, wie beispielsweise schlankeren Code durch Lambda-Funktionen oder der Einsatz von Namespaces.</p>
<h2>F3 in der Praxis</h2>
<p>Warum mir das Framework so zusagt, sieht man schnell, wenn man ein paar Zeilen Code sieht. Ein Beispiel ist das Routing:</p>
<pre class="brush: php; title: ; notranslate">
require __DIR__.'/libs/f3/base.php';
F3::set('AUTOLOAD','libs/f3/|libs/|libs/WideImage/|models/|libs/twitteroauth|libs/FeedWriter');
F3::route('GET /', 'controllers\Index-&gt;home');
F3::route('GET /mark/@item', 'controllers\Items-&gt;mark');
F3::route('POST /source', 'controllers\Sources-&gt;add');
F3::route('PUT /source/@id', 'controllers\Sources-&gt;write');
</pre>
<p>Mit der ersten Zeile wird das Framework eingebunden. Mit der zweiten wird ein Autoloader registriert und die entsprechenden Inlcude-Pfade gesetzt (das Pipe Symbol | dient hier als Trennzeichen. Dann werden die Routen definiert. Das Fat-Free Framework unterstützt hierbei auch den REST Ansatz und einzelne URLs können mehrfach, je nach Art des HTTP Requests belegt werden. In diesem Beispiel wird bei einem GET Aufruf der URL / die Klasse \controllers\Index instaziiert und dort die Methode home aufgerufen.</p>
<p>Ähnlich einfach ist der Datenbankzugriff:</p>
<pre class="brush: php; title: ; notranslate">
F3::set('DB',
	new DB(
		'mysql:host=localhost;port=3306;dbname=mysqldb',
		'admin',
		'p455w0rD'
	)
);
DB::sql('SELECT brandName FROM wherever');
foreach (F3::get('DB-&gt;result') as $row) {
	// whatever you want to do with $row
}
</pre>
<p>Um SQL Injection vorzubeugen, werden natürlich auch <a title="Manual PHP Fat Free Framework parameterized Queries" href="http://fatfree.sourceforge.net/page/sql-handler/parameterized-queries">parametrisierte Queries</a> unterstützt.</p>
<p>Ähnlich simpel ist das gesamte Framework gestrickt und meist bietet es verschiedene Wege etwas umzusetzen. Besonders elegant finde ich das Routing mit Lambda Funktionen:</p>
<pre class="brush: php; title: ; notranslate">
F3::route('GET /about',
	function() {
		echo 'No subliminal messages here...';
	}
);
</pre>
<h2>Lizenz und Downloads</h2>
<p>Das Framework steht unter der GPLv3 Lizenz zur Verfügung, es wird aber auch eine kostenpflichtige, kommerzielle Lizenz angeboten. Das finde ich das einzige Manko, hier bietet beispielsweise das Zend Framework unter der MIT Lizenz sehr viel mehr Möglichkeiten.</p>
<p>Zur Projektseite des PHP Fat-Free Frameworks: <a href="http://fatfree.sourceforge.net/">http://fatfree.sourceforge.net/</a></p>
<pre></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.aditu.de/2011/10/01/php-fat-free-framework/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Neue Version rsslounge 1.7</title>
		<link>http://blog.aditu.de/2011/02/20/neue-version-rsslounge-1-7/</link>
		<comments>http://blog.aditu.de/2011/02/20/neue-version-rsslounge-1-7/#comments</comments>
		<pubDate>Sun, 20 Feb 2011 11:58:25 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[rsslounge]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[feed reader]]></category>
		<category><![CDATA[google reader]]></category>
		<category><![CDATA[RSS]]></category>

		<guid isPermaLink="false">http://blog.aditu.de/?p=715</guid>
		<description><![CDATA[Nach langer Zeit ist es nun mal wieder so weit: eine neue Version von rsslounge ist verfügbar. Es gibt einige Änderungen und Optimierungen. Neue Features und größere Umbauten sind immer eine Frage der Zeit. Ich habe ja einiges auf der Wunschliste und auch im Forum haben einige Wünsche geäußert. Besonders interessant ist eine Funktion, so [...]]]></description>
			<content:encoded><![CDATA[<p>Nach langer Zeit ist es nun mal wieder so weit: eine neue Version von <a title="RSS Feed aggregator rsslounge" href="http://rsslounge.aditu.de">rsslounge</a> ist verfügbar. Es gibt einige <a title="Changelog" href="http://code.google.com/p/rsslounge/wiki/Changelog">Änderungen und Optimierungen</a>. Neue Features und größere Umbauten sind immer eine Frage der Zeit. Ich habe ja einiges auf der <a title="Feature Request Liste rsslounge" href="http://code.google.com/p/rsslounge/issues/list?can=2&amp;q=Feature+Request">Wunschliste</a> und auch im <a title="rsslounge forum" href="http://rsslounge.aditu.de/forum">Forum</a> haben einige Wünsche geäußert. Besonders interessant ist eine Funktion, so dass aus den gesammelten Feedbeiträgen wieder ein RSS Feed erzeugt wird. Das kann dann an beliebiger Stelle (z.B. in einer Android RSS App) eingebunden werden.</p>
<p><a title="rsslounge" href="http://rsslounge.aditu.de"><img class="alignnone size-full wp-image-718" title="rsslounge" src="http://blog.aditu.de/wp-content/uploads/2011/02/rsslounge.jpg" alt="" width="500" height="334" /></a></p>
<p>An dieser Stelle vielen Dank an alle, die mich mit Sprachdateien versorgt haben und mir Feedback geben. Sofern ich die Zeit finde, versuche ich sinnvolle Neuerungen einzubauen. Die Performance zu optimieren (besonders das erstmalige Laden von rsslounge zu beschleunigen) war im aktuellen Update mein primäres Anliegen. Die Änderungsliste ist im <a title="rsslounge changelog" href="http://code.google.com/p/rsslounge/wiki/Changelog">Changelog</a> zu finden.</p>
<p>Download: <a title="rsslounge download" href="http://code.google.com/p/rsslounge/downloads/list">rsslounge 1.7</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aditu.de/2011/02/20/neue-version-rsslounge-1-7/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Zend_Translate: Fallback für Übersetzungen</title>
		<link>http://blog.aditu.de/2011/02/01/zend_translate-fallback-fur-ubersetzungen/</link>
		<comments>http://blog.aditu.de/2011/02/01/zend_translate-fallback-fur-ubersetzungen/#comments</comments>
		<pubDate>Tue, 01 Feb 2011 17:06:08 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[rsslounge]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Translate]]></category>

		<guid isPermaLink="false">http://blog.aditu.de/?p=690</guid>
		<description><![CDATA[Häufig kommt es vor, dass Sprachdateien nicht vollständig sind. Ich habe den Effekt bei rsslounge, da ich hier von verschiedenen Personen Sprachdateien bekomme. Da ich nicht sicherstellen kann, ob auch wirklich jeder Key der Sprachdatei übersetzt wurde (außer ich prüfe manuell die gesamte Datei), bietet es sich an, einfach als Fallback-Lösung die entsprechende englische Übersetzung [...]]]></description>
			<content:encoded><![CDATA[<p>Häufig kommt es vor, dass Sprachdateien nicht vollständig sind. Ich habe den Effekt bei <a title="rsslounge free rss feed reader" href="http://rsslounge.aditu.de">rsslounge</a>, da ich hier von verschiedenen Personen Sprachdateien bekomme. Da ich nicht sicherstellen kann, ob auch wirklich jeder Key der Sprachdatei übersetzt wurde (außer ich prüfe manuell die gesamte Datei), bietet es sich an, einfach als Fallback-Lösung die entsprechende englische Übersetzung zu verwenden.</p>
<p><a title="Zend Framework Manual" href="http://framework.zend.com/manual/de/zend.translate.html">Zend_Translate</a> bietet hier eine einfache Möglichkeit &#8220;Routen&#8221; zu erstellen. Das heißt man kann festlegen, welche Sprache alternativ verwendet werden soll. Dabei können sogar Ketten gebildet werden (z.B. wenn Französisch nicht gefunden wurde, dann in der deutschen Übersetzung suchen und wenn dort auch nichts gefunden wird, in der englischen). Wobei sich mir der Sinn von so einer Verkettung nicht ganz erschließt.</p>
<p>Das setzen einer Route ist sehr einfach. Folgendes Beispiel scanned ein übergebenes Verzeichnis nach CSV Dateien und übernimmt deren Inhalt als Übersetzung. Mit dem Key &#8220;route&#8221; wird definiert, wie die Sprachen verkettet werden sollen. In diesem Beispiel ist Englisch die Fallbacksprache für Deutsch und Französisch.</p>
<pre class="brush: php; title: ; notranslate">
$language = new Zend_Translate(
            'csv',    // Typ der Quelle: hier csv Dateien
            'locale', // Quell-Verzeichnis
            'en',     // Standard Sprache
            array(    // Optionen
                'scan' =&gt; Zend_Translate::LOCALE_DIRECTORY,
                'route'     =&gt; array( 'de' =&gt; 'en', 'fr' =&gt; 'en' )
            ));
</pre>
<p>Der sauberste Weg ist es natürlich alle Schlüssel auf zu übersetzen. Beim Aufspüren von fehlenden Übersetzungen <a href="http://blog.aditu.de/2009/03/10/zend_translate-fehlende-ubersetzungen-loggen/">hilft Zend_Translate ebenfalls</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aditu.de/2011/02/01/zend_translate-fallback-fur-ubersetzungen/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>ServerBridge zwischen PHP und C/C++</title>
		<link>http://blog.aditu.de/2010/05/15/serverbridge-zwischen-php-und-cc/</link>
		<comments>http://blog.aditu.de/2010/05/15/serverbridge-zwischen-php-und-cc/#comments</comments>
		<pubDate>Sat, 15 May 2010 11:11:14 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[mongoose]]></category>
		<category><![CDATA[Zend Server]]></category>

		<guid isPermaLink="false">http://blog.aditu.de/?p=428</guid>
		<description><![CDATA[Jetzt ist es schon wieder einige Zeit her, dass ich hier etwas geschrieben habe und ich denke ich gebe mal ein Lebenszeichen von mir. Natürlich gibt es zahlreiche interessante Themen in meiner Queue zum bloggen, aber wie immer findet man nicht die Zeit oder nötige Ruhe dazu. Die Problemstellung Nun aber zum Thema: für ein [...]]]></description>
			<content:encoded><![CDATA[<p>Jetzt ist es schon wieder einige Zeit her, dass ich hier etwas geschrieben habe und ich denke ich gebe mal ein Lebenszeichen von mir. Natürlich gibt es zahlreiche interessante Themen in meiner Queue zum bloggen, aber wie immer findet man nicht die Zeit oder nötige Ruhe dazu.</p>
<h2>Die Problemstellung</h2>
<p>Nun aber zum Thema: für ein aktuelles Projekt benötige ich, von meiner PHP Webapplikation heraus, den Zugriff auf einige Hardwarekomponenten. Zudem will ich einige Fremdbibliotheken verwenden, die sehr rechenintensive Aufgaben übernehmen und auch nur in C++ zur Verfügung stehen. Die Frage ist also: wie kann ich diese Komponenten an mein PHP Programm ankoppeln?</p>
<p>Für Java gibt es eine ganz gute <a title="PHP Java Bridge" href="http://php-java-bridge.sourceforge.net/pjb/">Server Bridge</a>, die innerhalb der Java Virtual Machine einfach einen kleinen Server startet, der XML Anfragen entgegen nimmt, stellvertretend ausführt und das Ergebnis, auch wieder über eine XML Kommunikationsschnittstelle, zur Verfügung stellt. Die nötige PHP Klasse wird ebenfalls durch den Java Server direkt zur Verfügung gestellt. Eine ähnliche Bridge Lösung bringt auch der <a title="Zend Server Community Edition" href="http://www.zend.com/de/products/server-ce/">Zend Server</a> bereits out of the box mit.</p>
<p>Für C++ habe ich so eine Lösung nicht gefunden und als weiteren Ansatz überlegt, eine PHP Extension zu entwickeln. Sowohl für Linux, als auch für Windows, gibt es hier Tutorials (siehe &#8220;<a title="Extension-Entwicklung unter WAP" href="http://www.phpforum.de/forum/showthread.php?t=244096">Extension-Entwicklung unter WAP</a>&#8220;, &#8220;<a title="Wrapping C++ Classes in a PHP Extension" href="http://devzone.zend.com/article/4486-Wrapping-C-Classes-in-a-PHP-Extension">Wrapping C++ Classes in a PHP Extension</a>&#8221; oder &#8220;<a title="Extension Writing Part I: Introduction to PHP and Zend" href="http://devzone.zend.com/article/1021">Extension Writing Part I: Introduction to PHP and Zend</a>&#8220;). Allerdings ist, neben den Tutorials, der ganze Vorgang nicht gut dokumentiert und scheinbar muss das Kompilat der Extension exakt dem des verwendeten PHP Kompilats entsprechen. Insgesamt also eher eine wackelige Angelegenheit.</p>
<h2>Lösungsansatz</h2>
<p>Meine Lösung ist hingegen pragmatisch und verfolgt eine eher losere Kopplung: Meine C++ Komponenten werden in ein eigenständiges Programm ausgelagert, das selbst, über einen gewöhnlichen HTTP Server, die benötigten Dienste zur Verfügung stellt. Dabei orientiere ich mich an dem REST Architektur Prinzip und binde jeweils eine Teil-Funktionalität an eine feste URL. Die Parameter und Rückgabewerte werden mittels JSON kodiert. Von PHP Seite aus, wird der Aufruf der C++ Komponenten sauber gekapselt, so dass für das PHP Programm der Eindruck entsteht, dass eine gewöhnliche Funktion aufgerufen wird.</p>
<p>Welche Vor- und Nachteile hat das Vorgehen? Zum einen ist die in C++ implementierte Funktionalität sauber gekapselt und von der Webapplikation getrennt. Dadurch wird die Software leichter wartbar. Durch eine saubere Schnittstellendefinition, kann die C++ Serverkomponente auch unabhängig vom Wissen über die PHP Applikation gepflegt werden. Zum anderen entsteht aber ein zusätzlicher Aufwand (mit zusätzlichen Fehlerquellen). Die Schnittstelle muss definiert und implementiert werden, ein Fehlerhandling muss durchgeführt werden und eine zusätzliche Serverapplikation muss gestartet werden, was hinsichtlich der Sicherheit berücksichtigt werden muss. Dennoch halte ich die Lösung für die eleganteste, denn sie nutzt genau die Vorteile der Vernetzung und der losen Kopplung aus. So könnte die C++ Komponente bei höherer Last auch leicht auf einen eigenen Server umgezogen oder unabhängig von der Webapplikation betrieben werden.</p>
<h2>Implementierung</h2>
<p>In der Theorie hört sich natürlich immer alles ganz nett an, aber wie sieht das mit dem HTTP Server aus? Hier gibt es eine hervorragende C++ Bibliothek, mit der sich ohne großen Aufwand eine solcher HTTP Server realisieren lässt. <a title="mongoose" href="http://code.google.com/p/mongoose/">mongoose</a> heißt das Wunderding, steht unter der MIT Lizenz unter <a title="mongoose" href="http://code.google.com/p/mongoose/">Google Code</a> zur Verfügung. Es unterstützt Windows, Linux und Mac OS X, bietet eine CGI Schnittstelle, SSL Verschlüsselung, ACL, eine saubere API und ist nicht größer als 60 kB. Die Dokumentation ist zwar recht knapp, aber dank Beispiele findet man sich schnell zurecht und auch die API Beschreibung ist vollkommen ausreichend.</p>
<p>Will man einen eigenen Server starten, so muss zuerst ein neuer Context erzeugt werden:</p>
<pre class="brush: cpp; title: ; notranslate">
struct mg_context* ctx;
ctx = mg_start();
</pre>
<p>Mit <em>mg_set_options</em>, werden die Servereinstellungen geändert. Folgende zwei Zeilen deaktivieren das Directory Listing und setzten 8080 als Port.</p>
<pre class="brush: cpp; title: ; notranslate">
mg_set_option(ctx, &quot;dir_list&quot;, &quot;no&quot;);
mg_set_option(ctx, &quot;ports&quot;, &quot;8080&quot;);
</pre>
<p>Aus Sicherheitsgründen erlaube ich nur einen Zugriff vom selben Rechner aus, also erlaube nur die IP Adresse 127.0.0.1:</p>
<pre class="brush: cpp; title: ; notranslate">
mg_set_option(ctx, &quot;acl&quot;, &quot;-0.0.0.0,+127.0.0.1&quot;);
</pre>
<p>Mit <em>mg_set_uri_callback</em> kann ein Pointer auf eine eigene Funktion an eine URL gebunden werden. Diese wird aufgerufen, wenn der Client die URL aufruft, wobei die URL auch Wildcards enthalten kann.</p>
<pre class="brush: cpp; title: ; notranslate">
mg_set_uri_callback(ctx, 'dosomething', &amp;Server::dosomething, NULL);
</pre>
<p>Als dritter Parameter darf ein Pointer (<em>void*</em>) auf ein beliebiges Objekt übergeben werden. Die Callback Methode bekommt dazu alle notwendigen Parameter, wie die aktuelle Verbindung, den aktuellen Request und das zuvor übergebene Objekt (hier <em>NULL</em>) übergeben.</p>
<pre class="brush: cpp; title: ; notranslate">
void Server::capture(struct mg_connection *conn,
 const struct mg_request_info *request_info,
 void *user_data) {
char* param = mg_get_var(conn, &quot;param&quot;);
mg_printf(conn, &quot;%s&quot;, &quot;HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n&quot;);
}
</pre>
<p>Mit <em>mg_printf</em> kann dann eine Antwort an den Client gesendet werden. Hier als einfaches Beispiel einfach nur ein OK (HTTP 200). In meinem Szenario wird hier der generierte JSON Text zurück gegeben. Mit mg_get_var können übergebene Parameter (POST, GET) ausgelesen werden. Wichtig: um memory leaks zu vermeiden, müssen diese mit <em>mg_free</em> wieder freigegeben werden.</p>
<p>Natürlich ist das nur die eine Hälfte. PHP muss jetzt auch Funktionen, auf dem Server, aufrufen können. Dazu kommt der Zend_Http_Client zum Einsatz. Dieser ist im Zend Framework enthalten, mit etwas Frickelei kann er aber auch aus dem Gesamtpaket heraus gepickt werden. Da ich aber das Zend Framework für die ganze Anwendung nutze, ist das Aufrufen der URL und das Decodieren des JSON Strings in einen Action Helper ausgelagert, der gleichzeitig eine einfache Fehlerbehandlung durchführt:</p>
<pre class="brush: php; title: ; notranslate">
class JsonHttpHelper extends Zend_Controller_Action_Helper_Abstract {
   public function get($url, $params = array()) {
      try {
         $client = new Zend_Http_Client($url);
         foreach($params as $param=&gt;$value)
            $client-&gt;setParameterPost($param, $value);
            $response = $client-&gt;request('POST');
            $res = Zend_Json::decode($response-&gt;getBody());
            if($response-&gt;isSuccessful()) {
               return $res;
            } else {
               return array(&quot;error&quot; =&gt; &quot;request not successfully: &quot;.$res[&quot;error&quot;]);
            }
      } catch(Exception $e) {
         return array(&quot;error&quot; =&gt; $e-&gt;getMessage());
      }
 }
}
</pre>
<p>Bisher bin ich mit der Lösung sehr zufrieden. Besonders mongoose kann ich nur wärmstens empfehlen. Auch von der Verarbeitungsgeschwindigkeit ist das Ergebnis zufriedenstellend und kann sich sehen lassen. Um den Rahmen nicht zu sprengen, habe ich die serverseitige Generierung und Verarbeitung von JSON außen vor gelassen. Hier gibt es aber auch zahlreiche Bibliotheken, so dass die Suche nicht schwer fallen dürfte.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aditu.de/2010/05/15/serverbridge-zwischen-php-und-cc/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Klassen laden mit Zend_Loader_Autoloader_Resource</title>
		<link>http://blog.aditu.de/2010/02/03/klassen-laden-mit-zend_loader_autoloader_resource/</link>
		<comments>http://blog.aditu.de/2010/02/03/klassen-laden-mit-zend_loader_autoloader_resource/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 10:00:59 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Autoloader]]></category>

		<guid isPermaLink="false">http://blog.aditu.de/?p=318</guid>
		<description><![CDATA[Jede sauber programmierte PHP Applikation macht es notwendig, dass Klassen dynamisch  nachgeladen werden müssen. Dazu bietet PHP die __autoload() Funktion. Diese wird im Zend Framework natürlich in einem Objekt gekapselt. Nachdem ich den einfachen Weg immer vorziehe, nutze ich natürlich diesen gewöhnlichen Autoloader Mechanismus durch die Klasse Zend_Loader_Autoloader: Wird die Zend_Application Klasse verwendet, so wird [...]]]></description>
			<content:encoded><![CDATA[<p>Jede sauber programmierte PHP Applikation macht es notwendig, dass Klassen dynamisch  nachgeladen werden müssen. Dazu bietet PHP die <a title="PHP Manual Autoload" href="http://php.net/manual/de/language.oop5.autoload.php">__autoload()</a> Funktion. Diese wird im Zend Framework natürlich in einem Objekt gekapselt. Nachdem ich den einfachen Weg immer vorziehe, nutze ich natürlich diesen gewöhnlichen Autoloader Mechanismus durch die Klasse Zend_Loader_Autoloader:</p>
<pre class="brush: php; title: ; notranslate">
$autoloader =  Zend_Loader_Autoloader::getInstance();
$autoloader-&gt;registerNamespace('application_');
</pre>
<p>Wird die Zend_Application Klasse verwendet, so wird der Autoloader automatisch aktiviert (die Namespace&#8217;s müssen dabei in der Konfiguration gesetzt werden). Verwende ich dann eine Klasse, so wird der Name entsprechend aufgelöst, d.h. zu obigen Beispiel wird bei der Verwendung der Klasse &#8220;application_models_items&#8221; die Datei &#8220;application/models/items.php&#8221; eingebunden. Das Problem bei dieser Lösung: hat man ein sehr großes Projekt mit einer tiefen Hierachie, dann wächst der Klassenname entsprechend stark an. Bei meinem RSS Reader rsslounge hab ich das beispielsweise in Kauf genommen, da die Struktur nicht komplex ist. Zudem sieht man am Namen schon sofort, wo die Datei abgelegt ist und welche Funktion die Klasse übernimmt (application_models_items ist ein Model, dass sieht man sofort).</p>
<p>Seit der Version 1.8 bietet das Zend Framework einen eleganten Weg  Klassen automatisch zu laden, dabei aber genau zu spezifizieren, wo die Klassen gesucht werden sollen. Dazu wird ein Namespace definiert und für verschiedene &#8220;Unter-Namespace&#8221; Pfade angegeben. Ein Beispiel veranschaulicht das Vorgehen:</p>
<pre class="brush: php; title: ; notranslate">
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
 'basePath'  =&gt; APPLICATION_PATH . '/../einordner',
 'namespace' =&gt; 'Myproject',
 ));
 $resourceLoader-&gt;addResourceType('models', 'models', 'Model');
 $var = new Myproject_Model_Xyz();
</pre>
<p>Zuerst wird die Klasse Zend_Loader_Autoloader_Resource instanziiert. Dabei wird ein Namespace angegeben (im Beispiel &#8220;Myproject&#8221;) und definiert, in welchem Ordner die zugehörigen Dateien zu finden sind. In einem zweiten Schritt wird dann mit addResourceType ein &#8220;Unter-Namespace&#8221; definiert und angegeben in welchem Unterverzeichnis die Klassen liegen. Der Aufbau von addResourceType ist wie folgt:</p>
<pre class="brush: php; title: ; notranslate">
 $resourceLoader-&gt;addResourceType($name, $ordner, $namespace);
</pre>
<p>Damit ist der Autoloader für alle Klassen mit dem Präfix &#8220;Myproject_Model_&#8221; aktiv. Im Beispiel wird eine Klasse Xyz geladen. Dabei wird für die Klasse &#8220;Myproject_Model_Xyz&#8221; die Datei &#8220;APPLICATION_PATH . /&#8217;../einordner/models/xyz.php&#8221; eingebunden. Es können beliebig viele &#8220;Unter-Namespace&#8221; definiert werden, was für eigene Klassen wie Models, Forms oder Validatoren sinnvoll ist.</p>
<p>Weitere Informationen und Beispiele sind im <a title="Zend Manual" href="http://framework.zend.com/manual/de/zend.loader.autoloader-resource.html">Manual</a> zu finden. Keith Pope beschreibt anhand eines Beispiels sehr schön, wie er Zend_Loader_Autoloader_Resource in seinem Projekt verwendet (siehe &#8220;Seite 129ff, Zend Framework 1.8 &#8211; Web Application Development&#8221; von Keith Pope).</p>
<p>Dieser Weg Klassen automatisch zu laden gefällt mir ganz gut, weil er einfach ist und keine spezielle Loader Klasse nötig ist (die z.B. mittels einer statischen Funktion eine Klasseninstanz liefert). Natürlich offenbaren die Namespaces, welche mit PHP 5.3 eingeführt wurden neue Möglichkeiten, die ich mir auch noch genauer ansehen möchte. Oder gibt es eine noch schönere und elegantere Lösung? Dann bitte unbedingt kommentieren!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aditu.de/2010/02/03/klassen-laden-mit-zend_loader_autoloader_resource/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rsslounge 1.0</title>
		<link>http://blog.aditu.de/2009/12/27/rsslounge-1-0/</link>
		<comments>http://blog.aditu.de/2009/12/27/rsslounge-1-0/#comments</comments>
		<pubDate>Sun, 27 Dec 2009 14:32:20 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[rsslounge]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[RSS Reader]]></category>

		<guid isPermaLink="false">http://localhost/aditu.de/blog2/?p=269</guid>
		<description><![CDATA[In diesem Blog habe ich ja schon &#246;fters &#252;ber rsslounge geschrieben. Vor einiger Zeit habe ich einen webbasierten RSS Reader entwickelt, der auf PHP und MySQL aufsetzt und als Open Source Projekt jedem frei zur Verf&#252;gung steht. Die letzten Monate habe ich den Reader nun auf Herz und Nieren getestet und selbst jeden Tag verwendet. [...]]]></description>
			<content:encoded><![CDATA[<p>In diesem Blog habe ich ja schon &ouml;fters &uuml;ber rsslounge geschrieben. Vor einiger Zeit habe ich einen webbasierten RSS Reader entwickelt, der auf PHP und MySQL aufsetzt und als Open Source Projekt jedem frei zur Verf&uuml;gung steht.</p>
<p><a href="http://rsslounge.aditu.de" title="rsslounge"><img src="wp-content/uploads/2009/12/27/screenshot_1.png" alt="Screenshot rsslounge" width="470" height="257" /></a></p>
<p>Die letzten Monate habe ich den Reader nun auf Herz und Nieren getestet und selbst jeden Tag verwendet. Zudem habe ich Feedback gesammelt und den Reader im Detail verbessert. So kann er jetzt beispielsweise auch fehlerhaftes HTML in Feed Eintr&auml;gen verarbeiten und korrigieren. Die permanente Nutzung &uuml;ber die letzten Monate hat gezeigt, dass der Reader stabil ist und einwandfrei arbeitet. Daher habe ich mich entschlossen den aktuellen Stand als Version 1.0 zu ver&ouml;ffentlichen.</p>
<p>Ihr k&ouml;nnt die aktuelle Version jederzeit auf der Projektseite <a href="http://rsslounge.aditu.de" title="rsslounge">http://rsslounge.aditu.de</a> herunterladen. Wer skeptisch ist, oder rsslounge noch nicht kennt, findet dort nat&uuml;rlich auch eine Demo Installation und kann alles erst einmal testen. Interessierte k&ouml;nnen auch die Entwicklung verfolgen oder einen Blick auf den Quellcode werfen. Hierf&uuml;r gibt es eine Projektseite auf <a href="http://code.google.com/p/rsslounge/" title="rsslounge auf Google Code">Google Code</a>.</p>
<p>Feedback, Bugmeldungen oder Anmerkungen sind jederzeit willkommen. Ihr k&ouml;nnt hier kommentieren, das Kontaktforumlar auf <a href="http://rsslounge.aditu.de" title="rsslounge">http://rsslounge.aditu.de</a> oder das <a href="http://code.google.com/p/rsslounge/issues/list" title="Issue Tracking Google">Tracking System von Google Code</a> verwenden.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aditu.de/2009/12/27/rsslounge-1-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neues Zend Framework Buch und Gewinnspiel</title>
		<link>http://blog.aditu.de/2009/11/20/neues-zend-framework-buch-und-gewinnspiel/</link>
		<comments>http://blog.aditu.de/2009/11/20/neues-zend-framework-buch-und-gewinnspiel/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 21:51:19 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Literatur]]></category>
		<category><![CDATA[Ralf Eggert]]></category>

		<guid isPermaLink="false">http://localhost/aditu.de/blog2/?p=261</guid>
		<description><![CDATA[Seit einigen Wochen ist das neues Zend Framework Buch &#8220;Zend Framework 1.8 Web Appliaction Development&#8221; auf den Markt: Wen das Buch interessiert, der kann in Ralf seinem Blog an einem Gewinnspiel teilnehmen. Der Blog ist allgemein zu empfehlen: es gibt regelm&#228;&#223;ig Updates und Infos zum Zend Framework. Ich werde mein Gl&#252;ck mal versuchen. Bin noch [...]]]></description>
			<content:encoded><![CDATA[<p>Seit einigen Wochen ist das neues Zend Framework Buch &#8220;<a href="http://www.amazon.de/Zend-Framework-1-8-Application-Development/dp/1847194222" title="Zend Framework 1.8 Web Application Developement Amazon">Zend Framework 1.8 Web Appliaction Development</a>&#8221; auf den Markt:</p>
<p><a href="http://www.amazon.de/Zend-Framework-1-8-Application-Development/dp/1847194222" title="Zend Framework 1.8 Web Application Developement Amazon"><img src="wp-content/uploads/2009/11/20/zfcover.jpg" alt="Zend Framework 1.8" width="243" height="300" /></a></p>
<p>Wen das Buch interessiert, der kann in Ralf <a href="http://blog.zf-info.de/2009/11/20/gewinnspiel-zend-framework-bucher-zu-gewinnen/" title="Zend Framework 1.8 Web Application Developement Amazon">seinem Blog</a> an einem Gewinnspiel teilnehmen. Der Blog ist allgemein zu empfehlen: es gibt regelm&auml;&szlig;ig Updates und Infos zum Zend Framework. Ich werde mein Gl&uuml;ck mal versuchen. Bin noch unsicher, ob sich die Anschaffung des Buchs lohnt. Bisher bin ich mit <a href="2009/04/05/Neues-Buch-Ralf-Eggert:-Das-Zend-Framework" title="Ralfs Zend Framework Buch">Ralfs Buch</a> sehr zufrieden, dort sind alle wichtigen Informationen zu finden. Das was zur neuen Version hin noch fehlt, kann man auch problemlos im Zend Framework Manual nachschlagen. Aber als Gewinn w&auml;rs nat&uuml;rlich nicht schlecht&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aditu.de/2009/11/20/neues-zend-framework-buch-und-gewinnspiel/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zend Framework Poster von Mayflower</title>
		<link>http://blog.aditu.de/2009/09/29/zend-framework-poster-von-mayflower/</link>
		<comments>http://blog.aditu.de/2009/09/29/zend-framework-poster-von-mayflower/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 19:56:50 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Mayflower]]></category>
		<category><![CDATA[Poster]]></category>

		<guid isPermaLink="false">http://localhost/aditu.de/blog2/?p=253</guid>
		<description><![CDATA[Die Firma Mayflower ist mir ja schon l&#228;nger ein Begriff, da sie sehr im Open Source Bereich um PHP t&#228;tig ist. Um die Verbreitung des Zend Frameworks zu f&#246;rdern, verschenkt Mayflower Poster mit den wichtigsten Methodenaufrufen, Argumenten und Beispielaufrufen. Einfach das Kontaktformular ausf&#252;llen und das Poster wird einem versandkostenfrei zugeschickt. Eine feine Sache, mein Poster [...]]]></description>
			<content:encoded><![CDATA[<p>Die Firma Mayflower ist mir ja schon l&auml;nger ein Begriff, da sie sehr im Open Source Bereich um PHP t&auml;tig ist. Um die Verbreitung des Zend Frameworks zu f&ouml;rdern, verschenkt Mayflower Poster mit den wichtigsten Methodenaufrufen, Argumenten und Beispielaufrufen. Einfach das <a href="http://www.mayflower.de/de/produkte-services/development/zend-framework-poster" title="Zend Framework Poster Mayflower">Kontaktformular</a> ausf&uuml;llen und das Poster wird einem versandkostenfrei zugeschickt.</p>
<p>Eine feine Sache, mein Poster ist heute angekommen und echt top:</p>
<p><img src="wp-content/uploads/2009/09/29/zendframeworkposter.jpg" alt="Zend Framework Poster" width="520" height="254" /></p>
<p>Ein PHP Web Security Poster soll in Arbeit sein. Ich bin gespannt und werd jetzt einen passenden Platz f&uuml;r mein Poster suchen&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aditu.de/2009/09/29/zend-framework-poster-von-mayflower/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bibliotheken und jQuery Plugins von rsslounge</title>
		<link>http://blog.aditu.de/2009/09/04/bibliotheken-und-jquery-plugins-von-rsslounge/</link>
		<comments>http://blog.aditu.de/2009/09/04/bibliotheken-und-jquery-plugins-von-rsslounge/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 14:41:30 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[rsslounge]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Date Picker]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[SimplePie]]></category>
		<category><![CDATA[Skripte]]></category>

		<guid isPermaLink="false">http://localhost/aditu.de/blog2/?p=248</guid>
		<description><![CDATA[Frameworks und Bibliotheken zu verwenden hat viele Vorteile. Vor allem spart es aber Zeit, weil viele Funktionen so schon out of the box zur Verfügung stehen und wozu auch für jedes Projekt das Rad neu erfinden. In diesem Blogeintrag will ich alle Bibliotheken und Frameworks vorstellen, die ich für meinen aktuellen Feed Reader rsslounge verwendet [...]]]></description>
			<content:encoded><![CDATA[<p>Frameworks und Bibliotheken zu verwenden hat <a title="10 Gründe gegen den Einsatz von Frameworks" href="http://www.phphatesme.com/blog/wtf/10-grunde-gegen-den-einsatz-von-php-frameworks/">viele Vorteile</a>. Vor allem spart es aber Zeit, weil viele Funktionen so schon out of the box zur Verfügung stehen und wozu auch für jedes Projekt das Rad neu erfinden. In diesem Blogeintrag will ich alle Bibliotheken und Frameworks vorstellen, die ich für meinen aktuellen Feed Reader <a title="rsslounge" href="http://rsslounge.aditu.de">rsslounge</a> verwendet habe. Die Liste ist als kleine Empfehlung zu verstehen und soll gleichzeitig einen kleinen Einblick in rsslounge geben.</p>
<h2><a title="Zend Framework" href="http://framework.zend.com/">Zend Framework</a></h2>
<p><a title="Zend Framework" href="http://framework.zend.com/"><img src="wp-content/uploads/2009/09/04/zend_framework.jpg" alt="Zend Framework" width="520" height="100" /></a></p>
<p>Das Zend Framework ist ein objektorientiertes PHP Framework, das auf dem MVC Pattern basiert und viele viele Funktionen bietet. Das Zend Framework ist in diesem Blog ja ohnehin ein Thema und deshalb will ich an dieser Stelle dazu nicht schreiben. Einen ersten Überblick gebe ich <a title="Zend Framework ein Überblick" href="2008/09/30/Zend-Framework-ein-Ueberblick">hier</a>, wobei natürlich innerhalb des letzten Jahres einiges hinzu gekommen ist.</p>
<h2><a title="jQuery" href="http://jquery.com/">jQuery</a></h2>
<p><a title="jQuery" href="http://jquery.com/"><img src="wp-content/uploads/2009/09/04/jquery.jpg" alt="jQuery" width="520" height="100" /></a></p>
<p>Auch jQuery ist mittlerweile kein Geheimtipp mehr und wie eine <a title="jQuery dominiert bei den javascript frameworks - Webstandard Blog" href="http://webstandard.kulando.de/post/2009/07/21/jquery-dominiert-bei-den-javascript-frameworks">Umfrage des Webstandard Blogs</a> zeigt, auch das beliebteste JavaScript Framework. Ich kann das gut verstehen, nachdem ich bisher auf <a title="Prototype JavaScript Framework" href="http://www.prototypejs.org/">prototype</a> und <a title="script.aculo.us" href="http://script.aculo.us/">script.aculo.us</a> gesetzt habe, hat mich jQuery sofort überzeugt.</p>
<p>Alle weiteren JavaScript Bibliotheken basieren auf jQuery. Die Auswahl an Plugins ist schier unendlich und es gibt eine große Zahl an hervorragenden Projekten, die auf jQuery aufsetzen.</p>
<h2><a title="jQuery UI" href="http://jqueryui.com/">jQuery UI</a></h2>
<p><a title="jQuery UI" href="http://jqueryui.com/"><img src="wp-content/uploads/2009/09/04/jqueryui.jpg" alt="jQuery UI" width="520" height="100" /></a></p>
<p>Aufbauend auf jQuery gibt es jQuery UI, eine Bibliothek, die verschiedene Widgets und Funktionen bietet. Neben Widgets deckt jQuery UI das ab, was bei prototype durch script.aculo.us ergänzt wird: Drag n Drop, sortierbare Listen und animierte Effekte. In rsslounge basiert der Slider für die Priorität, das Drag n Drop der Feeds und Kategorien, sowie die Processbar für den ajaxbasierten Update auf dieser Bibliothek.</p>
<h2><a title="Impromptu" href="http://trentrichardson.com/Impromptu/index.php">Impromptu</a></h2>
<p><a title="Impromptu" href="http://trentrichardson.com/Impromptu/index.php"><img src="wp-content/uploads/2009/09/04/impromtu.jpg" alt="Impromptu" width="520" height="100" /></a></p>
<p>Es gibt ja eine <a title="15 JavaScript LightBox Skripte" href="2008/11/22/15-JavaScript-LightBox-Skripte/">ganze Reihe guter Lightbox Skripte</a>. Für rsslounge habe ich aber ein LightBox Skript gesucht, das sich besonders gut für Dialoge eignet. Impromptu bietet hier eine einfache Möglichkeit Buttons zu setzen und eigene Funktionen an die verschiedenen Aktionen der Popup-Box zu binden. Lediglich bei der Positionierung der Box, die pauschal auf top:15% gesetzt ist, war ich nicht zufrieden. Allerdings hat man hier vollen Einfluss auf das CSS, so dass auch das kein echtes Problem ist. Eine sehr gute Alternative wäre die <a title="ModalBox" href="http://okonet.ru/projects/modalbox/">ModalBox</a> gewesen. Diese basiert allerdings auf prototype.</p>
<h2><a title="Date Picker" href="http://www.eyecon.ro/datepicker/">Date Picker</a></h2>
<p><a title="Date Picker" href="http://www.eyecon.ro/datepicker/"><img src="wp-content/uploads/2009/09/04/datepicker.jpg" alt="Date Picker" width="520" height="100" /></a></p>
<p>Ein hervorragendes Skript für die Auswahl eines Datumbereichs ist der Date Picker von <a title="Stefan Petre" href="http://www.eyecon.ro">Stefan Petre</a>. Date Picker für die Auswahl eines einzelnen Datums gibt es ja viele, so bietet jQuery UI hier auch ein grundsolides Widget. Aber wenn es darum geht einen Bereich zu wählen, wird die Auswahl plötzlich sehr klein. Der Date Picker hat ein schickes Design und kann sehr genau konfiguriert und mittels CSS gestaltet werden.</p>
<h2><a title="jGrowl" href="http://www.stanlemon.net/projects/jgrowl.html">jgrowl</a></h2>
<p><a title="jGrowl" href="http://www.stanlemon.net/projects/jgrowl.html"><img src="wp-content/uploads/2009/09/04/jgrowl.jpg" alt="jGrowl" width="520" height="100" /></a></p>
<p>jgrowl orientiert sich an dem Benachrichtigungssystem von <a title="Growl Wikipedia" href="http://de.wikipedia.org/wiki/Growl_%28Software%29">Growl</a>, welches für Mac OS X verfügbar ist. Es zeigt Benachrichtigungen in einer kleinen Box am Bildschirmrand an. rsslounge nutzt dieses Skript nur recht selten, für Fehlermeldungen und wichtige Informationen ist es aber hervorragend geeignet.</p>
<h2><a title="Ajax Upload" href="http://valums.com/ajax-upload/">Ajax Upload</a></h2>
<p><a title="Ajax Upload" href="http://valums.com/ajax-upload/"><img src="wp-content/uploads/2009/09/04/ajaxupload.jpg" alt="Ajax Upload" width="520" height="100" /></a></p>
<p>Mit Hilfe dieses jQuery Plugins können bei rsslounge OPML Dateien importiert werden. So lässt sich der Dateiupload mit einem Klick auf den entsprechenden Menüpunkt starten, ohne das explizit ein neu Laden der Seite oder das Datei Eingabefeld nötig ist.</p>
<h2><a title="Tipsy" href="http://onehackoranother.com/projects/jquery/tipsy/">Tipsy</a></h2>
<p><a title="Tipsy" href="http://onehackoranother.com/projects/jquery/tipsy/"><img src="wp-content/uploads/2009/09/04/tipsy.jpg" alt="tipsy" width="520" height="100" /></a></p>
<p>Das Plugin Tipsy ermöglicht beliebige ToolTipps zu erstellen. Diese verwende ich für den Eingabedialog von neuen Feeds. Manchmal bleiben die ToolTipps noch hängen, hier muss ich also nochmal genauer testen. Der erste Eindruck ist aber sehr gut und die zusätzlichen Informationen sind für Neulinge dann doch eine gute Hilfe.</p>
<h2><a title="SimplePie" href="http://simplepie.org/">SimplePie</a></h2>
<p><a title="SimplePie" href="http://simplepie.org/"><img src="wp-content/uploads/2009/09/04/simplepie.jpg" alt="SimplePie" width="520" height="100" /></a></p>
<p>Das Herzstück von rsslounge ist die Bibliothek SimplePie. Diese PHP Bibliothek ermöglicht es sehr einfach RSS Feeds zu lesen und zu verarbeiten. Ich habe mich für SimplePie und nicht für Zend_Feed entschlossen, da es um einiges ausgereifter ist, mit keinem Feed Probleme hat und sich bereits in vielen Applikationen bewährt hat. Ein erster Test hat dann auch gleich gezeigt das SimplePie schwer zu toppen ist. rsslounge selbst ist so aufgebaut, dass sich problemlos SimplePie durch eine andere Bibliothek ersetzen lässt (oder eine zweite Bibliothek optional gewählt werden kann), bisher gab es aber keinen Grund dafür. SimplePie besteht lediglich aus einer Datei und einer Hand voll Klassen.</p>
<h2><a title="WideImage" href="http://wideimage.sourceforge.net/">WideImage</a></h2>
<p><a title="WideImage" href="http://wideimage.sourceforge.net/"><img src="wp-content/uploads/2009/09/04/wideimage.jpg" alt="WideImage" width="520" height="100" /></a></p>
<p>Für das Erzeugen der Thumbnails verwende ich die Bibliothek WideImage, welche sich zwar noch in Beta befindet, aber im Test super funktioniert. WideImage basiert auf der GD2 Erweiterung und kapselt alle Funktionen in eine Klasse und erlaubt es komfortabel Bilder zu laden, zu verkleinern oder anderweitig zu verändern. Ein Beispiel wie das dann aussehen kann:</p>
<pre class="brush: php; title: ; notranslate">

wiImage::load('image.png')-&gt;resize(50, 30)-&gt;saveToFile('new-image.jpg');
</pre>
<h2>Icons</h2>
<p>An der Stelle will ich auch nicht die Icons vergessen. Diese stammen von <a title="DryIcons" href="http://dryicons.com/free-icons/preview/stickers-icon-set/">DryIcons</a>, welche die Sticker Icons unter einer Free Lizenz anbieten, sowie vom <a title="Smashing Magazine" href="http://www.smashingmagazine.com/2009/03/16/new-smashing-freebies-for-designers-and-bloggers/">Smashing Magazine</a>. Letztere erlauben eine freie Verwendung der Icons (auch für kommerzielle Zwecke, ohne Einschränkungen).</p>
<p>Die Liste ist ganz schön lange, aber bestätigt mich darin laufend gute Skripte zu sammeln. Besonders Funktionalitäten, die sich gut kapseln lassen, oder kompliziert zu entwickeln sind, sind für eigene Projekte eine wahre Bereicherung.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aditu.de/2009/09/04/bibliotheken-und-jquery-plugins-von-rsslounge/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rsslounge 0.1 beta 2</title>
		<link>http://blog.aditu.de/2009/09/02/rsslounge-0-1-beta-2/</link>
		<comments>http://blog.aditu.de/2009/09/02/rsslounge-0-1-beta-2/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 16:35:04 +0000</pubDate>
		<dc:creator>Tobi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[rsslounge]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Feeds]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[RSS Reader]]></category>

		<guid isPermaLink="false">http://localhost/aditu.de/blog2/?p=246</guid>
		<description><![CDATA[Wie bereits angek&#252;ndigt, ist rsslounge jetzt f&#252;r alle &#246;ffentlich verf&#252;gbar. F&#252;r alle die nicht wissen worums &#252;berhaupt geht, hier ein kleiner &#220;berblick: rsslounge ist ein kostenloser, webbasierter RSS Feed Reader. Der Reader ist kein gehosteter Service und muss auf dem eigenen Webserver installiert werden. Features: Vollst&#228;ndiger RSS Reader Unterst&#252;tzt Bilder und Fotoblogs Setze Priorit&#228;ten und [...]]]></description>
			<content:encoded><![CDATA[<p>Wie bereits angek&uuml;ndigt, ist rsslounge jetzt f&uuml;r alle &ouml;ffentlich verf&uuml;gbar. F&uuml;r alle die nicht wissen worums &uuml;berhaupt geht, hier ein kleiner &Uuml;berblick:</p>
<blockquote>
<p>rsslounge ist ein kostenloser, webbasierter RSS Feed Reader. Der Reader ist kein gehosteter Service und muss auf dem eigenen Webserver installiert werden.</p>
</blockquote>
<p><a href="http://rsslounge.aditu.de" title="rsslounge aggregator"><img src="wp-content/uploads/2009/09/02/rsslounge.png" alt="rsslounge screenshot" width="520" height="304" /></a></p>
<p><strong>Features:</strong></p>
<ul>
<li>Vollst&auml;ndiger RSS Reader</li>
<li>Unterst&uuml;tzt Bilder und Fotoblogs</li>
<li>Setze Priorit&auml;ten und filtere Feeds und Eintr&auml;ge</li>
<li>Einfache ajaxbasierte Oberfl&auml;che</li>
<li>Unterst&uuml;tzt auf Ajax basierende, sowie Cronjob Updates</li>
<li class="last">Offenes Pluginsystem zum Hinzuf&uuml;gen eigener Datenquellen</li>
</ul>
<p>Also keine falsche Scheu, einfach saugen und austesten. &Uuml;ber Feedback, egal welcher Art, bin ich dankbar und freue mich &uuml;ber eure Meinungen, Gedanken, Ideen und Probleme.</p>
<p><strong>Downloaden </strong>k&ouml;nnt ihr rsslounge <a href="http://rsslounge.aditu.de/" title="rsslounge">hier</a>.</p>
<p>Wer sich f&uuml;r den Quellcode interessiert, der kann sich auf der <a href="http://code.google.com/p/rsslounge/" title="rsslounge auf Google Code">Google Code Seite</a> informieren. Dort findet ihr ein Wiki, das SVN Repository und weitere Infos. Die Seite werde ich nach und nach mit weiteren Infos bef&uuml;llen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aditu.de/2009/09/02/rsslounge-0-1-beta-2/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

