<?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>PHPUGFFM</title>
	<atom:link href="http://phpugffm.de/index.php/feed" rel="self" type="application/rss+xml" />
	<link>http://phpugffm.de</link>
	<description>one programming language :: one community</description>
	<lastBuildDate>Thu, 05 Aug 2010 13:09:17 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Streams: Wrap it up! Send it out!</title>
		<link>http://phpugffm.de/index.php/streams-wrap-it-up-send-it-out,2010-08,529.html</link>
		<comments>http://phpugffm.de/index.php/streams-wrap-it-up-send-it-out,2010-08,529.html#comments</comments>
		<pubDate>Thu, 05 Aug 2010 12:40:19 +0000</pubDate>
		<dc:creator>Tom</dc:creator>
				<category><![CDATA[Home]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Stream]]></category>
		<category><![CDATA[Wrapper]]></category>

		<guid isPermaLink="false">http://phpugffm.de/?p=529</guid>
		<description><![CDATA[Streams oder Streamwrapper sind ein Feature welches PHP bereits seit längerer Zeit kennt &#8211; und dennoch sind sie immer mal wieder für die eine oder andere Überraschung gut. Sie können recht universell eingesetzt werden um Dateien und Pfade zu abstrahieren, komplett sog. Streams (Fluss von Daten, z.B. eine Datei von ihrem Anfang bis zum Ende) [...]]]></description>
			<content:encoded><![CDATA[<p><b>Streams</b> oder <b>Streamwrapper</b> sind ein Feature welches PHP bereits seit längerer Zeit kennt &#8211; und dennoch sind sie immer mal wieder für die eine oder andere Überraschung gut. Sie können recht universell eingesetzt werden um Dateien und Pfade zu abstrahieren, komplett sog. <i>Streams</i> (Fluss von Daten, z.B. eine Datei von ihrem Anfang bis zum Ende) abbilden und einiges mehr.</p>
<p><em>Dieser Artikel stellt Stream Wrappern in PHP vor und zeigt anhand von existierenden Anwendungs-Beispielen was alles so möglich ist.</em><span id="more-529"></span></p>
<h2>PHP Streams sind doch auch nur Dateien, oder?</h2>
<p>Bei Streams handelt es sich um ein Konzept um Dateien und Zugriff auf eben diese abzubilden. Hört sich theoretisch an, bedeutet aber verkürzt nichts anderes, als das man auf Dateien oder meist ein größere Menge von Daten zugreift. Jeder PHP Entwickler, der einmal auf eine Datei zugegriffen hat, setzt Streams bereits ein. So einfach ist das. Warum also einen Artikel darüber schreiben? Unter der Haube, hat PHP einiges zu bieten und das mit den Dateizugriff ist auch verkürzt. Aber von Anfang an.</p>
<p>Ein wesentliches Merkmal von Streams in PHP ist, dass sich fast alles in der Pfadangabe abspielt, also die Zeichenkette mit der ein Datei- oder Verzeichnisname angegeben wird. In der eigenen Anwendung braucht beim Dateizugriff sonst erstmal kaum etwas weiter beachtet werden.</p>
<p>So können mit den bei PHP von Haus aus eingebauten sog. <i>Stream-Wrappern</i> (dazu später mehr) die bekannten Internetprotokolle wie HTTP oder FTP (um nur zwei zu nennen) genutzt werden, ohne dass die eigene Anwendung irgendwelche Details der Protokolle beachten müsste.</p>
<p>Um dies an einem einfachen Beispiel zu verdeutlichen, habe ich die PHP Funktion <a die href="http://php.net/manual/de/function.file-get-contents.php">file_get_contents()</a> gewählt. Es soll eine CSV Datei geladen werden:</p>
<p><code><br />
$data = file_get_contents('/var/www/data/cities.csv');<br />
</code></p>
<p>Hier kann &#8211; passende PHP Konfiguration vorausgesetzt &#8211; auch per HTTP eine Datei geladen werden, ohne den Programmablauf grundlegend zu verändern. Lediglich der Pfad-Parameter erhält eine neuen Wert:</p>
<p><code><br />
$data = file_get_contents('http://localhost/data/cities.csv');<br />
</code></p>
<p>Das obere Beispiel dürfte bekannt sein. Hier werkelt der Standard-Wrapper, der genau genommen auf <code>file://</code> hört. Dieses im PHP-Jargon genannte <em>Scheme</em> oder <em>Protocol</em> ist am Design von URLs orientiert, muss aber für den Dateizugriff wie man ihn erstmal kennen lernt, nicht explizit mit angegeben werden. Zuständig für alle &#8220;normalen&#8221; Dateizugriffe ist hier der <a href="http://www.php.net/manual/de/wrappers.file.php">Filesystem Wrapper</a>. Er kümmert sich gemeinsam mit der Funktion um all dass, was oftmals lästig erscheint: Gucken ob die Datei da ist (auffinden), öffnen, lesen und schließen (unter dem Link wird u.a. auch erläutert wie genau Pfade bei Dateizugriffen aufgelöst werden).</p>
<p>Im zweiten Beispiel welches ebenfalls selbsterklärend sein dürfte, wurde lediglich die Pfadangabe mit einer HTTP URL ausgetauscht. Mehr war nicht nötig um das HTTP Internetprotokoll im Dateizugriff zu verwenden. Hierfür ist dann der <a href="http://php.net/manual/en/wrappers.http.php">HTTP Wrapper</a> zuständig. Der wird auch aktiv, ohne das weiter etwas nötig wäre, den er ist bei PHP mit dabei.</p>
<p>Was hier im Beispiel so simpel daherkommt, wird durch Streams erst möglich gemacht. Statt auf eine Datei auf der Festplatte zuzugreifen, kann ich auch schnell mal was aus dem Netz laden. Streams vereinheitlichen den Zugriff auf Daten. Nun ist es mehr oder weniger egal geworden, wo die Datei liegt, auf der Festplatte oder auf einem Webserver. Meist nutzen wir dies tagtäglich beim Programmieren, ohne uns darüber weitere Gedanken machen zu müssen.</p>
<p>PHP stellt wie gesagt einige Wrapper bereit, die sich meist über die Pfadangbe nutzen lassen. Einige gibt es erst nach der Installation von PECL Extenstions. Einige Beispiel-Pfade um die Bandbreite zu verdeutlichen:<br />
<code><br />
file:///path/to/file.ext<br />
\\smbserver\share\path\to\winfile.ext<br />
http://user:password@example.com<br />
zip://path/to/textfile.odt#meta.xml<br />
php://memory<br />
compress.bzip2://<br />
data://text/plain;base64,SSBsb3ZlIFBIUAo=<br />
glob://ext/spl/examples/*.php<br />
phar://my.phar/somefile.php<br />
ssh2.shell://user:pass@example.com:22/xterm<br />
</code></p>
<h2>Grenzen und Chancen der Abstraktion</h2>
<p>Einschränkungen die solche Abstraktionsschichten mit sich bringen können schneide ich nur kurz an. So unterstützt nicht jeder Wrapper alle Stream Features, z.B. schreibenden Zugriff im Falle von HTTP. Ich kann die Daten nicht per HTTP wieder zurückschreiben. Und da sich nicht sämtliche Einstellungen jedes x-beliebigem Zielsystems (<i>Protokoll</i>) mit einer simplen Zeichenketten abbilden lassen (wie mache ich einen POST statt einem GET Request?), haben Streams auch einen Kontext (<a href="http://www.php.net/manual/de/stream.contexts.php">Stream Contexts</a>) der die Möglichkeiten meist Stream-spezifisch erweitert. Mehr Informationen dazu in der Dokumentation.</p>
<p>Aber neben diesen Einschränkungen bieten Streams eine Menge Chancen, und die sind erstmal interessanter.</p>
<p>So unterstützen sie nicht nur Datei- sondern ebenfalls Verzeichnis-Operationen. Der besondere Clou: Neben den <a href="http://www.php.net/manual/de/wrappers.php">fest eingebauten Streamwrappern</a> (die bereits sehr zahlreich sind) gibt es die Variante eigener, in PHP geschriebener Wrapper. Jeder kann also seinen eigenen Wrapper schreiben. Hierzu wird eine <a href="http://www.php.net/manual/de/class.streamwrapper.php"><i>streamWrapper</i> Klassen Vorlage</a> verwendet die als Basis für den eigenen Wrapper dient und dann unter einer <a href="http://www.php.net/manual/de/function.stream-wrapper-register.php">Protokoll (<i>Scheme</i>) registriert werden kann</a>. Von da an durchlaufen sämtliche Zugriffe dieses Protokoll/Scheme die eigene Implementierung. Die Dateizugriffe &#8220;besuchen&#8221; die eigene Klasse. Beispielcode hat Nils Langer in seinem Artikel <a href="http://www.phphatesme.com/blog/php/streams-ein-kleines-beispiel/">Streams – Ein kleines Beispiel</a>.</p>
<p>Ebenfalls können PHP Erweiterungen in C geschrieben werden, die solche Wrapper bereitstellen. Darauf gehe ich hier allerdings nicht weiter ein, die PHP Dokumentation hält dazu Informationen bereit. Das gleiche gilt für <a href="http://www.php.net/manual/de/stream.filters.php">Stream Filter</a>, die ich ebenfalls leider hier nicht vertiefe &#8211; sie können aber eine Menge und ergänzen die Wrapper.</p>
<h2>PHP Streaming Extravaganza</h2>
<p>Aufgrund des im Grunde einfachen Konzeptes und des hohen Abstraktionsgrades als auch der Verwendung von Streams innerhalb vom PHP Core Code ergeben sich mannigfaltige Einsatzmöglichkeiten die vielen PHP Entwicklern gar nicht so bewusst sind. Dabei handelt es sich um eine absolute Unterbewertung dieses Features, denn hier macht es durchaus Sinn den Gedanken freien Lauf zu lassen: Von der Entkopplung des konkreten Dateisystem, der Erhöhung der Test- und Wartbarkeit des eigenen Codes bis hin zu verschiedenen Dateisystem-Backends oder gar eines transparenten Cachings, Skalierung und vielem mehr. Den eigenen Ideen sind nur wenig Grenzen gesetzt. Was soll ich schreiben?</p>
<h3>Beispiel PIWI</h3>
<p>Ein Beispiel aus der Praxis über das ich gestolpert bin und welches den Einsatz eines Stream-Wrappers verdeutlicht findet sich im (relativ jungem) <a href="http://www.piwiframework.de/">PIWI</a> Quellcode. Keine Ahnung ob das jetzt ein super Beispiel ist, es hat mir nur wieder mal vor Augen geführt wie weit man mit der Stream-Denke gehen kann und es hat mich auf weitere Ideen gebracht. PIWI ist ein XML-Transformations-Framework zur Web-Publikation von Inhalten. Dies macht Verwendung von PHP&#8217;s <a href="http://www.php.net/manual/de/book.dom.php">DOMDocument</a> mit all seinen Fähigkeiten. Im Grunde alles bestehende PHP Bibliotheken, die bei Transformationen dieser Art gebräuchlich sind und Verwendung finden.</p>
<p>In einem der XSL-Stylesheets der Anwendung stolperte ich über eine Zeile, welche im XSL Stylesheet eine weitere Datei referenziert (vgl. mit einem PHP include nur für XSL), die bei Ausführung eingebunden werden soll:</p>
<p><code><br />
&lt;xsl:include href="xsltsss://customStyleSheet"/&gt;<br />
</code></p>
<p>Meine IDE mäkelte diese Zeile an und dies machte mich neugierig, was es mit <i>xsltsss</i> auf sich hatte. Offensichtlich handelt es sich ja nicht um eine Datei und das Protokoll sagte mir auch nichts. Nach einem Blick in den Quellcode der Anwendung war die Auflösung relativ einfach. Das Puzzle an dem die IDE scheiterte: Auf diesem Protokoll wird im PHP Code ein eigener Stream-Wrapper registriert, der dynamisch zur Laufzeit ein Custom-Stylesheet erstellt (xsltsss = XSLT Style Sheet Stream).</p>
<p>Möglich wird der Einstaz des eigenen StreamWrappers erst dadurch, dass die PHP interne Klasse <a href="http://php.net/manual/en/class.xsltprocessor.php">XSLTProcessor</a> nicht &#8220;einfach nur&#8221; Dateizugriffe sondern sämtliche Streams verwenden. Dies machen auch andere PHP Klassen und Funktionen so. Streams gehen somit durch Mark und Bein einer jeden PHP Anwendung &#8211; ob man sie nun bewusst einsetzt oder nicht. Und das macht sie so interessant wie effektiv.</p>
<p>Falls dies Beispiel Interesse geweckt hat, das Haupt-Stylesheet befindet sich in der Datei <a href="http://code.google.com/p/piwi/source/browse/framework/trunk/piwi/resources/xslt/HTMLTransformation-v1.0.xsl">HTMLTransformation-v1.0.xsl</a>, der PHP Code des Wrappers in <a href="http://code.google.com/p/piwi/source/browse/framework/trunk/piwi/lib/piwi/serializer/XSLTStylesheetStream.class.php">XSLTStylesheetStream.class.php</a> und das Processing u.a. in der <a href="http://code.google.com/p/piwi/source/browse/framework/trunk/piwi/lib/piwi/serializer/HTMLSerializer.class.php">HTMLSerializer.class.php</a> Datei.</p>
<h3>Weitere Beispiele</h3>
<p>Ein weiterer, etwas umfangreicherer Einsatz vom Streamwrapper findet sich im <a href="http://www.egroupware.org/Home">EGroupware</a> Quellcode. Ich setzte den Code nicht ein, allerdings halte ich hier das <a href="http://www.egroupware.org/index.php?page_name=devdocs&#038;lang=&#038;wikipage=VFSSystem">Virtual File System (en)</a> für erwähnenswert. So wie ich die Dokumentation gelesen habe wird hier ein komplettes Dateisystem implementiert, welches mehrere Backends sowie eine Benutzerverwaltung unterstützt. Ich kenne EGroupware nicht sehr genau, vermute aber, dass dieses System dafür eingesetzt wird, um mehrere Datei-Quellen (Repositories) innerhalb der Webanwendungs-Oberfläche den Benutzern zur Verfügung zu stellen. Diese sehen dann einen Verzeichnisbaum in dem Dateien eingeordnet werden &#8211; unabhängig davon, wo sich die Daten nun befinden. Ob in der Datenbank oder auf dem Server direkt oder sonst wo. Muss und soll den User ja auch nicht interessieren.</p>
<p>Das Netz hält noch einige weitere Inspirationen bereit (Surprise, Surprise). <a href="http://code.google.com/p/bovigo/wiki/vfsStream">vfsStream</a> stellt ein Virtuelles Dateisystem für Testing-Frameworks wie PHPUnit oder SimpleTest bereit; Anwendungen wie Drupal 7 planen die <a href="http://www.advomatic.com/blogs/aaron-winborn/stream-wrappers-and-you">Unterstützung von Stream-Wrappern</a>; und es finden sich Anwendungsbeispiele wie <a href="http://blog.northclick.de/archives/10">beim Refactoring eines Transport-Layers mittels Streamwrappern und der SPL</a> um nur einige Beispiele kurz zu nennen.</p>
<h2>Mehr als nur Dateien</h2>
<p>Der Blick in die PHP Dokumentation kann also lohnend sein. Es gibt zwar keine PHP Konfigurations-Direktiven, die Standard Stream Wrapper bereits per PHP INI zu überladen, aber sie können <a href="http://www.php.net/manual/de/function.stream-wrapper-unregister.php">per Funktionsaufruf de-registriert</a> werden, um sie dann mit einem eigenen Wrapper zu ersetzen. Wer aufräumen mag oder muss, kommt mit <a href="http://www.php.net/manual/de/function.stream-wrapper-restore.php">stream_wrapper_restore()</a> wieder auf Los zurück.</p>
<p>Soll der eigene Wrapper mehrere Subsysteme unterstützen, so ist ein pragmatischer Ansatz die Protokolle zu &#8220;stacken&#8221;, also im Pfad aufeinander zu staplen. Ein Beispiel dafür findet sich bei den <a href="http://www.php.net/manual/de/wrappers.audio.php">Audio Streams</a>:</p>
<p><code><br />
ogg://http://www.example.com/path/to/soundstream.ogg<br />
</code></p>
<p>Theoretisch wäre mit den Grundmöglichkeiten, die PHP von Haus aus bereitstellt, es auch möglich ein komplett objekt-orientiertes Subsystem auf der Basis von Streams zu Entwickeln. Im PHP Manual gibt es einen Kommentar, der eine <a href="http://www.php.net/manual/en/class.streamwrapper.php#92277">streamWrapper Interface Definition</a> beinhaltet, das erscheint mir in jedem Falle praktisch. Und wer weiß, vielleicht gibt es ja eines Tages etwas in der SPL. Oder ein Informatikstudent schmeißt mal alles an Pattern drauf, was die Theorie so hergibt &#8211; könnte auch interessant werden, wenn es nicht schon bereits gemacht wurde. Ein System welches für das PHP Umfeld recht Hochgradig durchplant ist, das Flow3 Framework, setzt beispielsweise dezidiert auf <a href="http://flow3.typo3.org/documentation/manuals/flow3/flow3.resourcemanagement/">Wrapper</a> und beinhaltet <a href="http://flow3.typo3.org/fileadmin/API/FLOW3/F3/FLOW3/Resource/Streams/interface-StreamWrapperInterface.html">ein eigenes Interface dafür</a>.</p>
<p>Streams selber sind werden nicht unbedingt direkt als ein Design Pattern, werden aber nah dran eingeordnet (manche reden von Anti-Pattern was den Gesetzen der Dialektik folgend schon sehr nah wäre). Die Affinität bemerkt man auch, wenn man sich über Proxy oder Strategy im Zusammenhang mit Streams mal Gedanken macht. Im Grunde aber sind sie erstmal eine sehr erprobte Abstraktionsschicht. Einige Entwickler kennen das Prinzip von C, dass wie in den meisten Computer-Hochsprachen der Einsatz von Stream Abstraktion gebräuchlich ist. Das <a href="http://www.php.net/~helly/php/ext/spl/classSplFileObject.html">SPLFileObject</a> &#8211; interessant für PHP Entwickler &#8211; unterstützt Streams bereits von Anfang an.</p>
<p>Beim Implementieren einer eigenen StreamWrapper Klasse ist es gut ein wenig Vorsicht walten zu lassen und darauf achten, dass das die Klasse genau das tut was sie auch tun soll und sämtliche Methoden und Eigenschaften des Klassen-Prototypen vorhanden sind. Ein Interface zu definieren ist sicherlich von Vorteil. Fehlerhafter Code kann zu unschönen Situationen führen, worauf auch die PHP Dokumentation hinweist. Von <i>undefined behaviour</i> ist hier die Rede &#8211; das kennt man als Programmierer ja vielleicht. Dies beachtend steht dem eigenen Wrapper nichts mehr im Wege.</p>
<p>Das Konzept von Streams sollte man als (PHP-) Entwickler kennen. Es eignet sich sowohl um bestehende Anwendungen weiter zu entwickeln, als auch Komponenten, welche Daten bereitstellen, in einfacher Weise anzubieten und zu integrieren. Auch können Neuentwicklungen oft von diesem Feature erheblich profitieren.</p>
<p>Meiner Meinung nach ist es ebenfalls sinnvoll das theoretische Konzept von Stream und Kontext ein wenig zu ergründen und damit zu spielen. Objekte in einem Kontext zu führen erweist sich oftmals als eine einfache Lösung, den eigenen Code modular zu halten was nur ein Aspekt ist.</p>
<h2>Weiterführendes</h2>
<ul>
<li><a href="http://www.phphatesme.com/blog/php/streams-ein-kleines-beispiel/">Streams – Ein kleines Beispiel</a> &#8211; von Nils Langner am 22. März 2010.</li>
<li><a href="http://www.php.net/manual/de/book.stream.php">Streams</a> &#8211; PHP Dokumentation für Streams.</li>
<li><a href="http://www.php.net/manual/de/wrappers.php">List of Supported Protocols/Wrappers</a> &#8211; Liste der von Haus aus eingebauten Wrapper.</li>
<li><a href="http://www.php.net/manual/de/class.streamwrapper.php">The streamWrapper class</a> &#8211; Prototyp der streamWrapper Klasse.</li>
<li><a href="http://www.php.net/manual/de/function.stream-wrapper-register.php">stream_wrapper_register</a> &#8211; Funktion zum Registrieren eigener Wrapper.</li>
<li><a href="http://www.php.net/manual/de/internals2.ze1.streams.php">Streams API for PHP Extension Authors</a> &#8211; Informationen für C Implementierungen (PHP/Zend Engine 1)</li>
<li><a href="http://www.joelonsoftware.com/articles/LeakyAbstractions.html">The Law of Leaky Abstractions</a> &#8211; Aufsatz von Joel Spolsky zu Grenzen von Abstraktion</li>
<li><a href="http://www.phpdeveloper.org/tag/wrapper">Wrapper bei PHPDeveloper.org</a> &#8211; Diverse Blog Posts zum Thema Stream-Wrapper</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://phpugffm.de/index.php/streams-wrap-it-up-send-it-out,2010-08,529.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Xdebug 2.1 veröffentlicht</title>
		<link>http://phpugffm.de/index.php/xdebug-2-1-veroffentlicht,2010-07,523.html</link>
		<comments>http://phpugffm.de/index.php/xdebug-2-1-veroffentlicht,2010-07,523.html#comments</comments>
		<pubDate>Thu, 01 Jul 2010 09:40:45 +0000</pubDate>
		<dc:creator>Tom</dc:creator>
				<category><![CDATA[Home]]></category>
		<category><![CDATA[xdebug]]></category>

		<guid isPermaLink="false">http://phpugffm.de/?p=523</guid>
		<description><![CDATA[Die praktische PHP-Erweiterung Xdebug ist in der Version 2.1 erschienen und kommt neben einigen Fehlerbehebungen mit einigen Neuerungen:

Error Collection: Fehler einfach aufsammeln und später kontrolliert ausgeben.
xdebug_get_headers(): Gibt alle bisher gesetzten HTTP-Antwort-Header zurück (egal ob per header() oder setcookie() gesetzt).
&#8220;Scream&#8221; Support: @-Operatoren zu Testzwecken ausschalten.
Und einiges mehr.

Die Xdebug Extension hilft beim Entwickeln in dem sie in [...]]]></description>
			<content:encoded><![CDATA[<p>Die <a href="http://xdebug.org/">praktische PHP-Erweiterung Xdebug</a> ist in der Version 2.1 erschienen und kommt neben einigen Fehlerbehebungen mit einigen Neuerungen:</p>
<ul>
<li><strong>Error Collection:</strong> Fehler einfach aufsammeln und später kontrolliert ausgeben.</li>
<li><strong>xdebug_get_headers():</strong> Gibt alle bisher gesetzten HTTP-Antwort-Header zurück (egal ob per header() oder setcookie() gesetzt).</li>
<li><strong>&#8220;Scream&#8221; Support:</strong> @-Operatoren zu Testzwecken ausschalten.</li>
<li>Und einiges mehr.</li>
</ul>
<p>Die Xdebug Extension hilft beim Entwickeln in dem sie in einer einfachen Art und Weise zusätzliche Debug-Informationen bereitstellt. Daneben beinhaltet sie auch einen kompletten Debugger, der aus einer IDE wie Eclipse oder Netbeans genutzt werden kann.</p>
<p>Sie bietet also für beide Typen des Debuggen etwas: Sowohl für den &#8220;print_r() oder var_dump()-Typen&#8221; als auch den &#8220;interaktiven Typen&#8221;, der sich gerne mit Breakpoints durch den Code hangelt.</p>
<p><a href="http://derickrethans.nl/xdebug-2.1-released.html">Release Notes</a></p>
]]></content:encoded>
			<wfw:commentRss>http://phpugffm.de/index.php/xdebug-2-1-veroffentlicht,2010-07,523.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Barbecue der PHP-UserGroup Frankfurt</title>
		<link>http://phpugffm.de/index.php/barbecue-der-php-usergroup-frankfurt,2010-06,517.html</link>
		<comments>http://phpugffm.de/index.php/barbecue-der-php-usergroup-frankfurt,2010-06,517.html#comments</comments>
		<pubDate>Tue, 29 Jun 2010 07:31:47 +0000</pubDate>
		<dc:creator>Nennemann</dc:creator>
				<category><![CDATA[Home]]></category>
		<category><![CDATA[PHPBBQ]]></category>
		<category><![CDATA[PHPBBQ2010]]></category>

		<guid isPermaLink="false">http://phpugffm.de/?p=517</guid>
		<description><![CDATA[Am Sonntag den 27. Juni 2010 traf sich die PHP-UserGroup Frankfurt. 20  Interessierte hatten trotz Hitze und Fußballbegeisterung um 13 Uhr den Weg zum Niederräder Ufer  gefunden. Ausgerichtet und gesponsert wurde der Event von spieletipps.de. Angemietet hatte man einen Platz auf  der Maininsel in angenehmen Schatten, direktem Zugang zu kühlem Wasser.
Eingefunden hatten [...]]]></description>
			<content:encoded><![CDATA[<p>Am Sonntag den 27. Juni 2010 traf sich die PHP-UserGroup Frankfurt. 20  Interessierte hatten trotz Hitze und Fußballbegeisterung um 13 Uhr den Weg zum Niederräder Ufer  gefunden. Ausgerichtet und gesponsert wurde der Event von <a href="http://spieletipps.de/" target="_blank">spieletipps.de</a>. Angemietet hatte man einen Platz auf  der Maininsel in angenehmen Schatten, direktem Zugang zu kühlem Wasser.</p>
<p>Eingefunden hatten sich Gäste aus Frankfurt und Umgebung mit  verschiedenen beruflichen und fachlichen Hintergründen. Allen gemein war die Affinität zum Netz &#8211; egal  ob auf mobilen oder festen Endgeräten, als Selbstständiger, Angestellter, oder Chef. Das Knüpfen  von Kontakten und der Austausch von Neuigkeiten stand im Vordergrund.</p>
<p>Nach rund 8 Stunden Barbecue, PHP und interessanten Gesprächen waren  sich alle einig: es hat sich gelohnt. Die Veranstaltung verdient eine Fortsetzung.<br />
Die Zwischenzeit wolle man nutzen die UserGroup ein wenig  wiederzubeleben. Auch der Sponsor zeigte sich mit der Resonanz zufrieden. Gern wieder im nächsten Jahr!</p>
<p>Besonderen Dank: Thorsten Rühl, dem Geschäftsführer von Spieletipps als  Sponsor und der PHPUG für einen gelungenen Event.</p>
<p><em>Vielen Dank an <a href="http://www.all-community.de/pub/pages/index.php?language=de">Thomas Meyer</a>, für diesen Text.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://phpugffm.de/index.php/barbecue-der-php-usergroup-frankfurt,2010-06,517.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eclipse PDT 2.2 erschienen</title>
		<link>http://phpugffm.de/index.php/eclipse-pdt-2-2-erschienen,2010-06,512.html</link>
		<comments>http://phpugffm.de/index.php/eclipse-pdt-2-2-erschienen,2010-06,512.html#comments</comments>
		<pubDate>Fri, 25 Jun 2010 11:21:52 +0000</pubDate>
		<dc:creator>Tom</dc:creator>
				<category><![CDATA[Home]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[PDT]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://phpugffm.de/?p=512</guid>
		<description><![CDATA[Vor einigen Tagen bereits ist die neue Version von Eclipse PDT erschienen &#8211; 2.2. Die mittlerweile in Eclipse Helios integrierte Entwicklungsumgebung kann mit vielen weiteren nützlichen Tools erweitert werden um das Schreiben von PHP Code zu vereinfachen. Die neuen Pakete stehen zum Download bereit.
]]></description>
			<content:encoded><![CDATA[<p>Vor einigen Tagen bereits ist die neue Version von <a href="http://www.eclipse.org/pdt/"><em>Eclipse PDT</em> erschienen &#8211; 2.2</a>. Die mittlerweile in <a href="http://www.eclipse.org/"><em>Eclipse Helios</em></a> integrierte Entwicklungsumgebung kann mit vielen weiteren nützlichen Tools erweitert werden um das Schreiben von PHP Code zu vereinfachen. Die neuen Pakete stehen <a href="http://download.eclipse.org/tools/pdt/downloads/">zum Download bereit</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://phpugffm.de/index.php/eclipse-pdt-2-2-erschienen,2010-06,512.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Geek and Poke</title>
		<link>http://phpugffm.de/index.php/geek-and-poke,2010-06,505.html</link>
		<comments>http://phpugffm.de/index.php/geek-and-poke,2010-06,505.html#comments</comments>
		<pubDate>Mon, 14 Jun 2010 13:25:07 +0000</pubDate>
		<dc:creator>Tom</dc:creator>
				<category><![CDATA[Home]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[Poke]]></category>

		<guid isPermaLink="false">http://phpugffm.de/?p=505</guid>
		<description><![CDATA[
Mehr von und auf Geek and Poke.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://geekandpoke.typepad.com/"><img src="http://phpugffm.de/wp-content/uploads/2010/06/geek-and-poke_-_pair-programming.png" alt="Pair Programming - Geek and Poke" title="Pair Programming - Geek and Poke" width="436" height="569" class="aligncenter size-full wp-image-506" /></a></p>
<p>Mehr von und auf <a href="http://geekandpoke.typepad.com/">Geek and Poke</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://phpugffm.de/index.php/geek-and-poke,2010-06,505.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>phpbbq2010</title>
		<link>http://phpugffm.de/index.php/phpbbq2010,2010-06,497.html</link>
		<comments>http://phpugffm.de/index.php/phpbbq2010,2010-06,497.html#comments</comments>
		<pubDate>Mon, 07 Jun 2010 07:08:33 +0000</pubDate>
		<dc:creator>Tom</dc:creator>
				<category><![CDATA[Home]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Veranstaltungen]]></category>
		<category><![CDATA[PHPBBQ]]></category>
		<category><![CDATA[PHPBBQ2010]]></category>

		<guid isPermaLink="false">http://phpugffm.de/?p=497</guid>
		<description><![CDATA[
Das PHP BBQ 2010 in Frankfurt am Main steht: Sonntag den 27. Juni ab 13:00 Uhr im Licht- und Luftbad am Niederräder Ufer. Die Teilnehmerzahl ist begrenzt, mehr Infos in der Mailingliste.
]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full wp-image-501" title="PHP BBQ 2010 FFM" src="http://farm2.static.flickr.com/1058/4724361924_44d1697703_b.jpg" alt="PHP BBQ 2010 FFM" width="436" height="311" /></p>
<p>Das PHP BBQ 2010 in Frankfurt am Main steht: Sonntag den 27. Juni ab 13:00 Uhr im Licht- und Luftbad am Niederräder Ufer. Die Teilnehmerzahl ist begrenzt, <a href="http://groups.google.com/group/phpugffm/msg/abc2ef9533b9357f">mehr Infos in der Mailingliste</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://phpugffm.de/index.php/phpbbq2010,2010-06,497.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Meine Agile Woche: Toyota und Tomaten</title>
		<link>http://phpugffm.de/index.php/meine-agile-woche-toyota-und-tomaten,2010-05,492.html</link>
		<comments>http://phpugffm.de/index.php/meine-agile-woche-toyota-und-tomaten,2010-05,492.html#comments</comments>
		<pubDate>Fri, 28 May 2010 09:29:30 +0000</pubDate>
		<dc:creator>Tom</dc:creator>
				<category><![CDATA[Home]]></category>
		<category><![CDATA[Kaban]]></category>
		<category><![CDATA[Pomodoro]]></category>

		<guid isPermaLink="false">http://phpugffm.de/?p=492</guid>
		<description><![CDATA[Verbesserungen jeglicher Art machen sich immer gut. Und Agilität hört sich schon fesch an. Doch was tun wenn die eignen &#8220;Produktionsstrukturen&#8221; auf das ganze tolle neue Zeugs nicht klarkommen weil irgendwie das ganze schon eher kompliziert oder gar oktroyierend daherkommt? Wenn diese ganzen &#8220;(Zeit)Management Tools&#8221; einem zu kompliziert sind? Mein Tipp diese Woche: Zeitmanagement mit [...]]]></description>
			<content:encoded><![CDATA[<p>Verbesserungen jeglicher Art machen sich immer gut. Und Agilität hört sich schon fesch an. Doch was tun wenn die eignen &#8220;Produktionsstrukturen&#8221; auf das ganze tolle neue Zeugs nicht klarkommen weil irgendwie das ganze schon eher kompliziert oder gar oktroyierend daherkommt? Wenn diese ganzen &#8220;(Zeit)Management Tools&#8221; einem zu kompliziert sind? Mein Tipp diese Woche: Zeitmanagement mit Tomaten und Entwickeln in der <em>Lean Production</em>.</p>
<h3>Pomodoro</h3>
<p>Das Grundprinzip ist schnell erklärt: Kleine, regelmäßige Zeiteinheiten mit Pausenzyklen bei gleichzeitigem fixieren auf einzelne Arbeitsschritte. Die Pomodoro Technik eignet sich hervorragend zum Task oder Ticket orientierten Arbeiten oder iterativen Ansätzen (alles was nicht in 25 Minuten gecoded werden kann, muss man eh direkt neu refaktorieren). </p>
<p>Sie ist einfach und rockt. Das Beste daran: Es erfordert lediglich eine Eieruhr. Als Zyklus ist 25 Minuten plus 5 Minuten Pause angedacht, man kann also zwei Runden pro Stunde drehen wenn man die Pause nicht über dehnt. Ja und wenn 25 Minuten um sind, Hände von der Tastatur. Das ist jetzt verkürzt erklärt, es gibt natürlich ein Buch zu kaufen, das offizielle Set und so und Tonnen an Software:</p>
<p><a href="http://www.pomodorotechnique.com/">The Pomodoro Technique™</a></p>
<h3>Kanban</h3>
<p><a href="http://en.wikipedia.org/wiki/Kanban">Kanban</a> ist vielleicht einigen Leuten mit geschäftlichem Background ein Begriff. Das ganze für die Softwareentwicklung adaptiert, ergibt einen ausgeglichenen Weg (vielleicht wegen fernöstlicher Weisheit?) sich die Arbeit im Team zu organisieren. </p>
<p>Wer also statt mit den tendenziell eher stressigen extrem Programmieren komplette Prozesse umkrempeln will, dem bietet sich das von <a href="http://www.agilemanagement.net/">David J. Anderson adaptiere &#8220;Lean Production&#8221; Model</a> an, das ganze mit mehr Flow angehen zu lassen. Ein deutschsprachiger Artikel findet sich in der <a href="http://www.heise.de/ix/inhalt.html">iX Juni 2010</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://phpugffm.de/index.php/meine-agile-woche-toyota-und-tomaten,2010-05,492.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eclipse, le &#8216;otte key</title>
		<link>http://phpugffm.de/index.php/eclipse-le-otte-key,2010-05,488.html</link>
		<comments>http://phpugffm.de/index.php/eclipse-le-otte-key,2010-05,488.html#comments</comments>
		<pubDate>Thu, 20 May 2010 00:30:52 +0000</pubDate>
		<dc:creator>Tom</dc:creator>
				<category><![CDATA[Home]]></category>
		<category><![CDATA[Eclipse]]></category>

		<guid isPermaLink="false">http://phpugffm.de/?p=488</guid>
		<description><![CDATA[Auch wenn im Titel als Zend Studio bezeichnet, so kann es doch als Eclipse PDT gelesen werden (wie auch das erste Slide mal eben klarstellt). Soviel Lead verdient durchaus Aufmerksamkeit:
royganor / zend-studio Tips-und-Tricks (englisch; Adobe Flash, Javascript oder ein Slideshare Account benötigt)
]]></description>
			<content:encoded><![CDATA[<p>Auch wenn im Titel als <em>Zend Studio</em> bezeichnet, so kann es doch als Eclipse PDT gelesen werden (wie auch das erste Slide mal eben klarstellt). Soviel Lead verdient durchaus Aufmerksamkeit:</p>
<p><a href="http://www.slideshare.net/royganor/zend-studio-tips-and-tricks">royganor / zend-studio Tips-und-Tricks</a> (englisch; Adobe Flash, Javascript oder ein Slideshare Account benötigt)</p>
]]></content:encoded>
			<wfw:commentRss>http://phpugffm.de/index.php/eclipse-le-otte-key,2010-05,488.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Breite Attacke auf Wordpress</title>
		<link>http://phpugffm.de/index.php/breite-attacke-auf-wordpress,2010-05,484.html</link>
		<comments>http://phpugffm.de/index.php/breite-attacke-auf-wordpress,2010-05,484.html#comments</comments>
		<pubDate>Sun, 09 May 2010 18:51:47 +0000</pubDate>
		<dc:creator>Tom</dc:creator>
				<category><![CDATA[Home]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Sicherheit]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://phpugffm.de/?p=484</guid>
		<description><![CDATA[Diesen Sonntag meldet heise online eine solche. Eine kurze Analyse des Angriffes zeigt, das ein jede/r der sich den Vorschlag von letzter Woche beherzigte, der Angriff die Benutzer seiner Webseite nicht weiter gefährdet hätte. Aber offensichtlich wurden bei den betroffenen Hostern Dateizugriffe generell nicht vernünftig abgesichert. Es betrifft im übrigen nicht nur eine einzelne Webanwendung [...]]]></description>
			<content:encoded><![CDATA[<p>Diesen Sonntag meldet <em>heise online</em> eine <a href="http://www.heise.de/newsticker/meldung/Breite-Attacke-auf-Wordpress-996270.html">solche</a>. Eine kurze Analyse des Angriffes zeigt, das ein jede/r der sich den <a href="http://phpugffm.de/index.php/einfacher-schutz-vor-hacks-auf-deinem-wordpress-blog,2010-05,474.html">Vorschlag von letzter Woche</a> beherzigte, der Angriff die Benutzer seiner Webseite nicht weiter gefährdet hätte. Aber offensichtlich wurden bei den betroffenen Hostern Dateizugriffe generell nicht vernünftig abgesichert. Es betrifft im übrigen nicht nur eine einzelne Webanwendung sondern viele PHP basierten Produkte.</p>
]]></content:encoded>
			<wfw:commentRss>http://phpugffm.de/index.php/breite-attacke-auf-wordpress,2010-05,484.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Einfacher Schutz vor Hacks auf deinem WordPress Blog</title>
		<link>http://phpugffm.de/index.php/einfacher-schutz-vor-hacks-auf-deinem-wordpress-blog,2010-05,474.html</link>
		<comments>http://phpugffm.de/index.php/einfacher-schutz-vor-hacks-auf-deinem-wordpress-blog,2010-05,474.html#comments</comments>
		<pubDate>Sun, 02 May 2010 14:33:46 +0000</pubDate>
		<dc:creator>Tom</dc:creator>
				<category><![CDATA[Home]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Eval]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Suhosin]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://phpugffm.de/?p=474</guid>
		<description><![CDATA[Um den eigenen WordPress Blog auch vor zukünftigen Angriffen zu schützen gibt es einen einfachen aber wirksamen Kniff. Viele Angriffe laden bei Erfolg PHP-Code oder gleich ganze Scripte auf den Server die Gebrauch vom PHP Sprachkonstrukt eval() machen. Da seit dem 2.8.5er Release WordPress frei von eval aufrufen ist, kann auch einfach auf diese &#8220;Funktion&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>Um den eigenen WordPress Blog auch vor zukünftigen Angriffen zu schützen gibt es einen einfachen aber wirksamen Kniff. Viele Angriffe laden bei Erfolg PHP-Code oder gleich ganze Scripte auf den Server die Gebrauch vom <a href="http://php.net/eval">PHP Sprachkonstrukt eval()</a> machen. Da seit dem 2.8.5er Release WordPress frei von eval aufrufen ist, kann auch einfach auf diese &#8220;Funktion&#8221; verzichtet werden. Die einfache Idee: Eval abschalten.</p>
<p>Die meisten Linux basierten PHP Setups kommen dieser Tage mit der <a href="http://www.hardened-php.net/suhosin/">Suhosin Extension von Stefan Esser</a>. Und diese kann das. Eine kleine Einstellung aktivieren und schon führt der Aufruf von eval zum Abbruch des Skriptes:</p>
<p><code>suhosin.executor.disable_eval = On</code></p>
<p>Einfach in die php.ini damit und schon ist Ruhe im Karton.</p>
<p>Es ist übrigens noch gar nicht so lange her, dass noch eval Aufrufe im WordPress Quellcode waren. <a href="http://core.trac.wordpress.org/attachment/ticket/9602/9602.patch">Der Patch</a> demonstriert mit ein wenig objektorientierter Programmierung die einfache Implementierung eines &#8220;Statefull Automata&#8221; (Quellcode Dokumentation in englischer Sprache). Dieser macht die Verwendung von eval überflüssig um eine Substitution von Variabeln in einer Zeichenketter vorzunehmen (bei der Verarbeitung von Permalinks in WordPress).</p>
<p>Die einzige Frage die bleibt ist wie lange ein solcher Schutz vorhält. Kann ein Angreifer in Dateien schreiben (und sei es nur nach /tmp), so reicht es, den code über ein include() einzuladen. Oder aber <code>allow_url_include = On</code> ist gesetzt:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Eval für Arme</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$code</span> = <span class="st0">&#8216;echo &quot;Hallo Welt.&quot;;&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">include</span> <span class="st0">&quot;data://text/plain,&lt;?php $code ?&gt;&quot;;</div>
</li>
<li class="li2">
<div class="de2">?&gt;</span></div>
</li>
</ol>
</div>
<p>Via: <a href="http://hakre.wordpress.com/2010/05/02/cheap-hack-worm-protection-for-your-wordpress-blog/" title="hakre on wordpress">Cheap Hack/Worm Protection for your WordPress Blog</a></p>
]]></content:encoded>
			<wfw:commentRss>http://phpugffm.de/index.php/einfacher-schutz-vor-hacks-auf-deinem-wordpress-blog,2010-05,474.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
