<?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>PHP hates me - Der PHP Blog &#187; Tools &amp; Helferlein</title>
	<atom:link href="http://www.phphatesme.com/archives/category/tools/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.phphatesme.com</link>
	<description>PhpHatesMe, but that&#039;s ok!</description>
	<lastBuildDate>Tue, 07 Feb 2012 06:00:42 +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>Continuous Integration</title>
		<link>http://www.phphatesme.com/blog/softwaretechnik/continuous-integration/</link>
		<comments>http://www.phphatesme.com/blog/softwaretechnik/continuous-integration/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 06:00:13 +0000</pubDate>
		<dc:creator>Nils Langner</dc:creator>
				<category><![CDATA[Softwaretechnik]]></category>
		<category><![CDATA[Tools & Helferlein]]></category>

		<guid isPermaLink="false">http://www.phphatesme.com/?p=11780</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p>Wer hat ihn nicht mitbekommen, den Streit um Hudson und die Entstehung von Jenkins. Continuous Integration Server waren eine Zeit lang in aller Munde. Auf PHP-Konferenzen gab immer wieder Vorträge über die Server. Und das auch alles zu Recht. Ich liebe unseren Bamboo!</p>
<p>Aber für all diejenigen, für die Continuous Integration noch ein Buch mit sieben Siegeln ist, hier noch mal die Schnelleinführung von dem, was die meisten glauben. was CI ist. Im nächsten Artikel schreibe ich dann, warum das nicht ganz richtig ist.</p>
<p>Wenn man einen CI-Server einsetzt, dann übernimmt der hauptsächlich eine Aufgabe. Er testet die Applikation. Grob zusammengefasst prüft er in wiederkehrenden Intervallen ein Source-Code-Repository (z.B. SVN), ob Änderungen am Code vorgenommen wurden. Falls es Änderungen gab, so wirft er die vorher definierte Test-Suite an und gibt einem das Ergebnis aus. Je nach Konfiguration bekommen die Teammitglieder dann eine Mail. falls etwas kaputt ist. In den meisten Fällen handelt es sich bei der Test-Suite um Unit Tests. Es ist aber auch problemlos möglich Tools wie Selenium, Code-Sniffer, PHPMD oder ähnliches einzuhängen. Alles was über die Kommandozeile funktioniert, funktioniert auch im CI-Server.</p>
<p>Vorteil von einem solchen Server ist somit, dass kaputter Code nicht lange unentdeckt bleibt, da es jemanden gibt, der sicher nicht vergisst die Tests auszuführen, so wie es einem Entwickler vielleicht passieren könnte. Schön ist es auch, dass es keine Zeit frisst. Niemand sitzt vorm Rechner und lässt die Tests laufen, das macht alles der dumme und günstige Server im Hintergrund.</p>
<p>Das war jetzt also die Quick-and-dirty-Version von dem, was die meisten Leute unter Continuous Intergration verstehen, dem Einsatz eines Continuous Integration Servers. Wie gesagt, im nächsten Artikel ergänzen wir das.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phphatesme.com/blog/softwaretechnik/continuous-integration/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Tobias Zeisings Selfoss</title>
		<link>http://www.phphatesme.com/blog/tools/tobias-zeisings-selfoss/</link>
		<comments>http://www.phphatesme.com/blog/tools/tobias-zeisings-selfoss/#comments</comments>
		<pubDate>Fri, 09 Dec 2011 06:00:09 +0000</pubDate>
		<dc:creator>Nils Langner</dc:creator>
				<category><![CDATA[Ein Herz für Blogger]]></category>
		<category><![CDATA[Tools & Helferlein]]></category>

		<guid isPermaLink="false">http://www.phphatesme.com/?p=11692</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><em>Früher hatte ich mal den Aufruf gestartet, dass jeder, der ein eigenes Projekt hat und regelmäßig phphatesme ließt doch gerne seine Produkte hier vorstellen darf. Tobias Zeising ist dem Aufruf bereits ein <a href="http://www.phphatesme.com/blog/ein-herz-fur-blogger/rsslounge-von-tobias-zeising/">zweites Mal</a> gefolgt und stellt heute sein selfoss vor. Viel Spaß damit.</em></p>
