<?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/blog</link>
	<description>webstandards, entwicklung, internet, kultur</description>
	<lastBuildDate>Thu, 24 Jun 2010 07:00:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</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>Ansprechbare Buttons mit visueller Reaktion und CSS3</title>
		<link>http://feedproxy.google.com/~r/hasematzel/~3/TUkp9Qp24O0/</link>
		<comments>http://hasematzel.de/blog/2010/06/24/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.]]></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.</p>
<p>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.</p>
<p>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)</p>
<p>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/blog/wp-content/uploads/2010/06/save-cancel-01.png"><img class="alignnone size-full wp-image-882" title="save-cancel-01" src="http://hasematzel.de/blog/wp-content/uploads/2010/06/save-cancel-01.png" alt="" width="200" height="80" /></a></p>
<p>Ü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>
<h3>Visuelle Reaktion</h3>
<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/blog/wp-content/uploads/2010/06/save-cancel-02.png"><img class="alignnone size-full wp-image-887" title="save-cancel-02" src="http://hasematzel.de/blog/wp-content/uploads/2010/06/save-cancel-02.png" alt="" width="200" height="80" /></a><em><br />
Der Save-Button wird hervorgehoben.</em></p>
<p><a href="http://hasematzel.de/blog/wp-content/uploads/2010/06/save-cancel-03.png"><img class="alignnone size-full wp-image-888" title="save-cancel-03" src="http://hasematzel.de/blog/wp-content/uploads/2010/06/save-cancel-03.png" alt="" width="200" height="80" /></a><em><br />
Der Cancel-Button erhält noch einen Farbwechsel.</em></p>
<p>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/blog/wp-content/uploads/2010/06/save-cancel-04.png"><img class="alignnone size-full wp-image-893" title="save-cancel-04" src="http://hasematzel.de/blog/wp-content/uploads/2010/06/save-cancel-04.png" alt="" width="200" height="80" /></a><br />
<em>Der :active-State für Save.</em></p>
<p><a href="http://hasematzel.de/blog/wp-content/uploads/2010/06/save-cancel-05.png"><img class="alignnone size-full wp-image-894" title="save-cancel-05" src="http://hasematzel.de/blog/wp-content/uploads/2010/06/save-cancel-05.png" alt="" width="200" height="80" /></a><br />
<em>Der :active-State für Cancel.</em></p>
<p><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/TUkp9Qp24O0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/blog/2010/06/24/ansprechbare-buttons-mit-visueller-reaktion-css3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://hasematzel.de/blog/2010/06/24/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/QgnwLHKn8Do/</link>
		<comments>http://hasematzel.de/blog/2010/06/22/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.]]></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:</p>
<ul>
<li>Jeremy Keith: <a href="http://books.alistapart.com/">HTML5 for Web Designers</a><br />
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><br />
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><br />
<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><br />
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><br />
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><br />
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/QgnwLHKn8Do" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/blog/2010/06/22/buecherliste-fuer-den-urlaub-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://hasematzel.de/blog/2010/06/22/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/CxFzWOqCfs4/</link>
		<comments>http://hasematzel.de/blog/2010/05/31/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.]]></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.</p>
<p>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>
<h3>Abruf von mehreren Feeds</h3>
<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>
<h3>Sortieren und Abschneiden</h3>
<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/CxFzWOqCfs4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/blog/2010/05/31/rss-feeds-mit-yql-aggregieren-und-abrufen/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://hasematzel.de/blog/2010/05/31/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/ygKcdLJiexU/</link>
		<comments>http://hasematzel.de/blog/2010/02/06/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.]]></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.</p>
