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

<channel>
	<title>Learning the World &#187; downloads</title>
	<atom:link href="http://learningtheworld.eu/category/downloads/feed/" rel="self" type="application/rss+xml" />
	<link>http://learningtheworld.eu</link>
	<description></description>
	<lastBuildDate>Tue, 06 Nov 2012 00:17:33 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.1</generator>
	<item>
		<title>Amazon Plugin Authorization</title>
		<link>http://learningtheworld.eu/2009/amazon-authorization/</link>
		<comments>http://learningtheworld.eu/2009/amazon-authorization/#comments</comments>
		<pubDate>Fri, 31 Jul 2009 21:00:04 +0000</pubDate>
		<dc:creator><![CDATA[Martin Kliehm]]></dc:creator>
				<category><![CDATA[downloads]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[machine tags]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[triple tags]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XSL]]></category>

		<guid isPermaLink="false">http://learningtheworld.eu/?p=693</guid>
		<description><![CDATA[Starting August 15th, the <acronym title="Amazon Web Services">AWS</acronym> Product Advertising <acronym title="Application Programming Interface">API</acronym>, as the former E-Commerce Service is now called, will only accept signed requests. <strong>The plugin will stop working if you don&#8217;t update.</strong> Thus I needed to re-engineer a few functions of my WordPress Amazon Machine Tags Plugin.&#160;[&#8230;]]]></description>
				<content:encoded><![CDATA[<p class="alert">Oh, it&#8217;s confusing how often Amazon changes it&#8217;s product names and API. In my plugin the Help response group is used for <strong>key validation</strong>, alas <a href="http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/CHAP_WhatsNew.html">recently it&rsquo;s been deprecated</a>. I need more time to look for an alternative. In the meantime you can hack it by adding a file <a href="http://learningtheworld.eu/wp-content/cache/amtap-aws-key-verification.txt"><code>amtap-aws-key-verification.txt</code></a> in the wp-content/cache folder where the content is <code>true</code>.</p>

<p>Starting August 15th, the <acronym title="Amazon Web Services">AWS</acronym> Product Advertising <acronym title="Application Programming Interface">API</acronym>, as the former E-Commerce Service is now called, will only accept signed requests. <strong>The plugin will stop working if you don&rsquo;t update.</strong> Thus I needed to re-engineer a few functions of my <a href="/2007/amazon-machine-tags/">WordPress Amazon Machine Tags Plugin</a>.</p>

<p>What you need to do is:</p>

<ul>
<li><a href="http://wordpress.org/extend/plugins/amazon-machine-tags/">Update to version 3.0</a> of the plugin.</li>
<li>If you didn&rsquo;t adapt any files just overwrite them. If you customized the <acronym title="Cascading Style Sheets">CSS</acronym> or <acronym title="Extensible Stylesheet Language">XSL</acronym> files, take care that you don&rsquo;t overwrite yours. Also the <acronym>XSL</acronym> namespace must reflect the <acronym>API</acronym> version used in the plugin (2009-07-01), i.e. <code>xmlns:aws=<span class="codeSpace">&nbsp;</span>&quot;http://webservices.amazon.com/<span class="codeSpace">&nbsp;</span>AWSECommerceService/<span class="codeSpace">&nbsp;</span>2009-07-01&quot;</code></li>
<li><a href="http://aws-portal.amazon.com/gp/aws/developer/account/index.html?action=access-key">Get your Secret Access Key</a> in addition to your existing Access Key ID. Your future requests will be signed using the secret key.</li>
<li>Go to the plugin&rsquo;s admin interface and <strong>enter the secret key</strong>.</li>
<li>Some people experienced a few minutes where the items didn&rsquo;t show up, instead they got the untransformed <acronym title="Extensible Markup Language">XML</acronym> code. After a few minutes the problem resolved itself. My guess is that Amazon cached the <acronym>XSL</acronym> files, the versions mismatched, therefore the <acronym>XML</acronym> wasn&rsquo;t transformed. That&rsquo;s why I renamed the <acronym>XSL</acronym> files so that the new ones will be used. If you want to be sure, also delete the cached files <code>amtap-aws-items-for-post-*.html</code> in your <code>wp-content/cache</code> directory.</li>
</ul>

<p>If you encounter any problems with the update, re-install the <a href="http://downloads.wordpress.org/plugin/amazon-machine-tags.2.0.zip">old version</a> and let me know what went wrong so that we can fix it together until August 15th.</p>

<p>You can also support the plugin by <strong>translating it</strong>. There&rsquo;s an empty PO file in the package. With a tool such as <a href="http://www.poedit.net/">Poedit</a> it&rsquo;s fairly easy to translate everything. Thanks. <img src="http://learningtheworld.eu/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> </p>
]]></content:encoded>
			<wfw:commentRss>http://learningtheworld.eu/2009/amazon-authorization/feed/</wfw:commentRss>
		<slash:comments>51</slash:comments>
		</item>
		<item>
		<title>Enhanced Keyboard-accessible Google Maps</title>
		<link>http://learningtheworld.eu/2009/keyboard-accessible-google-maps/</link>
		<comments>http://learningtheworld.eu/2009/keyboard-accessible-google-maps/#comments</comments>
		<pubDate>Tue, 28 Apr 2009 19:00:28 +0000</pubDate>
		<dc:creator><![CDATA[Martin Kliehm]]></dc:creator>
				<category><![CDATA[accessibility]]></category>
		<category><![CDATA[downloads]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Google Maps]]></category>
		<category><![CDATA[hCard]]></category>
		<category><![CDATA[keyboard access]]></category>
		<category><![CDATA[microformats]]></category>
		<category><![CDATA[opera]]></category>
		<category><![CDATA[Patrick H. Lauke]]></category>
		<category><![CDATA[vcard]]></category>

		<guid isPermaLink="false">http://learningtheworld.eu/?p=517</guid>
		<description><![CDATA[<strong>Patrick H. Lauke</strong> wrote an excellent article about <strong>keyboard-accessible Google Maps</strong> on the Opera Developer website. Still I was able to improve it slightly when I implemented an accessible map myself. I would like to share these modifications with you.]]></description>
				<content:encoded><![CDATA[<p><a href="http://twitter.com/patrick_h_lauke">Patrick H. Lauke</a> wrote an excellent article about <a href="http://dev.opera.com/articles/view/keyboard-accessible-google-maps/">keyboard-accessible Google Maps</a> on the Opera Developer website. Still I was able to improve it slightly when I implemented an <a href="http://eafra.eu/2009/venue/">accessible map</a> myself. I would like to share these modifications with you:</p>

<ul>
<li>A <strong>link to Google Maps</strong> when JavaScript is disabled.</li>
<li>Support for the <strong><a href="http://code.google.com/apis/ajax/documentation/">Google <acronym title="Asynchronous JavaScript and XML">AJAX</acronym> <acronym title="Application Programming Interface">API</acronym> Loader</a></strong>.</li><li>Using the <strong>small map control</strong>.</li>
<li>Keyboard accessibility for <strong><em>all</em> control elements</strong> within the map.</li>
</ul>

<p>As a fallback without JavaScript&nbsp;&mdash; because people disable it, because their mobile device doesn&rsquo;t support it, or because it gets filtered by corporate proxies&nbsp;&mdash; Patrick used the little known <a href="http://code.google.com/intl/en-US/apis/maps/documentation/staticmaps/">Google Static Maps <acronym>API</acronym></a>, but for some reason he missed adding the link to Google. Here is the fix:</p>

<ol class="code" title="HTML code">
<li><code>&lt;div id=&quot;map&quot;&gt;</code></li>
<li class="indent"><code><strong>&lt;a href=&quot;http://maps.google.com/maps<span class="codeSpace">&nbsp;</span><span class="nowrap">?f=q&amp;amp;output=html</span><span class="codeSpace">&nbsp;</span><span class="nowrap">&amp;amp;q=50.110950+8.684666&quot;</span> title=&quot;Google Maps&quot;&gt;</strong></code></li>
<li class="double">&lt;img src=&quot;http://maps.google.com/staticmap?hl=en<span class="codeSpace">&nbsp;</span><span class="nowrap">&amp;amp;center=50.112267,8.678384</span><span class="codeSpace">&nbsp;</span><span class="nowrap">&amp;amp;markers=50.110950,8.684666,red</span><span class="codeSpace">&nbsp;</span><span class="nowrap">&amp;amp;zoom=15&amp;amp;size=500&#x78;300</span><span class="codeSpace">&nbsp;</span><span class="nowrap">&amp;amp;key=[Your API Key]&quot;</span> alt=&quot;City map of Frankfurt&quot; width=&quot;500&quot; height=&quot;300&quot; /&gt;</li>
<li class="indent"><code><strong>&lt;/a&gt;</strong></code></li>
<li><code>&lt;/div&gt;</code></li>
</ol>

<div>
<p><a href="http://maps.google.com/maps?f=q&amp;output=html&amp;q=50.110950757575814+8.684666901826859" title="Google Maps" id="maps-static-without-js"><img src="http://maps.google.com/staticmap?hl=de&amp;center=50.112267,8.678384&amp;markers=50.110950757575814,8.684666901826859,red&amp;zoom=15&amp;size=500x300&amp;key=ABQIAAAAiX9IUvugciHL2lvi9eAyFBSMjuiRZEUjgLWr4CdH8vZ2LQfPbhTYj1_FZwtIQquykkDMnYbZpMJHXQ" alt="City Map of Frankfurt" width="510" height="300" /></a></p>
</div>

<p>Then I changed how the map is embedded. As it seems that the <a href="http://code.google.com/apis/ajax/documentation/"><acronym>API</acronym> loader</a> is more current, I preferred that way:</p>

<ol class="code" title="HTML code">
<li><code>&lt;script type=&quot;text/javascript&quot; src=&quot;http://www.google.com/jsapi?key=[Your API Key]&quot;&gt;&lt;/script&gt;</code></li>
<li><code>&lt;script type=&quot;text/javascript&quot; src="/js/accgmap.js&quot;&gt;&lt;/script&gt;</code></li>
<li><code>&lt;script type=&quot;text/javascript&quot;&gt;</code></li>
<li class="indent"><code>google.load( &#x27;maps&#x27;, &#x27;2&#x27;, { &#x27;language&#x27; : &#x27;en&#x27; } );</code></li>
<li class="indent"><code>google.setOnLoadCallback( GMAP.initMap );</code></li>
<li><code>&lt;/script&gt;</code></li>
</ol>

<p>Using the small control elements is trivial: <code>SmallMapControl()</code>. The next thing I wanted to change was <strong>keyboard access to <em>all</em> controls</strong>, in particular for the map type, <abbr title="that is">i.e.</abbr> <code>Map&nbsp;| Satellite&nbsp;| Hybrid</code>. Patrick refers to an <code>id</code>, but I found that all relevant controls have a <code>title</code>, so I just checked for that attribute. I also dropped setting the <code>style</code> attribute in JavaScript as that belongs in the <acronym title="Cascading Style Sheets">CSS</acronym> file. His original function <code>GKeyboardPatch()</code> now looks like this (note the <code>while</code> loop for a slightly better performance):</p>

<ol class="code" title="JavaScript code">
<li><code>GKeyboardPatch: <strong>function</strong>( map ) {</code></li>
<li class="indent"><code>var</code> button, divs = map.getContainer().getElementsByTagName( &#x27;div&#x27; );</li>
<li class="indent"><code>var</code> i = 0;</li>
<li class="indent"><code>while</code> ( divs[i] ) {</li>
<li class="double"><code>if ( divs[i].getAttribute( &#x27;log&#x27; ) || ( <em>divs[i].getAttribute( &#x27;title&#x27; ) &amp;&amp; divs[i].getAttribute( &#x27;title&#x27; ) != &#x27;&#x27;</em> ) ) {</code></li>
<li class="double"><span class="indent">button = document.createElement( &#x27;button&#x27; );</span></li>
<li class="double"><span class="indent">button.setAttribute( &#x27;value&#x27;, divs[i].getAttribute( &#x27;title&#x27; ));</span></li>
<li class="double"><span class="indent">divs[i].appendChild( button );</span></li>
<li class="double"><span class="indent">if ( divs[i].getAttribute( &#x27;log&#x27; )) { <code>// only control buttons</code></span></li>
<li class="double"><code class="double">// override the IE opacity filter that Google annoyingly sets</code></li>
<li class="double"><span class="double">divs[i].style.filter = &#x27;&#x27;;</span></li>
<li class="double"><code class="double">// should really set to &#x27;transparent&#x27;</code></li>
<li class="double"><span class="double">divs[i].style.background = <span class="nowrap">&#x27;url( http://www.google.com/</span><span class="codeSpace">&nbsp;</span>intl/en_ALL/mapfiles/transparent.png )&#x27;;</span></li>
<li class="double"><span class="indent">}</span></li>
<li class="double">}</li>
<li class="double">i++;</li>
<li class="indent">}</li>
<li>}</li>
</ol>

<p>Now remember I said I&rsquo;d rather separate style and behaviour, so here are a some lines of <acronym>CSS</acronym> with the setting of <code>width</code> and <code>height</code> for the <code>#map</code> being most relevant, otherwise it will collapse:</p>

<ol class="code" title="CSS code">
<li><code>#map {</code></li>
<li class="indent">height: 300px;</li>
<li class="indent">overflow: hidden;</li>
<li class="indent">position: relative;</li>
<li class="indent">width: 500px;</li>
<li><code>}</code></li>
<li><code>#maps-static, #maps-static img {</code></li>
<li class="indent">display: block;</li>
<li><code>}</code></li>
<li><code>#map span.note {</code></li>
<li class="indent">display: none;</li>
<li><code>}</code></li>
<li><code>#map button {</code></li>
<li class="indent">background: transparent;</li>
<li class="indent">border-style: solid;</li>
<li class="indent">border-width: 0;</li>
<li class="indent">cursor: pointer;</li>
<li class="indent">height: 100%;</li>
<li class="indent">left: -2px;</li>
<li class="indent">margin: 2px;</li>
<li class="indent">overflow: hidden;</li>
<li class="indent">padding: 2px;</li>
<li class="indent">position: absolute;</li>
<li class="indent">text-indent: -100em;</li>
<li class="indent">top: -2px;</li>
<li class="indent">width: 100%;</li>
<li><code>}</code></li>
<li><code>#map a:focus, #map a:active, #map button:focus, #map button:active {</code></li>
<li class="indent">outline: 2px dashed #61bf1a;</li>
<li><code>}</code></li>
</ol>

<p>And that&rsquo;s it, thanks again to Patrick for the solid foundation I built upon. Now <a href="/examples/js/accgmap.js">download the JavaScript code</a> and try to tab through the map below.</p>

<p>Actually on the other website I extracted <strong>hCard microformats</strong> from the page as well and displayed the addresses on the map, but I was lazy and used jQuery. I thought it doesn&rsquo;t look well here mixed with Patrick&rsquo;s clean <acronym title="Document Object Model">DOM</acronym> scripting, but feel free to <a href="http://eafra.eu/2009/venue/">take it from the original website</a>.</p>

<div id="map">
<p><a href="http://maps.google.com/maps?f=q&amp;output=html&amp;q=50.110950757575814+8.684666901826859" title="Google Maps" id="maps-static"><img src="http://maps.google.com/staticmap?hl=de&amp;center=50.112267,8.678384&amp;markers=50.110950757575814,8.684666901826859,red&amp;zoom=15&amp;size=500x300&amp;key=ABQIAAAAiX9IUvugciHL2lvi9eAyFBSMjuiRZEUjgLWr4CdH8vZ2LQfPbhTYj1_FZwtIQquykkDMnYbZpMJHXQ" alt="City Map of Frankfurt" width="510" height="300" /></a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://learningtheworld.eu/2009/keyboard-accessible-google-maps/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Better Foreground Sprites</title>
		<link>http://learningtheworld.eu/2008/better-foreground-sprites/</link>
		<comments>http://learningtheworld.eu/2008/better-foreground-sprites/#comments</comments>
		<pubDate>Thu, 26 Jun 2008 18:00:17 +0000</pubDate>
		<dc:creator><![CDATA[Martin Kliehm]]></dc:creator>
				<category><![CDATA[accessibility]]></category>
		<category><![CDATA[conferences]]></category>
		<category><![CDATA[downloads]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[background-image]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[css sprites]]></category>
		<category><![CDATA[foreground sprites]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[http-request]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[T.V. Raman]]></category>

		<guid isPermaLink="false">http://learningtheworld.eu/?p=106</guid>
		<description><![CDATA[A while ago I wrote about using <acronym title="Cascading Style Sheets">CSS</acronym> Sprites in <code>img</code> tags&#160;&#8212; <strong>Foreground Sprites</strong>. Thus you avoid HTTP requests, but the page turns really ugly when <acronym>CSS</acronym> is switched off because the sprite image will be displayed in its full size. Now Google&#8217;s accessibility specialist T.V. Raman explained their idea of using sprites for foreground images&#160;&#8212; a much better solution!]]></description>
				<content:encoded><![CDATA[<p>A while ago I wrote about using <a href="http://www.alistapart.com/articles/sprites/"><acronym title="Cascading Style Sheets">CSS</acronym> Sprites</a> in <code>img</code> tags, calling it <strong><a href="/2007/foreground-sprites/">Foreground Sprites</a></strong>. Thus you avoid performance-eating HTTP requests, but the page turns really ugly when <acronym>CSS</acronym> is switched off because the sprite image will be displayed in its full size. <img src="http://learningtheworld.eu/wp-includes/images/smilies/icon_sad.gif" alt=":(" class="wp-smiley" /> </p>

<p>What are the alternatives? Using background-images with off-screen text? Bad code:</p>

<ol class="code bad" title="HTML">
<li><code>&lt;a href=&quot;foo&quot; class=&quot;button&quot;&gt;</code></li>
<li class="indent"><code>&lt;span&gt;Alternative Text&lt;/span&gt;</code></li>
<li><code>&lt;/a&gt;</code></li>
</ol>

<ol class="code bad" title="CSS">
<li><code>a.button, button {</code></li>
<li class="indent"><code>background: url(foo.gif) 0 &minus;26px no-repeat;</code></li>
<li class="indent">display: block;</li>
<li class="indent">height: 52px;</li>
<li class="indent">overflow: hidden;</li>
<li class="indent">position: relative;</li>
<li class="indent">width: 150px;</li>
<li><code>}</code></li>
<li><code>span {</code></li>
<li class="indent"><code>left: &minus;9999px;</code></li>
<li class="indent"><code>position: absolute;</code></li>
<li class="indent"><code>top: auto;</code></li>
<li><code>}</code></li>
</ol>

<p><strong>That&rsquo;s a bad idea with accessibility issues.</strong> Screen readers will be able to read the text, but if somebody with low vision has high-contrast custom stylesheets, it is likely that the <code>background-image</code> won&rsquo;t be displayed. Still the alternative text will be invisible off-screen, so the link or <code>button</code> becomes unusable.</p>

<h3>A better solution</h3>

<p>Now Google&rsquo;s accessibility specialist <strong>T.V. Raman</strong> explained their idea for <a href="http://googlewebmastercentral.blogspot.com/2008/05/design-patterns-for-accessible.html">replacing  images with sprites</a>. Here are screenshots of Google search results with images, and with background images disabled:</p>

<p><img src="/wp-content/uploads/2008/06/screenshot-google-search-result-with-bgimage.png" width="400" height="84" alt="Screenshot displaying the Google logo" class="screenshot" />
<img src="/wp-content/uploads/2008/06/screenshot-google-search-result-wo-bgimage.png" width="400" height="84" alt="Screenshot with text visible instead of the logo" class="screenshot" /></p>

<p>Google puts the alternative text <strong><em>behind</em> the background image</strong> simply by attaching it on the <code>span</code> element, not the anchor. So when <acronym>CSS</acronym> or background images are turned off, the text just reappears.</p>

<ol class="code" title="XHTML">
<li><code>&lt;a id=&quot;logo&quot; title=&quot;Go to Google Home&quot; href=&quot;http://www.google.com/&quot;&gt;</code></li>
<li class="indent">Google</li>
<li class="indent"><code><strong>&lt;span&gt;<ins datetime="20080627T174700">&lt;/span&gt;</ins></strong></code></li>
<li><code>&lt;/a&gt;</code></li>
</ol>

<ol class="code" title="CSS">
<li><code>#logo {</code></li>
<li class="indent">display: block;</li>
<li class="indent">height: 52px;</li>
<li class="indent">overflow: hidden;</li>
<li class="indent">position: relative;</li>
<li class="indent">width: 150px;</li>
<li><code>}</code></li>
<li><code>#logo span {</code></li>
<li class="indent"><code>background: url(foo.gif) 0 &minus;26px no-repeat;</code></li>
<li class="indent"><code>height: 100%;</code></li>
<li class="indent"><code>left: 0;</code></li>
<li class="indent">position: absolute;</li>
<li class="indent">top: 0;</li>
<li class="indent"><code>width: 100%;</code></li>
<li><code>}</code></li>
</ol>

<p>There&rsquo;s only an issue if you have <em>a lot</em> of alternative text, perhaps combined with text zoom, so that it doesn&rsquo;t fit in the reserved space. But I can live with that.</p>

<p>Congratulations to Google for this ellegant solution, and it&rsquo;s <em>so</em> simple! Why didn&rsquo;t <em>I</em> think of it? <img src="http://learningtheworld.eu/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> </p>
]]></content:encoded>
			<wfw:commentRss>http://learningtheworld.eu/2008/better-foreground-sprites/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>WordPress Goodies with InlineRSS</title>
		<link>http://learningtheworld.eu/2008/wordpress-goodies-with-inlinerss/</link>
		<comments>http://learningtheworld.eu/2008/wordpress-goodies-with-inlinerss/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 19:00:46 +0000</pubDate>
		<dc:creator><![CDATA[Martin Kliehm]]></dc:creator>
				<category><![CDATA[downloads]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Christian Heilmann]]></category>
		<category><![CDATA[del.icio.us]]></category>
		<category><![CDATA[Ed Eliot]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[inlineRSS]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[upcoming]]></category>
		<category><![CDATA[XSL]]></category>
		<category><![CDATA[XSLT]]></category>

		<guid isPermaLink="false">http://learningtheworld.eu/2008/wordpress-goodies-with-inlinerss/</guid>
		<description><![CDATA[Christmas is over, but I thought I might share a few of the scripts used on this site with you anyway. The key is an <strong>incredibly useful plugin called inlineRSS</strong> that pulls everything you throw at it into your site. You only need some <acronym title="Extensible Stylesheet Language Transformation">XSLT</acronym> magic. Since <acronym>XSLT</acronym> isn&#8217;t everyone&#8217;s strength, just copy my files. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Christmas is over, but I thought I might share a few of the scripts used on this site with you anyway. The key is an <strong>incredibly useful plugin called <a href="http://www.iconophobia.com/wordpress/?page_id=55">inlineRSS</a></strong> that pulls everything you throw at it into your site. You only need some <acronym title="Extensible Stylesheet Language Transformation">XSLT</acronym> magic. Since <acronym>XSLT</acronym> isn&rsquo;t everyone&rsquo;s strength, just copy my files:</p>

<ol>
<li>
<p>Let&rsquo;s start with the simplest transformation, pulling <strong>the number of people who have bookmarked your post</strong> on del.icio.us. There are two components: one line of <acronym>PHP</acronym> code to insert the result in the footer of a page (found in template file <code>single.php</code>), and a few lines of <acronym>XSLT</acronym> for the transformation:</p>
<ol class="code">
<li><code>&lt;?php inlineRSS(</code></li>
<li class="indent"><code>&#39;delicious-incoming-&#39;&nbsp;. $id,<br />
&#39;<ins datetime="2008-07-27">http://feeds.delicious.com</ins>/rss/url?url=&#39;&nbsp;. get_permalink(), 60, <strong>&#39;inline-rss-linked.xslt&#39;</strong>);</code></li>
<li><code>?&gt;</code></li>
</ol>
<p>The function <code>inlineRSS()</code> takes four arguments: the filename where you want to cache the result, the feed <acronym title="Uniform Resource Identifier">URI</acronym>, the time to cache in minutes, and the filename of the transformation stylesheet. The latter has to be in the same directory as <code>inlineRSS.php</code> (the plugin).</p>
<ol class="code">
<li><code>&lt;xsl:template match=&quot;/rdf:RDF&quot;&gt;</code></li>
<li class="indent"><code>&lt;xsl:if test=&quot;count( rss:item ) &amp;gt; 0&quot;&gt;</code></li>
<li class="indent double"><code>Saved by &lt;span class="linked-in"&gt;<strong>&lt;xsl:value-of select=&quot;count( rss:item )&quot;&nbsp;/&gt;</strong>&lt;/span&gt; other people.</code></li>
<li class="indent"><code>&lt;/xsl:if&gt;</code></li>
<li><code>&lt;/xsl:template&gt;</code></li>
</ol>
<p><strong>Download:</strong> <a href="/downloads/inline-rss-linked.xslt"><code>inline-rss-linked.xslt</code></a></p>
</li>
<li>
<p>In the sidebar of this blog you see a section &ldquo;current reading&rdquo; which displays <strong>my latest five del.icio.us entries</strong> I have tagged with <code>show-in-blog</code>. Because I&rsquo;m too lazy to add a description on del.icio.us there is just the title and the tags, minus &ldquo;show-in-blog.&rdquo; Here is the code for <code>sidebar.php</code>:</p>
<ol class="code">
<li><code>&lt;?php inlineRSS(</code></li>
<li class="indent"><code>&#39;delicious-links&#39;,<br />
&#39;http://<ins datetime="2008-07-27">feeds.delicious.com</ins>/rss/<span class="codeSpace">&nbsp;</span><strong>your-delicious-name</strong>/show-in-blog&#39;, 60, <strong>&#39;inline-rss-delicious.xslt&#39;</strong>);</code></li>
<li><code>?&gt;</code></li>
</ol>
<p>Of course &ldquo;your-delicious-name&rdquo; needs to be replaced. <img src="http://learningtheworld.eu/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> </p>
<p><strong>Download:</strong> <a href="/downloads/inline-rss-delicious.xslt"><code>inline-rss-delicious.xslt</code></a></p>
</li>

<li>
<p>Finally there is a list of <strong>my upcoming events</strong>, including microformatted semantic information. The <acronym>XSLT</acronym> is a little longer, but not really complicated. You just need to replace the upcoming ID with your own.</p>
<ol class="code">
<li><code>&lt;?php inlineRSS(</code></li>
<li class="indent"><code>&#39;upcoming&#39;,<br />
&#39;http://upcoming.yahoo.com/<span class="codeSpace">&nbsp;</span>syndicate/v2/<span class="codeSpace">&nbsp;</span>my_events/<span class="codeSpace">&nbsp;</span><strong>123456</strong>&#39;, 60, <strong>&#39;inline-rss-upcoming.xslt&#39;</strong>);</code></li>
<li><code>?&gt;</code></li>
</ol>
<p><strong>Download:</strong> <a href="/downloads/inline-rss-upcoming.xslt"><code>inline-rss-upcoming.xslt</code></a></p>
</li>
</ol>

<p>I&rsquo;d like to point out that this is certainly not the only, and perhaps not even the best way to implement feeds into your site, but it&rsquo;s pretty convenient once you&rsquo;ve installed inlineRSS.</p>

<p><strong>Chris Heilmann</strong> approaches the issue with a <a href="http://www.wait-till-i.com/2007/08/01/yummy-add-delicious-boomarks-to-your-wordpress-blog-with-a-simple-plugin/">client side plugin</a> to distribute tasks from the server to the client. His JavaScript is insofar unobtrusive as the list of inline del.icio.us links is replaced with an external link to his del.icio.us category, but then you give away the responsibility that the list is accessible as well. That&rsquo;s why I would prefer a server side solution.</p>

<p><strong>Ed Eliot</strong> has written a script to create a very pretty <a href="http://www.ejeliot.com/blog/74">server side del.icio.us badge</a> that I highly recommend, but it&rsquo;s not as universal as the <em>inlineRSS</em> plugin, and it&rsquo;s not a WordPress plugin to begin with (the same applies to his neat <a href="http://www.ejeliot.com/blog/77">SimpleRSS</a> script). But both Chris&rsquo; and Ed&rsquo;s solutions are decent alternatives to take into consideration.</p>
]]></content:encoded>
			<wfw:commentRss>http://learningtheworld.eu/2008/wordpress-goodies-with-inlinerss/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Amazon Machine Tags Plugin for WordPress</title>
		<link>http://learningtheworld.eu/2007/amazon-machine-tags/</link>
		<comments>http://learningtheworld.eu/2007/amazon-machine-tags/#comments</comments>
		<pubDate>Sat, 01 Dec 2007 22:51:26 +0000</pubDate>
		<dc:creator><![CDATA[Martin Kliehm]]></dc:creator>
				<category><![CDATA[downloads]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[book:isbn=0596515812]]></category>
		<category><![CDATA[book:isbn=0596529260]]></category>
		<category><![CDATA[ECS]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[ip2country]]></category>
		<category><![CDATA[machine tags]]></category>
		<category><![CDATA[microformats]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[POSH]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[web services]]></category>
		<category><![CDATA[XSLT]]></category>
		<category><![CDATA[yui]]></category>

		<guid isPermaLink="false">http://learningtheworld.eu/2007/amazon-machine-tags/</guid>
		<description><![CDATA[I always wanted to implement one thing since I started the blog: <strong>a simple inclusion of Amazon items</strong>. I didn&#8217;t want to search through results that existing plugins provided. When I wrote about something like a book, I already used machine tags to identify the subject! So I found the inspiration to write my first real WordPress plugin: Amazon Machine Tags.&#160;[&#8230;]]]></description>
				<content:encoded><![CDATA[<p class="alert">The forthcoming <strong>API change</strong> requiring signed requests will effect this plugin. If you do not <a href="http://wordpress.org/extend/plugins/amazon-machine-tags/">update the plugin</a> then it will stop working on August 15th. Comments on this version are closed, please comment on the <a href="/2009/amazon-authorization/">update page</a>.</p>

<h3>In this article</h3>

<ul class="toc">
<li><a href="#intro">Introduction</a></li>
<li><a href="#installation">Installation</a></li>
<li><a href="#faq"><acronym title="Frequently Asked Questions">FAQ</acronym></a></li>
<li><a href="#changelog">Changelog</a></li>
<li><a href="#comments">Discussion</a></li>
</ul>

<h3 id="intro">Introduction</h3>

<p>I always wanted to implement one thing since I started the blog: <strong>a simple inclusion of Amazon items</strong>. I didn&rsquo;t want to search through results that existing plugins provided. When I wrote about something like a book, I already used machine tags to identify the subject! So I found the inspiration to write my first real WordPress plugin: <a href="http://wordpress.org/extend/plugins/amazon-machine-tags/">Amazon Machine Tags</a>.</p>

<p>Here&rsquo;s what it does:</p>

<ol>
<li>It identifies any tag in the <a href="http://en.wikipedia.org/wiki/Machine_tag">machine (or triple) tag</a> form <code>book:<acronym>isbn</acronym>=1234567890</code> or <code>amazon:asin=1234567890</code>. That works with native tags from WordPress 2.3 and later, Bunny&rsquo;s Technorati Tags, Jerome&rsquo;s Keywords, or as inline text (see below).</li>
<li>Then it gets the <strong>item information and a thumbnail image</strong> from the <a href="http://www.amazon.com/gp/browse.html?node=3435361">Amazon Web Services <acronym title="Application Programming Interface">API</acronym></a>. That&rsquo;s the real thing including prices and such, no cheap <acronym>RSS</acronym> feed. <img src="http://learningtheworld.eu/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> </li>
<li><p>The item(s) are displayed in the sidebar or in a blog article with a link to <strong>the visitor&rsquo;s best match</strong> (if the <a href="http://priyadi.net/archives/2005/02/25/wordpress-ip-to-country-plugin/">ip2country plugin</a> is installed) or <strong>a default Amazon shop</strong> of your choice. See examples in the sidebar.</p>
<p>The &ldquo;best match&rdquo; is based on the visitor&rsquo;s location. If she is from one of the six countries where Amazon has shops, that locale is chosen. If he is from Europe, the preferred language is matched to either France, Germany, or <acronym title="United Kingdom">UK</acronym>, with <acronym>UK</acronym> as default. If it&rsquo;s neither a locale nor Europe, amazon.com is the default. Based on your location, do you think that&rsquo;s a reasonable approach?</p>
<p>Note that some items, like books in any language other than English, are only available from certain locales, so a visitor from the <acronym title="United Kingdom">UK</acronym> might not see German books you recommend.</p></li>
<li>If you are an Amazon Associate for that locale, your Associate ID is included automatically.</li>
</ol>

<p>You can edit the server-side, semantic and valid <acronym title="Extensible Hypertext Markup Language">XHTML</acronym> output via <acronym title="Extensible Stylesheet Language Transformation">XSLT</acronym>, change the <acronym title="Cascading Style Sheets">CSS</acronym>, or translate the admin interface through <a href="http://www.poedit.net">.po files</a>. Actually <strong>Amazon loads the <acronym>XSLT</acronym> file from your server</strong> and processes it on theirs, so you shouldn&rsquo;t block <acronym>HTTP</acronym> access to the plugin directory, and <code>localhost</code> doesn&rsquo;t work either.</p>

<p>Results can be <strong>cached</strong> for anything between one second and one hour, so you don&rsquo;t need to worry even when you run an extremely popular blog.</p>

<p>The <a href="http://developer.yahoo.com/yui/connection/">YUI Connection Manager</a> is included to verify the Access Key in the admin interface via <acronym title="Representational State Transfer">REST</acronym> and unobtrusive <acronym title="Asynchronous JavaScript and XML">AJAX</acronym>.</p>

<p>I hope this little piece of software serves you well and you like it.</p>

<h3 id="installation">Installation</h3>

<ol>
<li><a href="http://downloads.wordpress.org/plugin/amazon-machine-tags.zip">Get the latest version</a> of the plugin from the WordPress site.</li>
<li>Upload the whole <code>amazon-machine-tags</code> folder into the <code>/wp-content/plugins/</code> directory.</li>
<li>Activate the plugin through the &ldquo;Plugins&rdquo; menu in WordPress.</li>
<li>Get an Amazon Web Services <a href="http://docs.amazonwebservices.com/AWSECommerceService/2007-06-13/GSG/GettinganAWSAccessKeyID.html">Access Key</a>.</li>
<li>Create a <code>wp-content/cache/</code> directory with permissions set to 755, or 777 if you create the directory as <code>root</code> user.</li>
<li>Put <code>&lt;?php AMTAP::get_items(); ?&gt;</code> in your sidebar and start using machine tags.</li>
<li><a href="#comment-32667">Edit <code>amtap-blog.css</code></a> if you like.</li>
<li>If you want to use tags in a blog article, write <code>&#91;amtap book:isbn=1234567890&#93;</code> or <code>&#91;amtap amazon:asin=1234567890&#93;</code>. Thanks to <a href="http://www.paulinepauline.de">paulinepauline</a> for that idea.</li>
</ol>

<h3 id="faq">Frequently Asked Questions</h3>

<h4>Does it work in the sidebar on Pages, too?</h4>

<p>Posts have tags, pages don&rsquo;t, so it doesn&rsquo;t work on those by default. But there&rsquo;s a plugin called <a href="http://wordpress.org/extend/plugins/tags4page/">tags4page</a> that enables tags for pages. Works like a charm.</p>

<h4>Is there a limit of how many items can be requested?</h4>

<p>Yes, Amazon has a limit of 10 items per request. Since they are separate requests, you can use a maximum of 10 items in the content plus a maximum of 10 in the sidebar.</p>

<h4>Would it be possible to cache the images?</h4>

<p>Technically it wouldn&rsquo;t be a problem, but the <a href="http://www.amazon.com/AWS-License-home-page-Money/b/?node=3440661#5">Amazon Web Services license</a> explicitly forbids caching of images (see 5.1.10). Sorry.</p>

<h4>I need to a larger thumbnail (medium), but can&rsquo;t seem to find a place to edit the size of the image being requested.</h4>

<p>The image size can be edited in the <acronym title="Extensible Stylesheet Language Transformation">XSLT</acronym>. The original result is a <acronym title="Extensible Markup Language">XML</acronym> file that is transformed by Amazon using your local copy of <code>amtap-html-sidebar.xsl</code> and <code>amtap-html-content.xsl</code>, respectively. Replacing every occurance of <code>.//aws:TinyImage</code> with <code>.//aws:MediumImage</code> should do the trick.
</p>

<p>You can view the original <acronym>XML</acronym> when you activate the &ldquo;debug&rdquo; option in the admin interface so that the request string is printed as a comment in the sidebar&rsquo;s source code. <acronym>XSLT</acronym> is a very powerful tool, and there&rsquo;s a lot more in the <acronym>XML</acronym>, for example customer reviews.</p>

<h4>Are all options really required?</h4>

<p>No. The only required field is the Amazon Web Services Access Key. You can leave the others, they are set to defaults then.</p>

<h3 id="changelog">Changelog</h3>

<ul class="changelog">
<li><strong>3.0</strong> <ins datetime="20090731">(2009-07-31)</ins>: Added signed requests for the new Amazon authorization requirement. Updated the API version to 2009-07-01 (please note: if you use your own XSL files, you must update the version in the XML namespace URL). Updated links.</li>
<li><strong>2.0</strong> <ins datetime="20080718">(2008-07-18)</ins>:
<ol>
<li>Added fields for editing the <a href="http://wppluginreview.info/2008/03/09/review-amazon-machine-tags/">sidebar headline</a>, <a href="#comment-33625">link target</a>, and displaying <a href="#comment-33625">rating stars</a>.</li>
<li>Added an error message if the plugin is run from a private IP address space like <a href="#comment-34319"><code>localhost</code></a>.</li>
<li>Changed <a href="#comment-33888">priorities for price</a> selection, they are now: <code>LowestNewPrice</code>, <code>ListPrice</code>, first offer, <code>LowestUsedPrice</code>.</li>
<li>Added support for the display of an <a href="#comment-34426">artist name</a>.</li>
<li>Added <a href="#comment-34412">rating stars</a>.</li>
<li>Fixed <a href="#comment-34224">EAN numbers with a dash</a>.</li>
<li>Fixed cutting of titles after a <a href="#comment-34326">period</a>.</li>
<li>Changed <acronym title="Cascading Style Sheets">CSS</acronym> and <acronym title="Extensible Stylesheet Language">XSL</acronym> files. <strong>Take care when you edited those.</strong></li>  
</ol>
</li>
<li><strong>1.1.3:</strong> Changed <code>amtap-admin.css</code> and <code>amtap-admin.inc.php</code> to make the admin interface look prettier with WordPress 2.5.</li>
<li><strong>1.1.2:</strong> Fixed a <a href="#comment-33367">bug</a> in <code>amtap.php</code> when there are no other tags but default tags.</li>
<li><strong>1.1.1:</strong> <a href="#comment-32967">Fixed</a> the sort order of inline items, a bug for returning an error message when the cache file is not writable, and added Amazon&rsquo;s limit of 10 items per request.</li>
<li><strong>1.1.0:</strong> Fixed the display of inline tags on the home page. Improved regular expression for filtering inline tags.</li>
<li><strong>1.0.6:</strong> Fixed a bug introduced through the new default items function when there were no items to be displayed in the sidebar.</li>
<li><strong>1.0.5:</strong> Added an option for <a href="#comment-32509">default items on every page</a>. Changed <code>amtap-html-sidebar.xsl</code> to sort items in the order of the request.</li>
<li><strong>1.0.4:</strong> Bugfix for replacement of dollar characters in content. Also content items are now cached separately.</li>
<li><strong>1.0.3:</strong> Fixed the <a href="#comment-32268" title="See comment">display of inline tags</a> on category pages.</li>
<li><strong>1.0.2:</strong> Changed the plugin path from <code>amtap</code> to <code>amazon-machine-tags</code> for consistency with the file structure in the zipped file.</li>
<li><strong>1.0.1:</strong> Bugfix for native WordPress tags.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://learningtheworld.eu/2007/amazon-machine-tags/feed/</wfw:commentRss>
		<slash:comments>202</slash:comments>
		</item>
		<item>
		<title>Cost-Effectiveness of Accessibility</title>
		<link>http://learningtheworld.eu/2007/accessibility-cost-effectiveness/</link>
		<comments>http://learningtheworld.eu/2007/accessibility-cost-effectiveness/#comments</comments>
		<pubDate>Thu, 12 Jul 2007 19:00:01 +0000</pubDate>
		<dc:creator><![CDATA[Martin Kliehm]]></dc:creator>
				<category><![CDATA[accessibility]]></category>
		<category><![CDATA[downloads]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[a11y]]></category>
		<category><![CDATA[cost effectiveness]]></category>
		<category><![CDATA[costs]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[germany]]></category>
		<category><![CDATA[presentation]]></category>
		<category><![CDATA[s5]]></category>
		<category><![CDATA[statistics]]></category>
		<category><![CDATA[talks]]></category>
		<category><![CDATA[upcoming:event=187929]]></category>
		<category><![CDATA[webmontag]]></category>

		<guid isPermaLink="false">http://learningtheworld.eu/2007/accessibility-cost-effectiveness/</guid>
		<description><![CDATA[Last week I talked at a geek meeting about the <strong>cost-effectiveness of accessibility</strong>. Inspired by Dave Wilton&#8217;s talk at the European Accessibility Forum about their most impressive redesign of the Legal &#38; General website, I decided to do some research and adopt it to the German market. The presentation is now available in German or English.&#160;[&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Last week I talked at a geek meeting about the <strong>cost-effectiveness of accessibility</strong>. Inspired by <a href="/2007/european-accessibility-forum/#wilton">Dave Wilton&rsquo;s talk</a> at the European Accessibility Forum about their most impressive redesign of the Legal&nbsp;&amp; General website, I decided to do some research and adopt it to the German market.</p>

<p>The <strong>presentation is now available for download in <a href="http://download.bluemars.de/webmontag/2007-07-02/en/" title="Slides in English">English</a> or <a href="http://download.bluemars.de/webmontag/2007-07-02/" title="Slides in German">German</a></strong> under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/2.5/">Creative Commons</a> license, so you can re-use material as long as you quote me.</p>

<p>Let&rsquo;s face it: all of us have heard the phrase <strong>&ldquo;blind people are not our target group,&rdquo;</strong> either from clients or colleagues. There are a few noble souls who actually care about other people&rsquo;s needs, but business is mostly about money.</p>

<p>So I explained <strong>how businesses lose money</strong> by ignoring accessibility. Because accessibility is not only about blind people: it&rsquo;s about color blind, about old people, young people with learning disabilities, or people who are not fluent in a language. Fundamentalists will deny, but there&rsquo;s also a close relation to device independence.</p>

<p>You may decide to ignore &ldquo;a few disabled,&rdquo; but you cannot ignore half of the population: accessibility is becoming a <strong>social and economic imperative</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://learningtheworld.eu/2007/accessibility-cost-effectiveness/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>XHTML 1.1 Second Edition with Target Attribute</title>
		<link>http://learningtheworld.eu/2007/xhtml-with-target/</link>
		<comments>http://learningtheworld.eu/2007/xhtml-with-target/#comments</comments>
		<pubDate>Thu, 22 Feb 2007 16:30:35 +0000</pubDate>
		<dc:creator><![CDATA[Martin Kliehm]]></dc:creator>
				<category><![CDATA[downloads]]></category>
		<category><![CDATA[W3C]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[web standards]]></category>
		<category><![CDATA[attribute]]></category>
		<category><![CDATA[HTML WG]]></category>
		<category><![CDATA[module]]></category>
		<category><![CDATA[Second Edition]]></category>
		<category><![CDATA[target]]></category>
		<category><![CDATA[working draft]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[XHTML 1.1]]></category>

		<guid isPermaLink="false">http://learningtheworld.eu/2007/xhtml-with-target/</guid>
		<description><![CDATA[When I switched from <acronym title="Hypertext Markup Language">HTML</acronym>&#160;4 to <acronym title="Extensible Hypertext Markup Language">XHTML</acronym>&#160;1.1 a couple of years ago, I soon found the <strong><code>target</code> attribute</strong> was missing. I have never been in love with the <code>target</code> attribute anyway, but some clients insisted that their links should open in a new window. So I did some research. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>When I switched from <acronym title="Hypertext Markup Language">HTML</acronym>&nbsp;4 to <acronym title="Extensible Hypertext Markup Language">XHTML</acronym>&nbsp;1.1 a couple of years ago, I soon found <strong>the <code>target</code> attribute was missing.</strong> I have never been in love with the <code>target</code> attribute anyway, but some clients insisted that their links should open in a new window. So I did some research.</p>

<p>You won&rsquo;t believe how much <a href="http://www.thinkvitamin.com/features/design/dont-be-the-weakest-link#comments" title="Comments on a Vitamin article">myth</a> and <a href="http://www.456bereastreet.com/archive/200603/the_target_attribute_and_opening_new_windows/" title="Roger Johansson: The target attribute and opening new windows">misinformation</a> is out there. Some say <strong>it&rsquo;s deprecated</strong>. In fact it never was. It is part of <acronym>XHTML</acronym>&nbsp;2 and <acronym>XHTML</acronym> Basic, and there is a <code>target</code> module in <acronym>XHTML</acronym>&nbsp;1.1, the modularized version of <acronym>XHTML</acronym>. The attribute is not included in <acronym>HTML</acronym>&nbsp;4.01 Strict and <acronym>XHTML</acronym>&nbsp;1.0 Strict because it was then considered to be related to <code>frame</code>s and <code>iframe</code>s, but it&rsquo;s not marked &ldquo;deprecated.&rdquo; It was simply not in the core set of modules for the <acronym>XHTML</acronym>&nbsp;1.1 driver.</p>

<p>Some people argued <strong>it&rsquo;s a behavior</strong> and thus belongs into <a href="http://www.thefutureoftheweb.com/blog/target-blank-xhtml11">unobtrusive JavaScript</a>. But then clicking on a link to get to another page is also some functionality, and nobody would think of replacing anchors with loads of bloated script to simulate such a basic behavior.</p>

<p id="dtd-extension">So I ended up <strong>extending the extensible</strong> with a <a href="/dtd/xhtml-target.dtd" type="application/xml-dtd">customized <acronym title="Document Tpe Definition">DTD</acronym></a>:</p>

<ol class="code">
<li><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;iso-8859-1&quot;?&gt;</code></li>
<li>&lt;!&#45;- Bring in the XHTML 1.1 driver -&#45;&gt;</li>
<li><code>&lt;!ENTITY % xhtml11.dtd</code></li>
<li class="indent"><code>PUBLIC &quot;-//W3C//DTD XHTML 1.1//EN&quot;</code></li>
<li class="indent"><code>&quot;http://www.w3.org/TR/xhtml11/<span class="codeSpace">&nbsp;</span>DTD/xhtml11.dtd&quot;&gt;</code></li>
<li><code>%xhtml11.dtd;</code></li>
<li>&nbsp;</li>
<li>&lt;!&#45;- Bring in the Target Module -&#45;&gt;</li>
<li><code>&lt;!ENTITY % xhtml-target.mod</code></li>
<li class="indent"><code>PUBLIC &quot;-//W3C//ELEMENTS XHTML Target 1.0//EN&quot;</code></li>
<li class="indent"><code>&quot;http://www.w3.org/TR/<span class="codeSpace">&nbsp;</span>xhtml-modularization/DTD/<span class="codeSpace">&nbsp;</span>xhtml-target-1.mod&quot;&gt;</code></li>
<li><code>%xhtml-target.mod;</code></li>
</ol>

<p>However, now I have to bid farewell to that bizarre old friend: the working draft of <a href="http://www.w3.org/TR/2007/WD-xhtml11-20070216/xhtml11-diff.html#a_xhtml11_driver"><acronym>XHTML</acronym>&nbsp;1.1 Second Edition</a> includes the <strong><code>target</code> module in the core set</strong>, finally. I&rsquo;m relieved because tinkering with <acronym>DTD</acronym>s is a pain, but it had style&nbsp;&hellip;</p>

<p>Note that in the current version <code>target</code> is not yet included in <acronym>XHTML</acronym>&nbsp;1.1 <em>Schema</em>, but I have been assured it will <a href="http://lists.w3.org/Archives/Public/www-html-editor/2007JanMar/0033.html">definitely be in the final version</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://learningtheworld.eu/2007/xhtml-with-target/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Website Performance Tweaks</title>
		<link>http://learningtheworld.eu/2007/performance/</link>
		<comments>http://learningtheworld.eu/2007/performance/#comments</comments>
		<pubDate>Thu, 25 Jan 2007 20:00:35 +0000</pubDate>
		<dc:creator><![CDATA[Martin Kliehm]]></dc:creator>
				<category><![CDATA[downloads]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[book:isbn=0596529309]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[concat]]></category>
		<category><![CDATA[css sprites]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Douglas Crockford]]></category>
		<category><![CDATA[Ed Eliot]]></category>
		<category><![CDATA[file aggregation]]></category>
		<category><![CDATA[http-request]]></category>
		<category><![CDATA[JSMin]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[Nate Koechley]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[sliding doors]]></category>
		<category><![CDATA[techniques]]></category>
		<category><![CDATA[yahoo]]></category>
		<category><![CDATA[yui]]></category>

		<guid isPermaLink="false">http://learningtheworld.eu/2007/performance/</guid>
		<description><![CDATA[In the last six months I became more aware of techniques for optimizing website performance. I learned about memory leaks and JavaScript performance, but what impressed me most was Nate Koechleyâ€™s presentation about large scale website performance issues in â€œYahoo! <abbr title="versus">vs.</abbr> Yahoo!&#8221; at the @media conference 2006. In the meantime there have been more blog posts about particular aspects of performance optimization, so I wrote a summary.&#160;[&#8230;]]]></description>
				<content:encoded><![CDATA[<p>In the last six months I became more aware of techniques for <strong>optimizing website performance</strong>. I learned about <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/IETechCol/dnwebgen/ie_leak_patterns.asp" title="Microsoft Developer Network: Understanding and solving Internet Explorer leak patterns">memory</a> <a href="http://outofhanwell.com/ieleak/" title="Drip: A memory leak detector for Internet Explorer">leaks</a> and <a href="http://blogs.msdn.com/ie/archive/2006/08/28/728654.aspx" title="IE + JavaScript performance recommendations &ndash; part 1">JavaScript</a> <a href="http://blogs.msdn.com/ie/archive/2006/11/16/ie-javascript-performance-recommendations-part-2-javascript-code-inefficiencies.aspx" title="IE + JavaScript performance recommendations &ndash; part 2">performance</a>, but what impressed me most was <a href="http://nate.koechley.com/blog/2006/07/12/my_atmedia_2006_slides/" rel="met colleague">Nate Koechley&rsquo;s presentation</a> about large scale website performance issues in &ldquo;<a href="http://learningtheworld.eu/2006/atmedia-day-two/#koechley" title="See my notes about his talk">Yahoo! <abbr title="versus">vs.</abbr> Yahoo!</a>&rdquo; at the @media conference 2006. In the meantime there have been more blog posts about particular aspects of performance optimization, and I&rsquo;d like to sum them up:</p>

<p id="file-location"><strong>Parsing JavaScript</strong> freezes the browser. Therefore put <acronym title="Cascading Stylesheets">CSS</acronym> in the <code>head</code> and JavaScript near to the <code>&lt;/body&gt;</code> so that it is parsed when the page has been rendered.</p>

<p id="http-requests">The arch enemy of performance are <strong><a href="http://yuiblog.com/blog/2006/11/28/performance-research-part-1/" title="YUI Blog: Performance research &ndash; what the 80/20 rule tells us about reducing HTTP requests"><acronym title="Hypertext Transfer Protocol">HTTP</acronym> requests</a></strong>. Many browsers still can&rsquo;t handle more than two or four requests at a time. Keep the number of files down, your website will be faster.</p>

<p>There are several techniques with the aim to reduce the number of files:</p>

<ol><li id="inline-css"><p><strong>&ldquo;<q>A single large file is fastest.</q>&rdquo;</strong> (<cite>Nate Koechley</cite>) That&rsquo;s why Yahoo! <em>apparently</em> has such an amount of <a href="http://www.robertnyman.com/2007/01/24/with-these-web-sites-would-you-say-the-web-standards-war-is-won/">inline <acronym title="Cascading Stylesheets">CSS</acronym></a>. They found out <a href="http://yuiblog.com/blog/2007/01/04/performance-research-part-2/" title="YUI Blog: Performance research, part 2: browser cache usage &ndash; exposed!">browser caching</a> is not as effective as they thought, in particular not on a user&rsquo;s start page. So they deliver &ldquo;inline&rdquo; <acronym>CSS</acronym>. Actually writing inline <acronym>CSS</acronym> is a maintenance nightmare, but delivering <acronym>CSS</acronym> content inline doesn&rsquo;t mean the files can&rsquo;t have separate lives on the server: concatenate the files with a server side technique of your choice.</p>
<p><strong>Update:</strong> A couple of months later <a href="/2007/performance-2/#rule-8">Nate explained that further</a>: when your page is likely to be a user&rsquo;s start page, caching plays a minor role, thus &ldquo;inline&rdquo; <acronym>CSS</acronym> is faster. Otherwise use external files, aggregate them, and make sure they are cached (see below).</p></li>
<li id="enforce-caching"><p><strong>Enforce caching.</strong> Another <a href="http://www.bazon.net/mishoo/articles.epl?art_id=958"><acronym title="Internet Explorer">IE</acronym> bug</a> prevents image caching. Add the following to your <code>.htaccess</code>, <code>httpd.conf</code> or <code>vhost.conf</code> settings:</p>
<ol class="code">
<li><code>&lt;IfModule mod_expires.c&gt;</code></li>
<li class="indent"><code>ExpiresActive On</code></li>
<li class="indent"><code>ExpiresByType image/jpg &quot;access plus 1 day&quot;</code></li>
<li class="indent"><code>ExpiresByType image/jpeg &quot;access plus 1 day&quot;</code></li>
<li class="indent"><code>ExpiresByType image/gif &quot;access plus 1 day&quot;</code></li>
<li class="indent"><code>ExpiresByType image/png &quot;access plus 1 day&quot;</code></li>
<li><code>&lt;/IfModule&gt;</code></li></ol></li>
<li id="background-images"><p><strong>Reduce the number of background images</strong> with techniques like <a href="http://www.alistapart.com/articles/sprites/">CSS Sprites</a> or <a href="http://www.alistapart.com/articles/slidingdoors/">Sliding Doors</a>. Instead of four images of rounded corners you <a href="http://www.fiftyfoureleven.com/sandbox/sliding-doors-one-image/" title="Example">only need one</a> and get the mouseover state for free! The green download button on <a href="http://www.mozilla.com">mozilla.com</a> is based on that technique. And <a href="http://www.yahoo.com">Yahoo!</a> uses <acronym>CSS</acronym> Sprites to combine a huge number of icons.</p>

<p><img src="/wp-content/uploads/2007/01/mozilla-button.jpg" class="centered screenshot" width="300" height="149" alt="Download button on mozilla.com using the Sliding Doors technique" /></p>

<p>Please note this approach is only for <em>decorational background images</em> that degrade gracefully. <del>It&rsquo;s not for <code>img</code> elements.</del> <ins>Be careful when you use it for <a href="/2007/foreground-sprites/">foreground images</a>.</ins> And if text comes as a graphical representation, it can become inaccessible for screen reader users, zoom readers, or people with stylesheets switched off. Use real text instead.</p>

<p>Also note changing the <code>background-position</code> causes <acronym>IE6</acronym> to flicker, related to the caching bug above. To avoid it, simply add the following:</p>
<ol class="code">
<li><code>&lt;script type=&quot;text/javascript&quot;&gt;</code></li>
<li class="indent"><code>try { document.execCommand(<span class="codeSpace">&nbsp;</span>&quot;BackgroundImageCache&quot;, false, true); } catch(e) {};</code></li>
<li><code>&lt;/script&gt;</code></li></ol></li>
<li id="file-aggregation"><p><strong>Aggregate files.</strong> Ed Eliot wrote a nice <a href="http://www.ejeliot.com/blog/72" title="Automatic merging and versioning of CSS/JS files with PHP">script to merge JavaScript or <acronym>CSS</acronym> files</a>, bonus respect for the advanced versioning and caching features.</p>

<p>But remember the cases when it doesn&rsquo;t make sense to merge <acronym>CSS</acronym> files: your <acronym title="Internet Explorer">IE</acronym> bugfixes still belong in conditional comments. If you use the <code>@import</code> rule to filter antique browsers from getting advanced styles, you can&rsquo;t drop it. And if you want to merge stylesheets for different media (<abbr title="for example">e.g.</abbr> print), make sure the code is enclosed in something like</p>


<ol class="code">
<li><code>@media print {</code></li>
<li class="indent"><code>/* style sheet for print goes here */</code></li>
<li><code>}</code></li></ol>


<p>In an <a href="http://www.ejeliot.com/blog/73" title="Adding JSMin to the CSS/JS merging script">updated version</a> Ed added <a href="http://javascript.crockford.com/jsmin.html">JSMin</a> to strip comments and excess whitespace. JSMin works like a charm for JavaScript files. But it cuts a few space characters too much so that the syntax of <acronym>CSS</acronym> selectors changes <del>therefore for now I have abandoned the idea to compress them too</del>. <ins>See <a href="#comment-6045">Jens Meiert&rsquo;s comment</a> below for a recommendation to minimize <acronym>CSS</acronym>.</ins></p>

<p>His original code requires the C version of JSMin with PHP <code>safe_mode</code> turned off. If you prefer a pure PHP version, get the <a href="http://javascript.crockford.com/jsmin2.php.txt">PHP version of JSMin</a> and my <a href="/examples/combine-jsmin.phps" type="text/plain">adapted version of the script</a>.</p>
</li></ol>

<p>I&rsquo;m still in awe how fast one of my own websites became! Thanks to the guys at Yahoo! for the inspiration and for most of the research this article is based upon. Even JSMin was written by an employee of Yahoo! Speaking about Yahoo! employees: <a href="http://wait-till-i.com/" title="Christian Heilmann" rel="met colleague">Chris</a>, I hope there are still enough topics for your <a href="http://www.thinkvitamin.com/features/dev/enhance-your-page-performance" title="Chris Heilmann: Enhance your (page) performance!">Vitamin article</a>. I wanted to write about performance anyway, and to my surprise I <a href="http://www.robertnyman.com/2007/01/24/with-these-web-sites-would-you-say-the-web-standards-war-is-won/#comment-29959">read yesterday</a> that you have similar plans. See ya in <a href="/2007/brain-food/#e-accessibility" title="First European e-Accessibility Forum">Paris</a>. <img src="http://learningtheworld.eu/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> </p>
]]></content:encoded>
			<wfw:commentRss>http://learningtheworld.eu/2007/performance/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
	</channel>
</rss>