<p>Ob Facebook, Google+ oder Twitter: alle verwenden als zentrales Element einen Stream, eine Pinnwand oder einen Newsbereich mit den aktuellsten Meldungen. Egal wie man es nennt, es handelt sich dabei immer um die erste Anlaufstelle über die sich der Benutzer über aktuelle Themen informieren kann, einen Überblick bekommt und mit wenigen Blicken weiß, was los ist. Ein Konzept, das so simpel wie nützlich ist. Nur ist das immer begrenzt auf die jeweilige Plattform und am Ende muss man sich durch die verschiedenen Netzwerke und Anwendungen klicken. Das schöne Prinzip vom einzelnen Informationsstrom ist damit dahin.</p>
<p>Nachdem ich schon länger einige interessante Frameworks und Bibliotheken testen wollte, war das für mich Grund genug eine Webanwendung zu bauen, welche aus den verschiedensten Quellen Informationen abgreift und in einem einzelnen Stream präsentiert. Praktisch ein beständiger Fluss an Informationen, weshalb ich die Anwendung nach dem schönen isländischen Wasserfall Selfoss benannt habe. Ein Bild das sehr gut passt, denn der Selfoss besteht aus zahlreichen kleinen Wasserfällen, also sozusagen aus viele einzelnen Informationsströme, die zusammen doch in einem Fluss münden. Genau so sollte das Programm funktionieren: Beliebige Quellen können als Plugins (ich habe sie spouts getauft) eingehängt werden und den Informationsstrom so mit Meldungen aus beliebigen Quellen (RSS Feeds, Twitter, Log Files, usw.) befüllen.</p>
<p><img class="alignnone" src="http://blog.aditu.de/wp-content/uploads/2011/10/selfoss-screenshot-thumb.png" alt="" width="500" height="488" /></p>
<h1>Requirements &amp; Planung</h1>
<p>Ich habe schon einige Erfahrung mit meinem letzten Projekt, dem RSS Reader rsslounge sammeln können und somit eine ganze Reihe an Anforderungen:</p>
<ul>
<li>Der Aufbau des Programms sollte simpel sein. Keine riesigen generischen Schnittstellen, keine fetten Frameworks und auch nicht die Möglichkeit alles abdecken zu können. Eine schlichte Architektur und einfacher Code sollten im Zentrum stehen.</li>
<li>Ein einfaches Framework mit möglichst wenigen Dateien sollte verwendet werden. Bei rsslounge setze ich auf das Zend Framework und bin damit auch sehr zufrieden. Allerdings ist das ZF sehr umfangreich und somit wird ein Update auf eine neue Version sehr lästig, da sich sehr viele Dateien sich über FTP durch die Leitung quälen müssen.</li>
<li>Leichte Erweiterbarkeit durch zusätzliche Datenquellen (Spouts).</li>
<li>Selfoss sollte auf dem iPad und auf Android laufen.</li>
<li>Selfoss sollte von seinem Einsatzgebiet nicht zu sehr eingegrenzt werden. Man kann das Programm also als zentrale Sammelstelle für Informationen nutzen, aber auch als mashup Tool verwenden. So kann Selfoss Informationen sammeln und als RSS Feed wieder zur Verfügung stellen. Oder man setzt Selfoss als Livestream ein und präsentiert Meldungen, die man selbst auf verschiedene Plattformen veröffentlicht hat, an einer zentralen Stelle.</li>
</ul>
<p>Das MVC Pattern als Grundgerüst hat sich gut bewährt und ist mittlerweile auch zum letzten Entwickler durchgedrungen. Für das Anbinden der Spouts hatte ich bereits bei rsslounge einen ähnlichen Mechanismus entwickelt. Der sollte wieder recycelt und in abgewandelter Form eingesetzt werden.</p>
<h1>Fat Free PHP Framework</h1>
<p>Als Basis-Framework habe ich mich für das <a href="http://fatfree.sourceforge.net/">Fat Free PHP Framework</a> entschieden. Dabei handelt es sich um ein sehr schlankes Framework, das mit einer Größe von 55kb beworben wird, tatsächlich dann aber doch 223kb und 27 Dateien umfasst. Im Vergleich zum Zend Framework aber immernoch super schlank.</p>
<p>Das Fat Free PHP Framework (kurz F3) benötigt auch PHP 5.3, da es die neuen Möglichkeiten, wie beispielsweise Lambda Funktionen verwendet. Für mich perfekt, die Sprachfeatures von PHP 5.3 mal vol auszuschöpfen. F3 bringt dabei alle wichtigen Funktionen mit, die man so benötigt:</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>Was mich neben der kompakten Größe überzeugt hat, sind die einfachen Programmkonstrukte, die sich damit ergeben. Am besten sieht man das an einem Beispiel:</p>
<pre>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');