<p>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>
<h3>Der Holzhammer</h3>
<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>
<h3>Etwas eleganter: Ein bisschen JSON</h3>
<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>
<h3>Erzeugen einer eigenen dictionary.js</h3>
<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>
<h4>Datei Nr. 1: Die dictionary.ini</h4>
<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>
<h4>Datei Nr. 2: Der Parser create_dictionary.php</h4>
<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>
<h4>Die dritte Datei: dictionary.js</h4>
<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/ygKcdLJiexU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/blog/2010/02/06/variablen-aus-php-per-json-in-javascript-uebergeben/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://hasematzel.de/blog/2010/02/06/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/ZpUjO03tTGM/</link>
		<comments>http://hasematzel.de/blog/2009/12/03/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 [...]]]></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>
<h3>Nur ein neuer Marketing-Kniff?</h3>
<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>
<h3>Der Zug ist weg, was nun?</h3>
<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?</p>
<p>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/ZpUjO03tTGM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/blog/2009/12/03/social-media-heute-und-morgen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://hasematzel.de/blog/2009/12/03/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/A3HG_5vOVwc/</link>
		<comments>http://hasematzel.de/blog/2009/09/18/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 [...]]]></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.</p>
<p>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.</p>
<p>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.</p>
<p>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/A3HG_5vOVwc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/blog/2009/09/18/erste-schritte-mit-microsofts-expression-web-superpreview/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://hasematzel.de/blog/2009/09/18/erste-schritte-mit-microsofts-expression-web-superpreview/</feedburner:origLink></item>
		<item>
		<title>jQuery Anti-Patterns für eine bessere Performance</title>
		<link>http://feedproxy.google.com/~r/hasematzel/~3/0V1AsWXNH30/</link>
		<comments>http://hasematzel.de/blog/2009/09/15/jquery-anti-patterns-fuer-bessere-performance/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 20:02:26 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web-Entwicklung]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[presentation]]></category>
		<category><![CDATA[slides]]></category>

		<guid isPermaLink="false">http://hasematzel.de/blog/?p=714</guid>
		<description><![CDATA[Das t3n-Magazin veröffentlicht einen Kurzbericht über die jQuery-Konferenz, die am vergangenen Wochenende in Boston stattfand (ein paar Fotos gibt&#8217;s natürlich [...]]]></description>
			<content:encoded><![CDATA[<p>Das <a href="http://t3n.de/news/jquery-alle-inhalte-jquery-conference-blick-254621/">t3n-Magazin veröffentlicht einen Kurzbericht</a> über die <a title="Offizielle Seite der jQuery-Konferenz" href="http://events.jquery.com/jquery-conference-2009/">jQuery-Konferenz</a>, die am vergangenen Wochenende in Boston stattfand (ein paar Fotos gibt&#8217;s <a href="http://www.flickr.com/photos/mikeyboydotcom/sets/72157622231841785/">natürlich</a> bei <a href="http://www.flickr.com/search/?q=jquery%20conference&amp;w=all">Flickr</a>). Neben vielen interessanten Präsentationen ist auch der Vortrag von <a href="http://paulirish.com/">Paul Irish</a> zum Thema <a href="http://www.slideshare.net/paul.irish/perfcompression">jQuery Anti-Patterns for Performance &amp; Compression</a> verlinkt. (Genau der Paul Irish, der vor kurzem den Artikel <a href="http://paulirish.com/2009/bulletproof-font-face-implementation-syntax/">Bulletproof @font-face</a> veröffentlichte, der durch viele Blogs ging).</p>
<p>Paul präsentiert in seinen Folien sehr wissenswerte Ansätze über die Optimierung des Codes beim Einsatz von jQuery. Manche Sachen sind offensichtlich &#8211; wenn man sie erstmal sieht, manche Ansätze sind neu, teilweise überraschend und sollten beim nächsten jQuery-Projekt dringend in Betracht gezogen und geprüft werden. Sehr lesenswert.</p>
<p>Hier geht&#8217;s <a href="http://www.slideshare.net/paul.irish/perfcompression">zur Präsentation auf Slideshare</a> und hier findet sich <a href="http://conslides.org/jqcon09/">eine gesamte Auflistung der Präsentationen und Vorträge</a> der jQuery Conference.</p>
<img src="http://feeds.feedburner.com/~r/hasematzel/~4/0V1AsWXNH30" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/blog/2009/09/15/jquery-anti-patterns-fuer-bessere-performance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://hasematzel.de/blog/2009/09/15/jquery-anti-patterns-fuer-bessere-performance/</feedburner:origLink></item>
		<item>
		<title>Snow Leopard und Apache, PHP und MySQL</title>
		<link>http://feedproxy.google.com/~r/hasematzel/~3/eeTwzlB33uI/</link>
		<comments>http://hasematzel.de/blog/2009/09/10/snow-leopard-und-apache-php-und-mysql/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 11:28:27 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Apache Webserver]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[snow leopard]]></category>

		<guid isPermaLink="false">http://hasematzel.de/blog/?p=695</guid>
		<description><![CDATA[Die Veröffentlichung von Apples neuer Betriebssystem-Version Snow Leopard hat für Web-Entwickler auch einige Neuerungen mitgebracht. Unter anderem wurde auch der [...]]]></description>
			<content:encoded><![CDATA[<p>Die Veröffentlichung von Apples neuer Betriebssystem-Version <a href="http://www.apple.com/macosx/">Snow Leopard</a> hat für Web-Entwickler auch einige Neuerungen mitgebracht. Unter anderem wurde auch der Apache und die PHP-Version aktualisiert. Wer wie ich nicht MAMP verwendet, hat eventuell ebenfalls eine böse Überraschung erlebt: Die angepasste Apache-Konfiguration und alle PHP-Einstellungen sind nach einem Update einfach weg, bzw. zurückgesetzt.</p>
<p>Nach wie vor lässt sich der docroot des Webservers über ein <code>http://localhost/~username</code> aurufen, aber PHP läuft dort nicht mehr und ein installiertes MySQL unter <code>/usr/local/</code> ist auf den ersten Blick auch nicht mehr da. Was ist passiert?</p>
<h3>Der neue Apache</h3>
<p>Der Apache Webserver wurde auf die Version 2.2.11 aktualisiert. Damit wurden jedoch die Einstellungen in der <code>httpd.conf</code> und vor allem unter <code>/extra/httpd-vhosts.conf</code> zurückgesetzt. Das bedeutet, trotz eines mitgelieferten PHP 5.3 funktionieren PHP-Dateien im docroot unter <code>/Users/{username}/Sites/</code> erstmal nicht. Eine Abhilfe schafft ein kurzer Sprung in die Konsole, um in der Apache-Konfiguration das Laden des PHP-Moduls wieder zu aktivieren (Bei solchen Sachen lohnt es sich, immer mal ein Backup der aktuellen Konfiguration anzulegen):</p>
<pre><code>#~&gt; sudo cp /private/etc/apache2/httpd.conf .
    ~/backup/httpd.conf.20090909.001
#~&gt; sudo vi /private/etc/apache2/httpd.conf
</code></pre>
<p>In der Datei suchen wir nach der Zeile, in der das PHP-Modul geladen wird. Die Zeile muss etwa so aussehen:</p>
<pre><code>#LoadModule php5_module    libexec/apache2/libphp5.so
</code></pre>
<p>Durch Entfernen des vorangestellten #-Zeichens und einem Neustart des Apaches wird nun das PHP-Modul geladen. Danach sollte eine im docroot des Webservers abgelegte PHP-Datei mit dem Aufruf der Funktion <code>phpinfo()</code> brav die nagelneue Version 5.3 anzeigen.</p>
<h3>Aktivieren der php.ini</h3>
<p>Bei einem Blick in die Aufstellung in der PHPInfo stellen wir fest, dass keine <code>php.ini</code>-Datei geladen wird. Stattdessen verwendet das Modul die Standardeinstellungen. Im Verzeichnis <code>/private/etc/</code> finden wir aber mehrere inaktive Versionen, die wir schnell aktivieren können:</p>
<pre><code>#~&gt; ls /private/etc/php.in*
/private/etc/php.ini.default
/private/etc/php.ini-5.2-previous
/private/etc/php.ini.default-5.2-previous
#~&gt; cd /private/etc/
#~&gt; sudo cp php.ini.default php.ini
#~&gt; sudo chmod u+w php.ini
#~&gt; sudo apachectl restart
</code></pre>
<p>Jetzt können wir an der Datei Änderungen vornehmen. Eine wichtige Neuerung in PHP5.3 ist sicherlich das Date/Timezone-Objekt. Das wirft nämlich massenweise Kompatibilitätsfehler aus, wenn Applikationen noch mit den date()-Funktionen von PHP5.2 und kleiner arbeiten. Um diese Fehler zu verhindern, sollte in der php.ini zumindest die Standard-Timezone gesetzt werden. Die unterschiedlichen Angaben (für Europa) findet man in der PHP-Dokumentation. Man öffnet die <code>php.ini</code>, sucht die Definition für <code>date.timezone</code> im Abschnitt <code>[date]</code>, setzt den Wert entsprechend (bei mir <strong>Europe/Berlin</strong>) und kommentiert die Zeile aus. Nach Speichern der Datei und eines Neustarts des Apaches sollten die Fehler verschwunden sein. Ich rate jedoch jedem Entwickler, sich <a href="http://de.php.net/manual/en/book.datetime.php">die Definition des neuen Date/Timezone-Objektes</a> anzusehen.</p>
<h3>MySQL</h3>
<p>Ich hatte vorher eine eigene MySQL-Installation unter <code>/usr/local/mysql</code> laufen. <code>/mysql</code> war dabei ein symbolischer Link auf die Bibliotheken unter <code>mysql-5.0.1a-osx10.5-x86</code>. Das Snow Leopard Update hat zwar die Bibliotheken wiederhergestellt, aber den symbolischen Link vergessen:</p>
<pre><code>#~&gt; cd /usr/local/
#~&gt; sudo ln -s mysql-5.0.1a-osx10.5-x86 mysql
</code></pre>
<p>Nebenbei sollte ich die MySQL-Version vielleicht auch einmal aktualisieren &#8211; zunächst mal klappt aber wieder der Zugriff über den Client.</p>
<p>PHP kann aber noch nicht auf MySQL zugreifen. Zunächst sind in der <code>php.ini</code> die entsprechenden mysql-Module freizuschalten (im Bereich <strong>Dynamic Extensions</strong>). Danach erscheint der Abschnitt MySQL zwar wieder brav in der phpinfo, es konnte jedoch immer noch keine Verbindung zur lokalen Datenbank hergestellt werden. Das liegt daran, das in der <code>php.ini.default</code> der Wert für das <code>mysql.default_socket</code> auf <code>/var/mysql/mysql.sock</code> steht. In meiner Installation liegt das Socket aber unter <code>/private/tmp/mysql.sock</code>. Schnell den Wert ändern, Apache neu starten und der Zugriff auf die lokale MySQL-DB klappt wieder:</p>
<pre><code>mysql.default_socket = /private/tmp/mysql.sock
mysqli.default_socket = /private/tmp/mysql.sock
</code></pre>
<p>Von meinen virtuellen Hosts hatte ich ausreichend Backups, darum war die Wiederherstellung der <code>httpd-vhosts.conf</code> nicht so schwer. Wer lokale TLDs verwendet und die Zugriffe durch Einträge in der <code>/private/etc/hosts</code> ermöglicht, muss übrigens die <em>hosts</em>-Datei nicht noch einmal anfassen: Die Einträge darin werden von Snow Leopard übernommen.</p>
<h3>Danke für die Hilfe</h3>
<p>Sehr viel geholfen haben mir dabei die Einträge von <em>tady</em> im <a href="http://wordpress.org/support/topic/306878">WordPress-Forum</a> und der Artikel <a href="http://blog.wolfgang-burger-it.de/archives/52-Snow-Leopard-Umstiegshuerden-eines-Webentwicklers.html">Snow Leopard: Umstiegshürden eines Web-Entwicklers</a> in Wookkies Blog. Danke dafür.</p>
<img src="http://feeds.feedburner.com/~r/hasematzel/~4/eeTwzlB33uI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/blog/2009/09/10/snow-leopard-und-apache-php-und-mysql/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://hasematzel.de/blog/2009/09/10/snow-leopard-und-apache-php-und-mysql/</feedburner:origLink></item>
		<item>
		<title>Warum der Umstieg auf HTML 5 jetzt eine gute Idee ist</title>
		<link>http://feedproxy.google.com/~r/hasematzel/~3/udxUuBkMVfs/</link>
		<comments>http://hasematzel.de/blog/2009/06/30/warum-der-umstieg-auf-html-5-jetzt-eine-gute-idee-ist/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 21:59:33 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[HTML & CSS]]></category>
		<category><![CDATA[Web-Entwicklung]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[w3c]]></category>
		<category><![CDATA[webstandards]]></category>

		<guid isPermaLink="false">http://hasematzel.de/blog/?p=683</guid>
		<description><![CDATA[Gestern wurde der Firefox in der Version 3.5 veröffentlicht und zum Download freigegeben. Die neue Variante bietet interessante und sinnvolle [...]]]></description>
			<content:encoded><![CDATA[<p>Gestern wurde der Firefox in der Version 3.5 veröffentlicht und zum Download freigegeben. Die neue Variante bietet <a title="Offlizielle Featureliste Firefox 3.5" href="https://developer.mozilla.org/En/Firefox_3.5_for_developers">interessante und sinnvolle Erweiterungen</a> zur Unterstützung für benutzbarere Webseiten sowohl für Anbieter als auch für Benutzer. Letzte Woche schon publizierte Opera die Information <a href="http://unite.opera.com/">zur zukünftigen Version 10</a> des beliebten Browsers, welche auch ein beachtenswertes Konzept enthält, welches den <em>Aufenthalt</em> im Internet bereichern könnte.</p>
<p>Über HTML5 wurde in der letzten Zeit ebenfalls extrem viel geschrieben. So viel, dass sich das W3C als offizielle Organisation zur Aussage genötigt sah, dass <a title="HTML5 ist noch kein Standard" href="http://www.w3.org/QA/2009/05/_watching_the_google_io.html">HTML5 derzeit noch kein Standard sei</a>. In der Tat, wenn man sich die derzeitigen Massnahmen der grossen Browserhersteller anschaut, so wird es noch dauern, bis HTML5 in notwendiger Breite unterstützt wird &#8211; und darauf kommt es letztlich an. Trotzdem entstehen allerortens Dialoge zum Thema HTML5, sogar erste professionelle Webseiten entstehen auf der durchaus vielversprechenden HTML5-Basis. Hacks und Workarounds, um Webseiten abwärtskompatibel zu gestalten, sind zu genüge zu finden.</p>
<h3>Warum jetzt auf HTML5 umsteigen?</h3>
<p>Um diesen Aufruf zu erklären, muss ich gute 6 Jahre zurückblicken. Im Oktober des Jahres 2003 hiess der Firefox noch Firebird und <a href="http://web.archive.org/web/20031014090907/http://www.mozilla.org/">war in einer frühen Version</a> erhältlich. Flächendeckend war der Internet Explorer verfügbar und die Kommunikation zwischen Standard-Organisation (W3C), Browserherstellern und Webdesignern möchte ich einmal als <em>dünn</em> bezeichnen. Nielsens Alertbox war <em>die</em> Resource zum Thema Usability. Dennoch war es die Zeit in der Menschen wie Dan Cederholm von simplebits.com und Jeffrey Zeldman mit seinem Daily Report und viele andere durch die Verwendung von Weblogs Dialoge über Möglichkeiten und Notwendigkeiten transparent machten. Der <a href="http://web.archive.org/web/20031001180317/http://www.csszengarden.com/">CSSZenGarden</a> entstand. Auf einmal bewegten sich Webseiten und deren Umsetzung über das oft (und leider immer noch) fälschlicherweise alleinstehend verwendete Merkmal <strong>Design</strong> hinaus. Die Trennung von Semantik und Layout wurde state-of-the-art &#8211; und zwar in erster Linie durch die Verwendung und damit der Erkennung der Vorteile in privaten und persönlichen Webseiten, vor allem Weblogs. Auf einmal traf man auf mehr und mehr Webdesigner, die ihren Schwerpunkt auf die Darstellungsebene ergänzten mit weiteren wichtigen Gesichtspunkten, unter der Haube, für den Benutzer auf den ersten Blick nicht sichtbar, im Code.</p>
<p>Diese Bewegung, die offene Kommunikation und die auf der Hand liegenden Vorteile, die an vielen Stellen dargestellt wurden, können durchaus als ein wichtiger Motivator angesehen werden, der vor allem auch Browserhersteller beeinflusste und insgesamt zu einer stabileren Grundlage von Webseiten und Technologien beitrug. Eine <em>perfekte</em> Lösung, die insbesondere bei grösseren Webseiten Usability, Barrierefreiheit, Corporate Design und Identity und Kundenanforderungen zusammenbringt, wurde (und wird) nie erreicht. Webdesign ist auch heute immer eine <em>Annäherungswissenschaft</em>, die &#8211; je nach Kompromissbereitschaft des Umsetzenden &#8211; mehr oder weniger Absicht und Umsetzung miteinander vereint. Welche &#8220;grosse&#8221; Webseite verwendet nicht auch heute sogenannte Hacks, Conditional Comments oder andere Helferlein, um die Darstellung in den Browsern aller Hersteller zu vereinheitlichen?</p>
<h3>Der Browserhersteller in Zugzwang</h3>
<p>Diese Entwicklung hatte eines erreicht: Die Hersteller mussten die Notwendigkeit einsehen, auf derartige Bestrebungen Rücksicht zu nehmen. Und obwohl die Implementierung der vom W3C empfohlenen Standards in den Browsern selbst heute noch zu wünschen übrig lässt, näherten sich Webdesigner (durch die massenhafte Verwendung der Webstandards) und Browserhersteller (durch Nachbesserung an den Render-Engines) immer weiter an. Man kann sagen, die Motivation, die ein Hersteller von sich aus zur korrekten Implementierung trieb, wurde durch die Webseiten-Ersteller und Designer ergänzt.</p>
<p>Heute, 6 Jahre später, ist man bei der Erstellung von Webseiten nach wie vor auf ein exaktes Wissen um die unterschiedlichen Render-Modelle der Browser angewiesen. Dies verlangt vom Webdesigner eine grosse autodidaktische Bereitschaft und mag vielleicht der Grund sein, warum Schulungsprogramme und Lehrpläne in Universitäten zu diesem Thema noch so absolut unterschiedlich ausfallen. Denn es gibt auch immer noch keinen XHTML-Standard und auch noch keinen HTML4-Standard. Ein Standard wäre grundlegend eine absolut identische Implementierung in jedem Browser dieser Welt. Das werden wir sicherlich auf lange Zeit noch nicht sehen.</p>
<h3>Die HTML5-Implementierung ist entweder nicht da oder nicht perfekt &#8211; na und?</h3>
<p>Wer sich also derzeit dem Umstieg auf HTML5 noch verschliesst und auf eine stabilere und flächendeckendere Umsetzung durch die Browserhersteller wartet, lässt sich zurückfallen in die (Stein-)Zeit von Tabellenlayouts und wird &#8211; wahrscheinlich &#8211; ziemlich lange warten. HTML5 wird kommen und bietet im Entwurf schon jetzt ein Funktionsportfolio, das uns befähigt, noch bessere, benutzbarere und barriereärmere Webseiten und -Applikationen zu bauen, als wir es jemals konnten. Wir müssen uns nur bewusst machen, dass wir nur durch den Einsatz von HTML5 in kleinen, persönlichen, aber auch grösseren, professionellen Projekten die Antriebskraft für die Hersteller liefern, HTML5 (und auch mal CSS3) früher oder später ausnahmslos zu unterstützen.</p>
<p><em>Machen wir uns nichts vor</em>. Auch wenn dieser Zeitpunkt irgendwann kommen wird, wird es Unterschiede in den Browsern geben. Man wird mit abgefahrenen Hacks auch weiterhin für einheitliche Erscheinungsbilder von Web-Oberflächen sorgen müssen. Man wird weiterhin für bestimmte Einsatzzwecke auf proprietäre Lösungen wie Flash zurückgreifen. Man wird weiterhin aufmerksam Unmengen Entwicklerblogs lesen müssen, um auf Stand zu bleiben und man wird sich auch weiterhin aktiv an der Diskussion zur Erkennung und Behebung bzw. Vermeidung von Schwachstellen in den Umsetzungen in den Browsern beteiligen müssen.</p>
<p>Aber es gibt keinen Grund, nicht mit dem Einsatz von HTML5 zu beginnen. Im Gegenteil, jedes Projekt, was neu jetzt noch auf Basis von HTML4 oder XHTML online geht, ist ein Grund weniger für die Browserhersteller, sich zu bewegen.</p>
<img src="http://feeds.feedburner.com/~r/hasematzel/~4/udxUuBkMVfs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/blog/2009/06/30/warum-der-umstieg-auf-html-5-jetzt-eine-gute-idee-ist/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://hasematzel.de/blog/2009/06/30/warum-der-umstieg-auf-html-5-jetzt-eine-gute-idee-ist/</feedburner:origLink></item>
		<item>
		<title>Meinungen zum Deutschen Multimedia Award</title>
		<link>http://feedproxy.google.com/~r/hasematzel/~3/6ubKegGIZEM/</link>
		<comments>http://hasematzel.de/blog/2009/06/15/meinungen-zum-deutschen-multimedia-award/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 07:42:19 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Unsortiert]]></category>
		<category><![CDATA[dmma]]></category>
		<category><![CDATA[webkrauts]]></category>
		<category><![CDATA[webstandards]]></category>

		<guid isPermaLink="false">http://hasematzel.de/blog/?p=680</guid>
		<description><![CDATA[Jens Grochtdreis hat den prämierten Publizierungen des Deutschen Multimedia Award unter die Haube geschaut. Das Ergebnis ist ein ausführlicher Bericht, [...]]]></description>
			<content:encoded><![CDATA[<p>Jens Grochtdreis hat den prämierten Publizierungen des Deutschen Multimedia Award unter die Haube geschaut. Das Ergebnis ist ein <a href="http://grochtdreis.de/weblog/2009/06/15/der-deutsche-multimedia-award-eine-codekritik/">ausführlicher Bericht</a>, der Aufschluss gibt über den Stand der Dinge hinsichtlich der Webstandards.</p>
<p>Lesebefehl!</p>
<img src="http://feeds.feedburner.com/~r/hasematzel/~4/6ubKegGIZEM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/blog/2009/06/15/meinungen-zum-deutschen-multimedia-award/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://hasematzel.de/blog/2009/06/15/meinungen-zum-deutschen-multimedia-award/</feedburner:origLink></item>
	</channel>
</rss>
