<?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>Aktuelle Artikel auf dNaber.de</title>
	<atom:link href="http://dnaber.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://dnaber.de</link>
	<description>Die zehn neuesten Beiträge aus dem Blog von David Naber.</description>
	<lastBuildDate>Wed, 30 Jun 2010 10:11:48 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>daily</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Kampf dem Spam</title>
		<link>http://dnaber.de/blog/2010/kampf-dem-spam/</link>
		<comments>http://dnaber.de/blog/2010/kampf-dem-spam/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 14:07:44 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Webdesign]]></category>

		<guid isPermaLink="false">http://dnaber.de/?p=1201</guid>
		<description><![CDATA[Wie ich automatisiertem Spam begegne und warum ich dazu keine <abbr title="Completely Automated Public Turing test to tell Computers and Humans Apart" lang="en">CAPTCHAS</abbr> und keine zentralen schwarzen Listen benutze.]]></description>
			<content:encoded><![CDATA[<p>Was unterscheidet eine Maschine vom Menschen? Scheinbar ist die Antwort schnell gefunden: der Eine kann Gefühle empfinden, der Andere nicht, der Andere ist dumm der Eine… lassen wir das. Leider ist diese Frage, gerade wenn es darum geht Besucher einer Website von einem automatisierten Programm – einem Bot – zu unterscheiden, alles andere als leicht zu beantworten. Das wird einem spätestens dann leidlich bewusst, wenn man z.B. ein Kontaktformular oder Blog mit Kommentarfunktion ins Internet stellt. Früher oder später kommen E-Mails bzw. Kommentare herein, die so gar nicht zum Thema passen, wenn sie denn überhaupt sprachliche Inhalte und nicht nur unzählige Links und Kauderwelsch enthalten. Je populärer dabei das eingesetzte System (z.B. WordPress) desto mehr scheint man im Fokus der Spammer zu liegen. Es muss heutzutage Kinderleicht sein, Bots zu programmieren, die auf ihrem Streifzug durch das Netz sämtliche Formulare mit Links zu Glücksspielseiten und Blauen-Pillen-Händlern zupflastern. Es wäre wohl zu viel verlangt, würden diese Programme ihre Intention in die Browserkennung schreiben. Also müssen andere Möglichkeiten gefunden werden, um dem Spam Herr zu werden.</p>
<h3><abbr title="Completely Automated Public Turing test to tell Computers and Humans Apart" lang="en">CAPTCHAS</abbr></h3>
<div id="attachment_1225" class="wp-caption aligncenter" style="width: 323px"><img class="size-full wp-image-1225" title="Ein unleserliches Captcha" src="http://dnaber.de/wp-content/uploads/captcha.jpg" alt="" width="313" height="126" /><p class="wp-caption-text">Wer kann&#39;s lesen?</p></div>
<p>Die wohl zuverlässigste Methode um Spam-Bots zu behindern und echte Besucher auf lange Zeit zu vergraulen nennt sich <a href="http://de.wikipedia.org/wiki/CAPTCHA"><abbr title="Completely Automated Public Turing test to tell Computers and Humans Apart" lang="en">CAPTCHAS</abbr></a>. Eine in eine Grafik eingebettete Zeichenfolge soll vom Benutzer erkannt und in ein Feld eingegeben werden. Der Vorteil dieser leider sehr verbreiteten Methode besteht lediglich darin, dass der Seitenbetreiber diesen Schutz sehr schnell in seine Seite integrieren kann. Aus der großen Popularität resultiert aber eben auch eine zunehmende Zahl an Programmen, die diese Bilder auf unterschiedlichen Wegen entschlüsseln oder umgehen können. Unnötig zu erwähnen, dass solche Lösungen nicht nur Barrieren aufbauen, sondern auch nerven. Nur wenig besser (aus Sicht der Zugänglichkeit) sind in Klartext formulierte Logikfragen oder Rechenaufgaben, deren Antwort in ein Feld geschrieben wird. (»Warum muss ich hier eingeben, wieviel Beine ein vierbeiniger Tisch hat?«)</p>
<p>Ich halte prinzipiell von Methoden Abstand, in denen sich der Benutzer als Mensch beweisen muss. Die eingangs gestellte Frage sollte man auch so stellen und nicht anders herum!</p>
<h3>(Zentrale) schwarze Listen</h3>
<p>Ein anderer Ansatz zur automatischen Erkennung von unerwünschtem Spam ist das Anlegen schwarzer Listen um bestimmte Regelmäßigkeiten in Spamkommentaren zu dokumentieren und jeden Kommentar gegen diese Listen abgleichen. Je größer dabei die betrachtete Menge der Kommentare, desto genauer und umfangreicher werden solche Listen. Zentrale Filterangebote wie <a href="http://de.wikipedia.org/wiki/Akismet">Akismet</a> werten alle Kommentare der teilnehmenden Websites aus und erstellen so effektive Filter, von denen alle Teilnehmer profitieren. Doch ist mir bei diesem Gedanken etwas unwohl, da die Formulardaten erstmal eine Reise um die halbe Welt antreten um durch die zentralen Server des Unternehmens zu laufen. Dazu kommt, dass nicht behobene falsch-positive Spamerkennungen einen unbedarften Kommentator gleich auf unzähligen anderen Websites ausschließt.</p>
<p>So effektiv und komfortabel Akismet auch sein mag, hier kommt es vorerst nicht zum Einsatz.</p>
<h3>Handarbeit</h3>
<p>Vorgefertigte Lösungen wie CAPTCHA-Dienste oder Akismet bedienen auch eines: die Bequemlichkeit dauergestresster Webmaster. Allerdings sind beide Lösungen nervig und/oder datenschutzrechtlich zumindest bedenklich. Dennoch habe ich keine Lust täglich zig Spamkommentare zu löschen. Also habe ich mir mit etwas Handarbeit ein eigenes Plugins gezimmert, in dem ich unterschiedliche Methoden zur Erkennung von Bots anwende. Dabei gehe ich von selbst aufgestellten, oder allgemein bekannten Thesen aus um daraus Filtermethoden abzuleiten.</p>
<ol>
<li>
<h4>Bots sind dumm</h4>
<p>oder zumindest häufig auf populäre Systeme zugeschnitten. Bei komplexeren Formularen mit mehreren obligatorischen Angaben kann eine Kontrolle der einzelnen Angaben auf Korrektheit schon eine menge Unsinn abfangen. Allerdings sollte man die Filter nicht zu streng auslegen. Eine URL muss nicht zwangsläufig mit ›http://‹ beginnen. Ein Name hingegen endet nur äußerst selten auf ›/index.html‹. Fakultative Felder sollten leer bleiben (Spambots können sich oftmals nur schwer bremsen und füllen gerne alles aus), oder eben den Ansprüchen der Logik genügen: Buchstaben z.B. haben in einer Telefonnummer oder Postleitzahl nichts zu suchen. Wem das zu heikel ist, der sucht nach bestimmten Zeichenketten (›http://‹), man kann sich ja mal vertippen.</p>
<p>Auf vielen WordPress-basierten Seiten ist die Angabe eines Namens und der E-Mailadresse gefordert, wenn man einen Kommentar hinterlassen will. Wahrscheinlich können die Spamprogramme deshalb die Namens-Attribute der Input-Felder lesen. Wir machen es ihnen aber auch einfach: geschätzte 99,9% aller WordPress-Installationen verwenden für die Namens-Attribute ›author‹, ›email‹, ›url‹ und ›comment‹. Ich habe nicht schlecht gestaunt, als das Spamaufkommen hier um gut 90% zurückging, nur weil ich diese Attributwerte durch zufällig generierte Zeichenketten wie ›df4928j‹ ersetzt habe. Die Bots hier verstehen offenbar noch keine Labels.</li>
<li>
<h4>Bots sind schnell</h4>
<p>Auf dieser Seite beträgt die Zeitspanne zwischen Aufruf des Artikels und Eintrag des Kommentars bei automatisiertem Spam im Durchschnitt 2,5 Sekunden. Selbst wenn ein Mensch den gesamten Artikel schon kennt, und einen vorbereiteten Kommentar einfach nur einfügt und absendet, dürfte er bedeutend länger brauchen. Momentan habe ich die Grenze bei 6 Sekunden gesetzt.</li>
<li>
<h4>Bots lesen keine Stylesheets</h4>
<p>Diese Theorie kann man sich zu nutze machen um eine Falle zu platzieren. Ein zufällig platziertes weiteres Formularfeld wird per Stylesheet für alle Parteien aus dem Sichtbereich geschoben bzw. gar nicht mehr angezeigt. Ist das Feld dennoch ausgefüllt, war mit sehr hoher Wahrscheinlichkeit ein Bot am Werk. Wer auf Nummer sicher gehen will, kann hier auch eine Logikfrage platzieren, für den seltenen Fall, dass ein Textbrowser verwendet wird, der kein CSS interpretiert.</li>
</ol>
<p>Die Kombination dieser Methoden klappt momentan so gut, dass ich auf die Angabe von Name und E-Mail inzwischen verzichten kann und Kommentare auch sofort eingetragen werden können, ohne von mir überprüft zu werden. Schlägt einer der Filter an, wird der Kommentar nicht gänzlich gelöscht, sondern nur als Spam markiert. Notfalls hole ich sie von Hand wieder zurück.</p>
<p>Auf statischen Seiten habe ich auf diesem Weg sehr gute Erfahrungen gemacht. Die Umsetzung als WordPress-Plugin ist noch in der Testphase. Wenn irgendwo Probleme beim Kommentieren auftreten, würde ich mich über eine kurze Problembeschreibung per E-Mail sehr freuen.</p>
<p>Mir ist bewusst, dass auf einer vergleichsweise kleinen Seite wie dieser andere Bedingungen herrschen als auf den großen Blogs und dass der Kampf gegen automatisierten Spam wahrscheinlich bis zum jüngsten Tag andauern wird, da sich auch Spambots weiter entwickeln. Solang ich aber mit etwas Handarbeit auf CAPTCHAS und Akismet verzichten kann, werde ich es auch tun.</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2010/kampf-dem-spam/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Frühjahrsputz</title>
		<link>http://dnaber.de/blog/2010/fruehjahrsputz/</link>
		<comments>http://dnaber.de/blog/2010/fruehjahrsputz/#comments</comments>
		<pubDate>Sat, 27 Mar 2010 21:57:05 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[In eigener Sache]]></category>

		<guid isPermaLink="false">http://dnaber.de/?p=1175</guid>
		<description><![CDATA[Frühjahrsputz auf dNaber.de: Durchbrüche, neue Wände, viel Farbe und ein solider CMS-Kitt.]]></description>
			<content:encoded><![CDATA[<p>Wie ihr vieleicht bemerkt haben werdet, habe ich hier ein wenig die Möbel gerückt. Gestalterisch ist eigentlich nur die Bannergrafik geblieben. Blog und Website sind nun nach langem Überlegen nicht mehr getrennt und insgesamt wurde Inhaltlich grob entrümpelt.</p>
<p>Im Großen und Ganzen bin ich ganz zufrieden mit dem Ergebnis. Wenn hier und da noch ein paar Macken auftreten, die werden sicher bald behoben sein. Falls ihr irgendwo noch über rumliegende Farbeimer stolpert, würde ich mich über einen kurzen Hinweis freuen.</p>
<p>Und wie findest Du, lieber Leser, das neue Outfit?</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2010/fruehjahrsputz/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Wordpress: Aufzählung der Kategorien und Tags im Satz</title>
		<link>http://dnaber.de/blog/2010/aufzaehlung-in-ganzen-saetzen/</link>
		<comments>http://dnaber.de/blog/2010/aufzaehlung-in-ganzen-saetzen/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 20:24:54 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://blog.dnaber.de/?p=1107</guid>
		<description><![CDATA[Durch eine kleine Funktion werden Wordpress-Kategorien und Tags grammatikalisch korrekt durch Kommas und abschließend durch ein „und“ getrennt.]]></description>
			<content:encoded><![CDATA[<p>Die Template-Tags <a href="" rel="external"><code>the_category()</code></a> und <a href="" rel="external"><code>the_tags()</code></a> geben die Kateorien und Stichworte eines Artikels wahlweise als eine ungeordnete Liste, oder durch einen Seperator getrennt aus. Für eine lose Aufzählung wäre ein naheliegendes Trennzeichen das Komma; der Funktionsaufruf dazu schaut so aus: <code>the_tags(', ')</code>.  Das Ergebnis wäre eine Aufzählung aller Stichworte, die durch ein Komma getrennt sind.</p>
<p>Für diesen Beitrag würde das so aussehen: <a href="http://blog.dnaber.de/stichwort/php/" rel="tag">PHP</a>, <a href="http://blog.dnaber.de/stichwort/wordpress/" rel="tag">Wordpress</a>. Kurz und knackig, aber ein ordentlicher Satz lässt sich daraus nicht formulieren, dazu fehlt das „und“ zwischen den beiden (letzten) Stichworten.</p>
<p>Um solche Aufzählungen in einen vernünftigen Satz einbinden zu können habe ich mir folgenden Code-Schnipsel in die functions.php des Themes geschrieben:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/*
*  Ersetzt das letzte Komma durch ein ' und ' 
*/</span>
<span style="color: #000000; font-weight: bold;">function</span> mytheme_tag_list<span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//wenn mehr als ein link vorhanden ist</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">substr_count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'&lt;a href=&quot;'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000088;">$pattern</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'#&lt;/a&gt;\s*,\s*&lt;a ([^&gt;]*)&gt;([^&lt;]*)&lt;/a&gt;\s?$#'</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$replace</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'&lt;/a&gt; und &lt;a $1&gt;$2&lt;/a&gt;'</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pattern</span><span style="color: #339933;">,</span><span style="color: #000088;">$replace</span><span style="color: #339933;">,</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$a</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'the_category'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'mytheme_tag_list'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'the_tags'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'mytheme_tag_list'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>In dieser Form greift der reguläre Ausdruck nur Auflistungen heraus, die durch ein Komma (und evtl. Whitespace) getrennt sind. Aufzählungen ohne oder mit anderen Trennzeichen bleiben unberührt. </p>
<p>Nun kann ich formulieren, dass dieser Beitrag die Themen <a href="http://blog.dnaber.de/stichwort/php/" rel="tag">PHP</a> und <a href="http://blog.dnaber.de/stichwort/wordpress/" rel="tag">Wordpress</a> behandelt.</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2010/aufzaehlung-in-ganzen-saetzen/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Kontaktformulare ohne Zeichensalat</title>
		<link>http://dnaber.de/blog/2010/kontaktformulare-ohne-zeichensalat/</link>
		<comments>http://dnaber.de/blog/2010/kontaktformulare-ohne-zeichensalat/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 15:55:45 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zeichenkodierung]]></category>

		<guid isPermaLink="false">http://blog.dnaber.de/?p=955</guid>
		<description><![CDATA[Kontaktformulare bereiten nicht selten Probleme mit Umlauten oder Sonderzeichen. Dabei ist die Lösung recht einfach: die verwendete Zeichenkodierung wird in den E-Mail-Header geschrieben.]]></description>
			<content:encoded><![CDATA[<p>Sie sind wohl die am häufigsten anzutreffende Art von Formularen im Web. Man muss kein großer Programmierer sein um selbst ein Kontaktformular zu schreiben, oder man bedient sich der vielen fertigen Skripte, die man im Netz findet. Problematisch wird es, wenn in der E-Mail Umlaute und Sonderzeichen zu kryptischen Zeichen oder fetten Fragezeichen verkommen. Dann liegt ein Verständigungsproblem vor, das aber leicht behoben werden kann.<span id="more-955"></span></p>
<p>Um in PHP eine E-Mail zu versenden reicht theoretisch folgendes Codebeispiel aus:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">mail</span><span style="color: #009900;">&#40;</span>
         <span style="color: #0000ff;">'mustermann@mail.de'</span><span style="color: #339933;">,</span>
         <span style="color: #0000ff;">'Urlaubsgrüße'</span><span style="color: #339933;">,</span>
         <span style="color: #0000ff;">'Hallo Max, Urlaub an der Ostsee ist toll!'</span>
       <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Der Funktion <a rel="external" href="http://de2.php.net/manual/de/function.mail.php"><code>mail()</code></a> werden drei Parameter übergeben: Empfänger, Betreff und der eigentliche Nachrichtentext. Nun besteht eine E-Mail nicht nur aus diesen drei Informationen. Genauer genommen, setzt sich eine E-Mail, ähnlich wie ein HTML-Dokument aus zwei Teilen zusammen: einem Kopf (Head) und einem Körper (Body). Im Head(er) werden wichtige Informationen über die E-Mail mit gesendet, unter anderem auch die verwendete <a rel="external" href="http://toscho.de/2008/grundlagen-zeichenkodierung/">Zeichenkodierung</a>. Wenn die Zeichenkodierung nicht angegeben wird, muss der Empfänger „raten“, rät er falsch kommt es zur fehlerhaften Darstellung von Umlauten und Sonderzeichen.</p>
<p>Für die Lösung des Problems sind zwei Schritte nötig:</p>
<ol>
<li>muss dafür gesorgt sein, dass die Daten des Formulars in einem bestimmten Zeichenkodierung zum Server gesendet werden und</li>
<li>muss diese Zeichenkodierung in der E-Mail <em>angegeben</em> werden.</li>
</ol>
<h3>Die Zeichenkodierung des Formulars</h3>
<p>Der Inhalt eines HTML-Formulars wird in der Zeichenkodierung gesendet, in der auch das HTML-Dokument an den Browser gesendet wird. Die zuverlässigste Art, den Browser über die Zeichenkodierung zu informieren ist das entsprechende HTTP-Headerfeld „Content-Type“. Auf dem Apache Webserver geht das recht unkompliziert, in dem man im Wurzelverzeichnis seiner Website die .htaccess-Datei um folgende Zeile ergänzt:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">AddDefaultCharset</span> UTF-<span style="color: #ff0000;">8</span></pre></div></div>

<p>Diese Methode setzt voraus, dass auch alle Text-Dokumente (Skripte, Stylesheets) in dieser Zeichenkodierung vorliegen.</p>
<p>Ob die Zeichenkodierung im HTTP-Header einer Seite gesendet wird, kann man <a rel="external" href="http://web-sniffer.net/">online testen</a>, oder z.B. in Firefox mit <a rel="external" href="https://addons.mozilla.org/en-US/firefox/addon/6647">verschiedenen</a> <a rel="external" href="https://addons.mozilla.org/de/firefox/addon/1843">Plugins</a>.</p>
<p>Darüber hinaus kann es nicht schaden, die Zeichenkodierung zusätzlich als Meta-Element in den Quelltext des HTML-Dokumentes zu übernehmen:</p>
<p>Eine weitere Möglichkeit bestünde darin, das Formular um das Attribut „accept-charset“ zu erweitern.</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;form accept-charset=&quot;utf-8&quot;&gt;
&lt;/form&gt;</pre></div></div>

<p>In der Regel reicht es jedoch aus, die Zeichenkodierung im HTTP-Header zu senden.</p>
<h3>E-Mails versenden mit Köpfchen</h3>
<p>Der <a rel="external" href="http://de.wikipedia.org/wiki/Header_%28E-Mail%29">E-Mail Header</a>, den die Funktion <code>mail()</code> generiert umfasst nur die nötigsten Informationen und  kann durch einen weiteren Parameter beeinflusst werden. Dabei werden die einzelnen Feld-Wert-Paare durch einen Zeilenumbruch (\r\n) voneinander getrennt. Die Zeichenkodierung wird im Feld „Content-Type“ angegeben. Mit dem „MIME-Version“ Feld wird gesagt, dass die E-Mail <a rel="external" href="http://de.wikipedia.org/wiki/Multipurpose_Internet_Mail_Extensions">MIME formatiert</a> vorliegt.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$email_header</span>  <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;MIME-Version: 1.0 <span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$email_header</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;Content-Type: text/plain;charset=UTF-8 <span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Die Variable <code>$email_header</code> wird als vierter Parameter der Funktion mail() übergeben:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//E-Mail senden</span>
<span style="color: #990000;">mail</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$address</span><span style="color: #339933;">,</span> <span style="color: #000088;">$subject</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #339933;">,</span> <span style="color: #000088;">$email_header</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><del>Damit hat sich der Zeichensalat erledigt.</del> So lange im E-Mailheader keine Sonderzeichen vorkommen, sind Unicodezeichen im Text der E-Mail ab jetzt kein Problem mehr. Wenn aber z.B. der Name und die E-Mailadresse des Absenders in den Header aufgenommen werden, oder der Betreff im Kontaktformular vom Benutzer eingegeben werden kann, dann muss man davon ausgehen, das nicht nur ASCII-Zeichen in den Header gelangen. Aber nur diese sind dort erlaubt.</p>
<p>In dem Fall müssen die Zeichenketten für den Header kodiert werden. Dazu gibt es zwei Möglichkeiten: <a rel="external" href="http://de.wikipedia.org/wiki/Base64">Base64</a> und <a rel="external" href="http://de.wikipedia.org/wiki/Quoted-printable">Quoted-printable</a>. Die kodierten Abschnitte werden von der Zeichenfolge <code>=?utf-8?q?</code> eingeleitet und von ?= beendet. Der einleitende Tag gibt die Ursprüngliche Zeichenkodierung (hier UFT-8) und die Kodierungsmethode (q für Quoted-printalbe und b für Base64) an.</p>
<p>Für die Kodierung bedient man sich der PHP-Funktionen <a rel="external" href="http://de2.php.net/manual/de/function.base64-encode.php"><code>base64_encode()</code></a> für Base64 bzw. <a rel="external" href="http://de3.php.net/manual/de/function.imap-8bit.php"><code>imap_8bit()</code></a> oder <a rel="external" href="http://de3.php.net/manual/de/function.quoted-printable-encode.php"><code>quoted_printable_encode()</code></a> für die Quoted-printable Methode. Allerdings ist die <code>Funktion imap_8bit()</code> an die IMAP-Extention geknüpft und <code>quoted_printable_encode()</code> gibt es erst seit PHP Version 5.3.</p>
<p>Der Betreff der E-Mail würde wie folgt kodiert werden:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$subject</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'subject'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Quoted-printable</span>
&nbsp;
<span style="color: #000088;">$subject</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'=?utf-8?q?'</span><span style="color: #339933;">.</span>imab_8bit<span style="color: #009900;">&#40;</span><span style="color: #000088;">$subject</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'?='</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//alternativ: Base64</span>
&nbsp;
<span style="color: #000088;">$subject</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'=?utf-8?b?.base64_encode($subject).'</span>?<span style="color: #339933;">=</span><span style="color: #0000ff;">';
&nbsp;
//senden
&nbsp;
mail($address, $subject, $content, $email_header);</span></pre></div></div>

<p>Theoretisch sind beide Varianten legitim, in der Praxis scheinen einige Freemailanbieter noch <a href="http://www.walkingsmall.de/2009/04/07/email-clients-freemailer-und-utf-8/" rel="external">Probleme mit UTF-8</a> in der ein oder anderen Methode zu haben. Die Web.de Webmail-Oberfläche z.B. zeigte die dekodierten Betreffzeilen in der Übersicht an, in der Einzelansicht allerdings nicht. Thunderbird und auch Outlook (mobile Version) haben hingegen keine Probleme mit der Dekodierung.</p>
<p>Spätestens wenn die Komplexität der zu sendenene E-Mails über ein simples Kontaktformular hinaus geht, empfielt es sich, vorgefertigte Klassen wie <a rel="external" href="http://phpmailer.worxware.com/">phpmailer</a> zu verwenden. Notwendige Kodierungen werden damit intern abgehandelt und die E-Mail automatisch zusammengefügt.</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2010/kontaktformulare-ohne-zeichensalat/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Wehr dich, Dresden!</title>
		<link>http://dnaber.de/blog/2010/wehr-dich-dresden/</link>
		<comments>http://dnaber.de/blog/2010/wehr-dich-dresden/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 17:20:32 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Dresden]]></category>
		<category><![CDATA[Demokratie]]></category>
		<category><![CDATA[Gesellschaft]]></category>

		<guid isPermaLink="false">http://blog.dnaber.de/?p=974</guid>
		<description><![CDATA[Auch dieses Jahr kündigt sich ein Großaufmarsch von Neonazis in Dresden an. Ich stelle mir die Frage, wie man als Verfechter von Grundrechten und Freiheit am besten damit umgehen sollte. ]]></description>
			<content:encoded><![CDATA[<p>Es sind noch knapp zwei Wochen, dann jährt sich der Luftangriff auf Dresden zum 65sten mal. Eine ganze Generation liegt zwischen einem tragischen Ereignis am Ende des zweiten Weltkrieges und heute. Dennoch ist dieses Datum weit über die Grenzen der Stadt hinaus ein <a rel="external" href="http://www.taz.de/1/politik/deutschland/artikel/1/buendnis-gegen-nazis-blockiert/">Begriff </a>und es wird <a rel="external" href="http://www.spreeblick.com/2010/01/22/zieht-die-piratenpartei-sachsen-ihre-unterstutzung-fur-die-demo-nazifrei-dresden-stellt-sich-quer-zuruck/">darüber</a> d<a rel="external" href="http://www.netzpolitik.org/2010/lka-sachsen-gegen-dresden-nazifrei-de/">iskutiert</a>, ob und wie weit man gehen darf um die angekündigte Nazi-Demonstration zu behindern.<span id="more-974"></span></p>
<p>Die Frage die ich aus den Artikeln und Kommentaren lese: „Darf man erklärte Feinde der Demokratie mit undemokratischen Mitteln bekämpfen?“</p>
<div id="attachment_1074" class="wp-caption aligncenter" style="width: 310px"><a class="highslide" href="http://blog.dnaber.de/wp-content/uploads/2010/01/freiheit_der_anderen.jpg"><img class="size-thumbnail wp-image-1074 " title="freiheit_der_anderen" src="http://blog.dnaber.de/wp-content/uploads/2010/01/freiheit_der_anderen-300x192.jpg" alt="Freiheit ist immer die Freiheit der Andersdenkenden" width="300" height="192" /></a><p class="wp-caption-text">Nach Rosa Luxemburg</p></div>
<p style="text-align: center;">
<p>Früher war ich häufig der Ansicht, man solle um eine Demonstration von Neonazis nicht mehr Wind machen, als unbedingt nötig. Durch gezielt organisierte Gegenaktionen würde man nur unnötige Aufmerksamkeit darauf lenken und polarisieren. Denn nicht selten enden solche Konfrontationen damit, dass auf Krawall gebürstete Linke sich mit der Staatsgewalt in die Haare bekommen. Eine schlechte Presse über „gewaltbereite Autonome“  relativiert dann das eigentliche braune Problem und die stille Zustimmung aus den Wohnzimmern mit den „eigentlich doch friedlichen Nationalen“ gibt es oben drauf.</p>
<p>Zu unseren Grundrechten gehört das Demonstrationsrecht – damit ist auch eine Demonstration der NPD durch das Gesetz legitimiert. Dieses Argument habe ich öfter gelesen, daran gibt es nichts zu drehen und zu wackeln. Die Demokratie lebt davon nicht nach Gutdünken die Freiheit anderer zu beschränken. Eine genehmigte Demonstration zu be- oder verhindern ist eine Ordnungswidrigkeit, entsprechend ist der Aufruf dazu ebenfalls gesetzlich verboten, weswegen die Seite dresden-nazifrei.de kürzlich gesperrt wurde.</p>
<p>Als überzeugter Demokrat und Dresdner steht man vor einer Zwickmühle: man schaut tatenlos zu, wie das braune Unheil durch seine Stadt zieht, oder man stellt sich quer, wissend, dass man anderen die Freiheit nimmt, für die man doch selbst einsteht.</p>
<p>Meine „laissez-faire“-Haltung gegenüber Nazidemos kann in diesem Fall keine Lösung sein. Im vergangenen Jahr wurde Dresden von 6000 Neonazis heimgesucht, dieses Jahr werden es sicher nicht weniger. Viel mehr öffentliche Aufmerksamkeit kann man gar nicht darauf lenken. Offiziell will man der Dresdner Opfer „in Würde gedenken“. Was inoffiziell dahinter steht, kann sich jeder vernunftbegabte Mensch ausmalen: Geschichtsrevision, Verharmlosung der deutschen Kriegsverbrechen und im Endeffekt blanker Rassismus.</p>
<p>Der vom NS-Regime gewollte und begonnene zweite Weltkrieg hat 55 bis 60 Millionen <em>Menschen</em> das Leben gekostet.  Es ist auf eine groteske Art beschämend und abstoßend zugleich, dass die Sympathisanten der faschistischen Ideologie, die zu diesem Krieg  führte, heute immer noch Menschen gegeneinander abgrenzen und Opfer aufzählen. Damit verhöhnten und missbrauchen sie jeden einzelnen Menschen, der in diesem Krieg gestorben ist. Allein der Gedanke daran macht mich wütend und ich kann jeden verstehen, der diesen Aufmarsch aus diesem Grund verhindern will.</p>
<p>Frau Oberbürgermeisterin Orosz ruft alle Dresdner zu <a rel="external" href="http://13februar.dresden.de/">„Erinnern und Handeln. Für mein Dresden“</a> auf. Eine Menschenkette soll symbolisch die Innenstadt vor den Nazis schützen. Immerhin ein gutes Zeichen dafür, dass Dresden nicht einverstanden ist mit dem braunen Pack – wenn genügend Menschen mitmachen. Das ungute Gefühl der scheinbaren Tatenlosigkeit bleibt dabei trotzdem. Ich würde mir eine Aktion der <a rel="external" href="http://www.apfelfront.de/">Front Deutscher Äpfel</a> wünschen. Dabei habe ich wenig Hoffnung, dass die Rechten das verstehen, es ist aber eine aktive und intelligente Art des Protests.</p>
<p>Am Ende zählt es als Dresdner zu zeigen, dass wir auf Nazis verzichten können auch wenn man sich nur symbolisch in den Weg stellt. Wie dieser Protest aussieht, muss jeder für sich selbst entscheiden.</p>
<p>Nachtrag 29.01.</p>
<p>Es kommt noch mehr Bewegung in die Sache. Dresden hat <a href="http://npd-blog.info/2010/01/28/neonazis-dresden-11marschieren/">Auflagen erlassen</a> nach der die Nazis nur eine Kundgebung, aber kein Aufmarsch durchführen dürfen. Wieder bleibt ein fader Beigeschmack, da doch dafür erst kürzlich das Versammlungsrecht vom Landtag geändert wurde.</p>
<p>Nachtrag  08.02.</p>
<p>Das Verwaltungsgericht Dresden <a href="http://www.justiz.sachsen.de/vgdd/content/923.php">hat entschieden</a>, dass die Einschränkung der Nazidemo unzulässig ist.</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2010/wehr-dich-dresden/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Geordneter Umzug (zu Wordpress)</title>
		<link>http://dnaber.de/blog/2010/geordneter-umzug/</link>
		<comments>http://dnaber.de/blog/2010/geordneter-umzug/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 12:30:29 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://blog.dnaber.de/?p=979</guid>
		<description><![CDATA[Eine Handvoll sinnvoller HTTP-Statuscodes, die beim Umbau einer Website die richtigen Antworten geben und wie man sie via PHP und .htaccess sendet.]]></description>
			<content:encoded><![CDATA[<p>Ende letzten Jahres habe ich mich dazu entschlossen, die Website <a rel="external" href="http://volleyballfische.de/">meines Volleyballvereins</a> mit einem Redaktionssystem zu betreiben. Im Zuge der Neuerungen musste auch die URL-Struktur geändert werden, was naturgemäß zu dem Problem führt, dass Aufrufe über Lesezeichen, Links und Suchmaschinen unerwartet im „Seite nicht gefunden“-Nirwana landen. Um unseren Besuchern (und unserer guter Position in den Suchmaschinen) das zu ersparen habe ich den Umzug geordnet durchgeführt und alle alten Links übersetzt und leite die Besucher zur gewünschten Seite <em>weiter</em>.<br />
<span id="more-979"></span></p>
<h3>Die richtige Antwort</h3>
<p>Wenn man eine URL Aufruft, zu der keine passende Ressource gefunden wird, landet man für gewöhnlich auf einer weißen „<strong>404 – not found</strong>“ Seite, die vom Server automatisch generiert wird. Mit etwas Glück ist diese Seite aber im Design der Website und bietet mögliche Alternativen zum nicht gefundenen Inhalt. In beiden Fällen antwortete der Webserver auf die Anfrage mit dem <a rel="external" href="http://de.wikipedia.org/wiki/HTTP-Statuscode">Statuscode</a> „404“ der besagt: „Es wurde <em>nichts</em> gefunden“.</p>
<p>Ändern sich bei einem Umzug die URLs der Seiten, so landet jeder Aufruf der <em>alten</em> Links in der Sackgasse obwohl die Seite noch existiert. Folgerichtig wäre die korrekte Antwort vom Server: „der gesuchte Inhalt ist jetzt unter einer neuen URL verfügbar“. Der richtige Statuscode für diesen Fall ist „301 – Moved Permanently“.</p>
<p>Einige Seiten sind auch komplett verschwunden. Zum Teil weil sie in andere eingebunden wurden (Kontakt und Impressum können durchaus auf einer Seite unterkommen), andere waren einfach veraltet. Anfragen auf gelöschte Seiten beantwortet man ordnungsgemäß mit dem Statuscode „410 – gone“, der soviel bedeutet wie „Diese Seite ist von uns gegangen“. Somit ist auch gleich dafür gesorgt, dass Google &amp; co. bescheid wissen und ihre Indizes aktualisieren können.</p>
<h3>Die Umzugskisten auspacken</h3>
<p>Während <a rel="external" href="http://scriptshit.de/blog/show/warum-wordpress-als-cms-nicht-geeignet-ist">andernorts</a> noch <a rel="external" href="http://toscho.de/2010/wordpress-cms/">diskutiert</a> wird, ob Wordpress als <abbr title="Content Management System" lang="en">CMS</abbr> taugt, setze ich es ein. Nicht zuletzt weil Anpassungen wie diese kinderleicht zu integrieren sind. Um alte URLs ihren neuen zuzuordnen und gelöschte Seiten zu kennzeichnen, ergänze ich die functions.php des eingesetzten Designs um folgende Funktion:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/** umleiten alter Permalinks auf die neuen
*/</span>
<span style="color: #000000; font-weight: bold;">function</span> translate_permalinks<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000088;">$_301</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
                    <span style="color: #0000ff;">'/startseite.html'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'/'</span>
                    <span style="color: #0000ff;">'/kontakt.html'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'/kontakt'</span><span style="color: #339933;">,</span>
                    <span style="color: #0000ff;">'/mannschaften.html'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'/mannschaften'</span><span style="color: #339933;">,</span>
                    <span style="color: #0000ff;">'/news.html'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'/aktuell'</span><span style="color: #339933;">,</span>
                    <span style="color: #0000ff;">'/links.html'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'/weblinks'</span><span style="color: #339933;">,</span>
                    <span style="color: #0000ff;">'/impressum.html'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'/kontakt#impressum'</span><span style="color: #339933;">,</span>
                <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$_410</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'/alt.html'</span><span style="color: #339933;">,</span>
                    <span style="color: #0000ff;">'/javascript/altes_script.js'</span><span style="color: #339933;">,</span>
                    <span style="color: #0000ff;">'/css/altes_stylesheet.css'</span><span style="color: #339933;">,</span>
                    <span style="color: #0000ff;">'/weg.html'</span>
                   <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array_key_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REQUEST_URI'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$_301</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Location: '</span><span style="color: #339933;">.</span>
                   <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTPS'</span><span style="color: #009900;">&#93;</span> ?
                          <span style="color: #0000ff;">'https'</span> <span style="color: #339933;">:</span>
                          <span style="color: #0000ff;">'http'</span>
                   <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span>
                   <span style="color: #0000ff;">'://'</span><span style="color: #339933;">.</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'SERVER_NAME'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span>
                   <span style="color: #000088;">$_301</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REQUEST_URI'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
                   <span style="color: #000000; font-weight: bold;">true</span><span style="color: #339933;">,</span>
                   <span style="color: #cc66cc;">301</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">elseif</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">in_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REQUEST_URI'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$_410</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span>
                  <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'SERVER_PROTOCOL'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'HTTP/1.1'</span> ?
                        <span style="color: #0000ff;">'HTTP/1.1'</span> <span style="color: #339933;">:</span>
                        <span style="color: #0000ff;">'HTTP/1.0'</span><span style="color: #009900;">&#41;</span>
                   <span style="color: #339933;">.</span> <span style="color: #0000ff;">' 410 Gone'</span>
                 <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Content-type: text/html;charset=utf-8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">echo</span> <span style="color: #0000ff;">'
&lt;h1&gt;410 - Gone&lt;/h1&gt;
Dieses Dokument existiert nicht mehr bei uns.
         Besuch bitte unsere &lt;em&gt;neue&lt;/em&gt; Website:
         &lt;a href=&quot;http://domain.tld/&quot;&gt;http://domain.tld&lt;/a&gt;'</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>In dem Array <code>$_301</code> ordne ich die neuen Links den alten in der Form zu:<br />
<code>/link/zur/alten-datei.html => /neue_datei</code>.<br />
Alle nicht mehr vorhandenen URLs werden in dem Array <code>$_410</code> lose aufgelistet. Die Elemente beider Arrays werden mit der <a rel="external" href="http://de3.php.net/manual/de/reserved.variables.server.php">Request-URI</a> verglichen und im Falle einer Übereinstimmung erfolgt die Weiterleitung bzw. die Antwort mit dem entsprechenden Statuscode.</p>
<p>Der Funktionsaufruf erfolgt am <em>Anfang</em> der functions.php. Je nach Umfang der Website ist das etwas mehr Handarbeit die sich aber lohnt.</p>
<p><strong>Nachtrag:</strong></p>
<p><a href="#comment-744">In den Kommentaren</a> hat mich Thomas darauf hingewiesen, dass es schneller geht, die Umleitungen in die .htaccess-Datei zu schreiben, da so nicht jedesmal das ganze System geladen wird. Wer also auf die Performance achtet, oder ein anderes System als Wordpress nimmt, schreibt die Umleitungen und gelöschten Dokumente besser in die .htaccess.</p>
<p>Für diese Zwecke ist die <a href="http://httpd.apache.org/docs/2.0/mod/mod_alias.html#redirect" rel="external">Redirect-Direktive</a> des Moduls <em>„mod_alias“</em> geeignet. Alle permanenten Umleitungen werden so notiert:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">Redirect</span> permanent /alte_seite.html http://domain.tld/neue_seite</pre></div></div>

<p>Hier muss man darauf achten, dass die URL zur neuen Seite vollständig angegeben werden muss, da Weiterleitungen nicht zwangsläufig auf eine Domain beschränkt sind.</p>
<p>Für gelöschte Dokumente lautet der Eintrag:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">Redirect</span> gone /alt.html</pre></div></div>

<p>Der vollständige Eintrag für die oben behandelten Seiten:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;">&lt;<span style="color: #000000; font-weight:bold;">IfModule</span> mod_alias.c&gt;
<span style="color: #00007f;">Redirect</span> permanent /startseite.html http://domain.tld/
<span style="color: #00007f;">Redirect</span> permanent /kontakt.html http://domain.tld/kontakt
<span style="color: #00007f;">Redirect</span> permanent /mannschaften.html http://domain.tld/mannschaften
<span style="color: #00007f;">Redirect</span> permanent /news.html http://domain.tld/aktuell
<span style="color: #00007f;">Redirect</span> permanent /links.html http://domain.tld/weblinks
<span style="color: #00007f;">Redirect</span> permanent /impressum.html http://domain.tld/kontakt<span style="color: #adadad; font-style: italic;">#impressum</span>
&nbsp;
<span style="color: #00007f;">Redirect</span> gone /alt.html
<span style="color: #00007f;">Redirect</span> gone /javascript
<span style="color: #00007f;">Redirect</span> gone /css
<span style="color: #00007f;">Redirect</span> gone /weg.html
&lt;/<span style="color: #000000; font-weight:bold;">IfModule</span>&gt;</pre></div></div>

<p>Mit der Redirect Direktive kann man nicht nur einzelne Dokumente sondern auch Verzeichnisse handhaben, wie im Fall der Stylesheets und der Skripte zu sehen ist.</p>
<p>Damit Anfragen auf die entfernten Dokumente nicht mit einer lieblosen Standardantwort abgespeist werden, kann man noch ein Error-Dokument in der .htaccess anlegen:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">ErrorDocument</span> <span style="color: #ff0000;">410</span> /entfernt.html</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2010/geordneter-umzug/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The same procedure</title>
		<link>http://dnaber.de/blog/2009/the-same-procedure/</link>
		<comments>http://dnaber.de/blog/2009/the-same-procedure/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 15:18:03 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Vermischtes]]></category>
		<category><![CDATA[Humor]]></category>
		<category><![CDATA[Video]]></category>

		<guid isPermaLink="false">http://blog.dnaber.de/?p=941</guid>
		<description><![CDATA[Stereotype Silvesterunterhaltung]]></description>
			<content:encoded><![CDATA[<p>Ich habe es satt. Jedes Jahr läuft der gleiche Mist im Fernsehen wie im Vorjahr. Ein vierundzwanzigstündiger, senderübergreifender (3sat ausgenommen) Marathon voller Jahresrückblicke, liebloser Sketchaneinanderreihungen, Kanzlerinnenansprachen und karnevalistischer „Törööö“-partys, der wie immer in „Dinner for one“ und Jerry Lewis <a href="http://www.youtube.com/watch?v=a7ySmnxy29Q">„Typewriter“</a> gipfelt.</p>
<p>Um mit dem schnöden Einheitsbrei zu brechen und diesem Blog ein würdiges Jahresabschlusspost (zu Deutsch: Beitrag) zu verpassen erlaube ich mir einen kritischen Beitrag von <a href="http://www.lebensqualitaeter.de/">Nico Semsrott</a> zu verlinken, einem sehr begabten Nachwuchskomiker, der die Zeichen der Zeit erkannt hat – wir haben nichts mehr zu lachen.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="295" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/P_vRK5xOdzU&amp;hl=de_DE&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="295" src="http://www.youtube.com/v/P_vRK5xOdzU&amp;hl=de_DE&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2009/the-same-procedure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aus gegebenem Anlass</title>
		<link>http://dnaber.de/blog/2009/aus-gegebenem-anlass/</link>
		<comments>http://dnaber.de/blog/2009/aus-gegebenem-anlass/#comments</comments>
		<pubDate>Fri, 25 Dec 2009 23:57:17 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Dresden]]></category>

		<guid isPermaLink="false">http://blog.dnaber.de/?p=925</guid>
		<description><![CDATA[Die schönsten Argumente für eine Ladenöffnung auch an Sonntagen. ]]></description>
			<content:encoded><![CDATA[<p><em>Ich</em> will shoppen, und zwar <strong>jetzt</strong>! <span id="more-925"></span></p>
<p>Was fällt der Stadtobrigkeit eigentlich ein? Nächstes Jahr darf ich an den Adventssonntagen nicht mehr shoppen? Es gibt für mich einfach nichts Schöneres als an einem Sonntag sich durch ein Kaufhaus zu drängen, in den Wühltischen zu kramen und sich mit Fastfood zu stopfen um anschließend das nächste Kaufparadies zu entern. Und nun wird es mir mit fadenscheinigen Argumenten verboten.</p>
<p><em>Ich</em> bin doch ein mündiger Bürger, der selbst entscheiden kann wann er wo sein Geld ausgeben will. Warum soll diese Entscheidung also von Anderen getroffen werden als mir? Es ist ja auch nicht so, dass sonntags niemand arbeiten müsste. Ärzte und Polizisten müssen doch auch ran und ich selbst hab schon Wochenendschichten geschoben, warum sollte es den Verkäufern besser gehen als mir, dem König Kunde? Deren Familien können doch auch schoppen gehen, dann tun sie wenigstens was für die Wirtschaft.</p>
<p>Wo wir gerade dabei sind, die Rechnung ist doch ganz simpel: Max Mustermann gibt jeden Tag 100€ beim shoppen aus. Ergo sind das 100€ mehr Umsatz für den Einzelhandel, wenn Max auch sonntags einkaufen geht. Pro Woche also 16,7% Umsatzsteigerung. Das können wir uns nicht leisten, darauf zu verzichten – gibt es einen besseren Weg aus der Kriese? Auf die Touristenscharen, die Dresden dann davonrennen, kann auch keiner verzichten. Die fahren dann lieber nach Riesa oder Meißen und kaufen Ihre Fernsehgeräte dort. Die obligatorischen Frauenkirchensouvenirs kann man auch im Internet bestellen, da muss man nicht extra herkommen.</p>
<p>Dabei könnte es so entspannt zugehen, wie heute schon auf dem Neustädter Bahnhof. Dort kann <em>ich</em> an allen Feiertagen noch gemütlich und entspannt shoppen gehen. Es ist schon zu oft vorgekommen, dass man den Braten am 25. verrissen hat und die Ersatzgans noch tiefgefroren im Froster lag. Wohl dem, der da zu Weihnachten noch schnell zum Fleischer spurten kann . In dem Sinne,</p>
<p>frohes shoppen!</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2009/aus-gegebenem-anlass/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linktipps 2</title>
		<link>http://dnaber.de/blog/2009/linktipps-2/</link>
		<comments>http://dnaber.de/blog/2009/linktipps-2/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 12:10:04 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Linktipps]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Musik]]></category>
		<category><![CDATA[Typografie]]></category>
		<category><![CDATA[Unterhaltung]]></category>

		<guid isPermaLink="false">http://blog.dnaber.de/?p=881</guid>
		<description><![CDATA[Schriftdateien Browserübergreifend einbinden, die Comic Sans im Visier, eine Reportage über die beste Musik der Welt und ein Comic.]]></description>
			<content:encoded><![CDATA[<ul>
<li><a rel="external" href="http://paulirish.com/2009/bulletproof-font-face-implementation-syntax/">Bulletproof @font-face syntax – totsicheres Einbinden von Schriften im Web mit CSS (englisch) [CSS, Typografie] </a></li>
<li><a rel="external" href="http://sixrevisions.com/graphics-design/comic-sans-the-font-everyone-loves-to-hate/">The font everyone loves to hate – warum die „Comic Sans“ so unbeliebt ist (englisch) [ Typografie]</a></li>
<li><a rel="external" href="http://www.youtube.com/watch?v=WeVRYPjcVXg&amp;feature=related">Synth Britania – BBC Dokumentation über die Anfänge der elektronischen Musik in den 70ern (englisch) [Musik, Unterhaltung]</a></li>
<li><a rel="external" href="http://www.nichtlustig.de/toondb/091202.html">Nicht lustig: „Wetter“ [lustig]</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2009/linktipps-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New wave</title>
		<link>http://dnaber.de/blog/2009/new-wave/</link>
		<comments>http://dnaber.de/blog/2009/new-wave/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 16:22:35 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Medien]]></category>

		<guid isPermaLink="false">http://blog.dnaber.de/?p=854</guid>
		<description><![CDATA[Googles neuester Wurf „Wave“ schaut auf den ersten Blick gar nicht so neu aus.]]></description>
			<content:encoded><![CDATA[<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="295" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/K0O4od94OvQ&amp;hl=de_DE&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="295" src="http://www.youtube.com/v/K0O4od94OvQ&amp;hl=de_DE&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object><span id="more-854"></span></p>
<dl>
<dt>Hi, I&#8217;m Stef.</dt>
<dd>And I&#8217;m Greg.</dd>
<dt>We&#8217;re cool.</dt>
<dd>We&#8217;re from google.</dd>
<dt>*winkt in die Kammera*</dt>
<dd> We use wave. </dd>
<dt>Oh yes, wave ist cool.</dt>
<dd>E-mail is uncool.</dd>
<dt>It&#8217;s so old</dt>
<dd>My granny uses e-mail.</dd>
<dt>Bah, we need some new stuff.</dt>
<dd><q>Why?</q>, you ask?</dd>
<dt>I don&#8217;t understand the question, you Greg?</dt>
<dd>No, but… erm, here ist wave!</dd>
<dt>It&#8217;s totaly new and great.</dt>
<dd>And new …</dd>
</dl>
<h3>Von allem ein Wenig</h3>
<p>Nach dem sich die Beiden aus dem Video so große Mühe gegeben haben, die unzähligen Vorteile von Googles neuestem Streich „Google Wave“ anzupreisen, <em>musste</em> ich das auch mal ausprobieren. Also hab ich nach einer Einladung Ausschau gehalten um zum erlesenen Kreis der Tester zu gehören, denn der Dienst befindet sich noch im Teststadium.</p>
<p>Mein erster Eindruck: Google versucht mit Wave die eierlegende Wollmilchsau 2.0 auf die Beine zu stellen. In Wave vereinen sich zentrale Kommunikationsmechanismen, die das Internet (z.T. schon sehr lange) zu bieten hat. Das „Neue“  ist also eher eine Mischung aus Internetforum, Chat  und etwas E-Mail ohne die spezifischen Nachteile der einzelnen Methoden zu verbessern. Im Gegenteil. In einem Forum und bei E-Mail kann ich jeder Nachricht einen Titel bzw. einen Betreff geben. Waves haben keinen Titel. Dafür kann man an einer (oder einem?) Wave mehrere Kontakte teilhaben lassen und sie sogar öffentlich zugänglich machen. Was im ersten Moment sehr praktisch klingt, wird schon bei nur zwei Teilnehmern schnell unübersichtlich, denn jeder kann in Echtzeit in den Nachrichtenverlauf an beliebiger Stelle herein schreiben, sogar die Beiträgen der anderen Adressaten verändern. Eine durchdachte Struktur (optisch wie semantisch) vermisse ich hier sehr. Unter der Haube handelt es sich bei dem Wave Benutzeroberfläche um eine fettige Div-Suppe mit Tabellenwürzung.  Dabei wird beim Einloggen dringend empfohlen, entweder Firefox 3.5, Safari 4 oder den neuesten Google Chrome zu verwenden. Warum also nicht auf HTML 5 setzen, dass eine Vielzahl an Struktur-Elementen bietet, also wie geschaffen wäre für komplexe Dokumentenstrukturen wie Wave?</p>
<p>Überhaupt, Tippen mit Echtzeitübertragung… Jeder der Online ist, sieht die Cursorposition des Teilnehmers, der gerade in der Wave schreibt, jeden Tippfehler, jede falsche oder undurchdachte Formulierung, alles. Sieht mit unter lustig aus, nervt aber wenn man, wie ich, ein bis zwei Anläufe braucht, bis man die richtige Formulierung hat.</p>
<p>Für Windowsnutzer ist Google Wave (zur Zeit) eine reine Webanwendung, d.h. ich kann nur mit dem Browser „waven“, was noch sehr langsam und stockend vor sich geht, selbst mit Firefox 3.5 oder Opera 10 (Googles Hausbrowser Chrome habe ich nicht). Eine Desktopanwendung gibt es wohl nur für Mac-User. Die können dann auch gleich aus iPhoto Bilder per Drag&amp;Drop in ein Wave einfügen. Das kann man mit jedem vernünftigen E-Mailprogramm auch unter Windows.</p>
<p><em>Natürlich</em> gibt es auch Schnittstellen für Twitter und Blogs. So kann man Waves mit einem Blog „verknüpfen“ um dann von der Wave in das Blog zu schreiben und anders herum.</p>
<p>Schaut man sich das ganze an, wird einem schnell klar, dass wenn sich der Dienst durchsetzt, er sehr ressourcenintensiv werden dürfte. Globale Echtzeitkommunikation mit Konferenzschaltungs-Charme, das braucht Rechenpower. Rechenpower, wie nur Google sie „kostenfrei“ bereit stellen kann.</p>
<h3>Kosten und Nutzen</h3>
<p>Die Frage nach dem Sinn und Zweck von Google Wave hat sich mir eigentlich gleich zu Anfang gestellt. Ich komme wunderbar mit E-Mail, ICQ und ein paar Internetforen zurecht. Allerdings ist die Frage nach dem „Warum“ im Web 2.0 aussichtslos. Irgendwo werden sich immer neue Bedarfsnischen auftun, die gefüllt werden wollen.  Am Ende muss die Frage nur jeder für sich beantworten können. Für mich bleibt der fade Beigeschmack, dass mit Wave ein riesiger Konzern wie Google noch genauere Profile von seinen <em>Kunden</em> bekommt.</p>
<p>Fazit: Google Wave ist im jetzigen Stadium ein unübersichtliches, zäh zu bedienendes Medium, dessen Mehrwert gegenüber bisher Vorhandenem sich mir nicht erschließt. Wer es selbst einmal probieren möchte,  ich habe noch „Einladungen“ zu vergeben.</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2009/new-wave/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linktipps 1</title>
		<link>http://dnaber.de/blog/2009/linktipps-1/</link>
		<comments>http://dnaber.de/blog/2009/linktipps-1/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 16:35:53 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Linktipps]]></category>
		<category><![CDATA[Abwechslung]]></category>
		<category><![CDATA[Barrierefreiheit]]></category>
		<category><![CDATA[Satire]]></category>

		<guid isPermaLink="false">http://blog.dnaber.de/?p=841</guid>
		<description><![CDATA[Über Konsumrausch und dessen groteske Formen, benennung von Legosteinen und die Zugänglichkeit von Dropdown-Menüs.]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://www.faz.net/s/RubA91992BFFBF84DB3B4EBE604A92D275B/Doc~E53AAF568AFA54B0EBBD21FADE86C367D~ATpl~Ecommon~SMed.html">Die Wahrheit über den Mauerfall [Satire, Video]<br />
(Das eigentliche Video startet bei 0:15, wurde offenbar falsch geschnitten)</a></li>
<li><a href="http://www.themorningnews.org/archives/opinions/a_common_nomenclature_for_lego_families.php">Nomenklatur der Legosteine [englisch, zur Abwechslung]<br />
(Ich fand erstaunlich viele Übereinstimmungen)</a></li>
<li><a href="http://www.bitvtest.de/infothek/artikel/lesen/ausklappmenues.html">Über die Zugänglichkeit von Ausklappmenüs [Zugänglichkeit]</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2009/linktipps-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Warum individueller Inhalt so wichtig ist</title>
		<link>http://dnaber.de/blog/2009/warum-individueller-inhalt-so-wichtig-ist/</link>
		<comments>http://dnaber.de/blog/2009/warum-individueller-inhalt-so-wichtig-ist/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 00:12:07 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Internet]]></category>

		<guid isPermaLink="false">http://blog.dnaber.de/?p=835</guid>
		<description><![CDATA[Willkommen beim wohl unpassendsten Suchwort.
]]></description>
			<content:encoded><![CDATA[<p>Spätestens seit heute weis ich, was die Suchmaschinen-Optimierer damit meinen, wenn sie von individuellem Inhalt sprechen und das man Standardfloskeln meiden sollte: googlet mal <q>Willkommen</q>!<br />
Erster Treffer: <a rel="external" href="http://www.heidiklum.com/">Heidi Klum GmbH</a> (Achtung, Lautstärke vorher runter drehen)!<br />
Es spricht aber auch schon fast wieder für die Seite, bei so einem Suchwort ganz oben zu stehen.</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2009/warum-individueller-inhalt-so-wichtig-ist/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Vorgeführt</title>
		<link>http://dnaber.de/blog/2009/vorgefuehrt/</link>
		<comments>http://dnaber.de/blog/2009/vorgefuehrt/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 22:47:42 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Vermischtes]]></category>
		<category><![CDATA[Kabarett]]></category>
		<category><![CDATA[Politik]]></category>

		<guid isPermaLink="false">http://blog.dnaber.de/?p=822</guid>
		<description><![CDATA[Feierliches Kabarettistengelöbnis nach der Bundestagswahl.]]></description>
			<content:encoded><![CDATA[<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/B4Q8eJJ81R4&amp;hl=de&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/B4Q8eJJ81R4&amp;hl=de&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>:)</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2009/vorgefuehrt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>In Dresden nichts Neues</title>
		<link>http://dnaber.de/blog/2009/in-dresden-nichts-neues/</link>
		<comments>http://dnaber.de/blog/2009/in-dresden-nichts-neues/#comments</comments>
		<pubDate>Sat, 03 Oct 2009 11:29:03 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Dresden]]></category>
		<category><![CDATA[Gesellschaft]]></category>
		<category><![CDATA[Politik]]></category>

		<guid isPermaLink="false">http://blog.dnaber.de/?p=793</guid>
		<description><![CDATA[Dresdens Zentrum wird seit vergangener Woche von einem weiteren Konsumtempel geschmückt und keine drei Wochen nach der Landtagswahl zeigt sich, was von den schwarz-gelben Versprechen im Wahlkampf übrig geblieben ist… Eigentlich Grund genug, schreiend davon zu rennen (oder einfach nur den Kopf zu schütteln) – aber dazu ist das Wetter viel zu schön!
Jeder der schon …]]></description>
			<content:encoded><![CDATA[<p>Dresdens Zentrum wird seit vergangener Woche von einem weiteren Konsumtempel geschmückt und keine drei Wochen nach der Landtagswahl zeigt sich, was von den schwarz-gelben Versprechen im Wahlkampf übrig geblieben ist… Eigentlich Grund genug, schreiend davon zu rennen (oder einfach nur den Kopf zu schütteln) – aber dazu ist das Wetter viel zu schön!<span id="more-793"></span></p>
<p>Jeder der schon mal Dresdens Zentrum gesehen hat könnte meinen, die Kaufkraft der Dresdner und ihrer Touristen sei durch ein Überangebot an Einkaufsmöglichkeiten erschöpfend ausgereizt. Zwischen Altmarkt und Hauptbahnhof kann man entweder einen acht Minuten Spaziergang machen, oder mehrere Stunden damit verbringen sein Geld in alle möglichen und unmöglichen Dinge zu tauschen. Vom Sekundenkleber bis zu Feinkostwaren gab es bereits vor einem Jahr <em>alles</em> was das Käuferherz begehrte. Die Altmarktgalerie, eine arkadenförmige Ansammlung von über 100 Geschäften, Karstadt, drei Modehäuser, unzählige kleinere Modeboutiquen, Mobilfunkläden, Schuhgeschäfte, Cafés, Fastfood, Fitnesscenter – die typische City eben. Man hat auch nichts vermisst, es war also nicht so, als ob noch was gefehlt hätte, im Gegenteil.</p>
<p>Offenbar hab ich mich in beiden Fällen getäuscht, denn seit gut einem Jahr wird an einem weiteren Kaufpalast gewerkelt. In den letzten Wochen war es schlicht unmöglich zu übersehen, dass die Eröffnung nun kurz bevor steht. Tagtäglich brummte ein Zeppelin gefühlte 24 Stunden über Dresden. Auf der Außenhaut prangte das Logo der neuen „Centrum Galerie“ und nachts wurde die Eröffnungsbotschaft in Leuchtschrift auf die Hülle projiziert. Die Marketingabteilung hat offenbar keine Kosten gescheut um auf die neue Galerie aufmerksam zu machen. Dummerweise schien das Geld am Ende nicht mehr für den <a href="http://www.centrumgalerie.de/" rel="external">Internetauftritt</a> zu reichen, der nicht mal ansatzweise die Atmosphäre und das Design der durchaus gelungenen Architektur widerspiegelt und auch sonst eher abschreckt. </p>
<p>Im Inneren erwarten einen nicht die typisch hellen Sandsteintöne und Vollglasgeländer wie man es von Arkaden wie der Altmarktgalerie gewohnt wäre. Verkaufspsychologen haben offenbar herausgefunden, dass mein Kaufrausch mit dunklen Tönen und verschnörkelten Fassaden effektiver stimuliert wird. (Die Schnörkel könnten aber auch ein clevere Assoziation zum Standort sein – Dresden, Barockstadt und so…) Insgesamt sieht es im Inneren wie auf einer Zukunftsmesse aus den 70ern aus. So hat man sich damals vieleicht das 21. Jahrhundert vorgestellt. Dunkle Fußböden, dunkles Holz für die Handläufe, dunkle verspiegelte oberflächen und indirektes violettes Licht. Ansonsten ist die Aufteilung eher gewohnt. Im Untergeschoss Fastfood und darüber Modeboutiquen, Mobilfunkläden, Schuhgeschäfte, Cafés usw. Kann man ja alles öfter gebrauchen. Neu sind dagegen Geschäfte, deren Angebot scheinbar ausschließlich aus neonfarbenen Flüssigkeiten besteht, die man in seltsam geformten Glaskaraffen kaufen kann (wtf?), sowie eine Lounge in der man in Sitzsäcken die bunten Lichter und die Flatscreens bewundern kann und die insgesamt den Eindruck erweckt, als ob unter der Ladentheke das Meskalin ausgeteilt wird. </p>
<p>Und endlich, ja endlich haben wir in Dresden ein „Starbucks“. Ich wollt schon immer mal erwachsenen Menschen dabei zu sehen wie sie ihren, mit Aromen gepanschten, „Coffee“ aus Pappbechern nuckeln, die in ihrer Form an Schnabeltassen erinnern. Gut, das ist jetzt kein Alleinstellungsmerkmal dieser Kaffeehauskette und auch ich habe meinen Kaffee auch schon mal „to-go“ konsumiert, aber bei Starbucks hat das doch mehr Stil und wirkt so weltoffen.</p>
<p>Besonders fasziniert bin ich von einer dieser Intershops 2.0. Eine Art Drogerie-Spielzeug-Feinkost-Kurzwaren-Kette, die die Möglichkeit bietet vom Tampon bis zum Legospielzeug einfach alles in einem Geschäft zu kaufen – das ist echt ungeheuer praktisch.</p>
<p>Genug gemeckert, denn das Ganze hat ja auch sein Gutes. Im Radio sprach man von 1000 neuen Arbeitsplätzen, die in der <em>Centrum Galerie</em> „entstanden“ sind. Mir fällt das ein bisschen schwer zu glauben, angesichts der Tatsache, dass zwei der größten Mieter nicht neu hinzugekommen sind, sondern einfach von der gegenüberliegenden Seite in die neuen Räume umgezogen sind (die jetzt übrigens leer stehen), aber wenn es denn so ist, kann man ja froh sein. </p>
<p>Und da geht offensichtlich immer noch was. Um den Kaufmannsladen-Overkill komplett zu machen, baut auch die Altmarktgalerie ihre Verkaufsfläche derzeit weiter aus. Ich bin gespannt, wie lange sich das alles halten wird.</p>
<p>&#8211;</p>
<p>Als hätte ich es geahnt, scherzte ich noch vor der Landtagswahl hier in Sachsen, „man müsse die Sonderausgabe der ad.rem“ (eine Studentenzeitung) zur Wahl „aufheben“. Darin prangten groß das Gesicht von Herrn Tillich und darunter die Worte:</p>
<blockquote><p>Mein Wort gilt: Vom Vorschuljahr bis zum Master bleiben die Bildungsangebote gebührenfrei.</p></blockquote>
<p>Ich hab die Ausgabe natürlich nicht aufgehoben, <a href="http://www.ad-rem.de/epaper/DMV_ADD_20090826_gesamt.pdf" rel="external">doch zum Glück gibt es sie auch online</a> (Seite 13).</p>
<p>Okay, dass Wahlversprechen selten das Papier wert sind, auf dem sie stehen ist jetzt nich so neu. Dennoch würde ich dieses Blatt gern ausdrucken und der gesamten Sachsen CDU unter die Nase reiben, da man zusammen mit der FDP nun doch <a href="http://wwwalter.taz.de/1/politik/deutschland/artikel/1/der-schwarz-gelbe-praezedenzfall/" rel="external">Studiengebühren für „Langzeitstudenten“ einführen will</a>. Langzeitstudenten, dass sind Studenten, die länger als die Regelstudienzeit brauchen. Regelstudienzeit, die kennen wir alle, ist die Anzahl an Semestern in der das Studium theoretisch zu schaffen wäre, wenn man sich keine Gedanken um das liebe Geld machen muss, nie durch eine Prüfung fällt und zufällig einen Studiengang erwischt, der nicht überfüllt ist.</p>
<p>Ich hoffe, dass sich dagegen auch so großer Widerstand formieren wird, wie gegen das neue Hochschulgesetz, auch wenn die Erfolgschancen eher gering sind.</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2009/in-dresden-nichts-neues/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Rettet eure Freiheit</title>
		<link>http://dnaber.de/blog/2009/rettet-eure-freiheit/</link>
		<comments>http://dnaber.de/blog/2009/rettet-eure-freiheit/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 09:43:54 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Vermischtes]]></category>
		<category><![CDATA[Politik]]></category>

		<guid isPermaLink="false">http://blog.dnaber.de/?p=787</guid>
		<description><![CDATA[Wir haben die Wahl – wir sollten diese Chance nutzen!]]></description>
			<content:encoded><![CDATA[<p>…und geht wählen! Denkt dabei bitte daran, wer die Zensur wieder eingeführt und die Vorratsdatenspeicherung beschlossen hat. Unter wem wir mit Sicherheit bald unsere Fingerabdrücke auf einem RFID-Chip mit uns rumschleppen und wer die Bundeswehr am liebsten innerhalb Deutschlands einsetzen würde.</p>
<p><a rel="external" href="http://rettedeinefreiheit.de/">Rette deine Freiheit</a> und geh wählen!</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2009/rettet-eure-freiheit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kanzleramt</title>
		<link>http://dnaber.de/blog/2009/kanzleramt/</link>
		<comments>http://dnaber.de/blog/2009/kanzleramt/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 09:25:26 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Vermischtes]]></category>
		<category><![CDATA[Politik]]></category>

		<guid isPermaLink="false">http://blog.dnaber.de/?p=784</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/CHbUctZPhow&#038;hl=de&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/CHbUctZPhow&#038;hl=de&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2009/kanzleramt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wordpress: Kommentare nummerieren (v.2.7+)</title>
		<link>http://dnaber.de/blog/2009/wordpress-kommentare-nummerieren/</link>
		<comments>http://dnaber.de/blog/2009/wordpress-kommentare-nummerieren/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 13:10:39 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://blog.dnaber.de/?p=747</guid>
		<description><![CDATA[Wie man die Kommentare zu einem Artikel durchlaufend nummeriert.]]></description>
			<content:encoded><![CDATA[<p class="remark">Anmerkung: <a href="http://webdesign-passau.com/wordpress/" rel="external">Klaus</a> hat mich darauf hingewiesen, dass dieser Artikel in der ersten Fassung etwas zu kurz und zu abstrakt geraten ist und dadurch zu unverständlich ist. Aus diesem Grund habe ich diesen Artikel noch einmal überarbeitet um die einzelnen Schritte nachvollziehbarer zu machen.</p>
<h3>Worum es geht</h3>
<p>Dieses kurze Tutorial soll zeigen, wie man in Wordpress die Kommentare fortlaufend nummeriert. Der Semantik wäre schon genüge getan, wenn man jeden einzelnen Kommentar als Punkt einer nummerierten Liste (<code>&lt;ol&gt;</code>) auszeichnet. Manchmal will man aber die <del>Nummern</del> Ziffern mit in die Gestaltung einbeziehen und mit CSS aufhübschen. Wie man die Nummer für jeden Kommentar als Zahl in den Quelltext bekommt, soll hier gezeigt werden.<span id="more-747"></span></p>
<h3>Die Idee</h3>
<p>Der HTML-Code für die Kommentare wird erzeugt, in dem die Datensätze in einer Schleife durchlaufen werden und für jeden Durchlauf der entsprechende Kommentar sein HTML-Kleid bekommt. Für unser Vorhaben reicht es also, <em>vor</em> dem Schleifenaufruf eine Zählvariable zu definieren (ich nenne sie hier mal <code>$comment_counter</code>). Innerhalb der Schleife setzen wir einen Befehl, der den Variablenwert um den Wert 1 erhöht.<br />
Vor der Version 2.7 musste man diese Schleife noch von Hand schreiben und die Zählvariable konnte man bequem mit unterbringen. Das Kommentartemplate (comments.php) sah bis 2.7 schematisch etwa so aus:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&lt; ?php
/**  comments.php
*/
// Unsere Zählvariable
$comment_counter = 1;
&nbsp;
//der Kommentar-Loop
foreach ($comments as $comment) {?&gt;
&nbsp;
   &lt;li id=&quot;comment-<span style="color: #000000; font-weight: bold;">&lt;?php</span> comment_ID<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;
        &lt;p&gt;&lt;cite&gt;&lt; ?php if(function_exists('get_avatar')) echo get_avatar(/*[…]*/); ?&gt;
        &lt; ?php comment_type('von', 'Trackback', 'Pingback'); ?&gt;
        &lt; ?php comment_author_link(); ?&gt; – &lt; ?php comment_date(); ?&gt; um &lt;a href=&quot;#comment-<span style="color: #000000; font-weight: bold;">&lt;?php</span> comment_ID<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;
        &lt; ?php comment_time(); ?&gt;&lt;/a&gt;&lt;/cite&gt;
        &lt; ?php edit_comment_link(); ?&gt;&lt;/p&gt;
&nbsp;
        &lt; ?php // Hier z.B. die Kommentarnummer ausgegeben: ?&gt;
        &lt;p class=&quot;nummer&quot;&gt;&lt; ?php echo $comment_counter; ?&gt;&lt;/p&gt;
&nbsp;
	&lt; ?php comment_text(); ?&gt;
    &lt;/li&gt; 
&nbsp;
      &lt; ?php
      //zum Schluss setzen wir die Zählvariable noch eins hoch:
      $comment_counter++;
}
?&gt;</pre></div></div>

<p>Soweit, so gut.</p>
<h3>Umsetzung seit Version 2.7</h3>
<p>Seit Version 2.7 muss man die Schleife nicht mehr von Hand starten, sondern hat dafür die Funktion <a href="http://codex.wordpress.org/Template_Tags/wp_list_comments" rel="external"><code>wp_list_comments()</code></a> zur Verfügung. Diese Funktion organisiert den Schleifendurchlauf automatisch und erzeugt gleichzeitig das HTML, auf welches man geringfügig Einfluss nehmen kann, in dem man der Funktion bestimmte Parameter übergibt. Eine Nummerierung der Kommentare ist leider nicht vorgesehen.</p>
<p>Um das erzeugte HTML komplett selbst zu bestimmen (und somit die Kommentarnummer einzufügen), akzeptiert <code>wp_list_comments()</code> eine sogenannte Callback-Funktion, die man selbst schreiben muss und in der man die HTML-Maske für die einzelnen Kommentare bestimmt. Eine solche Funktion, man könnte sie z.B. <a href="http://codex.wordpress.org/Template_Tags/wp_list_comments#Comments_Only_With_A_Custom_Comment_Display" rel="external"><code>mytheme_comment()</code></a> nennen, schreiben wir in die functions.php. Der Name dieser Funktion kann beliebig gewählt werden, allerdings muss sie dem folgendem Schema genügen, um die Funktionalität zu gewährleisten:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&lt; ?php
/** functions.php
*/
function mytheme_comment($comment, $args, $depth) {
&nbsp;
      $GLOBALS['comment'] = $comment; 
&nbsp;
      //Ab hier kann der Kommentar beliebig gestalltet werden 
?&gt;
      &lt;li <span style="color: #000000; font-weight: bold;">&lt;?php</span> comment_class<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span> id=&quot;comment-&lt; ?php comment_ID() ?&gt;&quot;&gt;
&nbsp;
        &lt;h3 class=&quot;comment-author vcard&quot;&gt;
            &lt;cite class=&quot;fn&quot;&gt;&lt; ?php comment_author_link();?&gt;&lt;/cite&gt;
        &lt;/h3&gt;
&nbsp;
        &lt;div class=&quot;comment-meta&quot;&gt;Geschrieben am &lt; ?php comment_date();?&gt; um &lt; ?php comment_time(); ?&gt;&lt;/div&gt;
&nbsp;
        &lt; ?php if ($comment-&gt;comment_approved == '0') : ?&gt;
            &lt;p class=&quot;commentinfo moderation&quot;&gt;Dein Kommentar muss erst durch den Administrator freigeschaltet werden&lt;/p&gt;
&nbsp;
        &lt; ?php endif; ?&gt;
            &lt;div class=&quot;comment-content&quot;&gt;&lt; ?php comment_text(); ?&gt;&lt;/div&gt;
&nbsp;
       &lt; ?php
        /**
        *   Das schließende &lt;/li&gt;-Tag für den einzelnen Kommentar
        *   setzt die Funktion wp_list_comments() von selbst, der 
        *   darf hier nicht gesetzt werden!
        */ ?&gt;
}
?&gt;
&lt;/li&gt;</pre></div></div>

<p>Um diese Callback-Funktion aufzurufen, übergeben wir deren Name als Parameter in Form eines Strings an die <code>wp_list_comments()</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php
<span style="color: #009933; font-style: italic;">/**
*   der Aufruf in der comments.php
*/</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #339933;">&lt;</span>ol id<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;commentlist&quot;</span><span style="color: #339933;">&gt;</span>
     <span style="color: #339933;">&lt;</span> ?php wp_list_comments<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'callback=mytheme_comment'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #339933;">&lt;/</span>ol<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Um auch hier die Kommentare mit ihrer Nummer zu versehen, definieren wir die Zählvariable wieder außerhalb der Schleife, also noch von dem Aufruf der Funktion <code>wp_list_comments()</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php
<span style="color: #009933; font-style: italic;">/**
*   comments.php
*/</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #339933;">&lt;</span>ol<span style="color: #339933;">&gt;</span>
   <span style="color: #339933;">&lt;</span> ?php
            <span style="color: #000088;">$comment_counter</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
            wp_list_comments<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'callback=mytheme_comment'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #339933;">&lt;/</span>ol<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Da diese Zählvariable außerhalb der Funktion <code>mytheme_comment</code> definiert wird, ist sie innerhalb der Funktion auch <em>noch</em> nicht „sichtbar“. Da wir sie nich einfach als Parameter an die Funktion übergeben können, müssen wir sie innerhalb von <code>mytheme_comment</code> als global definieren um darauf zugreifen zu können. Anschließend kann man sie per <code>echo</code>-Befehl an der gewünschten Stelle ausgeben und setzt deren Wert zum Schluss noch um 1 höher:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php 
<span style="color: #009933; font-style: italic;">/** functions.php
*/</span>
<span style="color: #000000; font-weight: bold;">function</span> mytheme_comment<span style="color: #009900;">&#40;</span><span style="color: #000088;">$comment</span><span style="color: #339933;">,</span> <span style="color: #000088;">$args</span><span style="color: #339933;">,</span> <span style="color: #000088;">$depth</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
      <span style="color: #666666; font-style: italic;">//Zugriff auf die Zählvariable (startet bei 0)</span>
      <span style="color: #990000;">global</span> <span style="color: #000088;">$comment_counter</span><span style="color: #339933;">;</span>
      <span style="color: #666666; font-style: italic;">//Zähler heraufsetzen.</span>
      <span style="color: #000088;">$comment_counter</span> <span style="color: #339933;">++;</span>
&nbsp;
      <span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'comment'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$comment</span><span style="color: #339933;">;</span>
      <span style="color: #666666; font-style: italic;">//...</span>
&nbsp;
      <span style="color: #990000;">echo</span> <span style="color: #0000ff;">'&lt;p class=&quot;comment_number&quot;&gt;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$comment_counter</span><span style="color: #339933;">.</span><span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
&nbsp;
&nbsp;
<span style="color: #339933;">&lt;</span> ?php
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Ab jetzt hat jeder Kommentar seine eigene Nummer, die man per CSS beliebig gestalten kann.</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2009/wordpress-kommentare-nummerieren/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP: String auf die ersten Worte kürzen</title>
		<link>http://dnaber.de/blog/2009/string-auf-die-ersten-worte-kuerzen/</link>
		<comments>http://dnaber.de/blog/2009/string-auf-die-ersten-worte-kuerzen/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 07:08:02 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[string bearbeiten]]></category>

		<guid isPermaLink="false">http://blog.dnaber.de/?p=739</guid>
		<description><![CDATA[Eine kleine Funktion, von der ich die ersten Worte eines Strings zurück bekomme, um z.B. in einem Vorschaublock den ersten Absatz eines Artikels anzureißen.
Die Idee, ich habe sie mir bei Thomas Funktion end_on_word() abgeschaut, ist so simpel wie effektiv: Der String wird an den Leerzeichen in ein Array aufgespalten und mit diesem kann man dann …]]></description>
			<content:encoded><![CDATA[<p>Eine kleine Funktion, von der ich die ersten Worte eines Strings zurück bekomme, um z.B. in einem Vorschaublock den ersten Absatz eines Artikels anzureißen.<span id="more-739"></span></p>
<p>Die Idee, ich habe sie mir bei Thomas Funktion <a href="http://toscho.de/2009/php-funktion-end_on_word/" rel="external">end_on_word()</a> abgeschaut, ist so simpel wie effektiv: Der String wird an den Leerzeichen in ein Array aufgespalten und mit diesem kann man dann arbeiten:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/** 
*   getFirstWords()
*   gibt die ersten count worte von str zurück
*   @param  int count (default 10)
*   @param  str str
*   @return str
*/</span>
<span style="color: #000000; font-weight: bold;">function</span> getFirstWords<span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #000088;">$count</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Jedes Wort ein Arrayelement</span>
        <span style="color: #000088;">$array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">' '</span><span style="color: #339933;">,</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Array in $count große Teile teilen</span>
        <span style="color: #000088;">$array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_chunk</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #339933;">,</span> <span style="color: #000088;">$count</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">/*Falls der String weniger Worte hatte als $count
        * geben wir den String unverändert zurück
        */</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
             <span style="color: #b1b100;">return</span> <span style="color: #000088;">$str</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">/* andernfalls entfernen wir eventuelle Kommas am ende
        * und fügen ein Auslassungszeichen an
        */</span>
        <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
             <span style="color: #b1b100;">return</span> <span style="color: #990000;">rtrim</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">' '</span><span style="color: #339933;">,</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">',;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'[…]'</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/** 
*   Anwendung
*/</span>
<span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam.&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Die ersten 5 Wörter bitte:</span>
<span style="color: #990000;">echo</span> getFirstWords<span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">' […]'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
* Ausgabe: Lorem ipsum dolor sit amet […]
*/</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2009/string-auf-die-ersten-worte-kuerzen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Schriftgröße in px oder em?</title>
		<link>http://dnaber.de/blog/2009/schriftgroesse-in-px-oder-em/</link>
		<comments>http://dnaber.de/blog/2009/schriftgroesse-in-px-oder-em/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 16:16:03 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Schriftgröße]]></category>
		<category><![CDATA[Typografie]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://blog.dnaber.de/?p=696</guid>
		<description><![CDATA[Die Schriftgröße auf Websites ist ein heißes Pflaster – nicht zuletzt, weil die entgültige Entscheidung beim Benutzer liegt. Man sollte es ihm also nicht unnötig schwer machen.]]></description>
			<content:encoded><![CDATA[<p>Ich spreche heut wieder mal ein Thema an, von dem ich dachte, dass es eigentlich schon vor langer Zeit in diverse <q>x-Dinge-die-man-nicht-macht</q>-Listen aufgenommen wurde. Die Rede ist von Schriftgrößen auf Webseiten und ob diese in der Einheit <code>px</code> angegeben werden sollten.<span id="more-696"></span></p>
<p>Die <abbr title="barrierefreie Informationstechnik-Verordnung">BITV</abbr> fordert ganz allgemein <a href="http://www.einfach-fuer-alle.de/artikel/bitv/anlage-1#bedingung-3.4" rel="external">die Verwendung von relativen statt absoluten Einheiten</a>. Ein <a href="http://www.w3.org/TR/CSS21/syndata.html#length-units" rel="external" title="Spezifikation des world wide web consortium" lang="en">Blick in die Spezifikation</a> verrät, dass in <abbr title="Cascading Style Sheets" lang="en">CSS</abbr> die Einheit <code>px</code> als relative Einheit zu verstehen ist. Logisch, denn wenn ich auf einen 15&#8243; Flachbildschirm 1024&#215;768 Bildpunkte aber auch 1400&#215;1050 Bildpunkte unterbekomme, dann muss der Platz pro Bildpunkt von Gerät zu Gerät unterschiedlich sein. Soweit die Theorie die sagt, <code>px</code> als Einheit ist okay für die Angabe der Schriftgröße. In der Praxis offenbaren sich dann doch einige Probleme, die ich hier demonstrieren will.</p>
<p>Als Testobjekt dient <a href="http://dnaber.de/tools/font-size.html">dieses HTML Dokument</a>, dessen Quelltext im wesentlichen so aussieht:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;style type=&quot;text/css&quot;&gt;
&nbsp;
    body {
        font-size:100%;
        line-height:1.5;
    }
    h1 {
        font-size:2em;
    }
    h2 {
        font-size:32px;
    }
    h3 {
        font-size:1em;
    }
    h4 {
        font-size:16px;
    }
    h5 {    
        font-size:.8em;
    }
    h6 {
        font-size:13px;
    }
&lt;/style&gt;
    &lt;h1&gt;Text mit 2em Schriftgröße&lt;/h1&gt;
    &lt;h2&gt;Text mit 32px Schriftgröße&lt;/h2&gt;
    &lt;h3&gt;Text mit 1em Schriftgröße&lt;/h3&gt;
    &lt;h4&gt;Text mit 16px Schriftgröße&lt;/h4&gt;
    &lt;h5&gt;Text mit .8em Schriftgröße&lt;/h5&gt;
    &lt;h6&gt;Text mit 13px Schriftgröße&lt;/h6&gt;</pre></div></div>

<p>Anschauen werde ich die Seite unter WinXP, bei einer Bildschirmauflösung von 1400&#215;1050 mit Firefox 2, Opera 9.6, InternetExplorer 6-8 und Safari 3, sowie unter Vista, 1280&#215;800 mit Firefox 3.5 und IE8 jeweils bei einem im Browser eingestellten Schriftgrößengrad von ›16‹ (also die Standardeinstellung der meisten Browser).<br />
Auf Grund der 100%-Schriftgröße für den Body, die sich auf die im Browser eingestellte Schriftgröße bezieht, sind die jeweiligen Wortgruppen annähernd gleich groß (1em entspricht <em>hier</em> 16px). Mit Ausnahme <em>aller</em> Versionen des InternetExplorers werden bei reiner Schriftvergrößerung alle Texte gleichermaßen vergrößert. Der IE8 und Opera, aber auch Firefox ab Version 3 bieten zusätzlich noch eine komplette Zoomfunktion, die die gesamte Seite proportional vergrößert/verkleinert. </p>
<p>Soweit so gut. Was passiert aber, wenn ich von der Möglichkeit gebrauch mache, mir die Schriftgröße auf ein für mich optimales Maß im Browser voreinzustellen, z.B. auf 20? Hier zeigt sich das Problem der einheit <code>px</code>: der Text ist festzementiert auf die Größe, die im Stylesheet der Seite steh. Der Schriftgrad in der Browsereinstellung wird schlicht ignoriert. Als Besucher muss ich also erstmal am Mausrad drehen, oder auf die <em>Plus</em>-Taste drücken, um die Schrift zu vergrößern.</p>
<p>Jeder bessere Browser bietet außerdem die Möglichkeit an, eine Mindestschriftgröße festzulegen, die dann nicht mehr ignoriert werden kann. Diese stellt, wenn sie denn überhaupt eingestellt ist, meist die unterste Schmerzgrenze dar, unter der absolut nichts mehr geht, und die für Fließtext eigentlich schon zu klein ist. Spätestens da ist dann Schluss mit den Pixelschriftgrößen. Im schlimmsten Fall verspielt man so die Möglichkeit mit Schriftgrößenunterschieden auf der Seite zu arbeiten, wenn man mit seinen Schriftgrößen unterhalb der Mindestgröße agiert.</p>
<p>Aus diesen Gründen kann ich nur dringend davon abraten, Schriftgrößen in <code>px</code> anzugeben. Ansonsten drängt man den Besucher, zu erst zu Zoomen, um den Text lesen zu können. Dabei ist es unerheblich ob nun reiner Textzoom oder der komplette Seitenzoom eingesetzt wird.</p>
<p>Meine Herangehensweise sieht so aus, dass ich für den Body einen Prozentwert um 100 angebe (von mir aus auch 100.01% für die älteren IEs). Überschriften und große Texte werden dann im Bereich 1.4 bis 2em bemaßt, Fließtest zwischen 1.1 und .85em und Fußnoten .9 bis .8em. Dabei kann man durchaus sehr Genau arbeiten, da die Einheit <code>em</code> bis auf die vierte Nachkommastelle genau angegeben werden kann. Ich richte meine Schriftgröße nur so lang am Design aus, wie es mir die Bemaßung in <code>em</code> erlaubt und bin damit bisher immer gut gefahren, auf Pixelgenauigkeit achte ich auch sonst eher selten. Viel wichtiger sind optimale Zeilenlängen und vor allem ein ausreichender Zeilenabstand. Der <em>Besucher</em> sollte, unabhängig von seinen gewählten Einstellungen, ein lesbares Schriftbild vorfinden. Ihm diese Freiheit zu lassen, muss nicht im Widerspruch zu gutem und detailiertem Design stehen, man muss es nur berücksichtigen.</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2009/schriftgroesse-in-px-oder-em/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>isc001 &#8211; Reassembly (free CD)</title>
		<link>http://dnaber.de/blog/2009/isc001-reassembly-free-cd/</link>
		<comments>http://dnaber.de/blog/2009/isc001-reassembly-free-cd/#comments</comments>
		<pubDate>Thu, 20 Aug 2009 15:34:04 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Vermischtes]]></category>
		<category><![CDATA[Musik]]></category>

		<guid isPermaLink="false">http://blog.dnaber.de/?p=706</guid>
		<description><![CDATA[Mit diesem Beitrag verlasse ich kurz das eigentliche Thema dieses Blogs und widme mich der elektronischen Musik. Genauer gesagt meinem Freund Maik aus Chemnitz, der unter dem Alias Commando47 seit Langem richtig gute Tracks auf seinem Myspaceprofil veröffentlicht. Gestern schrieb er mir, dass sein Track Pitchers auf der frei erhältichen Compilation Reassembly, die beim Netlabel …]]></description>
			<content:encoded><![CDATA[<p>Mit diesem Beitrag verlasse ich kurz das eigentliche Thema dieses Blogs und widme mich der elektronischen Musik. Genauer gesagt meinem Freund Maik aus Chemnitz, der unter dem Alias <em>Commando47</em> seit Langem richtig gute Tracks <a href="http://www.myspace.com/com47" rel="external">auf seinem Myspaceprofil</a> veröffentlicht. Gestern schrieb er mir, dass sein Track <em>Pitchers</em> auf der frei erhältichen Compilation <q>Reassembly</q>, die beim Netlabel indigo silver <a href="http://www.indigosilver.de/releases/isc001-reassembly/" rel="external">zum Download bereit steht</a>, veröffentlicht wurde. Wer auf locker-flockigen chillout Electro und Minimaltechno steht, der findet auf dieser virtuellen Scheibe ein paar schöne Tracks für einen entspannten Coctailabend an der Strandbar (alternativ auch auf dem hemischen Sofa).</p>
<p>Jetzt würd ich mir noch ein Release auf 12&#8243; von Pitchers wünschen… </p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2009/isc001-reassembly-free-cd/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