F3::run();</pre>
<p>Hier wird als erstes das F3 Framework eingebunden. Dann werden die Verzeichnisse für das Autoloading gesetzt. Anschließend werden die Routen definiert. Da das F3 Framework grundsätzlich den REST Ansatz unterstützt, wird mit F3::route die HTTP Methode und die Ziel URL festgelegt. In einem zweiten Parameter steht dann die Klasse und Methode, die aufgerufen wird (z.B. in der Klasse \controllers\Index die Methode home). Man könnte auch direkt eine Funktion übergeben:</p>
<pre>F3::route('GET /about',

function() {

echo 'No subliminal messages here...';

}

);</pre>
<p>Wie die gesamte Initialisierung von Selfoss und die Definition der Routen erfolgt, könnt ihr euch hier ansehen: <a href="https://github.com/SSilence/selfoss/blob/master/index.php">https://github.com/SSilence/selfoss/blob/master/index.php</a></p>
<h1>Das Backend im Überblick</h1>
<p>Was passiert noch im PHP Backend von Selfoss? Eine ganze Menge, aber dann doch mit erstaunlich wenig Code und eben simpel gestrickt.</p>
<p>Da mich die Templating Engine von F3 nicht überzeugen konnte und ich die PHP Programmierkonstrukte für ein Templating für ausreichend halte, habe ich mir selbst eine Hilfsklasse für das Rendern der PHP Templates erstellt: <a href="https://github.com/SSilence/selfoss/blob/master/helpers/View.php">helpers/View.php</a>. Die Klasse bietet die Methode render, welche einfach das übergebene Template einbindet, ausführt und als String zurück gibt. Es unterstützt auch eine JSON Ausgabe und bietet ein paar Hilfsfunktionen. Damit können Views wie im Zend Framework genutzt werden.</p>
<p>Ein ordentlicher Logger hat mir auch im F3 Framework gefehlt. Also habe ich einen ganz einfachen Logger erstellt: <a href="https://github.com/SSilence/selfoss/blob/master/helpers/Logger.php">helpers/Logger.php</a>, der ausschließlich in Dateien loggen kann.</p>
<p>Für den Datenbankzugriff wird die F3 Komponente verwendet. Die funktioniert auch sehr einfach. Hier ein Beispiel für einen MySQL Datenbankzugriff:</p>
<pre>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>Neben MySQL wird aber auch Sqlite und MongoDB unterstützt. Zwei Modelklassen für die vom Benutzer definierte Quellen und eine für die Einträge kapseln sämtliche Datenbankzugriffe (siehe <a href="https://github.com/SSilence/selfoss/tree/master/models">models</a>).</p>
<h1>Bibliotheken Backend</h1>
<p>Ich bin nicht zimperlich, was den Einsatz von Bibliotheken angeht. Selber machen ist ganz nett, aber es gibt mittlerweile super OpenSource Libraries, die einfach hervorragend sind. Also habe ich auch hier wieder meine Bookmarks gewälzt und auf folgende Bibliotheken zurückgegriffen:</p>
<ul>
<li><a href="http://simplepie.org/">SimplePie</a>: Verwende ich zum Parsen von RSS Feeds. Eine spitzen Bibliothek, die auch mit fehlerhaften Feeds ganz gut umgehen kann.</li>
<li><a href="http://wideimage.sourceforge.net/">WideImage</a>: Verwende ich zum Erstellen der Vorschaubildchen.</li>
<li><a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/">htmLawed</a>: Damit bereinige ich die Feed Einträge von schädlichen HTML und JavaScript Code. Das ist nicht nur aus Sicherheitsaspekten sinnvoll, sondern häufig wird auch fehlerhafter HTML Code ausgeliefert.</li>
<li><a href="https://github.com/rgrove/jsmin-php/blob/master/jsmin.php">jsmin</a>: F3 besitzt zwar einen JavaScript Minifier. Der hat bei mir aber nicht funktioniert und somit setze ich auf diese Lib, die ich auch schon seit langem in rsslounge verwende</li>
<li><a href="http://code.google.com/p/cssmin/">cssmin</a>: das Gleiche wie jsmin für CSS Dateien</li>
<li><a href="http://www.ajaxray.com/blog/2008/03/08/php-universal-feed-generator-supports-rss-10-rss-20-and-atom/">PHP Universal Feed Generator</a>: Damit erzeuge ich ein neues RSS Feed aus den gesammelten Beiträgen.</li>
<li><a href="http://www.phpclasses.org/package/3906-PHP-Read-and-write-images-from-ICO-files.html">floIcon</a>: Damit werden ICO Dateien verarbeitet</li>
</ul>
<h1>Spouts</h1>
<p>Wie eigene Datenquellen ergänzt werden können, ist in der Dokumentation zu finden. Wer z.B. irgendeine Datenquelle (z.B. Logfiles, Email Account, Webseite ohne RSS) anzapfen will, muss dazu lediglich eine einzelne PHP Klasse implementieren. Eine Anleitung, wie das geht, findet ihr in meinem <a href="http://blog.aditu.de/2011/10/17/selfoss-eigene-datenquellen-erstellen/">Blog</a>.</p>
<p>Im Prinzip funktioniert die Anbindung wie folgt:</p>
<ul>
<li>Die Hilfsklasse <a href="https://github.com/SSilence/selfoss/blob/master/helpers/ContentLoader.php">ContentLoader.php</a> lädt alle abzurufenden Quellen, die der Benutzer konfiguriert hat, aus der Datenbank</li>
<li>Dann wird zu jeder einzelnen Quelle das dazugehörige Spout geladen (das macht die Hilfsklasse <a href="https://github.com/SSilence/selfoss/blob/master/helpers/SpoutLoader.php">SpoutLoader.php</a> mit Hilfe von <a href="http://php.net/manual/en/book.reflection.php">Reflection</a>). Einen solchen Spout könnt ihr einfach <a href="http://blog.aditu.de/2011/10/17/selfoss-eigene-datenquellen-erstellen/">implementieren</a>, ohne Selfoss genauer zu kennen.</li>
<li>Der <a href="https://github.com/SSilence/selfoss/blob/master/helpers/ContentLoader.php">ContentLoader</a> ruft die load Methode des jeweiligen Spouts auf, welche dann die Inhalte (z.B. via RSS) abruft.</li>
<li>Dann holt sich der <a href="https://github.com/SSilence/selfoss/blob/master/helpers/ContentLoader.php">ContentLoader</a> nacheinander alle abgerufenen Beiträge und speichert diese in der Datenbank ab (sofern noch nicht vorhanden).</li>
</ul>
<h1>Frontend</h1>
<p>Für das HTML Grundgerüst konnte ich endlich einmal die <a href="http://html5boilerplate.com/">HTML5 Boilerplate</a> Vorlage ausprobieren. HTML5 war für mich die Technik der Wahl, nachdem alles auch auf mobilen Plattformen laufen sollte. Im Grunde verwende ich nichts von den HTML5 Neuerungen, aber wer weiß, was die Zukunft bringt.</p>
<p>HTML5 Boilerplate enthält auch die JavaScript Bibliothek <a href="http://www.modernizr.com/">modernizr</a>. Diese prüft das vorhandene System und fügt zum html Tag CSS Klassen hinzu, welche unterstützte Features markieren. So kann sehr einfach geprüft werden, ob z.B. das aktuelle Device touch-Funktionen unterstützt:</p>
<pre>if($(‘html‘).hasClass(‘touch‘)) {

…</pre>
<h1>Frontend Bibliotheken</h1>
<p>Nein, ich bin ganz sicher nicht zimperlich was Bibliotheken angeht. Aber wieso das Rad neu erfinden? Hier die Liste mit Bibliotheken, die ich für das Frontend verwende und auch weiterempfehlen kann:</p>
<ul>
<li><a href="http://elasticss.com/">Elastic CSS Framework</a>: Mit Browserkompatibilität kann man Nächte verbringen. Gerade was mehrspalitge Layouts usw. angeht. Daher verwende ich Elastics, dass sehr viel out of the box mit bringt.</li>
<li><a href="http://cubiq.org/iscroll">iScroll</a>: Der Stream ist in einem div Element untergebracht. Um das via touch scrollbar zu machen (z.B. auf dem iPad), verwende ich die JavaScript Bibliothek iScroll. Ein echter Tipp, denn diesbezüglich scheint es keine weiteren Alternativen zu geben.</li>
<li><a href="http://jquery.com/">jQuery</a>: Muss ich noch was dazu sagen?</li>
<li><a href="http://www.openjs.com/scripts/events/keyboard_shortcuts/">Keyboard Shortcuts</a>: Ein sehr schönes Skript um ganz einfach mit Funktionen auf Keypress Aktionen zu reagieren.</li>
</ul>
<h1>Download</h1>
<p>Selfoss ist natürlich OpenSource (GPLv3) und kann frei heruntergeladen werden:</p>
<p><a href="http://selfoss.aditu.de/">http://selfoss.aditu.de/</a></p>
<p>Sämtliche Quellen können auch auf <a href="https://github.com/SSilence/selfoss">github</a> eingesehen werden.</p>
<p>Gerne könnt ihr mich für Fragen kontaktieren: tobias.zeising@aditu.de. Und wenn jemand eine eigene nützliche Datenquelle (Spout) entwickelt hat, freue ich mich sehr über Feedback und Sourcecode.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phphatesme.com/blog/tools/tobias-zeisings-selfoss/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>&#8220;Symfony2 MVC &#8211; I don&#8217;t care&#8221;</title>
		<link>http://www.phphatesme.com/blog/webentwicklung/symfony2-mvc-i-dont-care/</link>
		<comments>http://www.phphatesme.com/blog/webentwicklung/symfony2-mvc-i-dont-care/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 06:00:20 +0000</pubDate>
		<dc:creator>Nils Langner</dc:creator>
				<category><![CDATA[Tools & Helferlein]]></category>
		<category><![CDATA[Webentwicklung]]></category>

		<guid isPermaLink="false">http://www.phphatesme.com/?p=11205</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p>Heute wollen wir mal wieder über den Franzosen berichten, der uns Symfony2 gebracht hat. Fabien Potencier. Und Leute die mich kennen, wissen, dass ich den Typ absolut nicht leiden kann. Er wirkt einfach arrogant und narzisstisch. Das doofe dabei ist, er hat leider wirklich was auf dem Kasten. Was er also an Unsympathie mitbringt macht er durch technisches Verständnis und gute Ideen wieder wett. Also kann ich es akzeptieren, dass er in der Community einen so hohen Stellenwert hat. Nicht das ihn das stören würde, wenn es nicht so wäre. Ok, genug gelästert? Ich glaube schon.</p>
<p>Ok jetzt zum Artikel. Vor ein einigen Tagen waren wir in Köln zum Symfony Day und Fabien hat in seiner Keynote ein wenig über Symfony2 philosophiert. Dabei hat er auch über MVC-Frameworks gesprochen und erklärt, dass man so gut wie nie in der Symfony-Doku finden wird, dass es sich dabei um eines handelt. Aber warum? Ist Symfony2 denn kein MVC-Framework? Wäre ja grausam, denn MVC verstehen wir und damit können wir auch arbeiten. Ja, Symfony ist auch weiterhin ein MVC-Framework, aber warum hat der Franzose das dann gesagt? <strong>Es ist ihm einfach egal</strong>.</p>
<p>Nutzt das Framework doch wie ihr wollt und wie es am besten zu euch passt. Ihr braucht MVC, dann kommt ihr eben so gut mit Symfony zurecht, wie jemand der einfach einen Webservice auf die Beine stellen will. Dank der Komponentisierung kann man auch viel kleinteiliger arbeiten und zum Beispiel nur den Class-Loader benutzen.</p>
<p>Hinter dem ganzen &#8220;I don&#8217;t care&#8221; stecken zwei Ideen. Zum einen will er die Verbreitung von Symfony fördern und dabei ist es sinnvoll bekannt zu machen, dass es eben viel mehr als ein MVC-Framework ist und man es überall einsetzen kann. Wiederverwendbarkeit ist einfach was feines. Und je mehr Projekte sf nutzen, umso schwieriger wird es an dem Thema vorbei zu kommen. Genial für eine Firma, die damit ihr Geld verdient. Zweiter Punkt ist eher so etwas prinzipielles. Wenn euch MVC nicht 100% zusagt, dann nutzt es nicht zu 100%. Erweitert die Ideen, programmiert nicht zu engstirnig. Wenn ihr ein MVCD machen wollt, dann macht es. Frische Ideen haben noch nie geschadet. Erfindet aber bitte das Rad an dieser Stelle nicht neu.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phphatesme.com/blog/webentwicklung/symfony2-mvc-i-dont-care/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Gamification bei Symfony2</title>
		<link>http://www.phphatesme.com/blog/tools/gamification-bei-symfony2/</link>
		<comments>http://www.phphatesme.com/blog/tools/gamification-bei-symfony2/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 05:00:03 +0000</pubDate>
		<dc:creator>Nils Langner</dc:creator>
				<category><![CDATA[Aktuelles]]></category>
		<category><![CDATA[Tools & Helferlein]]></category>

		<guid isPermaLink="false">http://www.phphatesme.com/?p=10747</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p>Wir sind alles Spielkinder und Angeber ist man ja auch manchmal gerne. Aus diesem Grund finde ich auch die Vorgehensweise im Symfony2-Projekt echt interessant. Bis jetzt konnte man auf der Symfony-Seite immer sehen, wer am häufigsten comitted hat und wer derzeit an erster Stelle steht. Ist schon toll, wenn man dort auftaucht, finde ich. Da ich aber selbst noch nichts beigetragen habe, findet man mich nicht in der Liste. Leider.</p>
<p>Hier wird also damit gespielt, dass man gerne bei etwas großen dabei sein will. Und genau das treiben die Jungs um <a href="http://fabien.potencier.org/">Fabien Potencier</a> noch ein Stück weiter. In den nächsten Wochen soll ein neues Symfony-Community-Portal eröffnet werden, in dem man für alles mögliche Badges bzw. Buttons gewinnen kann. Wir kennen das ja alle von diversen Spielen wie zum Beispiel Little Big Planet oder Foursquare. Im Symfony-Context könnte das bedeuten, dass man beim ersten Commit ein Badge bekommt, wenn man mal an der Spitze der Liste saß, bekommt man einen anderen, wer Fabien eine Postkarte schreibt erhält den dritten und und und. Die Ideen sind einfach unendlich und bestimmt wird jemand eingestellt, der den ganzen Tag nur neue Trophäen erfindet.</p>
<p>Das klingt von mir jetzt vielleicht ein wenig überzogen, aber ich bin mir total sicher, dass diese Herangehensweise ein echter Erfolg wird. Es werden viele genau aus diesem Grund ein wenig Doku schreiben oder mal einen kleinen Performance-Tweak zur Verfügung stellen. Ich bin auf jeden Fall dabei und ich glaube das andere Open-Source-Frameworks sich relativ schnell was von der Idee abschneiden werden.</p>
<p>Die Information, dass so etwas in Planung ist, kommt übrigens direkt von Monsieur Potencier persönlich, der dies auf seiner Keynote im Freitag in Köln erzählt hat.</p>
<p>So jetzt seid ihr mal wieder gefragt, haltet ihr das für idiotisch und meint, dass ihr Entwickler seid und keine Spielkinder?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phphatesme.com/blog/tools/gamification-bei-symfony2/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Shell Fu for Developers</title>
		<link>http://www.phphatesme.com/blog/webentwicklung/shell-fu-for-developers/</link>
		<comments>http://www.phphatesme.com/blog/webentwicklung/shell-fu-for-developers/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 13:00:00 +0000</pubDate>
		<dc:creator>Nils Langner</dc:creator>
				<category><![CDATA[Tools & Helferlein]]></category>
		<category><![CDATA[Vorträge]]></category>
		<category><![CDATA[Webentwicklung]]></category>

		<guid isPermaLink="false">http://www.phphatesme.com/blog/webentwicklung/shell-fu-for-developers/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p>Franz Pletz möchte mit seinem Vortrag, nachdem vor einigen Wochen bereits Martin Brotzeller in die grundlegende Shell- und UNIX-Tools-Benutzung eingeführt hat, in die Customization der eigenen Shell und in sinnvollen weiteren Tools, die den Developer-Alltag erleichtern, einführen. Dies sind einerseits Standardtools mit ungeahnter Zusatzfunktionalität, die allerdings häufig nicht bekannt sind aber auch Zusatztools, die erst neu zu installieren sind. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.phphatesme.com/blog/webentwicklung/shell-fu-for-developers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Edge Side Includes &#8211; Nachteile</title>
		<link>http://www.phphatesme.com/blog/webentwicklung/edge-side-includes-nachteile/</link>
		<comments>http://www.phphatesme.com/blog/webentwicklung/edge-side-includes-nachteile/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 05:00:55 +0000</pubDate>
		<dc:creator>Nils Langner</dc:creator>
				<category><![CDATA[Tools & Helferlein]]></category>
		<category><![CDATA[Webentwicklung]]></category>

		<guid isPermaLink="false">http://www.phphatesme.com/?p=10507</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p>Vor kurzem hatte ich eine &#8220;neue&#8221; Technologie vorgestellt &#8211; <a href="http://www.phphatesme.com/blog/webentwicklung/edge-side-includes/">Edge Side Includes</a> genannt. Habe auch erklärt warum sie total toll ist und so weiter. Im letzten Satz kam dann das ABER, vielleicht ist ja doch nicht alles Gold was glänzt. Dieser Artikel soll ein paar Nachtteile aufdenken, die meiner Meinung nach existieren.</p>
<ul>
<li><strong>Fehlende Framework-Unterstützung</strong>: ESI klingt zwar einfach, aber wenn das Framework es nicht unterstützt, dann kann es haarig werden. Das System muss ja so gebaut sein, dass jeder Snippet der Seite unabhängig vom Rest gerendert werden kann. Soviel ich weiß, ist Symfony2 das erste und einzige Framework derzeit auf dem PHP-Markt das es unterstützt. Nachträglich sowas einzubauen halte ich für sehr komplex.</li>
<li><strong>Overhead</strong>: Das ist jetzt für jedes Projekt eine eigenen Rechenaufgabe. Nehmen wir an, wir nutzen ein relativ schwergewichtiges Framework, welches 100ms braucht um hochzufahren. Jetzt besteht unsere Seite im einfachsten Fall aus zwei Teilen. Da wir dank ESI beide getrennt haben, müssen wir jetzt zwei mal das Framework hochfahren. 200ms einfach im Framework verbraten ist halt schon mal ein doofer Startpunkt für eine Hochlastseite. Wir wollten ESI vor kurzem auch bei einer relativ bekannten Seite einführen und sind daran gescheitert, dass zwei Teile der Seite gar nicht cachebar waren und somit ESI keine Beschleunigung gebracht hätte.</li>
<li><strong>Parallelität</strong>: Wer gerade den Overhead-Punkt nicht einfach nur überflogen hat, der hat sich sicherlich die Frage gestellt, warum man die zwei ESI-Includes nicht einfach parallel abholt und somit immer nur das Maximum der beiden Requests zu buche schlägt. Tja, ESI kann das leider nur sequentiell. Wobei ich gerade nicht genau weiß, ob es eine ESI-Einschränkung oder ob die Varnisch-Implementierung das Problem ist. Wenn man es aber mal genau betrachtet, kann es schon ganz logisch sein. Was wäre, wenn ein Include Cookies setzt und das andere darauf zurückgreifen will? Wenn immer mal eins von beiden zuerst fertig ist, hat man kein konsistentes Verhalten und debugging wird die Hölle. <a href="http://en.wikipedia.org/wiki/Unusual_software_bug#Heisenbug">Heisenbug</a> lässt grüßen.</li>
</ul>
<p>Das waren jetzt erstmal die von mir gesehenen drei Nachteile. Ihr werdet sicherlich auch noch einiges beitragen können.</p>
<p>Ach ja, heute geht meine Elternzeit zu Ende. Nach zwei Monaten zu hause wieder mal richtig arbeiten. Ich sag euch dann wie es war.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phphatesme.com/blog/webentwicklung/edge-side-includes-nachteile/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Edge Side Includes</title>
		<link>http://www.phphatesme.com/blog/webentwicklung/edge-side-includes/</link>
		<comments>http://www.phphatesme.com/blog/webentwicklung/edge-side-includes/#comments</comments>
		<pubDate>Wed, 07 Sep 2011 05:00:15 +0000</pubDate>
		<dc:creator>Nils Langner</dc:creator>
				<category><![CDATA[Tools & Helferlein]]></category>
		<category><![CDATA[Webentwicklung]]></category>

		<guid isPermaLink="false">http://www.phphatesme.com/?p=10303</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p>Da ich gerade dabei bin mit Mike zusammen einen Artikel für die ix zu schreiben und das Thema ESI (Edge Side Includes) angerissen wird, habe ich mir gedacht, ich schreibe hier auch mal eine ganz kurze Übersicht über das meiner Meinung nach wichtigste Feature dieser Technologie.</p>
<p>Betrachtet man das Caching-Verhalten einer Webseite, dann bemerkt man, dass sie so lange gültig sein kann, wie das aktuellste Element auf ihr. Existiert zum Beispiel eine Box mit den aktuellsten Nachrichten, die jede Minute aktualisiert werden muss,  so kann man mit reinem HTML da nichts machen. außer die komplette Seite maximal für eine Minute im Cache des Nutzers zu legen. Eigentlich eine nicht wirklich optimale Vorgehensweise, da die meisten Systeme zusätzlich so aufgebaut sind, dass sie immer die ganze Seite berechnen wenn eine Anfrage kommt. Gut einiges liegt im Cache, aber vieles eben auch nicht.</p>
<p>ESI kann dazu genutzt werden, dieses Problem ein wenig abzuschwächen und vielleicht sogar zu lösen. Eigentlich von <a href="http://www.akamai.de/">Akamai</a> vor einigen Jahren erfunden, wurde es 2001 als offizieller <a href="http://www.w3.org/TR/esi-lang">Standard bei der w3c</a> eingereicht. Man braucht also keine Angst haben, dass man sich bei Verwendung auf eine Technologie festlegt, die keine Zukunft hat. Fangen wir aber an das Feature zu beleuchten, dass uns bei unserem Problem helfen kann.</p>
<p>Edge Side Includes bieten einem die Möglichkeit die Webseite in einzelne Bestandteile aufzuteilen und diese somit auch wie eigene HTML-Seiten zu betrachten. Nehmen wir an, der Header unserer Seite würde als ein solcher Bestandteil gekennzeichnet werden. Wir haben nun die Möglichkeit genau diesen Header einzeln zu Cachen und das schöne ist, wir nutzen die HTTP-Header, die wir eh schon kennen. Im ESI-Jargon sprechen wir einfach mal von includes und es würde wie folgt aussehen:</p>
<pre>&lt;esi:include src="http://phphatesme.com/header.php" /&gt;</pre>
<p>Ziemlich einfach und verständlich, oder? ESI wird, wie man sieht, über XML-Elemente direkt im HTML gesteuert. Natürlich immer im ESI-Namespace, so wie es sich gehört. Jetzt kann man sich natürlich fragen, wer ein solches Tag versteht, die header.php anruft und die eigentliche Seite zusammenbaut. <a href="https://www.varnish-cache.org/">Varnish</a> oder <a href="http://www.squid-cache.org/">Squid</a> wären hier zum Beispiel zwei Kandidaten.</p>
<p>Um diese Tags zu verarbeiten schaltet man eine Instanz vor den Webserver, der diese interpretieren kann. Einige HTTP-Acceleratoren können dies. Wir haben gute Erfahrungen mit Varnish gemacht. Egal welches Tool, es werden die einzelnen Bestandteile zusammengefügt und nach allen HTTP-Gesichtspunkten verarbeitet. Caching funktioniert also weiterhin wie gehabt. Nachdem alle Schnippsel abgeholt wurden, wird eine ganze Seite zusammengesetzt, die ESI-Tags rausgeworfen und ausgeliefert. Einfach, oder? Also zumindest das Prinzip und wenn man ein wenig mit einem HTTP-Accelerator rumgespielt hat, sollte einem hier kaum etwas spanisch vorkommen.</p>
<p>Da alle Tags entfernt werden ist diese Technologie für den Endkunden, also die Person, die am Browser sitzt komplett transparent. Es hat keine Ahnung rauszufinden, was da im Hintergrund passiert und trotzdem gewinnt man in den meisten Fällen sehr viel Performance auf den Servern, denn nicht mehr die ganze Seite, sondern nur einzelne Teile müssen berechnet werden.</p>
<p>Suchmaschinen bekommen übrigens auch ein vollständiges HTML-File, was ein großer Vorteil gegenüber AJAX ist, mit welchem man dieses System ja auch ohne Probleme hätte umsetzen können.</p>
<p>Falls Interesse besteht, würde ich noch Folgeartikel schreiben, denn etwas über Symfony2 und ESI hätte ich noch parat, wann ESI keinen Vorteil bringt, was ESI noch kann und wo Fallstricke lauern. Wären also vier an der Zahl, die ich wohl aufs restliche Jahr verteilen werde.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phphatesme.com/blog/webentwicklung/edge-side-includes/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

