<?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>am530: Der Blog von Axel Michel</title>
	<atom:link href="http://www.am530.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.am530.de</link>
	<description>Anmerkungen, Artikel und Diskussionen zu den Themen Webentwicklung, Webtrends, Usability, Konzeption und Design.</description>
	<lastBuildDate>Mon, 07 Nov 2011 01:28:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>OpenSSH und Putty Schlüssel Dateien</title>
		<link>http://www.am530.de/2011/11/openssh-und-putty-schlussel-dateien/</link>
		<comments>http://www.am530.de/2011/11/openssh-und-putty-schlussel-dateien/#comments</comments>
		<pubDate>Mon, 07 Nov 2011 00:02:12 +0000</pubDate>
		<dc:creator>Axel Michel</dc:creator>
				<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Putty]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[Terminal]]></category>

		<guid isPermaLink="false">http://www.am530.de/?p=705</guid>
		<description><![CDATA[Eine Secure Shell oder SSH Verbindung herzustellen geschieht normalerweise einfach über den Terminal. In meinem Fall gab es da aber noch eine Schlüssel-Datei im PuTTY eigenen PPK Format. Sicher, es gibt PuTTY auch für Unix Systeme, aber warum den Terminal wechseln, wenn es eigentlich gar nicht nötig ist. Aber leider kann openSSH nicht mit den Putty eigenen Schlüssel-Dateien umgehen. Wie man das Ganze trotzdem zum Laufen kriegt - eine kurze Anleitung.]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/2011/11/Gnome-fs-ssh-e1320620653755.png" alt="OpenSSH und Putty Schlüssel Dateien" title="OpenSSH und Putty Schlüssel Dateien" class="fl" /><br />
<strong>Eine Secure Shell oder SSH Verbindung herzustellen geschieht normalerweise einfach über den Terminal. In meinem Fall gab es da aber noch eine Schlüssel-Datei im PuTTY eigenen PPK Format. Sicher, es gibt PuTTY auch für Unix Systeme, aber warum den Terminal wechseln, wenn es eigentlich gar nicht nötig ist. Aber leider kann openSSH nicht mit den Putty eigenen Schlüssel-Dateien umgehen. Wie man das Ganze trotzdem zum Laufen kriegt &#8211; eine kurze Anleitung.</strong></p>
<p>Zunächst muss man den Schlüssel konvertieren, dass geschieht mit dem Programm <code>PuTTYgen</code>. Unter Ubuntu installiert man das wie folgt:</p>
<div id="wpshdo_1" class="wp-synhighlighter-outer"><div id="wpshdi_1" class="wp-synhighlighter-inner" style="display: block;"><pre class="dos" style="font-family:monospace;">$ sudo apt-get install putty-tools</pre></div></div>
<p>Dann konvertiert man den Schlüssel, und speichert diesen unter dem <code>.ssh</code>-Ordner im Home-Verzeichnis ab.</p>
<div id="wpshdo_2" class="wp-synhighlighter-outer"><div id="wpshdi_2" class="wp-synhighlighter-inner" style="display: block;"><pre class="text" style="font-family:monospace;">cd /path/to/orginalkey/
puttygen orginalkey.ppk -O private-openssh -o mynewkeyfile.sec
mv mynewkeyfile.sec ~/.ssh/
chmod 600 ~/.ssh/mynewkeyfile.sec</pre></div></div>
<p>Damit die Schlüssel auch akzeptiert werden, gelten bestimmte Zugriffsrechte für das <code>.ssh</code> Verzeichnis (700) und die darin liegenden Dateien (600). In dieser Form funktioniert der Schlüssel, und man kann sich verbinden:</p>
<div id="wpshdo_3" class="wp-synhighlighter-outer"><div id="wpshdi_3" class="wp-synhighlighter-inner" style="display: block;"><pre class="text" style="font-family:monospace;">ssh MyUserName@hostname.de -i ~/.ssh/mynewkeyfile.sec</pre></div></div>
<p>Soweit so gut, nun kann man den Komfort noch erhöhen. Dafür legt man eine <code>config</code> Datei im <code>.ssh</code> Verzeichnis an, in dem man die Verbindungsparameter dauerhaft speichert:</p>
<div id="wpshdo_4" class="wp-synhighlighter-outer"><div id="wpshdi_4" class="wp-synhighlighter-inner" style="display: block;"><pre class="text" style="font-family:monospace;">sudo gedit ~/.ssh/config</pre></div></div>
<p>Eine genaue Anleitung findet man auf der entsprechenden <a href="http://unixhelp.ed.ac.uk/CGI/man-cgi?sshd_config+5" target="_blank" class="external">man-page</a> von ssh_config. Hier ein einfaches Beispiel:</p>
<div id="wpshdo_5" class="wp-synhighlighter-outer"><div id="wpshdi_5" class="wp-synhighlighter-inner" style="display: block;"><pre class="text" style="font-family:monospace;">Host mySSHConnection
    HostName 123.456.789.0
    Port 980
    User MyUserName
    IdentityFile ~/.ssh/mynewkeyfile.sec
    DynamicForward 1234</pre></div></div>
<p>Die letzte Anweisung emuliert per SSH einen <a href="http://de.wikipedia.org/wiki/SOCKS" target="_blank" class="external">SOCKS 5</a>-Proxy, der in meinem Falle ebenfalls nötig war. Man muss in seinem Browser lediglich die Verbindung entsprechend anpassen, das geschieht im Firefox bspw. über Bearbeiten &gt; Netzwerk &gt; Einstellungen. Dort die Angabe für Manuelle Proxy Konfiguration, als SOCKS Host die 127.0.0.1 und als Port den Wert des DynamicForward eintragen. Jetzt kann man sich im Terminal über den folgenden Befehl per SSH mit dem Server verbinden:</p>
<div id="wpshdo_6" class="wp-synhighlighter-outer"><div id="wpshdi_6" class="wp-synhighlighter-inner" style="display: block;"><pre class="text" style="font-family:monospace;">ssh mySSHConnection</pre></div></div>
<p>Wer auf der Unity Oberfläche von Ubuntu unterwegs ist, kann sich noch folgende Launcher Erweiterung ansehen: <a href="http://askubuntu.com/questions/35488/list-of-custom-launchers-quicklists-for-unity/44657#44657">Gnome-Terminal Quicklist (auto-update from ssh config)</a>, damit kann man die in der Konfiguration gespeicherten SSH Verbindungen direkt in seinen Terminal Launcher integrieren.</p>
<p>Eine Lösung für die gleiche Problematik auf einem Mac findet man unter <a href="http://leadingedgescripts.co.uk/server-administration/how-to-convert-your-putty-ppk-private-key-to-a-normal-ssh-key-you-can-use-on-an-apple-mac/">leadingedgescripts.co.uk</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.am530.de/2011/11/openssh-und-putty-schlussel-dateien/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Regex Mysterium</title>
		<link>http://www.am530.de/2011/11/regex-mysterium/</link>
		<comments>http://www.am530.de/2011/11/regex-mysterium/#comments</comments>
		<pubDate>Sun, 06 Nov 2011 12:44:11 +0000</pubDate>
		<dc:creator>Axel Michel</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Bugs]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[RegExp]]></category>

		<guid isPermaLink="false">http://www.am530.de/?p=679</guid>
		<description><![CDATA[<em>In any project, there will be a certain amount of unknown. This is the nature of our work.</em> schreibt Ka Wai Cheung in <a href="http://www.thedeveloperscode.com/" target="_blank" class="external">the developer’s code</a>. Bei der Frontend-Entwicklung beziehe ich diesen Satz zumeist auf die &#34;große Unbekannte&#34; - den Client (von der Hard- und Software bis hin zum Interaktionsverhalten), aber auch die Sprache JavaScript und ihre Implementationen bieten immer wieder echte <a href="http://wtfjs.com" class="external" target="_blank">Überraschungen</a>.]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/2011/11/mystery-e1320573625191.jpg" alt="Regex Mysterium" title="Regex Mysterium" class="fl" /><br />
<strong><em>In any project, there will be a certain amount of unknown. This is the nature of our work.</em> schreibt Ka Wai Cheung in <a href="http://www.thedeveloperscode.com/" target="_blank" class="external">the developer’s code</a>. Bei der Frontend-Entwicklung beziehe ich diesen Satz zumeist auf die &quot;große Unbekannte&quot; &#8211; den Client (von der Hard- und Software bis hin zum Interaktionsverhalten), aber auch die Sprache JavaScript und ihre Implementationen bieten immer wieder echte <a href="http://wtfjs.com" class="external" target="_blank">Überraschungen</a>.</strong></p>
<p>Eine triviale Aufgabe: ein Datum validieren und mit einem anderen Datum vergleichen, dabei kann das Datum eine gewisse Varianz in der Reihenfolge und Schreibweise haben. Ich betrachtete kurz die bereits implementierte Bestandslösung für die Validierung und war erstaunt über das mühsame Arbeiten mit <code>substr</code>. Das kann man doch eleganter lösen: Ein regulärer Ausdruck für die Validierung, dient gleichzeitig der Zerlegung des Datums, um daraus dann ein <code>Date</code> Objekt für den Vergleich zu erstellen:</p>
<div id="wpshdo_7" class="wp-synhighlighter-outer"><div id="wpshdi_7" class="wp-synhighlighter-inner" style="display: block;"><pre class="javascript" style="font-family:monospace;"><span class="co1">// eine Pruefung unter vielen, Abbruch der gesamten Pruefung wenn fehlerhaft...</span>
proceed <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span>
<span class="kw2">var</span> date_test <span class="sy0">=</span> <span class="br0">&#91;</span> <span class="st0">'07-11-2011'</span> <span class="sy0">,</span> <span class="st0">'05-11-2011'</span> <span class="br0">&#93;</span><span class="sy0">;</span>
<span class="kw2">var</span> date_regexp <span class="sy0">=</span> <span class="co2">/^(0[1-9]|[12][0-9]|3[01])[- /</span>.<span class="br0">&#93;</span><span class="br0">&#40;</span>0<span class="br0">&#91;</span>1<span class="sy0">-</span>9<span class="br0">&#93;</span><span class="sy0">|</span><span class="nu0">1</span><span class="br0">&#91;</span>012<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="sy0">-</span> <span class="co2">/.](19|20)\d\d$/</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">if</span><span class="br0">&#40;</span> date_test<span class="br0">&#91;</span>0<span class="br0">&#93;</span>.<span class="me1">match</span><span class="br0">&#40;</span> date_regexp <span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span>
    date_test<span class="br0">&#91;</span>1<span class="br0">&#93;</span>.<span class="me1">match</span><span class="br0">&#40;</span> date_regexp <span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
   temp <span class="sy0">=</span> date_test<span class="br0">&#91;</span>0<span class="br0">&#93;</span>.<span class="me1">split</span><span class="br0">&#40;</span> date_regexp <span class="br0">&#41;</span><span class="sy0">;</span>
   date_A <span class="sy0">=</span> <span class="kw2">new</span> Date<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
   date_A.<span class="me1">setFullYear</span><span class="br0">&#40;</span> temp<span class="br0">&#91;</span>3<span class="br0">&#93;</span><span class="sy0">,</span>  <span class="br0">&#40;</span> temp<span class="br0">&#91;</span>2<span class="br0">&#93;</span> <span class="sy0">-</span>1 <span class="br0">&#41;</span> <span class="sy0">,</span> temp<span class="br0">&#91;</span>1<span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
   temp <span class="sy0">=</span> date_test<span class="br0">&#91;</span>1<span class="br0">&#93;</span>.<span class="me1">split</span><span class="br0">&#40;</span> date_regexp <span class="br0">&#41;</span><span class="sy0">;</span>
   date_B <span class="sy0">=</span> <span class="kw2">new</span> Date<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
   date_B.<span class="me1">setFullYear</span><span class="br0">&#40;</span> temp<span class="br0">&#91;</span>3<span class="br0">&#93;</span><span class="sy0">,</span>  <span class="br0">&#40;</span> temp<span class="br0">&#91;</span>2<span class="br0">&#93;</span> <span class="sy0">-</span>1 <span class="br0">&#41;</span> <span class="sy0">,</span> temp<span class="br0">&#91;</span>1<span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
 <span class="co1">// Datum A muss vor Datum B liegen</span>
  <span class="kw1">if</span><span class="br0">&#40;</span> date_A <span class="sy0">&lt;</span> date_B <span class="br0">&#41;</span> <span class="br0">&#123;</span>
     proceed  <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span>
  <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span class="co1">// Ende der Pruefung - nun Entscheidung...</span>
<span class="kw3">alert</span><span class="br0">&#40;</span> proceed <span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// Test Ausgabe</span>
...</pre></div></div>
<p>Auf den ersten Blick schien alles zu funktionieren. Wie erwartet wird &quot;false&quot; ausgegeben - Task erledigt, Ticket schließen, Feierabend machen. Nächster Morgen - Ticket ist wieder auf: Die Erweiterung funktioniert nicht. Alle folgenden Prüfungen werden nicht mehr ausgeführt, unabhängig vom Datum. Kann nicht sein, ich hatte das Datum definitiv mehrfach verändert, um alle Variationen zu kontrollieren. Teste daraufhin die Anwendung im Firefox erneut - alles wie gewünscht, Screenshots an das Ticket gehängt, Rückmeldung. Geht Nicht! Noch ein Test, diesmal im Internet Explorer, und siehe da, im Internet Explorer bleibt <code>proceed</code> immer <code>false</code>. </p>
<p>Ein Fehler im regulären Ausdruck? Nicht wirklich, denn der <code>match</code> funktioniert cross-browser. Aber das Datum ist im Internet Explorer <code>NaN</code> während alle anderen getesteten Browser das korrekte Datum ausgeben. Scheitern tut das ganze am <code>split</code>. Laut <a href="http://objjob.phrogz.net/js/method/708" class="external" target="_blank">Spezifikation</a> kann die String Methode sowohl mit Zeichenketten, als auch regulären Ausdrücken umgehen. De facto gibt es da aber einige Unterschiede:</p>
<div id="wpshdo_8" class="wp-synhighlighter-outer"><div id="wpshdi_8" class="wp-synhighlighter-inner" style="display: block;"><pre class="javascript" style="font-family:monospace;"><span class="kw2">var</span> test_string <span class="sy0">=</span> <span class="st0">'a,b,c,,,d,e,f,g'</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Split mit Zeichenkette</span>
<span class="co1">// Erwartet: 9 -&gt; Ergebnis ist 9</span>
<span class="kw2">var</span> test_a <span class="sy0">=</span> test_string.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">','</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw3">alert</span><span class="br0">&#40;</span>test_a.<span class="me1">length</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Split mit regulärem Ausdruck:</span>
<span class="co1">// Erwartet: 9 -&gt; Ergebnis ist im IE: 7</span>
<span class="kw2">var</span> test_b <span class="sy0">=</span> test_string.<span class="me1">split</span><span class="br0">&#40;</span><span class="co2">/,/</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw3">alert</span><span class="br0">&#40;</span>test_b.<span class="me1">length</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>
<p>Die Methode <code>split</code> reagiert eindeutig anders als die Methode <code>exec</code> des <code>RegExp</code> Objektes.  Ändert man das ursprüngliche Script wie folgt:</p>
<div id="wpshdo_9" class="wp-synhighlighter-outer"><div id="wpshdi_9" class="wp-synhighlighter-inner" style="display: block;"><pre class="javascript" style="font-family:monospace;"><span class="co1">// eine Pruefung unter vielen, Abbruch der gesamten Pruefung wenn fehlerhaft...</span>
proceed <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span>
<span class="kw2">var</span> date_test <span class="sy0">=</span> <span class="br0">&#91;</span> <span class="st0">'07-11-2011'</span> <span class="sy0">,</span> <span class="st0">'05-11-2011'</span> <span class="br0">&#93;</span><span class="sy0">;</span>
<span class="kw2">var</span> date_regexp <span class="sy0">=</span> <span class="co2">/^(0[1-9]|[12][0-9]|3[01])[- /</span>.<span class="br0">&#93;</span><span class="br0">&#40;</span>0<span class="br0">&#91;</span>1<span class="sy0">-</span>9<span class="br0">&#93;</span><span class="sy0">|</span><span class="nu0">1</span><span class="br0">&#91;</span>012<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="sy0">-</span> <span class="co2">/.](19|20)\d\d$/</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">if</span><span class="br0">&#40;</span> date_test<span class="br0">&#91;</span>0<span class="br0">&#93;</span>.<span class="me1">match</span><span class="br0">&#40;</span> date_regexp <span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span>
    date_test<span class="br0">&#91;</span>1<span class="br0">&#93;</span>.<span class="me1">match</span><span class="br0">&#40;</span> date_regexp <span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
   temp <span class="sy0">=</span> date_regexp.<span class="me1">exec</span><span class="br0">&#40;</span> date_test<span class="br0">&#91;</span>0<span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
   date_A <span class="sy0">=</span> <span class="kw2">new</span> Date<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
   date_A.<span class="me1">setFullYear</span><span class="br0">&#40;</span> temp<span class="br0">&#91;</span>3<span class="br0">&#93;</span><span class="sy0">,</span>  <span class="br0">&#40;</span> temp<span class="br0">&#91;</span>2<span class="br0">&#93;</span> <span class="sy0">-</span>1 <span class="br0">&#41;</span> <span class="sy0">,</span> temp<span class="br0">&#91;</span>1<span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
   temp <span class="sy0">=</span> date_regexp.<span class="me1">exec</span><span class="br0">&#40;</span> date_test<span class="br0">&#91;</span>1<span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
   date_B <span class="sy0">=</span> <span class="kw2">new</span> Date<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
   date_B.<span class="me1">setFullYear</span><span class="br0">&#40;</span> temp<span class="br0">&#91;</span>3<span class="br0">&#93;</span><span class="sy0">,</span>  <span class="br0">&#40;</span> temp<span class="br0">&#91;</span>2<span class="br0">&#93;</span> <span class="sy0">-</span>1 <span class="br0">&#41;</span> <span class="sy0">,</span> temp<span class="br0">&#91;</span>1<span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
 <span class="co1">// Datum A muss vor Datum B liegen</span>
  <span class="kw1">if</span><span class="br0">&#40;</span> date_A <span class="sy0">&lt;</span> date_B <span class="br0">&#41;</span> <span class="br0">&#123;</span>
     proceed  <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span>
  <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span class="co1">// Ende der Pruefung - nun Entscheidung...</span>
<span class="kw3">alert</span><span class="br0">&#40;</span> proceed <span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// Test Ausgabe</span>
...</pre></div></div>
<p>Dann funktioniert diese Prüfung in allen Browsern. Aber warum? Wieso verhält sich der gleiche reguläre Ausdruck bei zwei Methoden so unterschiedlich? <a href="http://blog.stevenlevithan.com/" class="external" target="_blank">Steven Levithan</a> beschreibt in seinem <a href="http://blog.stevenlevithan.com/archives/cross-browser-split" class="external" target="_blank">Artikel <em>JavaScript split Bugs: Fixed!</em></a> gleich eine ganze Reihe von Fehlern (die nicht nur den Internet Explorer betreffen), und liefert auch gleich eine Lösung, in dem er die ganze Methode überlagert. Auch wenn es in meinem Fall ausgereicht hat, die Methode einfach zu wechseln - dieses Verhalten bleibt ein Mysterium. Bedeutet es doch, dass da unterschiedliche Verabeitungsprozesse ablaufen. Wenn man bedenkt, dass reguläre Ausdrücke für viele ohnehin ein Buch mit sieben Siegeln darstellt, wie passend ist es da, dass es auch noch solche Sprach-Fehler gibt. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.am530.de/2011/11/regex-mysterium/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ordnung ist das halbe Leben&#8230;</title>
		<link>http://www.am530.de/2011/07/ordnung-ist-das-halbe-leben/</link>
		<comments>http://www.am530.de/2011/07/ordnung-ist-das-halbe-leben/#comments</comments>
		<pubDate>Wed, 06 Jul 2011 08:44:07 +0000</pubDate>
		<dc:creator>Axel Michel</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Bugs]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Snipplet]]></category>

		<guid isPermaLink="false">http://www.am530.de/?p=651</guid>
		<description><![CDATA[Geschachtelte geordnete Listen mit einer fortlaufenden Nummerierung in Form von 1., 1.1, 1.1.1 usw.? Seit CSS 2 lassen sich dank der neuen <em>CSS-Counter</em> auch solche Arten der Aufzählung realisieren. Für ältere Browser wie dem Internet Explorer 7 müssen dabei allerdings ein paar Hürden genommen werden. Dabei sind die <em>CSS-Counter</em> nicht auf Listenelemente beschränkt, da gäbe es eine ganze Reihe schöner Einsatzszenarien.]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/2011/01/numbers.jpg"  alt="Ordnung ist das halbe Leben" title="Ordnung ist das halbe Leben" class="fl" /><br />
<strong>Geschachtelte geordnete Listen mit einer fortlaufenden Nummerierung in Form von 1., 1.1, 1.1.1 usw.? Seit CSS 2 lassen sich dank der neuen <em>CSS-Counter</em> auch solche Arten der Aufzählung realisieren. Für ältere Browser wie dem Internet Explorer 7 müssen dabei allerdings ein paar Hürden genommen werden. Dabei sind die <em>CSS-Counter</em> nicht auf Listenelemente beschränkt, da gäbe es eine ganze Reihe schöner Einsatzszenarien. Wahrlich kein brandneues Thema mehr, aber ein Blick lohnt trotzdem.</strong></p>
<h3>Geordnete Listen</h3>
<p><a href="http://www.w3.org/TR/CSS21/generate.html#counters" class="external" title="CSS-Counter">CSS-Counter</a> erlauben das Zählen von Instanzen bestimmter Elemente bzw. Selektoren. In Kombination mit den Pseudo-Elementen :before und :after lassen sich dann ganze neue Formen der Nummerierung erstellen. Die <em>CSS-Counter</em> sind dabei deutlich leistungsstärker als das alte HTML <a href="http://www.w3.org/TR/html401/struct/lists.html#h-10.2" class="external">start</a> Attribut, das ohnehin als <em>deprecated</em> gilt, und ausschließlich die Nummerierung einer Ebene bzw. eines Listenelementes beeinflusst.<br />
Die Nummerierung mit Hilfe von CSS basiert setzt sich aus mehreren Eigenschaften und Funktionen zusammen:</p>
<ul>
<li><strong>counter-reset</strong>: Setzt einen oder mehrere Zähler zurück, ein Zähler ist dabei eine frei wählbare Variable. Optional lässt sich für jeden Zähler noch ein Anfangswert festlegen, der Standardwert ist 1.</li>
<li><strong>counter-increment</strong>: Zählt einen oder mehrere Zähler hoch, auch hier kann man über einen zweiten optionalen integeren Wert die Zählweise beeinflussen (selbst negative Werte sind erlaubt).</li>
<li><strong>content</strong>: Gibt mit Hilfe der Funktionen <em>counter()</em> oder <em>counters()</em> die Nummerierung aus.</li>
</ul>
<h4>Ein Beispiel</h4>
<div id="wpshdo_10" class="wp-synhighlighter-outer"><div id="wpshdi_10" class="wp-synhighlighter-inner" style="display: block;"><pre class="css" style="font-family:monospace;">OL <span class="br0">&#123;</span>
  <span class="kw1">counter-reset</span><span class="sy0">:</span> item<span class="sy0">;</span>
<span class="br0">&#125;</span>
OL LI <span class="br0">&#123;</span>
  <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
OL LI<span class="re2">:before </span><span class="br0">&#123;</span>
  <span class="kw1">content</span><span class="sy0">:</span> counter<span class="br0">&#40;</span>item<span class="br0">&#41;</span> <span class="st0">&quot;. &quot;</span><span class="sy0">;</span>
  <span class="kw1">counter-increment</span><span class="sy0">:</span> item<span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p><a href="/lab/counter/index.php#example1">Betrachtet</a> man dieses erste Beispiel im Browser, so sieht das Ergebnis noch nicht anders aus, als eine ganz normale geordnete Liste (<code>OL</code>), der einzige Vorteil liegt darin, dass sich die Nummerierung nun erheblich besser gestalten lässt, ohne dass man weitere Tag Verschachtelungen vornehmen muss. Auf einen Nachteil sei an dieser Stelle auch gleich hingewiesen. In Sachen &#8220;Accessability&#8221; sind diese Lösungen negativ zu bewerten, denn über CSS generierter Content manipuliert die DOM nicht  (siehe <a href="http://dev.opera.com/articles/view/css-generated-content-techniques/" title="CSS generated content techniques" class="external">hier</a>), so dass aktuelle Screen-Reader diese Informationen schlicht nicht ausgeben, die Liste hätte also keine Nummerierung mehr.<br />
Für eine fortlaufende Nummerierung, die die übergeordneten Nummern übernimmt, kann man den CSS Code wie folgt verändern:</p>
<div id="wpshdo_11" class="wp-synhighlighter-outer"><div id="wpshdi_11" class="wp-synhighlighter-inner" style="display: block;"><pre class="css" style="font-family:monospace;">OL <span class="br0">&#123;</span>
  <span class="kw1">counter-reset</span><span class="sy0">:</span> item<span class="sy0">;</span>
<span class="br0">&#125;</span>
OL LI <span class="br0">&#123;</span>
  <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
OL LI<span class="re2">:before </span><span class="br0">&#123;</span>
  <span class="kw1">content</span><span class="sy0">:</span> counters<span class="br0">&#40;</span>item<span class="sy0">,</span> <span class="st0">&quot;.&quot;</span><span class="br0">&#41;</span> <span class="st0">&quot;.&quot;</span><span class="sy0">;</span>
  <span class="kw1">counter-increment</span><span class="sy0">:</span> item<span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>Nun werden die Nummern der übergeordneten Listenelemente übernommen. Die Funktion <em>counters()</em> liefert im Gegensatz zu <em>counter</em> alle Instanzen eines Zählers gleichzeitig. Der zweite Parameter ist das Trennzeichen, mit dem diese Instanzen verkettet werden. Doch Vorsicht mit dieser Syntax. Sie führt im Internet Explorer 7 dazu, dass alle folgenden CSS Notationen nicht mehr interpretiert werden, selbst wenn diese in separaten Stylesheet Dateien abgelegt sind. Anscheinend bringt die Notation der Anfürhrungszeichen innerhalb der Klammern den CSS Interpreter völlig durcheinander. Bedeutet, man kann wahlweise sicher stellen, dass der entsprechende Code projektweit wirklich immer an letzter Stelle kommt, oder man nutzt die Funktion <em>counter</em> anstatt <em>counters</em> &#8211; wobei diese Lösung den CSS-Code abhängig von der möglichen Verschachtelungstiefe deutlich vergrößern kann:</p>
<div id="wpshdo_12" class="wp-synhighlighter-outer"><div id="wpshdi_12" class="wp-synhighlighter-inner" style="display: block;"><pre class="css" style="font-family:monospace;"><span class="coMULTI">/* 1. Ebene */</span>
BODY OL <span class="br0">&#123;</span>
  <span class="kw1">counter-reset</span><span class="sy0">:</span> level1<span class="sy0">;</span>
  <span class="kw1">list-style-type</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
OL LI<span class="re2">:before </span><span class="br0">&#123;</span>
  <span class="kw1">content</span><span class="sy0">:</span> counter<span class="br0">&#40;</span>level1<span class="br0">&#41;</span> <span class="st0">&quot;. &quot;</span><span class="sy0">;</span>
  <span class="kw1">counter-increment</span><span class="sy0">:</span> level1<span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="coMULTI">/* 2. Ebene */</span>
OL LI OL <span class="br0">&#123;</span>
  <span class="kw1">counter-reset</span><span class="sy0">:</span> level2<span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
OL LI OL LI<span class="re2">:before </span><span class="br0">&#123;</span>
  <span class="kw1">content</span><span class="sy0">:</span> counter<span class="br0">&#40;</span>level1<span class="br0">&#41;</span> <span class="st0">&quot;.&quot;</span> counter<span class="br0">&#40;</span>level2<span class="br0">&#41;</span> <span class="st0">&quot; &quot;</span><span class="sy0">;</span>
  <span class="kw1">counter-increment</span><span class="sy0">:</span> level2<span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="coMULTI">/* 3. Ebene */</span>
OL LI OL LI OL <span class="br0">&#123;</span>
  <span class="kw1">counter-reset</span><span class="sy0">:</span> level3<span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
OL LI OL LI OL LI<span class="re2">:before </span><span class="br0">&#123;</span>
  <span class="kw1">content</span><span class="sy0">:</span> counter<span class="br0">&#40;</span>level1<span class="br0">&#41;</span> <span class="st0">&quot;.&quot;</span> counter<span class="br0">&#40;</span>level2<span class="br0">&#41;</span> <span class="st0">&quot;.&quot;</span> counter<span class="br0">&#40;</span>level3<span class="br0">&#41;</span> <span class="st0">&quot; &quot;</span><span class="sy0">;</span>
  <span class="kw1">counter-increment</span><span class="sy0">:</span> level3<span class="sy0">;</span>
<span class="br0">&#125;</span>
...</pre></div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.am530.de/2011/07/ordnung-ist-das-halbe-leben/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Jetzt wird Maß genommen</title>
		<link>http://www.am530.de/2011/01/jetzt-wird-mas-genommen/</link>
		<comments>http://www.am530.de/2011/01/jetzt-wird-mas-genommen/#comments</comments>
		<pubDate>Fri, 21 Jan 2011 18:26:04 +0000</pubDate>
		<dc:creator>Axel Michel</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Webtrends]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Semantik]]></category>

		<guid isPermaLink="false">http://www.am530.de/?p=457</guid>
		<description><![CDATA[Mit HTML5 kommen viele neue Auszeichnungsmöglichkeiten. Dazu gehören bspw. die Elemente <em>progress</em> und <em>meter</em>. Sie haben das Ziel, die Information "sinnvoller", auszuzeichnen als vorher.<em>Progress</em> - Klassisch der Fortschrittsbalken und <em>Meter</em> für Verhältnisangaben. Was kann man mit diesen neuen Auszeichnungen heute schon anstellen?]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/images/caliper.png"  alt="Jetzt wird Maß genommen" title="Jetzt wird Maß genommen" class="fl" /><br />
<strong>Mit HTML5 kommen viele neue Auszeichnungsmöglichkeiten. Dazu gehören bspw. die Elemente <em>progress</em> und <em>meter</em>. Die Auszeichnungen haben das Ziel, die Information &#8220;sinnvoller&#8221;, auszuzeichnen als vorher. <em>Progress</em> &#8211; Klassisch der Fortschrittsbalken, <em>Meter</em> für Verhältnisangaben. Was kann man mit diesen neuen Auszeichnungen heute schon anstellen?</strong></p>
<h3>Das <em>Meter</em> Element</h3>
<p><em>Meter</em> ist ein Inline-Element. Er dient der &#8220;Darstellung von Größen und Mengenverhältnissen innerhalb eines definierbaren Bereichs. In der <a href="http://dev.w3.org/html5/spec-author-view/the-button-element.html#the-meter-element" class="external" target="_blank" title="HTML5 (Edition for Web Authors) - The meter element">Spezfikation</a> heißt es:</p>
<blockquote><p>The meter  element represents  a scalar measurement within a known range, or a fractional value; for example disk usage, the relevance of a query result, or the fraction of a voting population to have selected a particular candidate. [...] The meter  element also does not represent a scalar value of arbitrary range — for example, it would be wrong to use this to report a weight, or height, unless there is a known maximum value.</p></blockquote>
<p>Solche Verhältnisangaben werden im Normalfall aber nicht nur textuell gemacht, sie werden durch eine grafische Information ergänzt. Die Darstellung entspricht im Prinzip der eines Fortschrittbalkens, aber er dient eben nicht der Statusanzeige einer Aufgabe sondern der Darstellung von Mengen.Das <em>Meter</em> Element kennt sechs Attribute, alle Werte (wenn gesetzt) müssen valide Ganz- oder Fließkomma Zahlen sein.</p>
<ul>
<li><strong>Value</strong>: Ist schlicht der aktuelle Wert, laut Spezifikation (Stand Juni 2010) ein Pflichtattribut. Bei <a href="http://html5doctor.com/measure-up-with-the-meter-tag/" class="external" target="_blank" title="Measure up with the meter tag">&lt;html&gt;5Doctor</a> fand ich noch eine erweiterte Erklärung, hier heißt es: Wenn das Attribut nicht gesetzt ist, wird die erste gefundene Zahl innerhalb des Elements als value genutzt, gibt es keine Zahl, so ist der Wert Null.</li>
<li><strong>Min</strong>: Der minimal erlaubte Wert (optional). Sollte kein Wert gesetzt sein, ist der Wert Null.</li>
<li><strong>Max</strong>: Der maximal erlaubte Wert (optional). In manchen Fällen (bspw. bei Prozentangaben) ergibt sich der maximal Wert von allein. Ist keiner gesetzt ist er 1.</li>
<li><strong>Low</strong>: Bestimmt den Anfangspunkt des unteren Abschnitts innerhalb der Gesamtspannweite (optional). Der Bereich zwischen <em>Min</em> und <em>Low</em> wäre die Ausprägung des unteren Abschnitts.  Größer als der <em>High</em> Wert kann <em>Low</em> nicht sein.</li>
<li><strong>High</strong>: Bestimmt den Anfangspunkt des oberen Abschnitts innerhalb der Gesamtspannweite (optional). Der Bereich zwischen <em>Max</em> und <em>Low</em> wäre die Ausprägung des oberen Abschnitts. Kleiner als der <em>Low</em> Wert kann <em>High</em> nicht sein.</li>
<li><strong>Optimum</strong>: Bestimmt den optimalen Punkt des definierten Bereichs (optional). Dieser Punkt &#8211; soweit gesetzt kann jeden beliebigen Wert zwischen und inklusive <em>Min</em> und <em>Max</em> einnehmen</li>
<li>Ein spezielles Attribut für die zugrunde liegende Maßeinheit kennt das <em>Meter</em> Element (noch) nicht. Vorgeschlagen wird in diesem Falle das Universal-Attribut <strong>title</strong> zu nutzen.</li>
</ul>
<h4>Ein Beispiel</h4>
<div id="wpshdo_13" class="wp-synhighlighter-outer"><div id="wpshdi_13" class="wp-synhighlighter-inner" style="display: block;"><pre class="html4strict" style="font-family:monospace;"><span class="sc2">&lt;<span class="kw2">p</span>&gt;</span>Ihr Ergbnis:
  <span class="sc2">&lt;meter min<span class="sy0">=</span><span class="st0">&quot;0&quot;</span> low<span class="sy0">=</span><span class="st0">&quot;4&quot;</span> high<span class="sy0">=</span><span class="st0">&quot;8&quot;</span> <span class="kw3">value</span><span class="sy0">=</span><span class="st0">&quot;7&quot;</span> optimum<span class="sy0">=</span><span class="st0">&quot;10&quot;</span> max<span class="sy0">=</span><span class="st0">&quot;10&quot;</span>&gt;</span>
    7 von 10 Punkten
  <span class="sc2">&lt;<span class="sy0">/</span>meter&gt;</span>
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">p</span>&gt;</span></pre></div></div>
<p>Die Semantik des Elements, der informative Mehrwert entsteht also nur durch die Attribute &#8211; und wie stellen Browser diese Informationen dar? Kurz: Bisher gar nicht &#8211; es gibt zwar Vorschläge wie ein Browser diese Informationen rendern könnte, aber passieren tut zur Zeit nichts. Wie weit kommt man mit CSS, um aus dem <em>Meter</em> Element mehr zu machen als die reine Textdarstellung? Auch nicht weit. CSS, so wie es die Browser momentan unterstützen fehlen dafür zwei entscheidene Möglichkeiten: Die Unterstützung von <a href="http://www.w3.org/TR/css3-values/#attribute" class="external" target="_blank" title="CSS3 Values and Units">Attributen als Werte</a> und die Möglichkeit <a  href="http://www.w3.org/TR/2006/WD-css3-values-20060919/#calc" class="external" target="_blank" title="CSS3 Values and Units">Werte zu berechnen</a>. Leider sind beide Eigenschaften in keinem aktuellen Browser implementiert. <a href="http://hacks.mozilla.org/2010/06/css3-calc/" class="external" target="_blank" title="Firefox 4: CSS3 calc()">Mozilla</a> meldet allerdings, dass es <code>CALC()</code> mit Firefox 4 unterstützen wird. Bis dahin ist eine reine CSS Lösung eine schöne Utopie. Als Basis für so eine zuküftige CSS basierte Lösung der Screenshot aus der Spezifikation:</p>
<dl class="image-box">
<dt><img src="/wp-content/images/sample-meter.png" alt="Beispiel" title="Beispiel" /></dt>
<dd>Beispiel Screenshot aus der Spezifikation: HTML5 (Edition for Web Authors) &#8211; The meter element</dd>
</dl>
<p>Könnte man innerhalb von CSS rechnen, und dabei auf die Attribute des Elements zugreifen, dann ließe es sich bspw. wie folgt realisieren (eine Variante mit festen Werten findet man <a href="/lab/html5/meter.php#example1" class="internal" title="HTML5 Meter element examples">hier</a>): </p>
<div id="wpshdo_14" class="wp-synhighlighter-outer"><div id="wpshdi_14" class="wp-synhighlighter-inner" style="display: block;"><pre class="css" style="font-family:monospace;">meter<span class="re2">:before </span><span class="br0">&#123;</span>
  <span class="kw1">height</span><span class="sy0">:</span><span class="re3">4px</span><span class="sy0">;</span>
  <span class="kw1">display</span><span class="sy0">:</span><span class="kw2">block</span><span class="sy0">;</span>
  <span class="kw1">float</span><span class="sy0">:</span><span class="kw1">left</span><span class="sy0">;</span>
  <span class="kw1">background</span><span class="sy0">:</span><span class="re0">#d9d9d9</span><span class="sy0">;</span>
  <span class="kw1">border-left</span><span class="sy0">:</span><span class="re3">1px</span> <span class="kw2">solid</span> <span class="re0">#4cb24c</span><span class="sy0">;</span>
  <span class="coMULTI">/* Dynamische Ermittlung der Breite */</span>
  <span class="kw1">width</span><span class="sy0">:</span> 40 - calc<span class="br0">&#40;</span><span class="br0">&#40;</span>40 / 100<span class="br0">&#41;</span> <span class="sy0">*</span> <span class="br0">&#40;</span>attrs<span class="br0">&#40;</span>value<span class="br0">&#41;</span> <span class="sy0">*</span> 100<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  <span class="kw1">border-left-width</span><span class="sy0">:</span>calc<span class="br0">&#40;</span><span class="br0">&#40;</span>40 / 100<span class="br0">&#41;</span> <span class="sy0">*</span> <span class="br0">&#40;</span>attrs<span class="br0">&#40;</span>value<span class="br0">&#41;</span> <span class="sy0">*</span> 100<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>Wie gesagt, das ist Zukunftsmusik, wenn überhaupt, denn was <em>calc</em> leisten wird ist noch unklar. Reine CSS-Lösungen hätten ohne Frage den höchsten Freiheitsgrad in der Gestaltung, aber browserübergreifend kommt man nicht wirklich weit. Ein paar Beispiele habe ich <a href="/lab/html5/meter.php#example2" class="internal" title="HTML5 Meter element examples">hier</a> zusammengestellt:</p>
<dl class="image-box">
<dt><img src="/wp-content/images/screenshots_meter_01.png" alt="Beispiel Screenshots" title="Beispiel Screenshots" /></dt>
<dd>Beispiel für eine CSS basierte meter Gestaltung in verschiedenen Browsersystemen</dd>
</dl>
<p>Die Screenshots zeigen, dass es zwar grundsätzlich möglich ist, die Gestaltung über CSS zu realisieren, aber selbst in aktuellen Browsersystem sind die Abweichungen zum Teil enorm. Der Internet Explorer 8 unterstützt ohne JavaScript noch gar kein html5 und würde demzufolge hier nur eine reine Textversion anzeigen. Da alle Werte &#8220;hart&#8221; gecodet werden müssen ist ein solcher Ansatz bis auf weiteres ohnehin obsolet. Was bleibt als Alternative? Man könnte das CSS mit Platzhaltern versehen, und diese serverseitig ersetzen. Dies würde die Darstellungsunterschiede aber auch nicht beseitigen. Serverseitig Bilder generieren wäre sicher auch eine Option, aber die Qualität solcher Bilder lässt zu wünschen übrig. Ein möglicher Ansatz wäre die Verwendung von <em>Canvas</em>, <em>VML</em> in Kombination mit JavaScript (auch wenn in solchen Fällen all die schöne Semantik wieder hin wäre).</p>
<h3>Das <em>Progress</em> Element</h3>
<p>Auch das <em>Progress</em> Element ist ein Inline-Element. Es ist eine quasi eine textuelle Repräsentation eines Fortschrittsbalken. Dabei kann er sowohl als Basis für eine dynamische Information (in Kombination mit JavaScript) oder statische Information (bspw. bei &#8220;Tunnel-Prozessen&#8221; wie einem mehrseitigen Formular) dienen. Die <a href="http://dev.w3.org/html5/spec-author-view/the-button-element.html#the-progress-element" target="_blank" class="external" title="HTML5 (Edition for Web Authors) - The progress element">Spezifikation</a> sagt:</p>
<blockquote><p>The progress  element represents  the completion progress of a task. The progress is either indeterminate, indicating that progress is being made but that it is not clear how much more work remains to be done before the task is complete (e.g. because the task is waiting for a remote host to respond), or the progress is a number in the range zero to a maximum, giving the fraction of work that has so far been completed.</p></blockquote>
<p>Letztlich unterscheiden sich das <em>Progress</em> Element und das <em>Meter</em> Element gar nicht so sehr voneinander. Wobei das <em>Progress</em> Element wohl noch wahrscheinlicher erst in Kombination mit JavaScript seine wahre Bedeutung erhält. Im Gegensatz zum <em>Meter</em> Element kennt <em>Progress</em> nur einen Anfgangs- und einen Endpunkt sowie den aktuellen Wert. Javascript basierte Lösungen für solche Fortschrittsbalken gibt es bereits einige, hier wäre eigentlich nur eine Schnittstelle zur Übernahme der Werte zu schaffen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.am530.de/2011/01/jetzt-wird-mas-genommen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rotation</title>
		<link>http://www.am530.de/2010/07/rotation/</link>
		<comments>http://www.am530.de/2010/07/rotation/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 04:07:53 +0000</pubDate>
		<dc:creator>Axel Michel</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.am530.de/?p=621</guid>
		<description><![CDATA[Die Aufgabe: Eine diagonal verlaufende Navigation. Aber wie lässt sich so ein Entwurf browserübergreifend umsetzen? Firefox, Safari und Google Chrome können das - über <em>transform:rotate</em>, aber wie schaut es mit dem Internet Explorer aus? Eigentlich kann der Internet Explorer das schon wesentlich länger - über den <em>Matrix</em> Filter. Nur diesen Filter einzusetzen ist alles andere als trivial, anstatt über eine Gradangabe, muß man bein Matrix Filter mit Sinus und Cosius Angaben arbeiten. D.h. man kommt nicht umhin, jedesmal eine komplexe Berechnung durchzuführen.]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/2010/07/SetObjectRotation.png"  alt="Rotation" title="Rotation" class="fl" /><br />
<strong>Die Aufgabe: Eine diagonal verlaufende Navigation. Aber wie lässt sich so ein Entwurf browserübergreifend umsetzen? Firefox, Safari und Google Chrome können das &#8211; über <em>transform:rotate</em>, aber wie schaut es mit dem Internet Explorer aus? Eigentlich kann der Internet Explorer das schon wesentlich länger &#8211; über den <em>Matrix</em> Filter. Nur diesen Filter einzusetzen ist alles andere als trivial, anstatt über eine Gradangabe, muß man bein Matrix Filter mit Sinus und Cosius Angaben arbeiten. D.h. man kommt nicht umhin, jedesmal eine komplexe Berechnung durchzuführen.</strong></p>
<p>Genau genommen kennt der IE zwei, nein drei Varianten, um ein Element zu rotieren. Zum einen gibt es den <code>writing-mode</code>. Seit der Version 7 unterstützt der IE eine Vielzahl von &#8220;<a href="http://blogs.msdn.com/b/ie/archive/2009/05/29/the-css-corner-writing-mode.aspx" target="_blank" class="external" title="The CSS Corner: writing-mode">Schreibrichtungen</a>&#8220;, aber diese Rotationen sind immer 90 Grad Rotationen. Ähnlich begrenzt ist der  <a href="http://msdn.microsoft.com/en-us/library/ms532972%28VS.85%29.aspx" class="external" target="_blank" title="BasicImage Filter">BasicImage</a> Filter, hier gibt es für die Rotation nur vier erlaubte Werte (0,1,2,3) &#8211; die das Element dann um 0, 90, 180 oder 270 Grad drehen. In meinem Fall hatte die Navigation aber einen Neigungsgrad von -1.5, da blieb nur die Matrix. Es ergibt sich folgende CSS Notation:</p>
<div id="wpshdo_15" class="wp-synhighlighter-outer"><div id="wpshdi_15" class="wp-synhighlighter-inner" style="display: block;"><pre class="css" style="font-family:monospace;">-moz-transform<span class="sy0">:</span>rotate<span class="br0">&#40;</span>-1.5deg<span class="br0">&#41;</span><span class="sy0">;</span>
-webkit-transform<span class="sy0">:</span>rotate<span class="br0">&#40;</span>-1.5deg<span class="br0">&#41;</span><span class="sy0">;</span>
-o-transform<span class="sy0">:</span>rotate<span class="br0">&#40;</span>-1.5deg<span class="br0">&#41;</span><span class="sy0">;</span>
filter<span class="sy0">:</span> progid<span class="re2">:DXImageTransform</span><span class="re1">.Microsoft</span>.Matrix<span class="br0">&#40;</span>
  sizingMethod<span class="sy0">=</span><span class="st0">'auto expand'</span><span class="sy0">,</span>
  M11<span class="sy0">=</span>0.9996573249755573<span class="sy0">,</span>
  M12<span class="sy0">=</span>0.026176948307873055<span class="sy0">,</span>
  M21<span class="sy0">=</span>-0.026176948307873055<span class="sy0">,</span>
  M22<span class="sy0">=</span>0.9996573249755573
<span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>
<p>Nicht wirklich intuitiv. Um ein Objekt über den <a href="http://msdn.microsoft.com/en-us/library/ms533014%28VS.85%29.aspx" class="external" target="_blank" title="Matrix Filter">Matrix-filter</a> zu rotieren, beschreibt man die Winkelverhältnisse, die sich ergeben. Da sich in CSS nicht rechnen lässt, bleibt einem nur der Taschenrechner, oder ein paar Zeilen JavaScript:</p>
<div id="wpshdo_16" class="wp-synhighlighter-outer"><div id="wpshdi_16" class="wp-synhighlighter-inner" style="display: block;"><pre class="javascript" style="font-family:monospace;"><span class="kw2">function</span> getMatrix<span class="br0">&#40;</span>deg<span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span class="kw2">var</span> deg2radians <span class="sy0">=</span> Math.<span class="me1">PI</span> <span class="sy0">*</span> 2 <span class="sy0">/</span> <span class="nu0">360</span><span class="sy0">;</span>
  <span class="kw2">var</span> rad <span class="sy0">=</span> deg <span class="sy0">*</span> deg2radians <span class="sy0">;</span>
  <span class="kw2">var</span> cos <span class="sy0">=</span> Math.<span class="me1">cos</span><span class="br0">&#40;</span>rad<span class="br0">&#41;</span><span class="sy0">;</span>
  <span class="kw2">var</span> sin <span class="sy0">=</span> Math.<span class="me1">sin</span><span class="br0">&#40;</span>rad<span class="br0">&#41;</span><span class="sy0">;</span>
  <span class="kw1">return</span> <span class="br0">&#91;</span>cos<span class="sy0">,-</span>sin<span class="sy0">,</span>sin<span class="sy0">,</span>cos<span class="br0">&#93;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>Ein entsprechendes Beispiel befindet sich <a href="/lab/rotation/index.php" class="internal" title="ross browser CSS based rotation">hier</a>. Es sei noch anzumerken, dass die Darstellungsqualität von Tex bei solchen Rotationen m Firefox (3.6.7 Windows XP, 3.5 Ubuntu) und Safari (4.0.3 Windows XP) miserabel ist. Die Buchstaben wirken zerfranst, oder &#8220;hüpfen&#8221;, d.h. sie laufen nicht sauber auf einer Linie. Chrome (5.0.3 Windows XP) und Internet Explorer (7,8 Windows XP) hingegen lieferten ein erstaunlich gutes Ergebnis.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.am530.de/2010/07/rotation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fokussieren &#8211; nicht selektieren, bitte!</title>
		<link>http://www.am530.de/2010/07/fokussieren-nicht-selektieren-bitte/</link>
		<comments>http://www.am530.de/2010/07/fokussieren-nicht-selektieren-bitte/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 10:52:42 +0000</pubDate>
		<dc:creator>Axel Michel</dc:creator>
				<category><![CDATA[Usability]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Bugs]]></category>
		<category><![CDATA[Formulare]]></category>
		<category><![CDATA[IE]]></category>

		<guid isPermaLink="false">http://www.am530.de/?p=587</guid>
		<description><![CDATA[Noch so ein Internet Explorer 6 Fehler, der bisher ganz an mir vorbei gegangen ist. Die Situation ist denkbar einfach: Ein Formular mit Auswahl-Feldern (SELECT) und dazugehörigen LABEL Elementen. Klickt der User auf das LABEL-Element wird das entsprechende Formular-Feld fokussiert. Funktioniert in allen mir bekannten Browsern fehlerfrei, nur der IE6 spielt verrückt. Hier wird das Formularfeld nicht nur fokussiert, nein, es wird auch gleich selektiert und zwar die erste Option des Auswahlfeldes.]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/2010/07/choose.jpg"  alt="Fokussieren - nicht selektieren, bitte!" title="Fokussieren - nicht selektieren, bitte!" class="fl" /><br />
<strong>Noch so ein Internet Explorer 6 Fehler, der bisher ganz an mir vorbei gegangen ist. Die Situation ist denkbar einfach: Ein Formular mit Auswahl-Feldern (SELECT) und dazugehörigen LABEL Elementen. Klickt der User auf das LABEL-Element wird das entsprechende Formular-Feld fokussiert. Funktioniert in allen mir bekannten Browsern fehlerfrei, nur der IE6 spielt verrückt. Hier wird das Formularfeld nicht nur fokussiert, nein, es wird auch gleich selektiert und zwar die erste Option des Auswahlfeldes.</strong></p>
<p>Habe ein wenig herumgestöbert und siehe da, Microsoft ist das Problem bekannt und bietet eine <a href="http://support.microsoft.com/kb/314279/en-us/" class="external" target="_blank" title="BUG: The FOR Attribute of the LABEL Object Resets Focus"> Lösung</a>. Interessant, dass gerade bei einem HTML-Element, das <em>Usability</em> und <em>Accessibility</em> erhöhen soll, auf eine JavaScript Lösung zurück gegriffen wird. Nicht so richtig sinnvoll, aber besser als gar nichts &#8211; hier der Beispielcode:</p>
<div id="wpshdo_17" class="wp-synhighlighter-outer"><div id="wpshdi_17" class="wp-synhighlighter-inner" style="display: block;"><pre class="javascript" style="font-family:monospace;"><span class="co1">//Set a temp expando to store the current selectedIndex</span>
<span class="kw2">function</span> SelectOnFocusIn<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span class="kw1">try</span> <span class="br0">&#123;</span>
    <span class="kw2">var</span> eSrc <span class="sy0">=</span> window.<span class="me1">event</span>.<span class="me1">srcElement</span><span class="sy0">;</span>
    <span class="kw1">if</span> <span class="br0">&#40;</span>eSrc<span class="br0">&#41;</span>  eSrc.<span class="me1">tmpIndex</span> <span class="sy0">=</span> eSrc.<span class="me1">selectedIndex</span><span class="sy0">;</span>
  <span class="br0">&#125;</span> <span class="kw1">catch</span> <span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
    HandleError<span class="br0">&#40;</span>e<span class="sy0">,</span> <span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span>
  <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">//restore the selectedIndex</span>
<span class="kw2">function</span> SelectOnFocus<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span class="kw1">try</span> <span class="br0">&#123;</span>
    <span class="kw2">var</span> eSrc <span class="sy0">=</span> window.<span class="me1">event</span>.<span class="me1">srcElement</span><span class="sy0">;</span>
    <span class="kw1">if</span> <span class="br0">&#40;</span>eSrc<span class="br0">&#41;</span> eSrc.<span class="me1">selectedIndex</span> <span class="sy0">=</span> eSrc.<span class="me1">tmpIndex</span><span class="sy0">;</span>
  <span class="br0">&#125;</span> <span class="kw1">catch</span> <span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
    HandleError<span class="br0">&#40;</span>e<span class="sy0">,</span> <span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span>
  <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>Und der dazugehörige HTML-Code:</p>
<div id="wpshdo_18" class="wp-synhighlighter-outer"><div id="wpshdi_18" class="wp-synhighlighter-inner" style="display: block;"><pre class="html4strict" style="font-family:monospace;"><span class="sc2">&lt;<span class="kw2">select</span> <span class="kw3">name</span><span class="sy0">=</span><span class="st0">&quot;test&quot;</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;test&quot;</span></span>
<span class="sc2">  onfocusin<span class="sy0">=</span><span class="st0">&quot;SelectOnFocusIn()&quot;</span> <span class="kw3">onfocus</span><span class="sy0">=</span><span class="st0">&quot;SelectOnFocus()&quot;</span>&gt;</span>
  <span class="sc2">&lt;<span class="kw2">option</span> <span class="kw3">value</span><span class="sy0">=</span><span class="st0">&quot;3&quot;</span>&gt;</span>Alien Perm <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">option</span>&gt;</span>
  <span class="sc2">&lt;<span class="kw2">option</span> <span class="kw3">value</span><span class="sy0">=</span><span class="st0">&quot;4&quot;</span>&gt;</span>Alien Temp <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">option</span>&gt;</span>
  <span class="sc2">&lt;<span class="kw2">option</span> <span class="kw3">value</span><span class="sy0">=</span><span class="st0">&quot;1&quot;</span> <span class="kw3">selected</span><span class="sy0">=</span><span class="st0">&quot;selected&quot;</span>&gt;</span>Native <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">option</span>&gt;</span>
  <span class="sc2">&lt;<span class="kw2">option</span> <span class="kw3">value</span><span class="sy0">=</span><span class="st0">&quot;2&quot;</span>&gt;</span>Naturalized <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">option</span>&gt;</span>
  <span class="sc2">&lt;<span class="kw2">option</span> <span class="kw3">value</span><span class="sy0">=</span><span class="st0">&quot;N&quot;</span>&gt;</span>Not Indic. <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">option</span>&gt;</span>
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">select</span>&gt;</span></pre></div></div>
<p>Eingebaut, getestet &#8211; und anscheinend hat der zuständige Entwickler noch nichts von <code>multiple</code> gehört, denn bei Auswahlfeldern mit Mehrfachauswahl greift der Code nicht. Es wird nur die erste selektierte Option übernommen, alle anderen Auswahlen gehen verloren &#8211; Bugfixing der besten Qualität. Welch hoher Maßstab hier angelegt wurde, sieht man schon an der Anweisung im <em>catch</em> Block der Funktionen, wo bitte ist die Funktion HandleError, oder gehört diese Funktion mittlerweile zu einem offiziellen JavaScript Standard? Nein &#8211; also weg damit, und dann auch gleich noch die fehlende Unterstützung von Mehrfachauswahlen implementiert:</p>
<div id="wpshdo_19" class="wp-synhighlighter-outer"><div id="wpshdi_19" class="wp-synhighlighter-inner" style="display: block;"><pre class="javascript" style="font-family:monospace;"><span class="kw2">function</span> SelectOnFocusIn<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span class="kw1">try</span> <span class="br0">&#123;</span>
    <span class="kw2">var</span> eSrc <span class="sy0">=</span> window.<span class="me1">event</span>.<span class="me1">srcElement</span><span class="sy0">;</span>
    <span class="kw1">if</span><span class="br0">&#40;</span>eSrc<span class="br0">&#41;</span>  <span class="br0">&#123;</span>
      eSrc.<span class="me1">firstSelected</span> <span class="sy0">=</span> eSrc.<span class="me1">selectedIndex</span><span class="sy0">;</span>
      <span class="kw2">var</span> tmpIndex <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">;</span>
      <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> s <span class="sy0">=</span> 0<span class="sy0">,</span> l <span class="sy0">=</span> eSrc.<span class="me1">options</span>.<span class="me1">length</span><span class="sy0">;</span> s<span class="sy0">&lt;</span>l<span class="sy0">;</span> s<span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">if</span> <span class="br0">&#40;</span>eSrc.<span class="me1">options</span><span class="br0">&#91;</span>s<span class="br0">&#93;</span>.<span class="me1">selected</span> <span class="sy0">==</span> <span class="kw2">true</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
          tmpIndex.<span class="me1">push</span><span class="br0">&#40;</span>s<span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
      <span class="br0">&#125;</span>
      eSrc.<span class="me1">tmpIndex</span> <span class="sy0">=</span> tmpIndex<span class="sy0">;</span>
    <span class="br0">&#125;</span>
  <span class="br0">&#125;</span> <span class="kw1">catch</span> <span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw2">function</span> SelectOnFocus<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span class="kw1">try</span> <span class="br0">&#123;</span>
    <span class="kw2">var</span> eSrc <span class="sy0">=</span> window.<span class="me1">event</span>.<span class="me1">srcElement</span><span class="sy0">;</span>
    <span class="kw1">if</span> <span class="br0">&#40;</span>eSrc<span class="br0">&#41;</span> <span class="br0">&#123;</span>
      <span class="coMULTI">/* muss gesetzt werden, anderenfalls wird die
          die erste Option immer mit aktiviert! */</span>
      eSrc.<span class="me1">selectedIndex</span> <span class="sy0">=</span> eSrc.<span class="me1">firstSelected</span><span class="sy0">;</span>
      <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw2">var</span> i<span class="sy0">=</span>0<span class="sy0">,</span> l <span class="sy0">=</span> eSrc.<span class="me1">tmpIndex</span>.<span class="me1">length</span><span class="sy0">;</span> i<span class="sy0">&lt;</span>l<span class="sy0">;</span> i<span class="sy0">++</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
        eSrc.<span class="me1">options</span><span class="br0">&#91;</span>eSrc.<span class="me1">tmpIndex</span><span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#93;</span>.<span class="me1">selected</span> <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span>
      <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
  <span class="br0">&#125;</span> <span class="kw1">catch</span> <span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>Mit diesen Korrekturen lässt sich der Fokus-Bug nun für alle Formen von SELECT-Feldern anwenden, und wenn dem schon so ist, dann würde eine allgemeine Regel für alle solche Felder doch deutlich weiter helfen, als in jedem einzelnen Feld zwei Event-Handler zu notieren. Das Ganze müsste dann nur noch zum frühst möglichen Zeitpunkt geladen werden, und idealerweise nur für den Internet Explorer 6. Meine finale Lösung sieht am Ende so aus:</p>
<div id="wpshdo_20" class="wp-synhighlighter-outer"><div id="wpshdi_20" class="wp-synhighlighter-inner" style="display: block;"><pre class="javascript" style="font-family:monospace;"><span class="br0">&#40;</span><span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span class="kw2">var</span> d   <span class="sy0">=</span> document<span class="sy0">;</span>
  selectFix <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw2">var</span> selFields <span class="sy0">=</span> document.<span class="me1">getElementsByTagName</span><span class="br0">&#40;</span><span class="st0">'select'</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span>selFields <span class="sy0">||</span> selFields.<span class="me1">length</span><span class="sy0">==</span>0<span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="kw1">return</span><span class="sy0">;</span><span class="br0">&#125;</span>
    <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw2">var</span> i<span class="sy0">=</span>0<span class="sy0">,</span> l<span class="sy0">=</span>selFields.<span class="me1">length</span><span class="sy0">;</span> i<span class="sy0">&lt;</span>l<span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
      <span class="kw2">var</span> elm <span class="sy0">=</span> selFields<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy0">;</span>
      elm.<span class="me1">onfocusin</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">try</span> <span class="br0">&#123;</span>
          <span class="kw2">var</span> eSrc <span class="sy0">=</span> window.<span class="me1">event</span>.<span class="me1">srcElement</span><span class="sy0">;</span>
          eSrc.<span class="me1">firstSelected</span> <span class="sy0">=</span> eSrc.<span class="me1">selectedIndex</span><span class="sy0">;</span>
          <span class="kw2">var</span> tmpIndex <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">;</span>
          <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> s <span class="sy0">=</span> 0<span class="sy0">,</span> l <span class="sy0">=</span> eSrc.<span class="me1">options</span>.<span class="me1">length</span><span class="sy0">;</span> s<span class="sy0">&lt;</span>l<span class="sy0">;</span> s<span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span class="kw1">if</span> <span class="br0">&#40;</span>eSrc.<span class="me1">options</span><span class="br0">&#91;</span>s<span class="br0">&#93;</span>.<span class="me1">selected</span> <span class="sy0">==</span> <span class="kw2">true</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
              tmpIndex.<span class="me1">push</span><span class="br0">&#40;</span>s<span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
          <span class="br0">&#125;</span>
         eSrc.<span class="me1">tmpIndex</span> <span class="sy0">=</span> tmpIndex<span class="sy0">;</span>
        <span class="br0">&#125;</span> <span class="kw1">catch</span> <span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span>
      <span class="br0">&#125;</span><span class="sy0">;</span>
      elm.<span class="kw3">onfocus</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">try</span> <span class="br0">&#123;</span>
         <span class="kw2">var</span> eSrc <span class="sy0">=</span> window.<span class="me1">event</span>.<span class="me1">srcElement</span><span class="sy0">;</span>
         <span class="kw1">if</span> <span class="br0">&#40;</span>eSrc<span class="br0">&#41;</span> <span class="br0">&#123;</span>
           eSrc.<span class="me1">selectedIndex</span> <span class="sy0">=</span> eSrc.<span class="me1">firstSelected</span><span class="sy0">;</span>
           <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw2">var</span> s<span class="sy0">=</span>0<span class="sy0">,</span> l <span class="sy0">=</span> eSrc.<span class="me1">tmpIndex</span>.<span class="me1">length</span><span class="sy0">;</span> s<span class="sy0">&lt;</span>l<span class="sy0">;</span> s<span class="sy0">++</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
             eSrc.<span class="me1">options</span><span class="br0">&#91;</span>eSrc.<span class="me1">tmpIndex</span><span class="br0">&#91;</span>s<span class="br0">&#93;</span><span class="br0">&#93;</span>.<span class="me1">selected</span> <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span>
           <span class="br0">&#125;</span>
         <span class="br0">&#125;</span>
        <span class="br0">&#125;</span> <span class="kw1">catch</span> <span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span>
      <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
  <span class="br0">&#125;</span><span class="sy0">;</span>
  <span class="kw1">try</span> <span class="br0">&#123;</span> d.<span class="me1">documentElement</span>.<span class="me1">doScroll</span><span class="br0">&#40;</span><span class="st0">'left'</span><span class="br0">&#41;</span><span class="sy0">;</span> selectFix<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="br0">&#125;</span>
  <span class="kw1">catch</span> <span class="br0">&#40;</span>err<span class="br0">&#41;</span> <span class="br0">&#123;</span> setTimeout<span class="br0">&#40;</span>arguments.<span class="me1">callee</span><span class="sy0">,</span> 0<span class="br0">&#41;</span><span class="sy0">;</span> <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>
<p>Fehlt nur noch die Anforderung, das Script nur für den IE 6 laufen zu lassen. Dafür gibt es verschiedene Möglichkeiten. Eine JavaScript basierte &#8220;Browserweiche&#8221; nutzen (muss aber nicht sein), das ganze Script in eine eigene Datei auslagern und innerhalb eines <a href="http://de.wikipedia.org/wiki/Conditional_Comments" class="external" target="_blank" title="Conditional Comments">Conditional Comment</a> einbinden, oder &#8211; für den Fall, dass der Code innerhalb einer größeren JavaScript Datei steht über die jscript Variante:</p>
<div id="wpshdo_21" class="wp-synhighlighter-outer"><div id="wpshdi_21" class="wp-synhighlighter-inner" style="display: block;"><pre class="javascript" style="font-family:monospace;"><span class="coMULTI">/*@cc_on @*/</span>
<span class="coMULTI">/*@if (@_jscript_version == 5.6)
  // dieser Bereich ist für jscript-Interpreter version 5.6 sichtbar
  // (das entspricht dem Internet Explorer 6)
@*/</span>
<span class="coMULTI">/*@end @*/</span></pre></div></div>
<p>Wie gesagt, es ist alles andere als ideal, die Funktionalität von LABEL mit JavaScript nachträglich zu implentieren, geht es bei diesem Element doch gerade um eine Erhöhung der &#8220;Verfügbarkeit&#8221; auch ohne Zusatztechnologien. Aber bei dieser Browserversion ist ohnehin schon alles verloren, sollte jemand eine bessere &#8211; eine scriptfreie Lösung haben, dann bitte!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.am530.de/2010/07/fokussieren-nicht-selektieren-bitte/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Von Zeichensätzen und Sortierfolgen</title>
		<link>http://www.am530.de/2010/07/von-zeichensaetzen-und-sortierfolgen/</link>
		<comments>http://www.am530.de/2010/07/von-zeichensaetzen-und-sortierfolgen/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 08:32:47 +0000</pubDate>
		<dc:creator>Axel Michel</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Datenbank Design]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.am530.de/?p=533</guid>
		<description><![CDATA[Beim Arbeiten mit MySQL kommt immer wieder die Frage auf, auf welchem Zeichensatz (CHARACTER SET) die Datenbank, Tabelle oder Zelle eingestellt werden soll - und für viele scheint die Angabe zur Sortierfolge (COLLATE) ein noch viel größeres Mysterium darzustellen. Gerade MySQL ist in Sachen Zeichensatz und Sortierfolge wirklich mächtig. MySQL erlaubt das Speichern von Strings in einer Vielzahl von Zeichensätzen, das Vergleichen von Strings unter Verwendung einer Vielzahl von Sortierfolgen. Man kann Zeichensätze und Sortierfolgen beliebig mischen, sei es auf Server-, Datenbank- oder Tabellen-Ebene. Wenn einem das System schon so viele Möglichkeiten liefert, dann sollte man versuchen diese effizient zu nutzen. ]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/images/dic.png"  alt="Von Zeichensätzen und Sortierfolgen" title="Von Zeichensätzen und Sortierfolgen" class="fl" /><br />
<strong>Beim Arbeiten mit MySQL kommt immer wieder die Frage auf, auf welchem Zeichensatz (CHARACTER SET) die Datenbank, Tabelle oder Zelle eingestellt werden soll &#8211; und für viele scheint die Angabe zur Sortierfolge (COLLATE) ein noch viel größeres Mysterium darzustellen. Gerade MySQL ist in Sachen Zeichensatz und Sortierfolge wirklich mächtig. MySQL erlaubt das Speichern von Strings in einer Vielzahl von Zeichensätzen, das Vergleichen von Strings unter Verwendung einer Vielzahl von Sortierfolgen. Man kann Zeichensätze und Sortierfolgen beliebig mischen, sei es auf Server-, Datenbank- oder Tabellen-Ebene. Wenn einem das System schon so viele Möglichkeiten liefert, dann sollte man versuchen diese auch effizient zu nutzen.</strong></p>
<h3>Was ist ein Zeichensatz genau, und was versteht man unter Sortierfolgen?</h3>
<p>Die Dokumentation von MySQL liefert auf diese Fragen ein sehr <a href="http://dev.mysql.com/doc/refman/5.1/de/charset-general.html" class="external" target="_blank" title="Zeichensätze und Sortierfolgen im Allgemeinen">anschauliches Beispiel</a>. Ein Zeichensatz (CHARACTER SET) ist eine Gesamtmenge von Symbolen bzw. Elementen &#8211; das können sichtbare Symbole wie Buchstaben, Zahlen, Sonder- oder Satzzeichen sein, aber auch unsichtbare Steuerzeichen (wie bspw. Zeilenumbruch) &#8211; und deren Kodierung (Zuordnung). So hat im deutschen Alphabet der Buchstabe &#8220;<strong>Ü</strong>&#8221; die Kodierung 220. Wechselt man den Zeichensatz, so kann die gleiche Kodierung einem ganz anderen Symbol zugeordnet sein. Im EBCDIC-Zeichensatz kodiert der Wert 220 bspw. die geschweifte Klammer &#8220;<strong>}</strong>&#8220;. Auch die Anzahl der darstellbaren Zeichen kann von Zeichensatz zu Zeichensatz stark variieren. ASCII kennt 95 darstellbare Zeichen, Unicode (Standard 5.1) hingegen 100.000.<br />
Je komplexer ein Zeichensatz, desto mehr Regeln braucht man für die Sortierung bzw. zum Vergleich dieser Zeichen. Der einfachste Vergleich von zwei Zeichen bzw. Zeichenketten (Strings) ist die Binärsortierung. Dabei wird verglichen, ob die Kodierung von <strong>A</strong> (<span title="ASCII Ordnungszahl">65</span>) größer ist als die von <strong>B</strong> (<span title="ASCII Ordnungszahl">66</span>). Soweit &#8211; so einfach, aber wie fällt der Vergleich von <strong>B</strong> (<span title="ASCII Ordnungszahl">66</span>) mit <strong>a</strong> (<span title="ASCII Ordnungszahl">97</span>) aus? In diesem Falle würde der Großbuchstabe <strong>B</strong> vor dem kleinen <strong>a</strong> erscheinen. Der Zeichensatz braucht also eine weitere Regel, die Groß- und Kleinschreibung nicht berücksichtigt. Zu Erkennen sind diese Sortierfolgen in MySQL an dem <em>_ci</em> in Namen, kurz für <em>case insensitive</em>. Sonderzeichen erzwingen weitere Regeln: Das deutsche &#8220;<strong>Ü</strong>&#8221; stehen in der Sortierfolge für <strong>UE</strong>, und wie sieht es mit <strong>é</strong> und <strong>è</strong> aus, welche Regeln gelten in diesem Fall?<br />
Kurz gesagt: COLLATE legt fest, wie Strings miteinander verglichen werden, und das kann ein durchaus komplexes Regelwerk sein.</p>
<h3>Welches ist der &#8220;richtige&#8221; Zeichensatz?</h3>
<p>Trival ist diese Frage nicht, betrachtet man folgendes Beispiel: Es soll einer Tabelle USER angelegt werden, die u.a. folgende Informationen aufnehmen soll: Benutzername, Name, Passwort, E-Mail und Land. Bei allen genannten Feldern handelt es sich Textfelder &#8211; aber für jedes gelten andere Voraussetzungen:</p>
<ul>
<li>Das Passwortfeld sollte verschlüsselt sein und für die Verschlüssung wird häufig MD5 verwendet. Nun liefert MD5 immer eine Zeichenkette von 32 Zeichen, und diese 32 Zeichen sind immer ASCII.
<li>Die E-Mail hingegen darf seit der Einführung der <a href="http://de.wikipedia.org/wiki/IDNA" class="external" title="Internationalen Domain-Namen" target="_blank">Internationalen Domain-Namen</a> 92 Sonderzeichen außerhalb des reinen ASCII-Codes enthalten, so sind bspw. deutsche Sonderzeichen im Domänenteil einer E-Mail Adresse durchaus erlaubt. Dies gilt zwar nicht für den eigentlichen Mailverkehr &#8211; hier müssen diese Zeichen kodiert werden &#8211; aber kaum ein User wird die &#8220;kodierte&#8221; Fassung einer solchen Adresse bei seiner Anmeldung verwenden. Im lokalen Teil der E-Mail  (vor dem @-Zeichen) sind alle Zeichen oberhalb des ASCII-Codes 127 generell verboten (also auch Umlaute), laut Spezifikation müssen aber Groß- und Kleinschreibung unterschieden werden. Bei den Adressen hans.mueller@email.de und Hans.Mueller@email.de könnte es also um zwei verschiedene Adressen handeln (auch wenn dieses in der Praxis kaum der Fall ist). Und die Länge &#8211; aus wievielen Zeichen kann eine E-Mail Adresse maximal bestehen? Legt man <a href="http://tools.ietf.org/html/rfc5321" class="external" target="_blank" title="Simple Mail Transfer Protocol">RFC 5321</a> zu Grunde, dann darf der lokale Teil aus maximal 64 Zeichen bestehen und der Domänenteil aus 255 Zeichen, kommt noch das @ Zeichen dazu, ergibt sich eine Gesamtlänge von 320 Zeichen. Ein theoretischer Wert, RFC-konforme SMTP-Server können nur mit einer maximalen Länge von 255 Zeichen umgehen, denn die Definitionen des Path-Elementes im <a href="http://tools.ietf.org/html/rfc5321" class="external" target="_blank" title="Simple Mail Transfer Protocol">RFC 5321</a> (in dem die E-Mail Adresse steht), erlaubt nur eine entsprechend reduzierte Zeichenlänge.</li>
<li>Beim Namen, dem &#8220;realen Namen&#8221; des Nutzers kann &#8211; je nachdem wie international die Seite ist &#8211; so ziemlich jeder Buchstabe aus jedem Alphabet auftauchen. Ganz gleich ob es ein hebräischer, russischer oder japanischer User ist, die Spalte sollte mit entsprechenden Zeichen umgehen können.</li>
<li>Das Länderkürzel besteht in vielen Projekten aus zwei oder drei Zeichen, in denen keine Sonderzeichen erlaubt sind, wie bei der Passwort-Spalte sind diese Zeichen immer Bestandteil des ASCII Zeichensatz.</li>
<li>Für den Benutzernamen gelten zumeist striktere Regeln, als für den realen Namen. Zeichen, die nicht in der Latin-1 (ISO-8859-1) oder US-ASCII Kodierung vorhanden sind, werden selten zugelassen.</li>
</ul>
<p>Es ist also durchaus möglich, dass innerhalb einer Tabelle Daten gespeichert werden, die in verschiedenen Zeichensätzen repräsentiert sein könnten. In dem Beispiel ließen sich ASCII, Latin-1 und UTF8 unterscheiden, aber welchen Vorteil würden unterschiedliche Zeichensätze überhaupt bieten, oder entstehen daraus am Ende sogar Nachteile?</p>
<p>Im Web setzt sich UTF8 immer mehr durch, seit 2008 ist es der meist verwendete Zeichensatz im World Wide Web. Mit UTF8 lässt sich fast jedes Alphabet abbilden, kein Wunder also, dass mehr und mehr Seiten auf diesen Zeichensatz wechseln. Der Standard Zeichensatz von MySQL ist Latin-1, gerade mal 256 darstellbare Zeichen (zu denen noch nicht einmal das &euro; Euro Zeichen gehört), Das UTF8 Kodierungsschema, das mit einer variablen Länge von 1-4 Bytes pro Zeichen arbeitet repräsentiert einen ungleich größeren Zeichenraum. Ist es nicht die effizienteste Lösung, dann alle Zeichenfelder, die gesamte Datenbank Kommunikation auf UTF8 umzustellen?</p>
<h4>Die UTF8 Kodierung hat ihren Preis</h4>
<p>UTF8 kodierte Zeichen aus dem ASCII Raum benötigen 1 Byte an Speicher, für Sprachen wie Hebräisch oder Türkisch, aber auch deutsche Sonderzeichen belegt es 2 Bytes und Japanisch oder Chinesisch beanspruchen 3 Bytes (MySQL unterstützt zur Zeit nur bis zu 3 Byte-Sequenzen). Latin-1 oder ASCII benötigt immer nur 1 Byte. Definiert man bspw. das Passwortfeld wie folgt:<br />
<div id="wpshdo_22" class="wp-synhighlighter-outer"><div id="wpshdi_22" class="wp-synhighlighter-inner" style="display: block;"><pre class="sql" style="font-family:monospace;">PASSWORD CHAR<span class="br0">&#40;</span><span class="nu0">32</span><span class="br0">&#41;</span> CHARSET utf8</pre></div></div></p>
<p>Ergibt sich folgendes: Eine CHAR Spalte  ist eine fixierte Spalte, d.h. es wird immer die gleiche Länge verwendet, sollten weniger Zeichen eingegeben werden, dann füllt MySQL diese fehlenden Zeichen mit einem Leerzeichen auf. MySQL muß in diesem Fall also gewährleisten, dass bis zu 32 Zeichen in diese Spalte passen, bei maximal 3 Bytes pro Zeichen belegt die Spalte damit immer 32*3 (96) Bytes, wäre die Spalte  in ASCII kodiert hingegen nur 32 Bytes, bei vielen Datensätzen und vielen solcher Spalten kann sich das im Speicherbedarf durchaus bemerkbar machen. Halb so wild &#8211; wechselt man den Typ von CHAR auf VARCHAR, dann wechselt man von einem fixierten Spaltentyp auf einen dynamischen Spaltentyp. VARCHAR braucht immer nur soviel Bytes wie tatsächlich in der Zelle notwendig sind (plus 1 bis 2 Byte für die Anzahl der Zeichen). In diesem Fall sind alles ASCII Zeichen, damit also 32 Byte + 2 Byte für die Länge, also 34 gegen 96 Byte für jeden Eintrag. </p>
<h4>Einfach auf CHAR verzichten und ganz auf VARCHAR wechseln?</h4>
<p>Ist es nicht sogar so, dass es MySQL mit CHAR und VARCHAR gar nicht so genau nimmt, den Spaltentyp zum Teil selbstständig wechselt?<br />
Hab ich auch so gelernt, aber es stimmt so nicht mehr: Früher galt, dass VARCHAR Spalten, die mit weniger als 4 Zeichen definiert werden, automatisch in ein CHAR konvertiert wurden. Umgedreht galt für CHAR-Spalten mit einer Definition von mehr als 3 Zeichen (unter der Voraussetzung, dass die Tabelle eine dynamsiche Spalte enthielt) die Wandlung in den Typ VARCHAR. Seit der MySQL Version 5 ergibt:</p>
<div id="wpshdo_23" class="wp-synhighlighter-outer"><div id="wpshdi_23" class="wp-synhighlighter-inner" style="display: block;"><pre class="sql" style="font-family:monospace;"><span class="kw1">CREATE</span> <span class="kw1">TABLE</span> testVARCHAR_CHAR <span class="br0">&#40;</span>
  col1 CHAR<span class="br0">&#40;</span>40<span class="br0">&#41;</span><span class="sy0">,</span>
  col2 VARCHAR<span class="br0">&#40;</span>2<span class="br0">&#41;</span><span class="sy0">,</span>
  col3 CHAR<span class="br0">&#40;</span>3<span class="br0">&#41;</span>
<span class="br0">&#41;</span>;
<span class="kw1">DESC</span> testVARCHAR_CHAR;</pre></div></div>
<div id="wpshdo_24" class="wp-synhighlighter-outer"><div id="wpshdi_24" class="wp-synhighlighter-inner" style="display: block;"><pre class="dos" style="font-family:monospace;">+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| col1  | char<span class="br0">&#40;</span>40<span class="br0">&#41;</span>   | YES  |     | NULL    |       |
| col2  | varchar<span class="br0">&#40;</span>2<span class="br0">&#41;</span> | YES  |     | NULL    |       |
| col3  | char<span class="br0">&#40;</span>3<span class="br0">&#41;</span>    | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+</pre></div></div>
<p>Also keine implizite Typenkonvertierung mehr, dieses Argument entfällt. Aber warum überhaupt fixierte Spalten, wenn dynamische Spalten doch effizienter mit dem Speicherplatz umgehen? Der Unterschied ergibt sich über die Geschwindigkeit. Bei <a href="http://phpperformance.de/char-oder-varchar-statisch-oder-dynamisch/" target="_blank" class="external" title="CHAR oder VARCHAR? Statisch oder dynamisch?">PHPPerformance</a> findet man einen Artikel zum Thema und die dort genannten Zahlen sprechen für sich. Aktualisierungen oder Löschvorgänge können bei dynamischen Tabellen zur Fragmentierung der Information führen, und dies hat eine Auswirkung auf die Performance &#8211; bei dem genanntem Test lag der Abfrageunterschied zwischen der dynamsichen und statischen Variante bei 0,6 zu 0,1 Sekunden.</p>
<p>Um bei dem hier gewählten Beispiel zu bleiben, die Passwortspalte ist immer gleich lang, sie besteht immer aus 32 Zeichen, der Typ CHAR ist hier demzufolge die optimale Lösung. Die Zeichen sind immer ASCII &#8211; also ist der ideale Zeichensatz für diese Spalte ASCII und nicht UTF8, man gewinnt an Performance und spart zudem noch 1 bis 2 Byte pro Eintrag. Bei der Spalte für das Länderkürzel lässt sich ähnlich argumentieren.<br />
Für die Felder E-Mail, Name und Benutzername hingegen sollte UTF8 verwendet werden. Auch wenn beim Benutzernamen ggf. ausschließlich Zeichen aus dem Latin-1 Zeichenraum verwendet werden, würde hier eine unterschiedliche Kodierung spätestens bei der Ausgabe auf einer Seite Probleme bereiten. Da in allen Zellen dieser Spalten sehr variable Werte stehen können, werden alle als VARCHAR definiert:</p>
<div id="wpshdo_25" class="wp-synhighlighter-outer"><div id="wpshdi_25" class="wp-synhighlighter-inner" style="display: block;"><pre class="sql" style="font-family:monospace;"><span class="kw1">CREATE</span> <span class="kw1">TABLE</span> user <span class="br0">&#40;</span>
  password CHAR<span class="br0">&#40;</span>32<span class="br0">&#41;</span> CHARSET ascii<span class="sy0">,</span>
  username VARCHAR<span class="br0">&#40;</span>20<span class="br0">&#41;</span> CHARSET utf8<span class="sy0">,</span>
  name VARCHAR<span class="br0">&#40;</span>50<span class="br0">&#41;</span> CHARSET utf8<span class="sy0">,</span>
  email VARCHAR<span class="br0">&#40;</span>255<span class="br0">&#41;</span> CHARSET utf8<span class="sy0">,</span>
  lang CHAR<span class="br0">&#40;</span>3<span class="br0">&#41;</span> CHARSET ascii<span class="sy0">,</span>
  <span class="kw1">UNIQUE</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span>username<span class="br0">&#41;</span>
<span class="br0">&#41;</span>;</pre></div></div>
<p>Der UNIQUE KEY auf das Feld &#8220;username&#8221; erzwingt einen eindeuten Benutzernamen (für den Fall, dass dieser Wert für den Nutzer nicht veränderbar ist, könnte man die Spalte &#8220;username&#8221; auch zum PRIMARY KEY machen.). Aber wie eindeutig ist dieser Name in dieser Form eigentlich? Macht es einen Unterschied ob ich der Nutzer &#8220;axel&#8221;, &#8220;Axel&#8221; oder &#8220;AXEL&#8221; bin?</p>
<h3>Warum man auf die Sortierfolge achten sollte</h3>
<p>Bei einem Benutzernamen kann man sicher darüber streiten, ob es sinnvoll ist, Groß- und Kleinschreibung zu unterscheiden &#8211; also jede Schreibvariante als einen eigenen Namen zu verstehen. In anderen Fällen, bspw. für den Fall, dass Sie mit unverschlüsselten Passwörtern arbeiten (müssen), sollte die Schreibweise unbedingt eine Rolle spielen. Anstatt (und das ist die Standard Einstellung) Groß- und Kleinschreibung nicht zu berücksichtigen, sollte in diesen Fällen die COLLATE Eigenschaft so verändert werden, dass unterschieden wird:</p>
<div id="wpshdo_26" class="wp-synhighlighter-outer"><div id="wpshdi_26" class="wp-synhighlighter-inner" style="display: block;"><pre class="sql" style="font-family:monospace;"><span class="br0">&#91;</span><span class="sy0">...</span><span class="br0">&#93;</span>
  username VARCHAR<span class="br0">&#40;</span><span class="nu0">20</span><span class="br0">&#41;</span> CHARSET utf8 COLLATE utf8_bin<span class="sy0">,</span>
<span class="br0">&#91;</span><span class="sy0">...</span><span class="br0">&#93;</span></pre></div></div>
<p>COLLATE Angaben, die auf <em>bin</em> oder <em>cs</em> enden, sind case sensitive &#8211; berücksichtigen Groß- und Kleinschreibung. Mit dieser Veränderung liessen sich die Nutzer axel&#8221;, &#8220;Axel&#8221; oder &#8220;AXEL&#8221; in die Tabelle eintragen, anderenfalls gäbe es einen Fehler: <code>#1062 - Duplicate entry 'Axel' for key 'username'</code>.<br />
Die Spalte &#8220;name&#8221; hatte den Zeichensatz UTF8 erhalten, die Standard-Sortierfolge ist damit utf8_general_ci, für viele Vergleiche korrekt &#8211; aber nicht für alle. Ein Beispiel: Angezeigt werden sollen alle deutsche Nutzer, in alphabetischer Reihenfolge:</p>
<div id="wpshdo_27" class="wp-synhighlighter-outer"><div id="wpshdi_27" class="wp-synhighlighter-inner" style="display: block;"><pre class="sql" style="font-family:monospace;"><span class="kw1">SELECT</span> name <span class="kw1">FROM</span> user <span class="kw1">WHERE</span> lang<span class="sy0">=</span><span class="st0">'DE'</span> <span class="kw1">ORDER</span> <span class="kw1">BY</span> name;</pre></div></div>
<div id="wpshdo_28" class="wp-synhighlighter-outer"><div id="wpshdi_28" class="wp-synhighlighter-inner" style="display: block;"><pre class="dos" style="font-family:monospace;">+-------------+
| name        |
+-------------+
| Aachen      |
| Aechten     |
| Affe        |
| Ärger       |
| Äußern      |
| Axel Michel |
+-------------+</pre></div></div>
<p>Die Sortierung entspricht nicht den deutschen Sortierungsregeln, Ein <strong>Ä</strong> steht für <strong>AE</strong>, und nicht für <strong>A</strong>, wie es bei UTF8 der Fall ist. Auch hier kann einem die Sortierfolge weiterhelfen:<br />
<div id="wpshdo_29" class="wp-synhighlighter-outer"><div id="wpshdi_29" class="wp-synhighlighter-inner" style="display: block;"><pre class="sql" style="font-family:monospace;"><span class="kw1">SELECT</span> name <span class="kw1">FROM</span> user
  <span class="kw1">WHERE</span> lang<span class="sy0">=</span><span class="st0">'DE'</span>
  <span class="kw1">ORDER</span> <span class="kw1">BY</span>
   CAST<span class="br0">&#40;</span>name <span class="kw1">AS</span> CHAR CHARACTER <span class="kw1">SET</span> latin1<span class="br0">&#41;</span>
   COLLATE latin1_german2_ci;</pre></div></div></p>
<div id="wpshdo_30" class="wp-synhighlighter-outer"><div id="wpshdi_30" class="wp-synhighlighter-inner" style="display: block;"><pre class="dos" style="font-family:monospace;">+-------------+
| name        |
+-------------+
| Aachen      |
| Aechten     |
| Ärger       |
| Äußern      |
| Affe        |
| Axel Michel |
+-------------+</pre></div></div>
<p>Nun ist das Ergebnis richtig (im Sinne des deutschen Alphabets) sortiert. Damit der Vergleich richtig funktioniert, wird der Zeichensatz für die Sortierung auf latin1 gewechselt, und dann die entsprechende Sortierfolge gewählt.</p>
<p>Zeichensatz und Sortierfolge sind keine starren, &#8220;unveränderbaren&#8221; Eigenschaften einer Datenbank. Sie sind im hohen Maße abhängig von den Inhalten und Typ der jeweiligen Tabellenspalten und &#8211; wie im letzten Beispiel aufgezeigt &#8211; von dem, was man <em>&#8220;mit den Daten anfangen will&#8221;</em>. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.am530.de/2010/07/von-zeichensaetzen-und-sortierfolgen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS basiertes text-overflow in allen Browsern</title>
		<link>http://www.am530.de/2010/06/css-basiertes-text-overflow-in-allen-browsern/</link>
		<comments>http://www.am530.de/2010/06/css-basiertes-text-overflow-in-allen-browsern/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 01:01:33 +0000</pubDate>
		<dc:creator>Axel Michel</dc:creator>
				<category><![CDATA[Usability]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://www.am530.de/?p=494</guid>
		<description><![CDATA[Nochmal ein Beitrag zum Thema Textbegrenzung. Längere Texte abzuschneiden, weil sie anderenfalls bestimmte Rahmengrößen brechen würden, ist eine immer wiederkehrende Anforderung. Solche Kürzungen kann man zum Teil serverseitig erledigen - aber das ist nicht unter allen Umständen sinnvoll. Schwierig wird es immer dann, wenn diese Kürzung nicht auf einer definierten Zeichenlänge basiert, sondern auf einer definierten Größe (bspw. innerhalb einer Tabelle, oder einer Schaltfläche). Der Internet Explorer kennt die CSS-Eigenschaft text-overflow, eine entsprechende Implementierung im Firefox fehlt. Es geht trotzdem...
]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/images/ellipsis.png"  alt="Pur CSS textoverflow in allen Browsern" title="Pur CSS textoverflow in allen Browsern" class="fl" /><br />
<strong>Nochmal ein Beitrag zum Thema Textbegrenzung. Längere Texte abzuschneiden, weil sie anderenfalls bestimmte Rahmengrößen brechen würden, ist eine immer wiederkehrende Anforderung. Solche Kürzungen kann man zum Teil serverseitig erledigen &#8211; aber das ist nicht unter allen Umständen sinnvoll. Schwierig wird es immer dann, wenn diese Kürzung nicht auf einer definierten Zeichenlänge basiert, sondern auf einer definierten Größe (bspw. innerhalb einer Tabelle, oder einer Schaltfläche). Der Internet Explorer kennt die CSS-Eigenschaft text-overflow, eine entsprechende Implementierung im Firefox fehlt. Es geht trotzdem&#8230;</strong></p>
<p>In meinem Artikel <a href="http://www.am530.de/2010/03/text-begrenzen-aber-richtig/" title="Text begrenzen, aber richtig!">Text begrenzen, aber richtig</a> hatte ich einige serverseitige Lösungen zum Begrenzen von Text vorgestellt. Solche Ansätze scheitern, wenn es bei der Begrenzung gar nicht um die Anzahl von Zeichen geht, sondern layoutabhängig sind. Die naheliegende Verwendung der CSS-Eigenschaft text-overflow wäre ideal, hier wird der Text nicht nur abgeschnitten, sondern in der Form <strong>Dieser Text geht noch weiter &hellip;</strong>  dargestellt:</p>
<h3>Beispielcode &#8211; die HTML Syntax</h3>
<div id="wpshdo_31" class="wp-synhighlighter-outer"><div id="wpshdi_31" class="wp-synhighlighter-inner" style="display: block;"><pre class="html4strict" style="font-family:monospace;"><span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;fixed-box&quot;</span>&gt;</span>
  <span class="sc2">&lt;<span class="kw2">p</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;truncate&quot;</span>&gt;</span>Ein viel zu langer Text für das Elternelement.<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">p</span>&gt;</span>
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span></pre></div></div>
<p>Legt man folgenden CSS Code zugrunde, dann wird der Text zwar in allen Browsern &#8220;abgeschnitten&#8221; (durch overflow:hidden), aber nur im Internet Explorer und im Webkit (Safari, Chrome) greift <em>text-overflow</em> mit der Ausprägung <em>ellipsis</em>:</p>
<div id="wpshdo_32" class="wp-synhighlighter-outer"><div id="wpshdi_32" class="wp-synhighlighter-inner" style="display: block;"><pre class="css" style="font-family:monospace;"><span class="re1">.fixed-box</span> <span class="br0">&#123;</span>
  <span class="kw1">width</span><span class="sy0">:</span><span class="re3">100px</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="re1">.truncate</span> <span class="br0">&#123;</span>
  <span class="kw1">white-space</span><span class="sy0">:</span> <span class="kw2">nowrap</span><span class="sy0">;</span>
  text-<span class="kw1">overflow</span><span class="sy0">:</span> ellipsis<span class="sy0">;</span>
  <span class="kw1">overflow</span><span class="sy0">:</span> <span class="kw2">hidden</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>Aber wie hilft man Firefox auf die Sprünge? Sicher &#8211; man könnte sich über JavaScript helfen, bei <a href="http://ajaxian.com/archives/text-overflow-for-firefox-via-jquery" class="external" title="Text-Overflow for Firefox via jQuery" target="_blank">Ajaxian</a> wird auf bspw. ein entsprechendes JQuery Plugin verwiesen. Es gibt aber noch eine Alternative und die basiert auf <em>XBL</em>. XBL (XML Binding Language) ist eine XML-basierte Auszeichnungssprache, mit der man das Verhalten und Aussehen von XML- und HTML-Elementen beschreiben kann. Dies geschieht über sogenannte Bindings (Bindungen) in XBL, die an ein solches Element angehängt werden. Die Bindings werden in einer separaten XBL-Datei definiert. Über ein Binding kann auch Text in das XML- oder HTML-Element eingefügt werden. Ein Binding kann an mehrere unterschiedliche Elemente angehängt werden. Der Code für die Implentierung von text-overflow ellipsis:</p>
<div id="wpshdo_33" class="wp-synhighlighter-outer"><div id="wpshdi_33" class="wp-synhighlighter-inner" style="display: block;"><pre class="xml" style="font-family:monospace;"><span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span><span class="re2">?&gt;</span></span>
<span class="sc3"><span class="re1">&lt;bindings</span></span>
<span class="sc3">  <span class="re0">xmlns</span>=<span class="st0">&quot;http://www.mozilla.org/xbl&quot;</span></span>
<span class="sc3">  <span class="re0">xmlns:xbl</span>=<span class="st0">&quot;http://www.mozilla.org/xbl&quot;</span></span>
<span class="sc3">  <span class="re0">xmlns:xul</span>=<span class="st0">&quot;http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul&quot;</span></span>
<span class="sc3"><span class="re2">&gt;</span></span>
  <span class="sc3"><span class="re1">&lt;binding</span> <span class="re0">id</span>=<span class="st0">&quot;ellipsis&quot;</span><span class="re2">&gt;</span></span>
    <span class="sc3"><span class="re1">&lt;content<span class="re2">&gt;</span></span></span>
      <span class="sc3"><span class="re1">&lt;xul:window<span class="re2">&gt;</span></span></span>
        <span class="sc3"><span class="re1">&lt;xul:description</span> <span class="re0">crop</span>=<span class="st0">&quot;end&quot;</span> <span class="re0">xbl:inherits</span>=<span class="st0">&quot;value=xbl:text&quot;</span><span class="re2">&gt;</span></span>
          <span class="sc3"><span class="re1">&lt;children</span><span class="re2">/&gt;</span></span>
        <span class="sc3"><span class="re1">&lt;/xul:description<span class="re2">&gt;</span></span></span>
     <span class="sc3"><span class="re1">&lt;/xul:window<span class="re2">&gt;</span></span></span>
    <span class="sc3"><span class="re1">&lt;/content<span class="re2">&gt;</span></span></span>
  <span class="sc3"><span class="re1">&lt;/binding<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/bindings<span class="re2">&gt;</span></span></span></pre></div></div>
<h3>Cross Browser text-overflow CSS Syntax</h3>
<p>Die XML Syntax wird als Datei abgespeichert und dann über CSS referenziert:</p>
<div id="wpshdo_34" class="wp-synhighlighter-outer"><div id="wpshdi_34" class="wp-synhighlighter-inner" style="display: block;"><pre class="css" style="font-family:monospace;"><span class="re1">.truncate</span> <span class="br0">&#123;</span>
  <span class="kw1">white-space</span><span class="sy0">:</span> <span class="kw2">nowrap</span><span class="sy0">;</span>
  text-<span class="kw1">overflow</span><span class="sy0">:</span> ellipsis<span class="sy0">;</span>
  <span class="kw1">overflow</span><span class="sy0">:</span> <span class="kw2">hidden</span><span class="sy0">;</span>
  <span class="coMULTI">/* Firefox mit text-overflow */</span>
  -moz-binding<span class="sy0">:</span> <span class="kw2">url</span><span class="br0">&#40;</span>ellipsis<span class="re1">.xml</span><span class="re0">#ellipsis</span><span class="br0">&#41;</span><span class="sy0">;</span>
  <span class="coMULTI">/* und nun auch noch Opera */</span>
  -o-text-<span class="kw1">overflow</span><span class="sy0">:</span>ellipsis<span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p><del datetime="2010-06-17T15:45:35+00:00">Einen kleinen Schönheitsfehler hat die Sache im Firefox Version 3.6. Aufgrund eines Bugs bei <em>-moz-binding</em> werden einmal gesetzte Werte nicht wieder geändert. Heißt bei Fluid-Designs bleibt der &#8220;ellipsis&#8221; Effekt auch dann noch vorhanden, wenn er eigentlich nicht mehr benötigt wird. </del></p>
<div class="update">
<p>Habe heute ein wenig mit der Syntax <a href="/lab/ellipsis/index.php" class="internal" title="CSS text-overflow examples">herumgespielt</a> und dabei festgestellt, dass die genannte XML Fassung für <em>Textflow</em> im Firefox 3.6.3 einen Bug hat. Sobald der Text, der gekürzt werden soll, inline-Elemente wie bspw. <code>STRONG</code> oder <code>EM</code> enthält, &#8220;verschwinden&#8221; diese Fragmente. Eine modifizierte Fassung des XML-Codes schafft Abhilfe:
</div>
<div id="wpshdo_35" class="wp-synhighlighter-outer"><div id="wpshdi_35" class="wp-synhighlighter-inner" style="display: block;"><pre class="xml" style="font-family:monospace;"><span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span><span class="re2">?&gt;</span></span>
<span class="sc3"><span class="re1">&lt;bindings</span></span>
<span class="sc3">  <span class="re0">xmlns</span>=<span class="st0">&quot;http://www.mozilla.org/xbl&quot;</span></span>
<span class="sc3">  <span class="re0">xmlns:xul</span>=<span class="st0">&quot;http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul&quot;</span></span>
<span class="sc3"><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;binding</span> <span class="re0">id</span>=<span class="st0">&quot;none&quot;</span><span class="re2">&gt;</span></span>
  <span class="sc3"><span class="re1">&lt;content<span class="re2">&gt;</span></span><span class="re1">&lt;children</span><span class="re2">/&gt;</span><span class="re1">&lt;/content<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/binding<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;binding</span> <span class="re0">id</span>=<span class="st0">&quot;ellipsis&quot;</span><span class="re2">&gt;</span></span>
  <span class="sc3"><span class="re1">&lt;content<span class="re2">&gt;</span></span></span>
    <span class="sc3"><span class="re1">&lt;xul:label</span> <span class="re0">crop</span>=<span class="st0">&quot;end&quot;</span><span class="re2">&gt;</span><span class="re1">&lt;children</span><span class="re2">/&gt;</span><span class="re1">&lt;/xul:label<span class="re2">&gt;</span></span></span>
  <span class="sc3"><span class="re1">&lt;/content<span class="re2">&gt;</span></span></span>
  <span class="sc3"><span class="re1">&lt;implementation<span class="re2">&gt;</span></span></span>
    <span class="sc3"><span class="re1">&lt;field</span> <span class="re0">name</span>=<span class="st0">&quot;label&quot;</span><span class="re2">&gt;</span></span> document.getAnonymousNodes( this )[ 0 ] <span class="sc3"><span class="re1">&lt;/field<span class="re2">&gt;</span></span></span>
    <span class="sc3"><span class="re1">&lt;field</span> <span class="re0">name</span>=<span class="st0">&quot;style&quot;</span><span class="re2">&gt;</span></span> this.label.style <span class="sc3"><span class="re1">&lt;/field<span class="re2">&gt;</span></span></span>
    <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;display&quot;</span><span class="re2">&gt;</span></span>
       <span class="sc3"><span class="re1">&lt;getter<span class="re2">&gt;</span></span></span>
         this.style.display
       <span class="sc3"><span class="re1">&lt;/getter<span class="re2">&gt;</span></span></span>
       <span class="sc3"><span class="re1">&lt;setter<span class="re2">&gt;</span></span></span>
         if( this.style.display != val ) this.style.display= val
       <span class="sc3"><span class="re1">&lt;/setter<span class="re2">&gt;</span></span></span>
    <span class="sc3"><span class="re1">&lt;/property<span class="re2">&gt;</span></span></span>
    <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;value&quot;</span><span class="re2">&gt;</span></span>
      <span class="sc3"><span class="re1">&lt;getter<span class="re2">&gt;</span></span></span>
         this.label.value
      <span class="sc3"><span class="re1">&lt;/getter<span class="re2">&gt;</span></span></span>
      <span class="sc3"><span class="re1">&lt;setter<span class="re2">&gt;</span></span></span>
        if( this.label.value != val ) this.label.value= val
      <span class="sc3"><span class="re1">&lt;/setter<span class="re2">&gt;</span></span></span>
    <span class="sc3"><span class="re1">&lt;/property<span class="re2">&gt;</span></span></span>
    <span class="sc3"><span class="re1">&lt;method</span> <span class="re0">name</span>=<span class="st0">&quot;update&quot;</span><span class="re2">&gt;</span></span>
      <span class="sc3"><span class="re1">&lt;body<span class="re2">&gt;</span></span></span>
         var strings= this.textContent.split( /\s+/g )
         if( !strings[ 0 ] ) strings.shift()
         if( !strings[ strings.length - 1 ] ) strings.pop()
         this.value= strings.join( ' ' )
         this.display= strings.length ? '' : 'none'
      <span class="sc3"><span class="re1">&lt;/body<span class="re2">&gt;</span></span></span>
    <span class="sc3"><span class="re1">&lt;/method<span class="re2">&gt;</span></span></span>
    <span class="sc3"><span class="re1">&lt;constructor<span class="re2">&gt;</span></span></span> this.update() <span class="sc3"><span class="re1">&lt;/constructor<span class="re2">&gt;</span></span></span>
  <span class="sc3"><span class="re1">&lt;/implementation<span class="re2">&gt;</span></span></span>
  <span class="sc3"><span class="re1">&lt;handlers<span class="re2">&gt;</span></span></span>
    <span class="sc3"><span class="re1">&lt;handler</span> <span class="re0">event</span>=<span class="st0">&quot;DOMSubtreeModified&quot;</span><span class="re2">&gt;</span></span> this.update() <span class="sc3"><span class="re1">&lt;/handler<span class="re2">&gt;</span></span></span>
  <span class="sc3"><span class="re1">&lt;/handlers<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/binding<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/bindings<span class="re2">&gt;</span></span></span></pre></div></div>
<p>Dafür ist der erwähnte Bug bei dynamisch modifizierten Elementen (sei es über Javascript oder flexibel skalierbare Boxen) nicht mehr aktuell und kann gestrichen werden (wurde gestrichen). <a href="/lab/ellipsis/index.php" class="internal" title="CSS text-overflow examples">Hier</a> sind noch einmal alle Tests zusammgefasst zu finden. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.am530.de/2010/06/css-basiertes-text-overflow-in-allen-browsern/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>@font-face: CSS3 basierte Schriftvielfalt</title>
		<link>http://www.am530.de/2010/06/font-face-css3-basierte-schriftvielfalt/</link>
		<comments>http://www.am530.de/2010/06/font-face-css3-basierte-schriftvielfalt/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 13:33:01 +0000</pubDate>
		<dc:creator>Axel Michel</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Webtrends]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[font-face]]></category>
		<category><![CDATA[Layout]]></category>

		<guid isPermaLink="false">http://www.am530.de/?p=366</guid>
		<description><![CDATA[Das gab es doch schon mal - die Einbettung von Schriften über CSS. Richtig, vorgeschlagen wurde diese Möglichkeit schon beim Standard CSS2 aber mit der Fassung CSS2.1 wieder verworfen. Mit CSS3 kehrt <code>font-face</code> zurück und es ziehen alle Browserhersteller mit - Microsoft Internet Exporer, FireFox, Opera und Safari - alle unterstützen mittlerweile die Möglichkeit, eigene Schriften über eine Pfadangabe im CSS auf die Seite einzubinden. Der gestalterischen Freiheit sind damit keine Grenzen mehr gesetzt. Vorbei die Zeiten komplexer "Workarounds", vorbei die Zeiten, in denen man nur zwischen ein paar "websicheren" Schriftarten wählen konnte. Klingt gut, stimmt es auch?]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/images/a.png"  alt="CSS3 basierte Schriftvielfalt" title="CSS3 basierte Schriftvielfalt" class="fl" /><br />
<strong>Das gab es doch schon mal &#8211; die Einbettung von Schriften über CSS. Richtig, vorgeschlagen wurde diese Möglichkeit schon beim Standard <a href="http://www.w3.org/TR/2008/REC-CSS2-20080411/fonts.html#font-descriptions" class="external" target="_blank" title="Font Descriptions and @font-face">CSS2</a> aber mit der Fassung CSS2.1 wieder verworfen. Mit CSS3 kehrt <code>font-face</code> zurück und es ziehen alle Browserhersteller mit &#8211; Microsoft Internet Exporer, FireFox, Opera und Safari &#8211; alle unterstützen mittlerweile die Möglichkeit, eigene Schriften über eine Pfadangabe im CSS auf die Seite einzubinden. Der gestalterischen Freiheit sind damit keine Grenzen mehr gesetzt. Vorbei die Zeiten komplexer &#8220;Workarounds&#8221;, vorbei die Zeiten, in denen man nur zwischen ein paar &#8220;websicheren&#8221; Schriftarten wählen konnte. Klingt gut, stimmt es auch?</strong></p>
<p>In Sachen Schrift war das World Wide Web lange Zeit eine echte Wüste. Es gab nur wenige unterschiedliche <a href="http://www.ampsoft.net/webdesign-l/WindowsMacFonts.html" class="external" target="_blank" title="Common fonts to all versions of Windows &amp; Mac equivalents">Schriftarten</a>, die man verwenden konnte. Was blieb, wenn das Design anderes vorgesehen hatte? </p>
<ul>
<li><strong>Variante 1:</strong> Das &#8220;Ersetzen&#8221; von Text mit Bildern &#8211; wahlweise über eine Vordergrundgrafik (ganz schlecht für Suchmaschinen), oder via <a href="http://css-tricks.com/css-image-replacement/" class="external" target="_blank" title="Nine Techniques for CSS Image Replacement">CSS</a> über eine Kombination von verwendeten Hintergrundgrafiken (die schönen Schriften) und versteckten Inhalten.</li>
<li><strong>Variante 2:</strong> Über den Einsatz von Flash, wie es bspw. die Bibliothek <a href="http://www.mikeindustries.com/blog/sifr/" target="_blank" class="external" title="sIFR">sIFR</a> (Scalable Inman Flash Replacement) macht.</li>
<li><strong>Variante 3:</strong> Über eine Kombination von Canvas und VML, bei der mit Hilfe von JavaScript eine spezielle Schriftdatei gerendert wird, dies ist bspw. bei <a href="http://cufon.shoqolate.com/generate/" target="_blank" class="external" title="Cufon">Cufón</a>, oder <a href="http://typeface.neocracy.org/" class="external" target="_blank" title="Typeface">Typeface</a> der Fall.</li>
</ul>
<h3>Die CSS Syntax</h3>
<p>Alles aufwendige, zeit- und lade-intensive Verfahren. Und jetzt, alles ganz einfach: Quell-Datei im CSS angeben und fertig. Nein, so einfach ist es leider nicht. Auch die schöne neue CSS3 Welt hat noch einige Tücken, wenn es um die Einbettung von Schriften geht. So schaut es von der blanken Theorie zunächst einmal aus:</p>
<div id="wpshdo_36" class="wp-synhighlighter-outer"><div id="wpshdi_36" class="wp-synhighlighter-inner" style="display: block;"><pre class="css" style="font-family:monospace;"><span class="co1">@font-face {</span>
  <span class="kw1">font-family</span><span class="sy0">:</span> derFontName <span class="sy0">;</span>
  src<span class="sy0">:</span> <span class="kw2">url</span><span class="br0">&#40;</span><span class="co2"> /location/of/font/FontDateiName.ttf </span><span class="br0">&#41;</span> format<span class="br0">&#40;</span><span class="st0">&quot;truetype&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span>  
&nbsp;
<span class="coMULTI">/* Nun hat man über den Font-Namen (derFontName) Zugriff,
    und verwendet den Schrifttyp wie andere Schriftarten auch... */</span>
h1 <span class="br0">&#123;</span>
  <span class="kw1">font-family</span><span class="sy0">:</span> derFontName <span class="sy0">,</span> verdana<span class="sy0">,</span> helvetica<span class="sy0">,</span> <span class="kw2">sans-serif</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>Die hier gewählte Syntax entspricht der CSS3 Spezifikation, diese läßt verschiedene Schriftformate zu: &#8220;TrueType&#8221; (ttf), &#8220;opentype&#8221; (ttf,otf), &#8220;TrueType-aat (ttf), &#8220;Embedded OpenType&#8221; (eot) und &#8220;Scalable Vector Graphic&#8221; (svg,svgz). Im Internet Explorer läuft das Ganze ein wenig anders ab (dafür unterstützt der IE die Möglichkeit Schriften einzubetten aber auch schon seit der Version 4.0!). Zunächst: Der IE kennt nur das &#8220;eot&#8221; Format (Embedded OpenType), und weil er nur ein Format kennt, entfällt im IE eben auch die Angabe zum Format. Für den Internet Explorer sähe die gleiche Syntax wie folgt aus.</p>
<div id="wpshdo_37" class="wp-synhighlighter-outer"><div id="wpshdi_37" class="wp-synhighlighter-inner" style="display: block;"><pre class="css" style="font-family:monospace;"><span class="co1">@font-face {</span>
  <span class="kw1">font-family</span><span class="sy0">:</span> derFontName <span class="sy0">;</span>
  src<span class="sy0">:</span> <span class="kw2">url</span><span class="br0">&#40;</span><span class="co2"> /location/of/font/FontDateiName.eof </span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>Eine solche Abweichung ließe sich leicht über <a href="http://www.quirksmode.org/css/condcom.html" target="_blank" class="external" title="CSS - conditional comments">conditional comments</a> realisieren. Wenn solche &#8220;IE-only&#8221; Stylesheets ohnehin schon für ein Projekt genutzt werden, ist das ein absolut gangbarer Weg. Paul Irish schlägt in seinem Artikel <a href="http://paulirish.com/2009/bulletproof-font-face-implementation-syntax/" class="external" target="_blank" title="Bulletproof @font-face syntax">&#8220;Bulletproof @font-face syntax&#8221;</a> eine andere Vorgehensweise vor. Er kombiniert IE und Non-IE Anweisungen in einem CSS-Element:</p>
<div id="wpshdo_38" class="wp-synhighlighter-outer"><div id="wpshdi_38" class="wp-synhighlighter-inner" style="display: block;"><pre class="css" style="font-family:monospace;"><span class="coMULTI">/* Die CSS Syntax aus dem Artikel Bulletproof font-face syntax
    von Paul Irish */</span>
<span class="co1">@font-face {</span>
  <span class="kw1">font-family</span><span class="sy0">:</span> <span class="st0">'Graublau Web'</span><span class="sy0">;</span>
  <span class="coMULTI">/* der IE stoppt hier...*/</span>
  src<span class="sy0">:</span> <span class="kw2">url</span><span class="br0">&#40;</span><span class="st0">'GraublauWeb.eot'</span><span class="br0">&#41;</span><span class="sy0">;</span>
  <span class="coMULTI">/* weil er damit nicht umgehen kann */</span>
  src<span class="sy0">:</span> local<span class="br0">&#40;</span><span class="st0">'☺'</span><span class="br0">&#41;</span><span class="sy0">,</span>
    <span class="kw2">url</span><span class="br0">&#40;</span><span class="st0">'GraublauWeb.ttf'</span><span class="br0">&#41;</span> format<span class="br0">&#40;</span><span class="st0">'truetype'</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>Der Smiley in <code>local('☺')</code> ist kein Fehler, sondern ein Feature. Die <code>local</code> Anweisung erlaubt es Browsern auf dem Clientsystem nachzusehen, ob eine entsprechende Schriftdatei dort vorhanden ist und im Erfolgsfall auf sie zurückzugreifen, anstatt die Typo von der URL zu laden. Das kann Ladezeiten minimieren, birgt aber ein Problem. Paul Irish weist in seinem Artikel darauf hin, dass eine <a href="http://typophile.com/node/63992" class="external" target="_blank" title="Different Fonts Named The Same: Does This Happen Frequently?">lokale Schrift mit gleichem Namen</a> nicht unbedingt der gewünschten (im CSS eingebundenen) Schrift entsprechen muß. Um diesen &#8220;Fehler&#8221; zu umgehen, nutzt er den Smiley &#8211; laut <a href="http://www.adobe.com/devnet/opentype/afdko/topic_feature_file_syntax.html#9.e" class="external" target="_blank" title="OpenType Feature File Specification">Spezifikation</a> schlicht ein ungültiger Font-Name. Ob man in der <code>local</code> Anweisung einen solchen Weg geht und damit auf die Möglichkeit verzichtet, ggf. auf eine bereits installierte Schrift zuzugreifen sollte Fallweise entschieden werden.</p>
<p>Zum konvertieren der Schriften in das eot Format lässt sich das kostenfreie Microsoft Werkzeug <a href="http://www.microsoft.com/typography/WEFT.mspx" class="external" target="_blank" title="Web Embedding Fonts Tool (WEFT)">WEFT</a> verwenden, oder man nutzt einen Online Konverter wie den von <a href="http://www.kirsle.net/wizards/ttf2eot.cgi" title="TTF to EOT Font Converter" class="external" target="_blank">Kirsle.net</a>.</p>
<p>Ob über conditional comments oder über die von Paul Irish vorgeschlagene Variante &#8211; <code>@font-face</code> läßt sich in der Mehrheit der Browser einsetzen, und im Vergleich zu manch anderen CSS-Weichen, die man für die Unterstützung einer großen Browser-Palette eingehen muß, ist die Syntax relativ einfach zu verwenden. Alles halb so wild&#8230;</p>
<h3>Stolpersteine</h3>
<p>Nicht so schnell, es gibt noch einige Auffälligkeiten in Sachen <em>font-face</em>. Eine Reihe von &#8220;Stolpersteinen&#8221; über die man sich im Klaren sein sollte, bevor man <em>font-face</em> einsetzt:</p>
<ul>
<li><strong>Nicht alle Formate funktionieren browserübergreifend</strong>: Auch wenn laut <a href="http://www.w3.org/TR/css3-fonts/#font-resources" class="external" target="_blank" title="CSS Fonts Module Level 3">CSS3 Spezifikation</a> das <em>eot</em> (embedded-opentype) Format unterstützt wird, damit kann nur der Internet Explorer umgehen (siehe bspw. diese <a href="http://forums.mozillazine.org/viewtopic.php?t=390414&#038;sid=b5fdf1753e0d28dd193a60b9f32e61b3" class="external" target="_blank" title="Embedded OpenType (.eot) fonts">Forumsdiskussion</a>). <em>WOFF</em> (Web Open Font Format) hingegen läuft momentan nur im FireFox 3.6.</li>
<li><strong>Konvertierungen können unterbunden werden</strong>: Will man möglichst viele Browser unterstützen, kommt man ohne <em>eot</em> nicht weiter. Konvertierungen von <em>ttf</em> auf <em>eot</em> sind aber nur dann möglich, wenn der Urheber der Schrift dieses nicht unterbindet. Und selbst wenn sich die Schrift konvertieren lässt, kann dieses schon eine Verletzung der Lizenz-Rechte darstellen.</li>
<li><strong>Fehlende Zeichen</strong>: Viele der frei verfügbaren Fonts sind nicht vollständig, es fehlen bspw. Umlaute oder Zahlen. In solchen Fällen greift die alternativ definierte Schrifttype, die Schrift wechselt im schlimmsten Fall also mitten im Wort.</li>
<li><strong>Beachtung der Lizenzrechte</strong>: Was für die Konvertierung in das <em>eot</em> Format gilt, gilt natürlich auch für die Verwendung von <em>ttf</em>-Schriften. Eine interessante Diskussion hierzu findet man bspw. in dem Artikel: &#8220;<a href="http://praegnanz.de/essays/aller" class="external" target="_blank" title="Aller - wirklich großes FreeFont Tennis">Aller &#8211; wirklich großes FreeFont Tennis</a>&#8220;.</li>
<li><strong>Kleinste Syntax-Fehler werden bestraft</strong>: Minimale Abweichungen in der CSS Notation führen zu Fehlern. Lässt man bspw. die Anführungszeichen bei der Local-Anweisung weg, läuft das Ganze im Opera nicht mehr. Nennt man die Microsoft spezifische <em>eot</em> Anweisung nicht zuerst, scheitert der IE. </li>
<li><strong>Schwierigkeiten mit <em>font-style</em></strong>: Bei <a href="http://dev.opera.com/articles/view/seven-web-fonts-showcases/" class="external" target="_blank" title="Seven Web Fonts showcases">dev.opera.com</a> wird darauf hingewiesen, dass die Version 10 einen Bug bei der Implementierung von font-face hat. Fett und Kursiv Variantionen der Schrift können nicht über das CSS Element <code>font-style</code> gesetzt werden.</li>
<li><strong>Das Render-Verhalten von Schrift bei <em>@font-face</em></strong>: Die Qualität der Darstellung von Schrift kann sehr unterschiedlich sein. Das zugrundeliegende Problem steckt tief im System: Unter Windows werden nur die Schriften ordentlich und lesbar auf dem Bildschirm angezeigt, die auch für den Bildschirm optimiert wurden. Diese Optimierung nennt sich <em><a href="http://en.wikipedia.org/wiki/Font_hinting" class="external" title="_blank" title="Font hinting">Hinting</a></em>, ein zeitaufwendiges und mühsames Verfahren bei der Erstellung von Schriften. Deshalb gibt es nur recht wenige Schriften, die ein gutes <em>Hinting</em> beinhalten, und noch viel weniger, die kostenfrei zur Verfügung stehen. Daher sehen viele der derzeit für <code>@font-face</code> zur Verfügung stehenden Schriften im Web unter Windows so miserabel aus. Den Schriften fehlt das <em>Hinting</em>.</li>
<li><strong>Render-Verhalten die Zweite: Schriftenglättung</strong>: Auch bei der Glättung von Schrift fällt das Ergebnis von System zu System zum Teil sehr unterschiedlich aus. Zum einen kann es sein, dass die Kantenglättung gar nicht aktiviert ist (<a href="http://www.microsoft.com/typography/cleartype/tuner/step1.aspx" class="external" title="ClearType Tuner" target="_blank">Cleartype</a> muss unter Windows XP erst aktiviert werden), zum anderen sind die Verfahren von <a href="http://www.joelonsoftware.com/items/2007/06/12.html?hi=joel" class="external" target="_blank" title="Font smoothing, anti-aliasing, and sub-pixel rendering">MAC und Windows</a> unterschiedlich. Abweichungen in der Darstellung sind daher unvermeidlich. </li>
<li><strong>Rendering die Dritte, das Verhalten beim Laden der Seite</strong>: Das Laden einer Schriftdatei kostet Zeit &#8211; wie lange, das ist abhängig von vielen Faktoren &#8211; aber es ist spürbar und manchen Fällen sogar sichtbar. Firefox rendert den Text zunächst mit einem Webstandard-Font. Erst wenn die individuelle Font-Datei vollständig geladen ist, wechselt die Ansicht, die Seite &#8220;flackert&#8221;. Je größer die Unterscheidung zwischen dem nachgeladenen Font und dem websicheren Fallback, desto augenfälliger wird das Ganze. Beim <a href="http://remysharp.com/2009/06/23/safaris-problem-with-font-face/" class="external" target="_blank" title="Safari's problem with @font-face">Webkit </a> hingegen werden die Inhalte erst eingeblendet, wenn die entsprechende Datei geladen ist. <a href="http://www.stevesouders.com/blog/2009/10/13/font-face-and-performance/" class="external" title="High Performance Web Sites:: @font-face and performance" target="_blank">Steve Souders</a> gibt in seinem Blog noch den wichtigen Hinweis, dass im Internet Explorer überhaupt nichts passiert, bis die Schriftdatei fertig geladen ist &#8211; unter der Vorraussetzung, dass es vor der CSS Syntax einen <code>SCRIPT</code> Block gibt. Paul Irish beschreibt in seinem Artikel <a href="http://paulirish.com/2009/fighting-the-font-face-fout/" class="external" target="_blank" title="Fighting the @font-face FOUT">Fighting the @font-face FOUT</a> eine JavaScript basierte Lösung, die das Verhalten vom Webkit nachbildet, um so den &#8220;flash of unstyled text&#8221; (FOUT) zu unterdrücken, eine alternatives Szenario &#8211; in Kombination mit Jquery findet man bei <a href="http://boxcarpress.com/us/blog/2009/11/05/css-font-face-flickering-in-firefox-somewhat-solved/" class="external" title="CSS @font-face flickering in Firefox, somewhat solved" target="_blank">BoxCar Press</a>.</li>
<li><strong>Am Ende hängt es vom Client ab</strong>: Auch wenn alles richtig läuft, sicher sein, dass die Seite nun im gewünschten Layout angezeigt wird, kann man sich nicht. Sowohl im Internet Explorer (Extras &gt; Internet Optionen &gt; Sicherheit &gt; Spezieller Level &gt; Downloads &gt; Font Download) als auch bei FireFox (Extras &gt; Einstellungen &gt; Inhalt &gt; Schriftarten &amp; Farben &gt; Erweitert &gt; Seiten das Verwenden von Schriften erlauben) lässt sich die Unterstützung einfach abschalten bzw. muß eingeschaltet werden. In den Versionen IE7 and IE8 werden eigene Fonts unter der höchsten Sicherheitsstufe nicht angezeigt und im IE6 taucht bei höchster Sicherheitsstufe nach jedem Neuladen der Seite, jedem internen Verweis ein Dialog auf, ob man die Schrift herunterladen will &#8211; ein unerträglicher Zustand.</li>
<li><strong>Richtiger Mime-type</strong>: Auf Windows Servern kann es notwendig sein, die Dateiformate OTF und TTF mit dem korrekten MimeType (application/octet-stream) auszuliefern.</li>
<li><strong>Cross-Domain @font-face</strong>: Eine volle url für die Schrift-Datei lässt sich so ohne weiteres nicht angeben, Firefox erlaubt keinen cross-domain Zugriff bei den Schriften. Wie man diese Sicherheitseinschränkung umgehen kann zeigt der Eintrag von <a href="http://blog.paulstraw.com/post/465136191" class="external" target="_blank" title="You can’t use @font-face in Firefox with a font hosted on a different domain">Paul Straw</a>.</li>
</ul>
<h3>Fazit</h3>
<p><em>font-face</em> gehört die Zukunft und es lässt sich auch heute schon einsetzen. Aber bevor man eine so gestaltete Seite online stellt, ist intensives Testen erforderlich. Die Schwierigkeiten in Sachen Rendering, Schriftenglättung sind so systemspezfisch, dass man mit allem rechnen muß &#8211; da reicht ein Rechner mit einem Betriebssystem zum Testen nicht aus. Ladezeiten abhängige Darstellungsprobleme &#8211; die &#8220;ungestalteten Inhalte&#8221; erfordert wohl auch nach wie vor den Einsatz von JavaScript. Nichts desto trotz ist diese Variante performanter als ein komplett scriptbasierter Ansatz. Mit dem <em>WOFF</em> (Web Open Font Format) kommt zudem ein neues, weiteres Format ins Spiel. Es wird browserübergreifend funktionieren, und schneller geladen werden (WOFF ist kein neues Schriftformat, sondern eine komprimierte Fassung einer TTF oder OTF Datei). Noch läuft <em>WOFF</em> zwar nur im FireFox 3.6, soll aber im Internet Explorer (ab Version 9), Opera und Chrome implementiert werden. Dass der Internet Explorer unter bestimmten Umständen das Laden der Dateien vollständig unterbindet bzw. unmöglich macht, legt die Verwendung von conditional comments nahe &#8211; auch wenn der Ansatz von Paul Irish sicher eleganter ist. Die Verwendung von <code>@font-face</code> ist nicht ganz so unproblematisch, wie es zunächst den Anschein hat. Die Tage der ewig gleichen Schriftlayouts sind dennoch gezählt. Wie schnell und wie weit das gehen wird, hängt sicher auch von den jeweiligen Lizenzen und damit verbundenen Kosten ab, aber auch auf dem &#8220;<a href="http://www.theleagueofmoveabletype.com/" target="_blank" class="external" title="The League of Moveable Type">freien Markt</a>&#8221; lassen sich immer mehr Schriften finden. Wie bei vielen neuen Techniken ist Vorsicht geboten, doch der Mehrwert (Suchmaschinen Optimierung, geringe bis gar keine Scriptlast, selektierbarer, skalierbarer und druckbarer Text) gegenüber den anderen Alternativen (Flash, Grafiken, Canvas+VML) spricht für den Einsatz von <code>@font-face</code>.</p>
<h3>Weiterführende Artikel</h3>
<ul>
<li><strong><a href="http://www.alistapart.com/articles/real-web-type-in-real-web-context/" class="external" target="_blank" title="Real Web Type in Real Web Context">Real Web Type in Real Web Context</a></strong>: Der umfassende Einstieg in das Thema:&#8221;<em>I need to know how my type renders on screens, in web browsers</em>&#8220;.</li>
<li><strong><a href="http://helloschema.com/code/testing-cufon-font-face-and-typekit" class="external" target="_blank" title="Testing Cufón, @font-face, and Typekit">Testing Cufón, @font-face, and Typekit</a></strong>: Ausführlicher Vergleichstest zwischen den scriptbasierten Lösungen Cufón und Typekit mit der CSS basierten @font-face Lösung.</li>
<li><strong><a href="http://paulirish.com/2009/fighting-the-font-face-fout/" class="external" target="_blank" title="Fighting the @font-face FOUT">Fighting the @font-face FOUT</a></strong>: Das Problem mit den &#8220;ungestalteten Inhalten, FOUT steht für: flash of unstyled text. Und zum gleichen Thema: <strong><a href="http://www.stevesouders.com/blog/2009/10/13/font-face-and-performance/" class="external" title="High Performance Web Sites:: @font-face and performance" target="_blank">@font-face and performance</a></strong></li>
<li><strong><a href="http://sixrevisions.com/css/font-face-guide/" title="The Essential Guide to @font-face">The Essential Guide to @font-face</a></strong>: Der Titel ist Programm, umfassender Wegweiser zum Thema von Six Revisions.</li>
<li><strong><a href="http://jontangerine.com/log/2008/10/font-face-in-ie-making-web-fonts-work" title="@font-face in IE: Making Web Fonts Work" class="external" target="_blank">@font-face in IE: Making Web Fonts Work</a></strong>: Jon Tan&#8217;s (einer der Konzepter von <a href="http://fontdeck.com/" class="external" target="_blank" title="Fontdeck">Fontdeck</a>) wegweisender Artikel zum Thema aus dem Jahre 2008.</li>
<li><strong><a href="http://informationarchitects.jp/the-web-is-all-about-typography-period/" title="Web Design is 95% Typography" class="external" target="_blank">Web Design is 95% Typography</a></strong>: Ein Artikel nicht zur Technik, sondern über das &#8220;Warum&#8221;, Typografie im World Wide Web. Und zur gleichen Thematik: <strong><a href="http://webtypography.net/toc/" title="The Elements of Typographic Style Applied to the Web" class="external" target="_blank">The Elements of Typographic Style Applied to the Web</a></strong>.</li>
<li><strong><a href="http://code.google.com/intl/de-DE/apis/webfonts/docs/webfont_loader.html" target="_blank" class="external" title="Google Font Api: WebFont Loader">Google WebFont Loader</a></strong>: Recht neu, und ein weitere Variante, um &#8220;flash of unstyled text&#8221; zu unterbinden.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.am530.de/2010/06/font-face-css3-basierte-schriftvielfalt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Plazes deplatziert?</title>
		<link>http://www.am530.de/2010/06/plazes-deplatziert/</link>
		<comments>http://www.am530.de/2010/06/plazes-deplatziert/#comments</comments>
		<pubDate>Mon, 14 Jun 2010 10:22:47 +0000</pubDate>
		<dc:creator>Axel Michel</dc:creator>
				<category><![CDATA[Webtrends]]></category>
		<category><![CDATA[Plazes]]></category>

		<guid isPermaLink="false">http://www.am530.de/?p=355</guid>
		<description><![CDATA[Plazes startete 2004 als der erste "Location Based Service", die Idee: Menschen und Orte miteinander zu verbinden. Das gelang wahlweise über die Online Plattform oder einem kleinem Programm, dem <strong>Plazer</strong>, der sich bis heute auf meinem Laptop befindet. 2006 selbst an einem der "Relaunches" von Plazes beteiligt, habe ich über eine ganze Weile am Rande mitverfolgt, wie sich Plazes weiter entwickelte und wuchs, bis Plazes 2008 von Nokia gekauft wurde. Und heute - wie steht es um die einst erfolgreiche  "Web 2.0" Plattform?]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/images/plazes-logo.gif"  alt="Plazes" title="Plazes" class="fl" /><br />
<strong><a href="http://www.plazes.com" target="_blank" class="external" title="Plazes">Plazes</a> startete 2004 als der erste &#8220;Location Based Service&#8221;, die Idee: Menschen und Orte miteinander zu verbinden. Das gelang wahlweise über die Online Plattform oder einem kleinem Programm, dem <strong>Plazer</strong>, der sich bis heute auf meinem Laptop befindet. 2006 selbst an einem der &#8220;Relaunches&#8221; von Plazes beteiligt, habe ich über eine ganze Weile am Rande mitverfolgt, wie sich Plazes weiter entwickelte und wuchs, bis Plazes 2008 von Nokia gekauft wurde. Und heute &#8211; wie steht es um die einst erfolgreiche  &#8220;Web 2.0&#8243; Plattform?</strong></p>
<p>Die Übernahme durch Nokia sahen die <a href="http://www.stilbuero.de/2008/06/23/plazes-acquired-by-nokia/" class="external" target="_blank" title="Klaus Hartl &#8211; Stilbüro : Plazes Acquired By Nokia">einen</a> als Grund zum Feiern, bei <a href="http://www.spreeblick.com/2008/06/23/nokia-kauft-plazes/" class="external" target="_blank" title="Nokia kauft Plazes | Spreeblick">anderen</a> klang schon damals wesentlich mehr Skepsis mit. Verfolgt man die Blogs und Nachrichten rund um Plazes seit der Übernahme, dann fällt auf, dass es merklich stiller und die Plattform geworden ist. Besser gesagt, man findet seit Mitte 2009 eigentlich gar keine News mehr. Der Plazes eigene Blog ist abgeschaltet, die News auf der Startseite von Plazes informiert noch immer über den Kauf durch Nokia. Da stellt sich einem doch die Frage, ob die Plazes Plattform überhaupt noch aktiv ist.</p>
<p>Sicher, grundsätzlich funktioniert der Service noch und zugegeben ich nutze ihn nur sporadisch, damit reicht es für meine Zwecke, aber es gibt einige zum Teil gravierende Mängel: </p>
<ul>
<li>Bilder zu Orten hochzuladen ist mir nicht möglich, stattdessen ein Flash-Fehler.</li>
<li>Einen neuen Ort über den Plazer hinzufügen, nur bedingt &#8211; die Daten werden nicht richtig übernommen.</li>
<li>Die Zeitleiste im Profil &#8211; nur wenn man angemeldet ist, anderenfalls gibt es über den entsprechenden Ajax-Request einen 404 Fehler.</li>
</ul>
<p>Eine Anfrage beim Support &#8211; keine Reaktion. Eine Anfrage bei den Gründern, wie es um die Plattform steht &#8211; keine Antwort. Eine lebendige Community? An vielen Tagen bin ich der einzige User online im Umkreis von 15 oder mehr Kilometern, und das in der (ehemaligen) Heimatstadt von Plazes. </p>
<blockquote><p>Nokia has acquired the services provided through plazes.com. Together with the Plazes team, Nokia will work on further improving and developing this service for you. See more on location based services at www.maps.nokia.com.</p></blockquote>
<p>Welchen Focus Nokia hat(te), als es Plazes übernahm, das Vorantreiben der Online Plattform Plazes gehört anscheinend nicht dazu. Schaut man unter www.maps.nokia.com mal nach, dann führt es einem u.a. zu der Seite <a href="http://maps.ovi.com/" target="_blank" class="external" title="Ovi Karten">maps.ovi.com</a>. Vielleicht hat der Wissens- und Techniktransfer in diese Richtung stattgefunden, zu Vergleichen sind die beiden Anwendungen aber nicht. </p>
<p>Am Ende haben die Skeptiker wohl doch Recht behalten, die meinten, dass es Plazes an einem eindeutigen Konzept mangelte: <em>&#8220;&#8230;hatte ich den Eindruck, Plazes würde in alle möglichen Richtungen ballern, ohne wirklich zu treffen.&#8221;</em>, schreibt <a href="http://www.spreeblick.com/2008/06/23/nokia-kauft-plazes/" class="external" target="_blank" title="Nokia kauft Plazes | Spreeblick">Johnny Haeusler</a> in seinem bereits weiter oben erwähnten Artikel. Sechs Jahre  nach dem Start von Plazes liegt die Plattform in ihrer alten Form anscheinend danieder, andere Services sind zum Teil recht erfolgreich auf den Zug der &#8220;Location Based Services&#8221; aufgesprungen. Claudio Schapsis liefert 2009 in seinem Blog eine Liste von <a href="http://bdnooz.com/lbsn-location-based-social-networking-links/" target="_blank" class="external" title="Location Based Social Networks Links - A list of Location Based Social Networks compiled by Claudio Schapsis">60 verschiedenen Anbietern</a>, die noch nicht einmal vollständig ist. Auch hier ist Plazes noch gelistet, aber in dieser Form findet es kaum noch Zuspruch. Wie frustrierend das für manche ist, kann man anhand einer <a href="http://getsatisfaction.com/plazes/topics/cannot_add_images_to_plazes_any_more" target="_blank" class="external" title="Cannot add images to Plazes any more">Fehler-Anfrage bei Plazes</a> ganz gut nachvollziehen. Manchmal wäre es wohl besser, den Anwendern ein wenig genauer zu kommunizieren, wo die Reise eigentlich hingehen soll. So bleibt mir, wie vielen anderen auch, nur der Weg einen anderen Anbieter zu nutzen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.am530.de/2010/06/plazes-deplatziert/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

