<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>hasematzel.de</title>
	
	<link>http://hasematzel.de</link>
	<description>Oliver Schwarz über Web-Entwicklung, Accessibility, Usability und das Internet</description>
	<lastBuildDate>Mon, 02 May 2011 08:04:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/hasematzel" /><feedburner:info uri="hasematzel" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>51.131734</geo:lat><geo:long>7.211865</geo:long><item>
		<title>PHP Code Sniffer und Mess Detector in Netbeans 7.0 integrieren</title>
		<link>http://feedproxy.google.com/~r/hasematzel/~3/MpfFrteUD2c/</link>
		<comments>http://hasematzel.de/2011/05/php-code-sniffer-und-mess-detector-in-netbeans-7-0-integrieren/#comments</comments>
		<pubDate>Mon, 02 May 2011 08:04:23 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web-Entwicklung]]></category>
		<category><![CDATA[Werkzeuge]]></category>

		<guid isPermaLink="false">http://hasematzel.de/?p=1007</guid>
		<description><![CDATA[Was bringen einem die grossartigen Werkzeuge wie PHP Mess Detector oder der PHP Code Sniffer, wenn sie auf der Kommandozeile vor sich hinschlummern. Mit ein paar Handgriffen sind sie in eine IDE integriert. Hier ein Beispiel mit der recht jungen 7.0-Version von Netbeans. <a href="http://hasematzel.de/2011/05/php-code-sniffer-und-mess-detector-in-netbeans-7-0-integrieren/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Netbeans ist seit der 7er Beta mein Standard-IDE auf Mac OS X. Um das Entwickeln von PHP-Anwendungen zu bereichern, habe ich dazu den <a title="PHP Code Sniffer als PEAR-Paket" href="http://pear.php.net/package/PHP_CodeSniffer/">PHP Code Sniffer</a> und den <a title="Der PHP Mess Detector" href="http://phpmd.org/">PHP Mess Detector</a> in Netbeans integriert. Der Code Sniffer warnt mich, sobald ich beim Schreiben des Codes von einem gewissen Standard abweiche. Vordefiniert sind die Coding Standards von PEAR, MySource, PHPCS, Squiz und Zend. Über eine eigene <code>ruleset.xml</code> kann man die Standards aber sehr leicht erweitern, bzw. sich aus den vorhandenen, sogenannten <em>Sniffs</em> einen neuen Standard zusammenbauen. Der Mess Detector macht mich per Fehler- oder Warnmeldung in meinem <em>Tasks</em>-Fenster darauf aufmerksam, dass mein Code bestimmte Grenzen überschreitet: <a title="Einfache Einführung in Zyklomatische Komplexität mit Beispielen" href="http://www.litfuel.net/plush/?postid=137">Zyklomatische Komplexität</a> (hehe :), die Grösse von Modulen, zu kurze Variablennamen, ungenutzter Code &#8211; trifft also generell eine Aussage über die Stabilität meiner Applikation.</p>
<h2>Installation über PEAR</h2>
<p>phpmd und phpcs werden über PEAR installiert. Auf Mac OS X hat man PEAR standardmässig im Pfad &#8211; d. h. ein Aufruf von <code>pear version</code> im Terminal liefert normalerweise den aktuellen Stand der Installation. Um den aktuellen Code Sniffer zu holen, reicht also ein:</p>
<pre><code>#&gt; pear install PHP_CodeSniffer-1.3.0
downloading PHP_CodeSniffer-1.3.0.tgz ...
Starting to download PHP_CodeSniffer-1.3.0.tgz (327,201 bytes)
...................................................................done: 327,201 bytes
install ok: channel://pear.php.net/PHP_CodeSniffer-1.3.0</code></pre>
<p>Danach steht der Code Sniffer über den einfachen Befehl phpcs auf der Kommandozeile zur Verfügung.</p>
<p>Auch phpmd wird über PEAR installiert, benötigt zusätzlich das Paket von pdepend:</p>
<pre><code>#&gt; pear channel-discover pear.phpmd.org
#&gt; pear channel-discover pear.pdepend.org
#&gt; pear install --alldeps phpmd/PHP_PMD</code></pre>
<p>Auch der Mess Detector steht danach auf der Kommandozeile per Befehl <code>phpmd</code> zur Verfügung. Die Verwendung ist etwas komplizierter, <a title="Offizielle phpmd-Dokumentation" href="http://phpmd.org/documentation/index.html">wird in der offiziellen Dokumentation aber ausreichend erklärt</a>.</p>
<h2>Das Netbeans-Plugin ziehen und installieren</h2>
<p>Es gibt <a href="http://sourceforge.net/projects/phpmdnb/">ein kombiniertes Plugin</a>, welches beide Module sofort in die Netbeans Taskliste integriert. Nach Herunterladen wähle ich in Netbeans Tools &gt; Plugins, um mir die Pluginliste anzeigen zu lassen. Unter dem Tab &#8220;Downloaded&#8221; kann ich dann den Ort für das heruntergeladene Plugin angeben und eine Installation durchführen.</p>
<p>Nach der Installation hat sich das PHP-Menü in den Einstellungen verändert und ich habe zwei neue Reiter: phpMD und phpCodeSniffer:</p>
<p><a href="http://hasematzel.de/wp-content/uploads/2011/05/netbeans-config.png"><img class="alignnone size-full wp-image-1011" title="netbeans-config" src="http://hasematzel.de/wp-content/uploads/2011/05/netbeans-config.png" alt="" width="500" height="169" /></a></p>
<p>Um beide Werkzeuge nun in Netbeans zu integrieren, wähle ich den jeweiligen Reiter und muss den Pfad zur entsprechenden Batch-Datei angeben. Ausführbare PEAR-Pakete werden im Standard im Pfad /usr/local/bin/ installiert und sind dort zu finden.</p>
<p><a href="http://hasematzel.de/wp-content/uploads/2011/05/netbeans-phpmd.png"><img class="alignnone size-full wp-image-1013" title="netbeans-phpmd" src="http://hasematzel.de/wp-content/uploads/2011/05/netbeans-phpmd.png" alt="" width="576" height="330" /></a></p>
<p>Die <a href="http://phpmd.org/rules/index.html">rulesets werden auf der phpmd-Webseite</a> erklärt. Ein Klick auf &#8220;test settings&#8221; sagt uns, ob wir die richtige ausführbare Datei erwischt haben.</p>
<p>Das gleiche Spiel wiederholen wir nun für den CodeSniffer. Auch hier wählen wir den Standard, den wir verwenden wollen. Im Screenshot sieht man, dass ich den PEAR-Standard verwende:</p>
<p><a href="http://hasematzel.de/wp-content/uploads/2011/05/netbeans-phpcs.png"><img class="alignnone size-full wp-image-1014" title="netbeans-phpcs" src="http://hasematzel.de/wp-content/uploads/2011/05/netbeans-phpcs.png" alt="" width="559" height="137" /></a></p>
<p>Sind beide Module einmal installiert, gehe ich in mein Projektfenster und öffne eine PHP-Datei. Netbeans verfügt über eine exzellente Filterung von Tasks (eine der Gründe, warum ich derzeit Netbeans vor Eclipse PDT verwende). Ich kann einstellen, ob ich meine Tasks über alle Projekte, ein Projekt, nur offene Dateien oder nur die angezeigte Datei darstellen will. Gleichzeitig kann ich mir Filter bauen wie &#8220;Development&#8221;, &#8220;Quality&#8221; oder &#8220;TODO&#8221;, um mir nur bestimmte Tasks anzeigen zu lassen. Ausserdem lassen sich Tasks als allgemeine oder gruppierte Listen anzeigen. Das macht es einfach, einen Bereich nach dem anderen abzuarbeiten und nicht immer 500+ Todos, Fehler und Warnings mit sich rumzuschleppen.</p>
<p><a href="http://hasematzel.de/wp-content/uploads/2011/05/netbeans-tasks.png"><img class="alignnone size-full wp-image-1015" title="netbeans-tasks" src="http://hasematzel.de/wp-content/uploads/2011/05/netbeans-tasks.png" alt="" width="572" height="437" /></a></p>
<p>Wenn man in einem Team arbeitet, sind Mess Detector und Code Sniffer meiner Meinung nach unverzichtbar. Auch wenn man alleine arbeitet, verhindert die Netbeans-Integration beider Werkzeuge so manchen Bug und manchen schlechten Code. Der nächste Schritt ist die Einbindung von den Tools als pre-commit Hook im Versionierungssystem. Aber das machen wir ein anderes mal :)</p>
<img src="http://feeds.feedburner.com/~r/hasematzel/~4/MpfFrteUD2c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/2011/05/php-code-sniffer-und-mess-detector-in-netbeans-7-0-integrieren/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://hasematzel.de/2011/05/php-code-sniffer-und-mess-detector-in-netbeans-7-0-integrieren/</feedburner:origLink></item>
		<item>
		<title>Ein kurzer Blick auf den Status der PHP-Entwicklung</title>
		<link>http://feedproxy.google.com/~r/hasematzel/~3/pwii6UJxaTI/</link>
		<comments>http://hasematzel.de/2011/04/ein-kurzer-blick-auf-den-status-der-php-entwicklung/#comments</comments>
		<pubDate>Sat, 30 Apr 2011 12:17:27 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web-Entwicklung]]></category>

		<guid isPermaLink="false">http://hasematzel.de/?p=999</guid>
		<description><![CDATA[Der Stand der Dinge in der PHP-Entwicklung. Ohne Anspruch auf Vollständigkeit. <a href="http://hasematzel.de/2011/04/ein-kurzer-blick-auf-den-status-der-php-entwicklung/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In den letzten Jahren hat sich in PHP extrem viel getan. Nach einem anfänglich doch belächeltem Status ist PHP zu einer mächtigen Instanz herangereift, fundiert auf kontinuierlicher Entwicklung, flankiert durch unzählige Tools und getragen durch eine aktive Community. Mittlerweile ist PHP ein <em>Big Player</em> &#8211; wen wundert es da, dass der Einstieg für Programmierer immer komplexer wird. Man kann natürlich immer noch in Sekunden ein paar Zeilen prozeduralen PHP-Code raushauen. In der folgenden Übersicht versuche ich aber mal ein paar Anlaufstellen aufzuzeigen, mit denen man sich nach dem Einstieg oder auch noch mit jahrelanger Erfahrung auf jeden Fall beschäftigen sollte.</p>
<h2>IDE</h2>
<p>Die Abkürzung IDE steht für <a href="http://en.wikipedia.org/wiki/Integrated_development_environment">Integrated Development Environment</a>. Neben den klassischen, <em>kleinen</em> Text-Editoren gibt es bereits einige Baukästen, die sich auf PHP spezialisiert haben oder einen Funktionsumfang für PHP anbieten. Der Sinn hinter IDEs ist die Integration unterschiedlicher Werkzeuge in einer Software. Meistens durch optionale Plugins unterstützt, verwende ich also nicht für verschiedene Arbeitsschritte unterschiedliche Programme, sondern steuere meine Entwicklung aus einer Applikation heraus. Zur Auswahl stehen <a title="Eclipse PDT Startseite" href="http://www.eclipse.org/pdt/">Eclipse PDT</a>, <a title="Zend Studio" href="http://www.zend.com/de/products/studio/">Zend Studio</a>, <a title="Aptana" href="http://www.aptana.com/">Aptana</a>, <a title="Netbeans" href="http://netbeans.org/">Netbeans</a>,  <a title="PHPStorm Startseite" href="http://www.jetbrains.com/phpstorm/">PHPStorm</a> und die <a title="Komodo IDE" href="http://www.activestate.com/komodo-ide">Komodo IDE</a> (sicher was vergessen, oder? Schreib&#8217;s in die Kommentare). Alle IDEs haben Stärken und Schwächen. Im Grunde bieten sie aber einen ähnlichen, wenn nicht sogar identischen Funktionsumfang.</p>
<h2>Debugging</h2>
<p>PHP ist eine serverseitige Skriptsprache. Zur Überprüfung meiner Arbeit während der Erzeugung des Codes brauche ich also mindestens einen Server als Interpreter. Klassisches Debugging besteht aus der expliziten Ausgabe des Programmzustandes in meinem Code und einer Überprüfung dieser Ausgabe durch Aufruf meiner Entwicklung im Browser oder in den Server-Logfiles. Das ist doof. Debugger wie der Zend Debugger oder <a title="Webseite xdebug.org" href="http://www.xdebug.org/">Xdebug</a> erleichtern mir die Arbeit und erzeugen Ausgaben und Informationen bereits während der Erstellung des Codes. Beide lassen sich hervorragend in IDEs einbinden.</p>
<h2>Tests</h2>
<p>Testen sieht meistens so aus: Applikation im Browser aufrufen und so lange probieren, bis man ein vages Gefühl der Sicherheit bekommt. <strong>Falsch!</strong> <a title="Sebastian Bergmanns PHPUnit" href="https://github.com/sebastianbergmann/phpunit/">PHPUnit</a> bietet automatisierte Tests von atomaren Bestandteilen meines Codes bis hin zur Erzeugung von komplexen Testsuites, um bei sauberer und umsichtiger Anwendung jederzeit ein Qualitätsbild meiner Entwicklung zu zeichnen. <a title="Simpletest.org" href="http://www.simpletest.org/">SimpleTest</a> macht das auf ähnliche Art und Weise. <a title="Selenium-Webseite" href="http://seleniumhq.org/">Selenium</a> liefert mir noch die zusätzliche Option, funktional, aber automatisiert im Browser zu testen &#8211; per Makros. Selenium lässt sich übrigens fein in PHPUnit integrieren und von dort aus steuern.</p>
<h2>Analyse</h2>
<p>Wer hat schon einmal wirklich seinen Code analysiert? Anzahl Klassen? Komplexität? Mit Werkzeugen wie <a title="Sebastian Bergmanns phploc" href="https://github.com/sebastianbergmann/phploc">phploc</a> und <a title="Heimseite von pDepend" href="http://pdepend.org/">pdepend</a> schafft man sich schnell einen Überblick. Die Ergebnisse sind nicht einfach zu verstehen oder zu interpretieren, gehören aber zu den erforderlichen Standards, sobald Projekte mal etwas grösser werden. <a title="Sebastian Bergmanns PHP Copy &amp; Paste Detector" href="https://github.com/sebastianbergmann/phpcpd">phpcpd</a> liefert dazu die Menge von dupliziertem Code in meinen Modulen. Zeit für Refactoring :)</p>
<h2>Qualität</h2>
<p>Natürlich programmiert jeder sauber. Der <a title="Das PEAR-Paket PHP Code Sniffer" href="http://pear.php.net/package/PHP_CodeSniffer/redirected">PHP Code Sniffer</a> und der <a title="PHP Mess Detector" href="http://phpmd.org/">PHP Mess Detector</a> unterstützen das ganze jedoch auch noch mit Audits und Kennzahlen. Der Code Sniffer sorgt für ein einheitliches Bild und verhindert, dass ich schludere &#8211; im Code, wie auch in der Dokumentation. Der Mess Detector macht mich darauf aufmerksam, wenn ich nicht ausreichend abstrahiere, zuviel in eine Code-Passage packe oder Variablen nicht sauber benenne.</p>
<h2>Dokumentation</h2>
<p>Ohne Zweifel: Eine automatisierte Dokumentation gehört zu jedem PHP-Projekt. Ganz einfach geht das mit dem <a title="Webseite phpDocumentor" href="http://www.phpdoc.org/">phpDocumentor</a>. JavaDoc-ähnlich werden meine Kommentare im PHP-Code automatisch in eine ansehnliche HTML-Oberfläche verwandelt.</p>
<h2>Versionierung</h2>
<p>Zugegeben: Versionierung hat nicht viel mit PHP zu tun sondern ist eher ein generelles Werkzeug in der Software-Entwicklung. Trotzdem kann man nicht genug betonen: Software-Entwicklung benötigt Versionierung. Klassisch geht das mit CVS (ja, gibt&#8217;s auch noch) und SVN. Erfahrene, Mehrversteher und Disziplinierte verwenden .git oder Mercurial.</p>
<h2>Build und Deployment</h2>
<p>Gerade die Tatsache, dass man seine PHP-Anwendungen nicht kompilieren muss, war ja eine der Vorzugsargumente für den Einstieg in PHP, oder? Wenn man komplexere Projekte entwickelt, sehnt man sich jedoch nach Automatisierung durch Build-Skripte. Mit <a title="Apache Ant" href="http://ant.apache.org/">ant</a> oder <a title="Phing is not gnu make" href="http://www.phing.info/trac/">phing</a> verwende ich XML-Instruktionen, um mein Testing, Staging oder Deployment zu automatisieren. Im Build kann ich dann viele der oben genannten Werkzeuge implementieren. Automatisiertes Durchlaufen meiner Testsuites, Codeanalyse, Trennung von Test- und Produktivcode, Export aus der Versionierung, Up- bzw. Download per sFTP, Verzeichnisse anlegen, Dateien kopieren, umbenennen, löschen oder Skripte ausführen.</p>
<h2>Einsatz</h2>
<p>Unerlässlich für Installation und Einsatz der meisten Tools ist <a href="http://pear.php.net/">PEAR</a>, eine Paketverwaltung für die Kommandozeile aller Betriebsysteme. Für Netbeans und Eclipse-basierte IDEs gibt es weitere Plugins. Z. B. bietet <a title="PTI auf phphatesme.com" href="http://www.phphatesme.com/blog/tools/phpunit-mittels-pti-in-eclipse-einbinden/">PTI</a> als Eclipse-Plugin eine ganze Toolbox auf einmal. Für Netbeans gibt es ein <a href="http://sourceforge.net/projects/phpmdnb/">PHP Mess Detector und PHP Code Sniffer-Plugin</a>. Wer schlau ist, <a title="Statische Analyse mit mehreren PHP-Tools auf Gregors Blog" href="http://krsteski.de/php-tricks-und-tipps/statische-analyse-selbst-gebaut.html">nutzt einen Aggregator von Gregor Krsteski für alle Analysen auf einmal über PHP auf der Kommandozeile</a>.</p>
<p>Zur kontinuierlichen Integration von allem stehen mehrere Systeme zur Verfügung: <a href="http://hudson-ci.org/">Hudson</a>, <a href="http://jenkins-ci.org/">Jenkins</a> oder <a href="http://phpundercontrol.org/">phpUnderControl</a>.</p>
<p>Viel Spass beim Stöbern und Lernen.</p>
<img src="http://feeds.feedburner.com/~r/hasematzel/~4/pwii6UJxaTI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/2011/04/ein-kurzer-blick-auf-den-status-der-php-entwicklung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://hasematzel.de/2011/04/ein-kurzer-blick-auf-den-status-der-php-entwicklung/</feedburner:origLink></item>
		<item>
		<title>Ein paar Kniffe für die WordPress functions.php</title>
		<link>http://feedproxy.google.com/~r/hasematzel/~3/xcgVYH__qXA/</link>
		<comments>http://hasematzel.de/2011/04/kniffe-fuer-die-wordpress-functions-php/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 13:00:32 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://hasematzel.de/?p=970</guid>
		<description><![CDATA[Beim diesjährigen Frühjahrsputz auf hasematzel.de hatte ich mal wieder die Gelegenheit, mich näher mit Wordpress zu beschäftigen. In den letzten Monaten hatte sich an der beliebten Blog-Software einiges getan, also war es Zeit, nochmal ein bisschen nachzulesen und zu lernen. <a href="http://hasematzel.de/2011/04/kniffe-fuer-die-wordpress-functions-php/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Die Datei <code>functions.php</code> in einem WordPress-Theme ist der Standard für den Eingriff in den WordPress-Kern. Neben Plugins, die man natürlich auch entwickeln kann, sollte ein Entwickler tunlichst diese Funktionsbibliothek zur Anpassung und Erweiterung von WordPress nutzen, um sich immer die Möglichkeit zum Upgrade zu behalten.</p>
<p>In dieser zentralen Datei kann ich auf sogenannte <a title="Wordpress-Hooks" href="http://codex.wordpress.org/Plugin_API/Hooks">Hooks</a> zugreifen, die in <a title="Filter hooks im WordPress Codex erklärt" href="http://codex.wordpress.org/Plugin_API/Filter_Reference">Filter-Hooks</a> und <a title="Action hooks im WordPress Codex erklärt" href="http://codex.wordpress.org/Plugin_API/Action_Reference">Action-Hooks</a> aufgeteilt sind. Das heißt, ich kann meine Funktionen zu bestimmten Zeitpunkten bei der Zusammenstellung des WordPress-Inhaltes meiner Seite durch die WordPress-Engine <em>einhängen</em>. Weiterhin kann ich einige optional verfügbare Module in WordPress ansprechen und konfigurieren. Dazu gehören unter anderem der <em>Thumbnail-Support</em>, <em>die benutzerdefinierten Menüs</em> oder <em>die Widgets</em>.</p>
<p>Hier sind ein paar Funktionen, die ich bei meiner Arbeit am hasematzel.de-Theme zusammengetragen habe:</p>
<h2>Support für Windows Live Writer</h2>
<p>Wer Windows Live Writer nicht verwendet, der kann den Link auf das notwendige Manifest aus dem Kopf der Seiten entfernen. Dadurch spart man eine Zeile im <code>&lt;head&gt;</code>-Bereich seiner Seite.</p>
<pre><code>/**
* Remove Windows Live Writer
* @link http://wp-snippets.com/remove-wlwmanifest/
*/
remove_action('wp_head', 'wlwmanifest_link');</code></pre>
<h2>RSD-Link aus dem head entfernen</h2>
<p><a title="Really Simple Discovery auf Wikipedia" href="http://en.wikipedia.org/wiki/Really_Simple_Discovery">Really Simple Discovery</a> ist ein XML-Dialekt, um externe Werkzeuge und Publishing-Software an das Blog anzubinden, beziehungsweise um bestimmte Funktionen des Blogs anderen Werkzeugen zur Verfügung zu stellen. Wer nur über die WordPress-Oberfläche bloggt, sollte den Eintrag ohne Nebeneffekte aus dem <code>&lt;head&gt;</code> entfernen können. Wieder eine Zeile weniger.</p>
<pre><code>/**
* Remove RSD link
* @link http://wp-snippets.com/remove-rsd-link/
*/
remove_action('wp_head', 'rsd_link');</code></pre>
<h2>Standard-Stylesheets für Kommentare entfernen (ab Version 2.9.1)</h2>
<p>Für das <em>Recent comments</em>-Widget gibt es immer eine Style-Definition im Kopf der HTML-Seite. Dieser wird automatisch hinzugefügt, ob man das Widget nun nutzt oder nicht. In den WordPress-Versionen zwischen 2.8 und 2.91 hat sich der Zugriff auf diesen Filter verändert. Eine gesamte Historie und eine umfangreiche Erklärung kann man im <a title="Webstractions: Remove recent comments inline style" href="http://webstractions.com/wordpress/remove-recent-comments-inline-styl/">webstractions-Blog</a> nachlesen. Es empfielt sich, die eine Zeile CSS in das eigene Theme-CSS zu übernehmen, um nicht überrascht zu werden, wenn man sich später einmal entscheidet, das <em>Recent comments</em>-Widget zu aktivieren.</p>
<pre><code>.recentcomments a {
    display: inline !important;
    padding: 0 !important;
    margin: 0 !important;
}</code></pre>
<pre><code>/**
* Remove recent comments styling
* @link http://webstractions.com/wordpress/remove-recent-comments-inline-styl/
*/
if (!function_exists('my_remove_recent_comments_style')) {
    function my_remove_recent_comments_style()
    {
        global $wp_widget_factory;
        remove_action(
            'wp_head', array(
                $wp_widget_factory-&gt;widgets['WP_Widget_Recent_Comments'],
                'recent_comments_style'
            )
        );
    }
    add_action('widgets_init', 'my_remove_recent_comments_style');
}</code></pre>
<p>Noch ein Wort zu Funktionen: Es ist eine gute Angewohnheit, mit Funktionsnamen zu arbeiten, die offensichtlich als <em>custom</em>-Funktionen zu erkennen sind. Zusätzlich sollte man die Funktionsdefinition und das Einbinden in den Hook mit der PHP-Funktion <a title="PHP-Manual: function_exists()" href="de.php.net/function_exists">function_exists()</a> absichern.</p>
<h2>Webanalyse-Code nur unter Bedingungen einbinden</h2>
<p>Wer ein Analyse-Tool verwendet, welches auf einen Pixelabruf oder einen JavaScript-Tracker angewiesen ist, der sollte diesen nur auf der LIVE-Webseite und nur für andere Benutzer als sich selbst aktivieren. Meistens müssen diese Dinger im <em>head</em>-Bereich oder am Ende der Seite stehen. Die Anzeige kann man dann einfach an die Bedingungen knüpfen:</p>
<pre><code>if (!function_exists('my_page_tracker')) {
    function my_page_tracker()
    {
        // No tracking if logged in as admin
        if (current_user_can('level_10')) {
            return '';
        }
        // No tracking if is dev environment
        if ($_SERVER['HTTP_HOST'] == 'hasematzel.local') {
            return '';
        }
        echo "... my tracking code ...";
    }
    add_action('wp_head', 'my_page_tracker');
}</code></pre>
<h2>Anzeige der WordPress-Signatur unterdrücken</h2>
<p>WordPress meldet sich selbst mit der Versionsnummer im Kopf der HTML-Seite. Auch diese eine Zeile kann &#8211; wer möchte &#8211; entfernen.</p>
<pre><code>/**
* Remove wordpress generator element
* @link http://wp-snippets.com/remove-meta-generator/
*/
remove_action('wp_head', 'wp_generator');</code></pre>
<h2>Weitere nützliche Tipps &amp; Tricks</h2>
<p>Es gibt natürlich mittlerweile unzählige Quellen zum Thema WordPress-Anpassungen. Den <a title="Wordpress-Codex" href="http://codex.wordpress.org">WordPress-Codex</a> selbst finde ich reichlich unübersichtlich: Ein paar Sachen sind hervorragend erklärt, manche Sachen sucht man vergeblich. Auf ein paar Quellen möchte ich aber noch direkt hinweisen:</p>
<ul>
<li><a href="http://perishablepress.com/press/2009/12/01/stupid-wordpress-tricks/">Perishable Press: Stupid WordPress Tricks</a></li>
<li><a href="http://wp-snippets.com/">wp-snippets.com</a></li>
<li><a href="http://digwp.com/">digwp.com</a></li>
<li><a href="http://bueltge.de/wordpress-tipps/">Die WordPress-Tipps von Frank Bültge in einer Liste</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/hasematzel/~4/xcgVYH__qXA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/2011/04/kniffe-fuer-die-wordpress-functions-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://hasematzel.de/2011/04/kniffe-fuer-die-wordpress-functions-php/</feedburner:origLink></item>
		<item>
		<title>Überlegungen zur Gestaltung von Tabellen</title>
		<link>http://feedproxy.google.com/~r/hasematzel/~3/F4okPeE6-lc/</link>
		<comments>http://hasematzel.de/2010/09/ueberlegungen-zur-gestaltung-von-tabellen/#comments</comments>
		<pubDate>Mon, 27 Sep 2010 11:58:43 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[UI]]></category>
		<category><![CDATA[tabellen]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[ux]]></category>

		<guid isPermaLink="false">http://hasematzel.de/blog/?p=922</guid>
		<description><![CDATA[Über @webstandardsmag gerade einen fantastischen Tweet reinbekommen: Janko Jovanovic und Theresa Neil schreiben über UI pattern von Tabellen und zeigen in Ihren Posts anhand unzähliger Beispiele, welche Anwendungsfälle und Lösungen existieren.]]></description>
			<content:encoded><![CDATA[<p>Über <a href="http://twitter.com/webstandardsmag/status/25679074314">@webstandardsmag</a> gerade einen fantastischen Tweet reinbekommen: <a href="http://www.jankoatwarpspeed.com/post/2010/02/26/table-ui-patterns.aspx">Janko Jovanovic</a> und <a href="http://theresaneil.wordpress.com/2010/03/08/ultimate-guide-to-table-ui-patterns/">Theresa Neil</a> schreiben über UI pattern von Tabellen und zeigen in Ihren Posts anhand unzähliger Beispiele, welche Anwendungsfälle und Lösungen existieren.</p>
<img src="http://feeds.feedburner.com/~r/hasematzel/~4/F4okPeE6-lc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/2010/09/ueberlegungen-zur-gestaltung-von-tabellen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://hasematzel.de/2010/09/ueberlegungen-zur-gestaltung-von-tabellen/</feedburner:origLink></item>
		<item>
		<title>Ansprechbare Buttons mit visueller Reaktion und CSS3</title>
		<link>http://feedproxy.google.com/~r/hasematzel/~3/CYbyHNrZR6k/</link>
		<comments>http://hasematzel.de/2010/06/ansprechbare-buttons-mit-visueller-reaktion-css3/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 07:00:20 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[HTML & CSS]]></category>
		<category><![CDATA[buttons]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[prism]]></category>

		<guid isPermaLink="false">http://hasematzel.de/blog/?p=875</guid>
		<description><![CDATA[Bei jeder neuen Webseite oder Applikation stelle ich mir erneut die Frage, welche Browser und welche Technologien unterstützen will oder muss. In Intranets hat man es meistens recht einfach. So entstehen ansprechende Buttons ganz ohne Grafiken. <a href="http://hasematzel.de/2010/06/ansprechbare-buttons-mit-visueller-reaktion-css3/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Die HTML5- und CSS3-Unterstützung in den aktuellen Browsern und Surfclients dieser Welt ist sicherlich noch mangelhaft. Manchmal darf man jedoch Applikationen entwickeln, bei denen es auf eine flächendeckende Unterstützung nicht so sehr ankommt. Das gilt z. B. für manche Intranets oder Applikationen mit beschränkten Zugangsberechtigungen.Ich habe in der letzten Zeit einige, sogenannte <em>Backoffices</em> gebaut (Messeclients etc.) und es hat mir enorm viel Spass gemacht, dabei neuere Elemente und CSS-Angaben verwenden zu können, weil ich mir über die korrekte Darstellung sicher sein konnte.Wenn man z. B. Desktop-ähnliche Webapplikationen für <a href="http://mozillalabs.com/prism/">Prism</a> entwickelt, darf man auf den vollen Schwung von Properties zugreifen, <a href="https://developer.mozilla.org/en/CSS">die derzeit vom Mozilla-Projekt unterstützt werden</a>. (Naja, zumindest fast) Mit wenigen Zeilen CSS hat man so schnell einen feinen, ansprechenden Button gebastelt, der bei Interaktion mit der Maus brav ein reaktives Verhalten zeigt. Hier erstmal das HTML:</p>
<pre><code>&lt;!DOCTYPE html
    PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta http-equiv="content-type" content="text/html; charset=UTF-8" /&gt;
    &lt;title&gt;XHTML 1.0 Transitional&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id="wrapper"&gt;
    &lt;form&gt;
        &lt;button type="submit" class="save"&gt;Save&lt;/button&gt;
        &lt;button type="submit" class="cancel"&gt;Cancel&lt;/button&gt;
    &lt;/form&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>Das Formular ist nicht funktional und dient nur der Demonstration. Kommen wir lieber zum CSS. Zunächst geben wir dem <em>#wrapper</em> einen Hintergrund:</p>
<pre><code>#wrapper {
    width: 400px;
    height: 200px;
    background-color: #ddd;
    padding: 50px;
}</code></pre>
<p>Dann geben wir den Buttons mit ein wenig CSS3 ein bisschen Schick:</p>
<pre><code>button {
    background-color: #ddd;
    background-image: -moz-linear-gradient(bottom center, #ccc, #ddd);
    border: 1px solid #999;
    border-top-color: #eee;
    border-left-color: #eee;
    color: #333;
    font-weight: bold;
    text-shadow: 1px 1px 1px #fff;
    padding: 3px 8px;
    cursor: pointer;
    -moz-border-radius: 5px;
    -moz-box-shadow: 2px 2px 3px #ccc;
}</code></pre>
<p>Das erste Resultat sieht dann so aus:</p>
<p><a href="http://hasematzel.de/wp-content/uploads/2010/06/save-cancel-011.png"><img class="alignnone size-full wp-image-882" title="save-cancel-01" src="http://hasematzel.de/wp-content/uploads/2010/06/save-cancel-011.png" alt="" width="200" height="80" /></a></p>
<p><a href="http://hasematzel.de/wp-content/uploads/2010/06/save-cancel-011.png"></a>Über das <em>cursor: pointer</em> lässt sich bekanntlich streiten. Ich mag es, weil es ein visueller Indikator dafür ist, dass hier eine Aktion erfolgen kann.</p>
<h2>Visuelle Reaktion</h2>
<p>Als nächste beschäftigen wir uns mit der visuellen Rückmeldung der Buttons, den verschieden <em>states</em> beim Überfahren und beim Klick. Zunächst die Pseudoklassen <em>:hover</em> und <em>:focus</em>. Der Abbrechen-Button erhält dabei ein eigenes Benehmen, die Schriftfarbe soll sich beim <em>:hover</em> ändern.</p>
<pre><code>button:hover, button:focus {
    -moz-box-shadow: 2px 2px 3px #aaa;
}
button.cancel:hover, button.cancel:focus {
    color: #f60; /* Fast orange */
}</code></pre>
<p>Der <em>:hover</em>-Status hebt den Button visuell an (über die <em>shadow</em>-Property):</p>
<p><a href="http://hasematzel.de/wp-content/uploads/2010/06/save-cancel-021.png"><img class="alignnone size-full wp-image-887" title="save-cancel-02" src="http://hasematzel.de/wp-content/uploads/2010/06/save-cancel-021.png" alt="" width="200" height="80" /></a></p>
<p><a href="http://hasematzel.de/wp-content/uploads/2010/06/save-cancel-021.png"></a><em>Der Save-Button wird hervorgehoben.</em></p>
<p><em></em><a href="http://hasematzel.de/wp-content/uploads/2010/06/save-cancel-031.png"><img class="alignnone size-full wp-image-888" title="save-cancel-03" src="http://hasematzel.de/wp-content/uploads/2010/06/save-cancel-031.png" alt="" width="200" height="80" /></a></p>
<p><a href="http://hasematzel.de/wp-content/uploads/2010/06/save-cancel-031.png"></a><em>Der Cancel-Button erhält noch einen Farbwechsel.</em></p>
<p><em></em>Der tatsächliche Klick nutzt dann die :active-Pseudoklasse, um die Aktion farblich zu unterstreichen. Der Save-Button bekommt eine grüne, der Cancel-Button eine rote Schrift:</p>
<pre><code>button.save:active {
    color: green;
}
button.cancel:active {
    color: #c00;
}</code></pre>
<p><a href="http://hasematzel.de/wp-content/uploads/2010/06/save-cancel-041.png"><img class="alignnone size-full wp-image-893" title="save-cancel-04" src="http://hasematzel.de/wp-content/uploads/2010/06/save-cancel-041.png" alt="" width="200" height="80" /></a></p>
<p><a href="http://hasematzel.de/wp-content/uploads/2010/06/save-cancel-041.png"></a><em>Der :active-State für Save.</em></p>
<p><em></em><a href="http://hasematzel.de/wp-content/uploads/2010/06/save-cancel-051.png"><img class="alignnone size-full wp-image-894" title="save-cancel-05" src="http://hasematzel.de/wp-content/uploads/2010/06/save-cancel-051.png" alt="" width="200" height="80" /></a></p>
<p><a href="http://hasematzel.de/wp-content/uploads/2010/06/save-cancel-051.png"></a><em>Der :active-State für Cancel.</em></p>
<p><em></em><strong>Fertig!</strong> Wir haben keine Grafiken verwendet, die einen weiteren HTTP-Request notwendig machen würden. Findige Webdesigner können sicherlich die paar Zeilen für die Webkit-und anderen Browser-Abkömmlinge hinzufügen. Mit ein bisschen Bastelei hat man die Buttons sicherlich auch in älteren Browsern, die ggf. noch unterstützt werden müssen, ergänzt. Obwohl das reaktive Verhalten der Buttons für Menschen mit Wahrnehmungsschwächen nicht optimal ist, <em>kann</em> diese Lösung eingebaut werden. Ohne CSS und <em>state-changes</em> hat man immer noch zwei klassische Buttons.</p>
<img src="http://feeds.feedburner.com/~r/hasematzel/~4/CYbyHNrZR6k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/2010/06/ansprechbare-buttons-mit-visueller-reaktion-css3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://hasematzel.de/2010/06/ansprechbare-buttons-mit-visueller-reaktion-css3/</feedburner:origLink></item>
		<item>
		<title>Bücherliste für den Urlaub 2010</title>
		<link>http://feedproxy.google.com/~r/hasematzel/~3/8R9DmLoP5fM/</link>
		<comments>http://hasematzel.de/2010/06/buecherliste-fuer-den-urlaub-2010/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 21:35:40 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Bücher]]></category>

		<guid isPermaLink="false">http://hasematzel.de/blog/?p=867</guid>
		<description><![CDATA[Der Sommer steht bevor. Da der Pip dieses Jahr in die Schule kommt, werden wir in der Hauptsaison Urlaub machen. Damit mir dann nicht langweilig wird, sammle ich schon einmal ein paar Bücher. <a href="http://hasematzel.de/2010/06/buecherliste-fuer-den-urlaub-2010/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Auch wenn der Sommer sich hierzulande vielleicht nicht im Wetter zeigt, so ist doch zumindest ein Urlaub angesagt. Damit die Weiterbildung nicht zu kurz kommt, hier meine Bücherliste für eine gepflegte Lektüre am Abend:
<ul>
<li>Jeremy Keith: <a href="http://books.alistapart.com/">HTML5 for Web Designers</a>Ich kenne von Jeremy <a href="http://bulletproofajax.com/">Bulletproof Ajax</a>. Das hatte mir damals aufgrund seiner Kürze gut gefallen.</li>
<li>Steve Souders: <a href="http://www.amazon.de/High-Performance-Websites-Steve-Souders/dp/389721850X/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1276677792&amp;sr=8-1">High Performance Websites</a> und <a href="http://www.amazon.de/Even-Faster-Web-Sites-Performance/dp/0596522304/ref=sr_1_2?ie=UTF8&amp;s=books-intl-de&amp;qid=1276677792&amp;sr=8-2">Even Faster Web Sites: Performance Best Practices for Web Developers</a>Habe ich schon länger auf der Wunschliste, wurde mir zusätzlich von <a href="http://twitter.com/derschepp">@derSchepp</a> empfohlen.</li>
<li>Peter Kröner: <a href="http://www.peterkroener.de/das-html5-buch/">HTML5 &#8211; Webseiten innovativ und zukunftssicher</a><a href="http://www.peterkroener.de/weblog/">Peters Blog</a> lese ich ohnehin gerne, das Buch erntet von allen Seiten gute Kritiken. Ganz oben auf der Liste.</li>
<li><a href="http://webstandards.org/">Web Standards Project</a>: <a href="http://interactwithwebstandards.com/">InterACT with Web Standards</a>Vielleicht nur Pflichtlektüre, vielleicht aber auch sehr interessant. Mal die ersten Rezensionen abwarten.</li>
<li>Markus Albers: <a href="http://www.meconomy.me/">Meconomy</a>Nachdem ich kürzlich <a href="http://www.amazon.de/Let-People-Surfing-Education-Businessman/dp/0143037838">Let my people go surfing</a> und <a href="http://37signals.com/rework/">Rework</a> gelesen hatte, ist das bestimmt noch ein weiterer, schön zu lesender Ansatz zum Thema Arbeitskultur.</li>
<li>Steve Krug: <a href="http://www.amazon.de/gp/product/0321657292/ref=ord_cart_shr?ie=UTF8&amp;m=A3JWKAKR8XB7XF">Rocket Surgery Made Easy</a>Steves erstes Buch mag ich sehr gerne (wer nicht?).</li>
</ul>
<p>Es fehlen noch ein paar Bücher. <a href="http://www.amazon.de/gp/product/0465018653/ref=ord_cart_shr?ie=UTF8&amp;m=A3JWKAKR8XB7XF">The Cluetrain Manifesto</a> habe ich noch nicht gelesen (mittlerweile in der 10-Jahres-Jubiläumsausgabe, tsts). Irgendwas Leichtes wäre auch nicht schlecht. Naja, ich werde die Liste wohl nach und nach aktualisieren.</p>
<img src="http://feeds.feedburner.com/~r/hasematzel/~4/8R9DmLoP5fM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/2010/06/buecherliste-fuer-den-urlaub-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://hasematzel.de/2010/06/buecherliste-fuer-den-urlaub-2010/</feedburner:origLink></item>
		<item>
		<title>RSS-Feeds mit YQL aggregieren und abrufen</title>
		<link>http://feedproxy.google.com/~r/hasematzel/~3/22njcjo98nc/</link>
		<comments>http://hasematzel.de/2010/05/rss-feeds-mit-yql-aggregieren-und-abrufen/#comments</comments>
		<pubDate>Mon, 31 May 2010 11:01:47 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Werkzeuge]]></category>
		<category><![CDATA[aggregate]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[yahoo query language]]></category>
		<category><![CDATA[yql]]></category>

		<guid isPermaLink="false">http://hasematzel.de/blog/?p=848</guid>
		<description><![CDATA[YQL ist das Schweizer Taschenmesser eines Web-Entwicklers. Der einfache, SQL-ähnliche Zugriff auf Daten, Inhalte und Schnittstellen im Internet eröffnet ungeahnte Möglichkeiten und rasante Entwicklungszeiten. Wir bauen mal schnell einen Lifestream aus RSS-Feeds. <a href="http://hasematzel.de/2010/05/rss-feeds-mit-yql-aggregieren-und-abrufen/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>YQL hatte sich innerhalb kürzester Zeit zu einem meiner Lieblingswerkzeuge gemausert. Schon seit über einem Jahr hatte <a href="http://www.wait-till-i.com/">Yahoo!s Developer Evangelist Chris Heilmann</a> in regelmäßigen Abständen die Fähigkeiten der API für APIs unter Beweis gestellt. Die <em>Yahoo! Query Language</em> ist eine SQL-ähnliche Syntax, unter deren Verwendung man alle möglichen Dritt-Schnittstellen einheitlich abrufen kann. Die kleinen Beispiele in diesem Artikel sollen zeigen, welchen Einsatzzweck diese Schnittstelle haben kann. Werfen wir mal einen Blick auf einen einfachen Aufruf:</p>
<pre><code>select * from html where url='http://mashable.com'</code></pre>
<p>Diese Query ist relativ sinnfrei, liefert sie doch das gesamte <code>body</code>-Konstrukt der mashable.com-Startseite. Dennoch erkennt man schon das Potenzial, wenn man für den Zugriff auf Inhalte eine Art SQL anwenden kann. <a title="Einfache Query in der YQL-Konsole" href="http://developer.yahoo.com/yql/console/?q=select%20*%20from%20html%20where%20url%3D%27http%3A%2F%2Fmashable.com%27">Öffnet man diese Query in der YQL-Konsole</a>, kann man sich die Rückgabewerte anzeigen lassen.Nehmen wir einmal an, mashable.com hätte <em>keinen</em> RSS-Feed, wir möchten aber gerne die neuesten drei News abrufen und in unserer Webseite zeigen. Mit ein bisschen <a title="XPath-Infos auf den Seiten des W3Cs" href="http://www.w3.org/TR/xpath/">xpath</a>-Magie und einen Blick in den Quelltext ist das kein Problem. mashable.com verwendet WordPress und versteckt seine News in einem <strong>div-Element</strong> und dort in einem <strong>h2/a-Konstrukt</strong>. Eine Funktion reduziert die Resultate auf die obersten 3. In Verbindung mit einer XML-Query sieht unsere Abfrage also so aus:</p>
<pre><code>select * from html
    where url='http://mashable.com'
    and xpath='//div/h2/a' | truncate(count=3)</code></pre>
<p>Am besten schaut man sich das Resultat wieder <a href="http://developer.yahoo.com/yql/console/?q=select%20*%20from%20html%0A%20%20%20%20where%20url%3D%27http%3A%2F%2Fmashable.com%27%0A%20%20%20%20and%20xpath%3D%22%2F%2Fdiv%2Fh2%2Fa%22">in der YQL-Konsole</a> an. Wählt man JSON als Output und ruft das Ganze über die API ab, kann man leicht durch das Resultat iterieren.</p>
<h2>Abruf von mehreren Feeds</h2>
<p>Wie der Abruf eines HTML-Konstruktes ist auch das Einlesen von RSS-Feeds überaus einfach. Nehmen wir an, ich möchte die letzten Einträge des Hasematzel-RSS einlesen &#8211; und zwar nur die Titel, Links und das Veröffentlichungsdatum der einzelnen Einträge. Die Query sieht dann so aus:</p>
<pre><code>select title, link, pubDate from rss
    where url='http://feeds.feedburner.com/hasematzel'</code></pre>
<p><a title="Der Hasematzel-Feed in der YQL-Konsole" href="http://developer.yahoo.com/yql/console/?q=select%20title%2Clink%2CpubDate%20from%20rss%20where%20url%3D%27http%3A%2F%2Ffeeds.feedburner.com%2Fhasematzel%27">Im Ausgabefenster der Konsole sind die Einträge nach Datum absteigend sortiert</a>. Das liegt bei RSS in der Natur der Dinge. Bei der Aggregierung von mehreren Feeds <a title="Mehrere Feeds in der YQL-Konsole aggregieren" href="http://developer.yahoo.com/yql/console/?q=select%20title%2Clink%2CpubDate%20from%20rss%20where%20url%20in%20(%27http%3A%2F%2Ftwitter.com%2Fstatuses%2Fuser_timeline%2F818226.rss%27%2C%20%27http%3A%2F%2Ffeeds.delicious.com%2Fv2%2Frss%2Fhasematzel%3Fcount%3D15%27)">bekomme ich aber die Feeds (nicht die Beiträge) nacheinander angezeigt</a>. Ich rufe mal meinen delicious.com-Feed und meinen Twitter-Feed ab:</p>
<pre><code>select title, link, pubDate from rss
    where url in (
        'http://twitter.com/statuses/user_timeline/818226.rss',
        'http://feeds.delicious.com/v2/rss/hasematzel?count=15')</code></pre>
<p>Bei zwei Feeds könnte man ja noch schnell ein bisschen Basteln, die Rückgabe auseinandernehmen und die Arrays/Objekte in der richtigen Reihenfolge wieder zusammenfügen. <a title="4 Feeds in der YQL-Konsole" href="http://developer.yahoo.com/yql/console/?q=select%20title%2Clink%2CpubDate%20from%20rss%20where%20url%20in%20(%27http%3A%2F%2Ftwitter.com%2Fstatuses%2Fuser_timeline%2F818226.rss%27%2C%20%27http%3A%2F%2Ffeeds.delicious.com%2Fv2%2Frss%2Fhasematzel%3Fcount%3D15%27%2C%20%27http%3A%2F%2Foliverschwarz.tumblr.com%2Frss%27%2C%20%27http%3A%2F%2Fpiepmatzel.de%2Ffeed%2F%27)">Je mehr Feeds man aber aggregiert</a>, umso umständlicher wird das. Zusätzlich bürde ich meinem Code zusätzliche Arbeit auf, die auch YQL verrichten kann.</p>
<pre><code>select title, link, pubDate from rss
    where url in (
        'http://twitter.com/statuses/user_timeline/818226.rss',
        'http://feeds.delicious.com/v2/rss/hasematzel?count=15',
        'http://oliverschwarz.tumblr.com/rss',
        'http://piepmatzel.de/feed/')</code></pre>
<h2>Sortieren und Abschneiden</h2>
<p>Für die Sortierung (und auch das Abschneiden) von Daten hat das YQL-Team <a title="Funktionen in YQL." href="http://developer.yahoo.com/yql/guide/sorting.html">spezielle Funktionen bereitgestellt</a>. Die Funktionen werden einfach am Ende der Query positioniert. So ist es möglich, zunächst nach <em>pubDate</em> aufsteigend zu sortieren und das Resultat zusätzlich auf maximal fünf Einträge zusammenzuschneiden:</p>
<pre><code>select title, link, pubDate from rss
    where url in (
        'http://twitter.com/statuses/user_timeline/818226.rss',
</code><code>        'http://feeds.delicious.com/v2/rss/hasematzel?count=15',
        'http://oliverschwarz.tumblr.com/rss','http://piepmatzel.de/feed/'
    ) | sort(field='pubDate',descending='true') | truncate(count=5)</code></pre>
<p><a title="Die Query in der YQL-Konsole" href="http://developer.yahoo.com/yql/console/?q=select%20title%2Clink%2CpubDate%20from%20rss%0A%20%20%20%20where%20url%20in%20(%0A%20%20%20%20%20%20%20%20%27http%3A%2F%2Ftwitter.com%2Fstatuses%2Fuser_timeline%2F818226.rss%27%2C%0A%20%20%20%20%20%20%20%20%27http%3A%2F%2Ffeeds.delicious.com%2Fv2%2Frss%2Fhasematzel%3Fcount%3D15%27%2C%0A%20%20%20%20%20%20%20%20%27http%3A%2F%2Foliverschwarz.tumblr.com%2Frss%27%2C%0A%20%20%20%20%20%20%20%20%27http%3A%2F%2Fpiepmatzel.de%2Ffeed%2F%27%0A%20%20%20%20)%20%7C%20sort(field%3D%27pubDate%27%2Cdescending%3D%27true%27)%20%7C%20truncate(count%3D5)">So einfach ist das mit YQL</a>. Der Spasseffekt kommt dann auf, wenn ich das nicht nur in der YQL-Konsole mache, sondern die Resultate über die API abrufe. Dazu wird es dann noch einmal einen zusätzlichen Beitrag geben. In <a href="http://github.com/codepo8/yql-rss-speed-comparison">Chris Heilmanns github-Account</a> gibt es dazu auch schon jede Menge Beispiele. Vor dem Einsatz in produktiven Systemen sollte damit gerechnet werden, dass <a href="http://grochtdreis.de/weblog/2010/02/13/mea-culpa-yql/">die YQL-API auch mal nicht da sein kann</a>. Es empfiehlt sich, die Ergebnisse für einen gewissen Zeitraum zu cachen (<a href="http://github.com/ginader/simpleCachedCurl">Dirk Ginader hat dazu eine einfache Lösung</a>).</p>
<img src="http://feeds.feedburner.com/~r/hasematzel/~4/22njcjo98nc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/2010/05/rss-feeds-mit-yql-aggregieren-und-abrufen/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://hasematzel.de/2010/05/rss-feeds-mit-yql-aggregieren-und-abrufen/</feedburner:origLink></item>
		<item>
		<title>Variablen aus PHP per JSON in JavaScript übergeben</title>
		<link>http://feedproxy.google.com/~r/hasematzel/~3/FTPBTaQ0c1E/</link>
		<comments>http://hasematzel.de/2010/02/variablen-aus-php-per-json-in-javascript-uebergeben/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 20:32:24 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Web-Entwicklung]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[variables]]></category>

		<guid isPermaLink="false">http://hasematzel.de/blog/?p=757</guid>
		<description><![CDATA[Von einem Layer in den nächsten zu kommunizieren, z. B. von PHP in JavaScript, kann schmerzhaft sein. Es wird eine Menge Überhang an Daten erzeugt, die nur zwischen Bestandteilen einer einzigen Applikation ausgetauscht werden müssen - dennoch werden diese Daten meist dringend gebraucht. <a href="http://hasematzel.de/2010/02/variablen-aus-php-per-json-in-javascript-uebergeben/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Es passiert mir recht oft, dass ich in einer Applikation im JavaScript-Layer auf die Werte von Variablen zugreifen muss, die eigentlich nur in PHP existieren. Meist habe ich mir in PHP ein Wörterbuch angelegt, welches Standardbegriffe enthält, die an vereinzelten Stellen in der Applikation verwendet werden. Zum Beispiel werden Fehlermeldungen (&#8220;konnte nicht gespeichert werden&#8221;, &#8220;bitte Feld %s ausfüllen&#8221;) in einer einzigen Datei zusammengefasst und zum notwendigen Zeitpunkt abgerufen und angezeigt. Das ermöglicht mir unter anderem später eine Lokalisierung der Applikation.Ich beginne im Normalfall immer mit dem Backend (PHP) und setze erst später den Client-Layer (JavaScript) um. Das meiste JavaScript ist dann eine Verbesserung der Usability. Nicht selten brauche ich an manchen Stellen im JavaScript auch eine Fehlermeldung, die aber nur in PHP existiert.</p>
<h2>Der Holzhammer</h2>
<p>Die einfachste Methode ist der <code>print()</code> der Variable direkt in das JavaScript:</p>
<pre><code>&lt;?php
$error = 'Es ist ein Fehler aufgetreten';
?&gt;&lt;!DOCTYPE html&gt;
&lt;html lang="de"&gt;
&lt;head&gt;
...
&lt;script type="text/javascript"&gt;
    var error = '&lt;?php echo $error; ?&gt;';
    alert(error);
&lt;/script&gt;</code></pre>
<p>Die Methode ist effektiv, hat aber gehörige Nachteile:</p>
<ol>
<li>Ich habe manchmal nicht die Möglichkeit, mit PHP noch im HTML/DOM rumzuwerkeln. Manchmal will ich sie auch gar nicht haben.</li>
<li>Diese Lösung verursacht eine Sprach-Suppe, die nur sehr schwer zu betreuen ist.</li>
<li>Bei grösseren Wörterbüchern kommt man hier ganz schön ans Schwitzen.</li>
</ol>
<h2>Etwas eleganter: Ein bisschen JSON</h2>
<p>Die JavaScript-Objekt-Notation, kurz <em>JSON</em> genannt, bietet einen etwas eleganteren Weg, auch grössere Mengen von Variablen von PHP in JavaScript zu transferieren:</p>
<pre><code>&lt;?php
$errors = array(
    'errnosave' =&gt; 'Speichern fehlgeschlagen',
    'errunknown' =&gt; 'Unbekannter Fehler'
);
?&gt;&lt;!DOCTYPE html&gt;
&lt;html lang="de"&gt;
&lt;head&gt;
...
&lt;script type="text/javascript"&gt;
    var errors = '&lt;?php echo json_encode($errors); ?&gt;';
    alert(errors.errunknown);
&lt;/script&gt;</code></pre>
<p>Diese Methode hat schon einige Vorteile, aber immer noch ein paar Nachteile:</p>
<ol>
<li>Ich kann schon einige Daten an JavaScript übertragen. Das JSON-Format ist genial kurz und erzeugt für diese Aufgabe fast keinen Overhead.</li>
<li>Nachteil: Ich muss immer noch direkt ins Dokument schreiben.</li>
</ol>
<h2>Erzeugen einer eigenen dictionary.js</h2>
<p>Diese dritte Variante bemüht sich, einfach, aber so abstrakt wie möglich den Variablentransfer durchzuführen. Wir brauchen dafür drei Dateien und &#8211; wenn möglich &#8211; einen Cron, der regelmässig das Wörterbuch erzeugt.</p>
<h3>Datei Nr. 1: Die dictionary.ini</h3>
<p>In der dictionary.ini werden die Variablen abgelegt. Eine ini-Datei, weil man sie aus PHP heraus mit der Funktion <a title="Funktionsbeschreibung parse_ini_file() auf php.net" href="http://php.net/parse_ini_file">parse_ini_file()</a> so schön lesen und weiterverarbeiten kann. Eine ini-Datei ist ein einfaches Textdokument und kann so aussehen:</p>
<pre><code>; Statische Meldungen
[authentication]
variable = "Wert"
variable2 = "Wert2"

[errors]
errnosave = "Es wurde nicht gespeichert"
errunknown = "Unbekannter Fehler"</code></pre>
<p>Den Aufbau kennt man z. B. von den Smarty-Config-Dateien.</p>
<h3>Datei Nr. 2: Der Parser create_dictionary.php</h3>
<p>Ich kann meinen Parser in der Datei <em>create_dictionary.php</em> nun anweisen, die ini-Datei einzulesen und dabei die Sektionen (in den eckigen Klammern) zu berücksichtigen:</p>
<pre><code>&lt;?php
$dictionary = parse_ini_file('dictionary.ini', true);
$errors = $dictionary['errors']; // Sektion 'errors' ermitteln
?&gt; </code></pre>
<h3>Die dritte Datei: dictionary.js</h3>
<p>Nun kann ich den Array <code>$errors</code> im JSON-Format in eine Datei namens <em>dictionary.js</em> schreiben:</p>
<pre><code>&lt;?php
$data = sprintf('var DICT = %s', json_encode($errors));
$h = fopen('dictionary.js', 'w');
fwrite($h, $data);
fclose($h);
?&gt;</code></pre>
<p>Diese <em>dictionary.js</em>-Datei kann ich nun ganz normal im <code>&lt;head&gt;</code>-Bereich meiner HTML-Seite einbinden und habe Zugriff auf das <code>DICT</code>-Objekt:</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang="de"&gt;
&lt;head&gt;
...
&lt;script type="text/javascript" src="dictionary.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;alert(DICT.errunknown);&lt;/script&gt;</code></pre>
<p>Auch diese Methode kommt nicht ganz ohne Nachteile daher:</p>
<ol>
<li>Ich muss aus PHP in eine dictionary.js schreiben können, manchmal will man das aus Sicherheitsgründen nicht.</li>
<li>Ich will eine solche Schreiboperation nicht bei jedem Request auf die Applikation durchführen. Ich muss das also per Cronjob oder immer in einem Build machen.</li>
</ol>
<p>Dennoch ist die Variante &#8220;schön&#8221; genug, um in einzelnen Fällen und gerade in Web-Applikationen die Übermittlung von Variablen von PHP zu JavaScript zur Leichtigkeit werden zu lassen.</p>
<img src="http://feeds.feedburner.com/~r/hasematzel/~4/FTPBTaQ0c1E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/2010/02/variablen-aus-php-per-json-in-javascript-uebergeben/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://hasematzel.de/2010/02/variablen-aus-php-per-json-in-javascript-uebergeben/</feedburner:origLink></item>
		<item>
		<title>Social Media heute und morgen</title>
		<link>http://feedproxy.google.com/~r/hasematzel/~3/WRFLh8hJ08g/</link>
		<comments>http://hasematzel.de/2009/12/social-media-heute-und-morgen/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 20:59:55 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Social Media]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://hasematzel.de/blog/?p=725</guid>
		<description><![CDATA[Zwei Beiträge über Social Media haben mich in dieser zweiten Wochenhälfte angenehm überrascht. Jeder Beitrag geht auf völlig unterschiedliche Situationen ein. Mike Schnoor beschreibt in seinem Blog, was aus seiner Sicht 2010 im Bereich Social Media passieren wird. Dabei erfasst &#8230; <a href="http://hasematzel.de/2009/12/social-media-heute-und-morgen/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Zwei Beiträge über <em>Social Media</em> haben mich in dieser zweiten Wochenhälfte angenehm überrascht. Jeder Beitrag geht auf völlig unterschiedliche Situationen ein. <em>Mike Schnoor</em> beschreibt in seinem Blog, <a href="http://www.sichelputzer.de/2009/12/03/was-wird-2010-im-bereich-social-media-passieren/">was aus seiner Sicht 2010 im Bereich Social Media passieren wird</a>. Dabei erfasst er die Spitze des Social Media-Eisbergs, die Early Adopters, die Treiber und Erfinder. Im Grunde zeichnet er eine Fortsetzung der aktuellen Bewegung. Mehr Nutzer, mehr Bedarfe, weniger Kontrolle für herkömmliche Broadcaster usw. Ohne die Qualität seiner 10 Punkte einzeln bewerten zu wollen, kann ich mir vorstellen, dass sich der Bereich Internet so oder so ähnlich entwickeln wird. Gerade Unternehmen werden sich aus unterschiedlichen Gesichtspunkten mehr und mehr gezwungen sehen, auf Züge aufspringen zu müssen. Der eine oder andere Zug kann dabei für das eine oder andere Unternehmen durchaus zu schnell sein.</p>
<h2>Nur ein neuer Marketing-Kniff?</h2>
<p>Es wird noch lange dauern, bis der Grossteil der Unternehmen feststellt, dass es sich bei <em>Social Media</em> nicht um einen weiteren Marketing-Kniff handelt. Dass es nicht nur eine Marketing-Verantwortung ist, sich um das grosse Potenzial zu kümmern. Es wird stattdessen Zeit brauchen, zu erkennen, dass ein intensiver Wechsel in der Unternehmenskultur stattfinden muss, um sich auf Social Media einzulassen. Manche Unternehmen bringen das aufgrund ihres Produktes oder ihrer Dienstleistung mit, vielleicht auch aufgrund der Branche oder des Durchschnittalters der Mitarbeiter. Andere Unternehmen werden Schwierigkeiten haben, den Einstieg jemals in absehbarer Zeit zu schaffen. Persönlich halte ich den Denkansatz &#8220;Social Media/Crowd Sourcing/User Generated Content/Insert Buzzword Here ist ein Potenzial, welches abgeschöpft werden muss&#8221; für völlig falsch. Vorher muss der Komplex erst verstanden werden, dann muss eine Entscheidung erfolgen, ob man sich überhaupt <em>auf dieses Internetz</em> einlassen will. Vielleicht wird auch eine friedliche Koexistenz zwischen Klassik und Moderne angestrebt. Gibt es soetwas?</p>
<h2>Der Zug ist weg, was nun?</h2>
<p>Kommen wir also zum zweiten Beitrag. <em>Seth Godin</em> veröffentlicht die Aufgabenliste für den Fall, dass es schon zu spät ist: &#8220;<a href="http://sethgodin.typepad.com/seths_blog/2009/12/is-it-too-late-to-catch-up.html">Is it too late to catch up?</a>&#8220;, fragt er. Damit richtet er sich an die Konservativen, die Langsamen, die Verweigerer und Ängstlichen. Was ist, wenn mein Unternehmen noch nicht dabei ist? Kann man den Rückstand mit GMail und 11 Punkten auf der Liste aufholen? Muss ich, wie er im letzten Punkt beschreibt, wirklich scheitern, um zu verstehen?Unternehmenskulturen sehen sich neuen Herausforderungen gegenübergestellt. Klassische, starre Kommunikationswege werden aufgelöst. Das Internet als neuer Senderkanal für das Marketing ist in Wirklichkeit ein Bündel von Millionen Kanälen. Und diese Kanäle sind auf einmal keine Einbahnstrasse mehr. Resourcen sind ohnehin knapp und bei gegenwärtiger Arbeitslast ist die Bewältigung neuer Aufgaben kaum möglich. Es müssen sich erst ganze Prozessketten ändern, bevor Platz geschaffen wird für neuen Input, neue Kommunikation. Seths Artikel zaubert ein bisschen augenscheinliche Leichtigkeit in diese Aufgabe, meiner Meinung nach zu viel davon. Aber ein Kernsatz in seinem Artikel ist wichtig: &#8220;Mach doch einfach&#8221;. Eine schöner Vorsatz für das neue Jahr.</p>
<img src="http://feeds.feedburner.com/~r/hasematzel/~4/WRFLh8hJ08g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/2009/12/social-media-heute-und-morgen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://hasematzel.de/2009/12/social-media-heute-und-morgen/</feedburner:origLink></item>
		<item>
		<title>Erste Schritte mit Microsofts Expression Web SuperPreview</title>
		<link>http://feedproxy.google.com/~r/hasematzel/~3/4vE0eZn_7Ww/</link>
		<comments>http://hasematzel.de/2009/09/erste-schritte-mit-microsofts-expression-web-superpreview/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 10:15:06 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Web-Entwicklung]]></category>
		<category><![CDATA[expression]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[superpreview]]></category>

		<guid isPermaLink="false">http://hasematzel.de/blog/?p=717</guid>
		<description><![CDATA[Seit dem 2. September können Entwickler Microsofts Expression Web SuperPreview herunterladen. MEWSP ist ein Werkzeug zur Darstellung von Webseiten in mehreren Browsern, im Standard in den Internet Explorer-Versionen 6, 7 und 8. Entwickler sind ohnehin besonders bei der Gestaltung der &#8230; <a href="http://hasematzel.de/2009/09/erste-schritte-mit-microsofts-expression-web-superpreview/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Seit dem 2. September können Entwickler <em>Microsofts Expression Web SuperPreview</em> herunterladen. MEWSP ist ein Werkzeug zur Darstellung von Webseiten in mehreren Browsern, im Standard in den Internet Explorer-Versionen 6, 7 und 8. Entwickler sind ohnehin besonders bei der Gestaltung der Webseiten von den unterschiedlichen Interpretationen der Browserversionen gebeutelt. Microsoft versucht, mit MEWSP eine Unterstützung anzubieten.Vor einigen Wochen hatte ich schonmal die Beta heruntergeladen, die ich aber dank fehlendem XP ServicePack3 nicht installieren konnte. Die <a title="Downloadseite MEWSP" href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=8e6ac106-525d-45d0-84db-dccff3fae677">aktuelle Version</a> läuft nun auch auf XP ServicePack 2, benötigt aber ein installiertes <a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=333325fd-ae52-4e35-b531-508d977d32a6">.NET Framework 3.5</a>. Um die IE8-Vorschau verwenden zu können ist zusätzlich eine IE8-Installation notwendig &#8211; verständlich.Trotz vieler Ansätze (Virtual Machines, MultipleIE) im Internet habe ich für mich nie DAS Werkzeug zum browserübergreifenden Test finden können, dementsprechend gross war meine Hoffnung, vielleicht von Microsoft selbst mit einer Lösung versorgt zu werden. Und &#8211; nach den ersten Stunden mit dem Expression Web Super Preview &#8211; bin ich recht zuversichtlich, etwas gefunden zu haben. Zumindest die gröbsten Probleme lassen sich leicht mit der Software ermitteln und beheben.</p>
<h3>Ein paar Screenshots</h3>
<p>Nach einer reibungslosen Installation, wenig Konfiguration und dem ersten Start nimmt das Tool recht schlicht seine Arbeit auf. MEWSP startet mit einem geteilten Fenster und einer Browserauswahl. Am oberen Rand befindet sich eine Adressleiste, mit der öffentlich verfügbare Seiten aufgerufen werden können. Gibt man eine Adresse ein, wird die Seite in den beiden Browsern geladen.</p>
<p><img class="alignnone" title="Geteilter Screen" src="http://farm4.static.flickr.com/3430/3931310672_c5127d975c_m.jpg" alt="" width="240" height="145" /></p>
<p>Leider ist kein &#8220;browsen&#8221; möglich, d. h. geladen werden nur Abbilder der Seite. Das DOM ist da und ich kann Elemente analysieren, aber ich kann keine Links verwenden. Ein Klick auf ein Element oder einen Link führt nur zu einer Detailanzeige der Elementinformationen. Macht aber im Grunde nix, das ist ohnehin schon viel besser, als alle Lösungen, die ich bisher gesehen habe. Trotz korrekter Einstellung meines Internet Explorers habe ich es jedoch leider noch nicht geschafft, lokale Seiten aus einem lokalen Webserver (localhost) aufzurufen.JavaScript scheint in diesem Rahmen auch nicht zu funktionieren, bzw. ausgeführt zu werden. Schade, auch JavaScript ist browserübergreifend manchmal schmerzhaft, aber dafür gibt&#8217;s ja <a href="http://jquery.com">jQuery</a> ;)</p>
<p><img class="alignnone" title="Overlay-Modus" src="http://farm3.static.flickr.com/2634/3931310676_27a6622bbc_m.jpg" alt="" width="240" height="145" /></p>
<p>MEWSP erlaubt zusätzlich einen Overlay beider Fenster, wodurch Unterschiede in den Layouts nun einwandfrei zu Tage treten. Sehr tolle Sache, das. Jede Menge weiterer Funktionen erleichtern den Überblick über das Layout: Zoom-Funktionen, ein Browser für das DOM, ein Lineal und Hilfslinien, die ich auf die jeweiligen Screens legen kann.</p>
<h3>Ein erstes Fazit</h3>
<p>Trotz einiger Schwächen (kein <em>echter</em> Browser, kein JavaScript) ist <strong>Microsofts Expression Web SuperPreview</strong> eine gute Alternative zum browserübergreifenden Test von Layouts &#8211; vorausgesetzt, man kann sich auf die IE6-Interpretation verlassen. Auf meinen <a href="http://www.flickr.com/photos/hasematzel/tags/superpreview/">Flickr-Account habe ich ein paar erste Screenshots</a> hochgeladen.</p>
<img src="http://feeds.feedburner.com/~r/hasematzel/~4/4vE0eZn_7Ww" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/2009/09/erste-schritte-mit-microsofts-expression-web-superpreview/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://hasematzel.de/2009/09/erste-schritte-mit-microsofts-expression-web-superpreview/</feedburner:origLink></item>
	</channel>
</rss>

