<?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, 25 Jan 2012 18:15:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>daily</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>WordPress: TinyMCE Plugin mit Dialogbox</title>
		<link>http://dnaber.de/blog/2012/wordpress-tinymce-plugin-mit-dialogbox/</link>
		<comments>http://dnaber.de/blog/2012/wordpress-tinymce-plugin-mit-dialogbox/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 09:51:45 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Webdesign]]></category>

		<guid isPermaLink="false">http://dnaber.de/?p=1477</guid>
		<description><![CDATA[Tutorial zu den Grundlagen eines Dialogfensters in TinyMCE und Wordpress.]]></description>
			<content:encoded><![CDATA[<p class="remark">In diesem Beitrag zeige ich <em>eine</em> Möglichkeit, wie man den WordPress-standardeditor TinyMCE um einen Button erweitert der eine beliebig komplexes Dialogfenster öffnet mit dem man mit den gewohnten APIs auf die WordPressumgebung zugreifen kann. Sämtliche <a href="https://gist.github.com/1658122">Codebeispiele</a> sind als Gist direkt zu sehen.</p>
<p>Das Tutorial beschreibt ein erdachtes WordPress-Plugin mit folgender Verzeichnisstruktur:</p>
<pre>
my-plugin/
    i18n/
        mce_locale.php
    js/
        editor_plugin.js
    my_plugin.php
</pre>
<h3>TinyMCE</h3>
<p>Ein TinyMCE-Plugin ist wie <a href="http://www.tinymce.com/wiki.php/Creating_a_plugin">Folgt aufgebaut</a>:</p>
<p>Sämtliche Plugin-Dateien sind in einem eigenen Verzeichnis zusammengefasst. In der <code>editor_plugin.js</code> wird das Plugin initialisiert:</p>
<p><script src="https://gist.github.com/1658122.js?file=editor_plugin.js"></script></p>
<p>(Das ist der Standard von TinyMCE, die Datei kann natürlich auch anders heißen). Dafür wird der Methode <code>tinymce.create()</code> neben dem Namen des Plugin-Objekts an zweiter Stelle ein Objekt übergeben, welches u.A. die Methode <code>init</code> definiert. Diese akzeptiert wiederum zwei Parameter: das Objekt des Editorfensters und die URL zum Pluginverzeichnis. Mit dem <a href="http://www.tinymce.com/wiki.php/API3:class.tinymce.Editor">Editor-Objekt</a> und dessen Methoden kann man sich in die Funktionalität von TinyMCE einklinken und z.B. einen Button registrieren, ein Kommando definieren, dass beim Klick auf den Button zur Ausführung kommt und so fort. Über die Methode <code>editor.getLang()</code> kommt man an die übersetzten Textbausteine heran. Dazu später mehr. Um nun ein Dialog mit mehreren Eingabemöglichkeiten zu öffnen, geht TinyMCE den Weg über eine externe HTML-Datei die es in einem Inline-Frame öffnet. Das ist in sofern von Nachteil, da in diesem Kontext nur schwerlich an die WordPress API heranzukommen ist. Von der umständlichen Handhabung, das Fenster so zu stylen, dass es im WordPress-Look daher kommt mal ganz abgesehen.</p>
<p>WordPress bietet eine andere Option an: Das Markup (in den meisten Fällen ein HTML-Formular) für das Dialogfenster wird einfach über den Hook <code>wp_footer</code> in die Seite eingesetzt und per CSS ausgeblendet.</p>
<p><script src="https://gist.github.com/1658122.js?file=hook_in_dialog.php"></script></p>
<p>Die Funktionalität des Popups stellt das WP-Interne TinyMCE-Plugin »WP-Dialog« zur Verfügung. Der Methode <code>editor.windowManager.open</code> wird anstelle eines Pfads zum Popup einfach die ID des Formulars übergeben. Das ganze an ein Befehl gebunden, der wiederum an einen neuen Button gebunden wird, öffnet das Fenster beim Klick auf selbigen.</p>
<p><script src="https://gist.github.com/1658122.js?file=editor_plugin_part.js"></script></p>
<h3>WordPress</h3>
<p>WordPress kümmert sich dankenswerter Weise um die Integration des Plugins in TinyMCE. Dazu sind die Filter <code>mce_external_plugins</code> für das Plugin-Script und <code>mce_buttons</code> für den Button bereit gestellt. Beide Filter werden auf je ein Array angewendet, dass erweitert zurück gegeben wird. Um etwas Abstand zwischen die Buttons zu bekommen, setzt man als ein Array-Element einen senkrechten Stricht <code>'|'</code>.</p>
<p><script src="https://gist.github.com/1658122.js?file=mce_hook_in.php"></script></p>
<p>Dynamik in den Dialog bekommt man wie gewohnt über ein JavaScript, dass mit der Funktion <a href="http://codex.wordpress.org/Function_Reference/wp_enqueue_script"><code>wp_enqueue_script()</code></a> geladen wird. Innerhalb dieses Scripts kommt man über das globale JavaScript-Objekt <code>tinyMCEPopup</code> an den Editor bzw. mit <code>edCanvas</code> an die Textarea im HTML-Modus heran. Zu beachten ist, dass <code>tinyMCEPopup</code> zum Zeitpunkt des jQuery-eigenen Events <em>ready</em> nocht nicht verfügbar ist.</p>
<h3>i18n</h3>
<p>Um innerhalb des TinyMCE Plugins lokalisierbare Strings zu nutzen, bedarf es einer weiteren PHP-Datei, die über den Filter <code>mce_external_languages</code> geladen wird. Genauer gesagt loopt WordPress über mehrere solche Dateien und erweitert dabei einen String, der die entsprechenden Textausteine enthält, die in bekannter Weise übersetzt werden können. Der String selbst ist JavaScript-Code, der die Methode <code>tinymce.addI18n()</code> aufruft. Über den hier definierten Namensraum sind die Textbausteine dann verfügbar.</p>
<p><script src="https://gist.github.com/1658122.js?file=mce_locale.php"></script></p>
<p>Das Laden übernimmt wieder WordPress:</p>
<p><script src="https://gist.github.com/1658122.js?file=mce_i18n.php"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2012/wordpress-tinymce-plugin-mit-dialogbox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firefox 7 – und es wird nicht unbedingt besser</title>
		<link>http://dnaber.de/blog/2011/firefox-7-und-es-wird-nicht-unbedingt-besser/</link>
		<comments>http://dnaber.de/blog/2011/firefox-7-und-es-wird-nicht-unbedingt-besser/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 21:52:43 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Vermischtes]]></category>

		<guid isPermaLink="false">http://dnaber.de/?p=1457</guid>
		<description><![CDATA[Schon wieder muss ich nach einer Aktualisierung des Firefox unter der Haube rumschrauben. Ich weiß nicht, ob mir das gefallen soll.]]></description>
			<content:encoded><![CDATA[<p>So schnell kann man gar nicht gucken, wie jetzt die Versionen von Firefox rauspurzeln. Wirklich praktisches Neues ist auch bei der eben erschienenen Version 7 nicht dabei. Dafür zwei Sachen, bei denen ich ins Grübeln komme ob mir die Richtung in die die Entwicklung geht gefallen soll.</p>
<p>In der Adresszeile wird die URL jetzt um das Protokoll beschnitten. Zumindest wenn es sich dabei um das HTT-Protokoll handelt. Was das bringen soll, kann ich nur vermuten. Mir gefällt es jedenfalls nicht. In <code>about:config</code> kann man das unter dem Schlüssel <code>browser.urlbar.trimURLs</code> beheben.</p>
<p>Ein weiterer Punkt der eher Kopfschütteln verursacht ist die Implementierung der CSS-Eigenschaft <code>text-overflow</code> samt Wert <code>ellipsis</code>. Diese von Microsoft erfundene Eigenschaft führt dazu, dass Text der nicht in das umgebende Element passt (sic!) gekürzt wird und durch eine Ellipse (…) ergänzt wird. In gutem Webdesign passt sich die Box dem Text an und nicht… lassen wir das. Fakt ist, dass der Text der im Quelltext steht auch am Bildschirm zu sehen sein muss. Wenn man seine Texte schon kastrieren will, dann ist das keine Aufgabe des Stylesheets sondern des Scripts auf dem Server. Also kommt gar nicht erst auf dumme Gedanken, liebe Webdesigner da draußen. Danke.</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2011/firefox-7-und-es-wird-nicht-unbedingt-besser/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Firefox 6 und der schwache Kontrast der URL</title>
		<link>http://dnaber.de/blog/2011/firefox6-und-der-schwache-kontrast-der-url/</link>
		<comments>http://dnaber.de/blog/2011/firefox6-und-der-schwache-kontrast-der-url/#comments</comments>
		<pubDate>Mon, 22 Aug 2011 17:53:06 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Vermischtes]]></category>

		<guid isPermaLink="false">http://dnaber.de/?p=1452</guid>
		<description><![CDATA[Die Hervorhebung des Domainnamens, die eigentlich eine Abschwächung der restlichen URL ist. Und wie man es abschaltet.]]></description>
			<content:encoded><![CDATA[<p>Schwups, da war Firefox schon bei Version 6. Wirklich große Neuerungen für den Benutzer gibt es nicht. Was auffällt ist, dass die URL in der Adressleiste sehr kontrastarm erscheint. Mozilla bezeichnet das als Hervorhebung des Domainnamens und hat sich das wahrscheinlich bei Opera abgeschaut. Beispiel:</p>
<p><code><span style="color: #c0c0c0;">http://subdomain.</span>domainname.tld<span style="color: #c0c0c0;">/pfad/zurm/ziel</span></code></p>
<p>Ich hatte noch nie Probleme die einzelnen Teile einer URL zu erfassen und bei gut gemachten Seiten sind die Permalinks eine Orientierungshilfe (wenn überhaupt sollte man also den Pfad <em>hervorheben</em>). Was mir Probleme bereitet sind schwache Kontraste.</p>
<p>Um die URL gewohnt darstellen zu lassen gibt man in die Adressleiste <em>about:config</em> ein, sucht nach dem Eintrag <em>browser.urlbar.formatting.enabled</em> und setzt den Wert auf <strong>false</strong>. Nach einem Neustart des Browsers ist der Unsinn behoben.</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2011/firefox6-und-der-schwache-kontrast-der-url/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Und alle so: px oder em – oder rem?</title>
		<link>http://dnaber.de/blog/2011/und-alle-so-px-oder-em-oder-rem/</link>
		<comments>http://dnaber.de/blog/2011/und-alle-so-px-oder-em-oder-rem/#comments</comments>
		<pubDate>Mon, 02 May 2011 16:08:37 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Webdesign]]></category>

		<guid isPermaLink="false">http://dnaber.de/?p=1437</guid>
		<description><![CDATA[Mein wirklich allerletzter Beitrag zur leidigen em vs px Disskusion.]]></description>
			<content:encoded><![CDATA[<p>Es vergeht wohl kein Tag, an dem ich nicht einem zerstörten Weblayout begegne oder seufze, weil die Schrift wieder mal viel zu klein ist um sie vernünftig lesen zu können. Eigentlich habe ich mich zu der Problematik schon <a href="http://dnaber.de/blog/2009/schriftgroesse-in-px-oder-em/">ausführlich geäußert</a> und in den anderthalb Jahren hat sich die Lage auch nicht groß verändert, wenn, dann eher ins Negative. Da taucht ein Silberstreif am <abbr title="Cascading Stylesheets 3">CSS3</abbr>-Horizont auf, wie ich gerade durch den Artikel <a href="http://snook.ca/archives/html_and_css/font-size-with-rem">„Font sizing with <code>rem</code>“</a> erfahre.</p>
<p>Jonathan Snook reduziert das Problem der Einheit <code>px</code>, wie häufig in dieser Diskussion, auf den InternetExplorer. An der Einheit em stört ihn die Ungenauigkeit und die Vererbbarkeit. Ersteres ist leider nich einmal das Hauptproblem und Letztere <em>kann</em> man als Probleme sehen.</p>
<p>Absolut jeder Browser, nicht nur der <abbr title="Internet Explorer">IE</abbr>, stellt die Schrift in der Größe dar, in der sie <em>in <code>px</code> bemaßt</em> ist. Ebenfalls in jedem Browser ist die Möglichkeit gegeben, eine Schriftgröße einzustellen, die den persönlichen Gegebenheiten Rechnung trägt – das müssen noch nicht mal körperliche Einschränkungen sein, es reicht <abbr title="zum Beispiel">z.B.</abbr> ein 15&#8243;-Bildschirm mit einer hohen relativen Auflösung zu nutzen. Zugegeben, diese Möglichkeit wird wahrscheinlich eher selten genutz, aber wer nutzt sie denn? Jemand, der sich nicht jedesmal auf&#8217;s Neue den Text zurechtzoomen möchte. Muss er aber, wenn die Schriften mal wieder in <code>px</code> bemaßt sind! Einziger Ausweg ist, die Mindestschriftgröße (die in vielen Browsern ab Werk nicht gesetzt &#8211; also null &#8211; ist) auf einen erträglichen Wert herauf zu setzen. Die (bedauernswert häufige) Folge: zerschossene Layouts oder Text, der im Nirgendwo verschwindet. „Barrierefreies Webdesign? &#8211; Noch nie gehört!“</p>
<p>Die bessere Alternative zu <code>px</code> heißt <code>em</code>. Diese bedarf allerdings im Einsatz etwas mehr der Vorüberlegung. Unachtsam auf ein Element wie <code>ul</code> angewendet, führt eine Verschachtelung zu einer Multiplikation der relativen Schriftgrößenwerte. Für eine konsistente Schriftgößengestaltung würde man also darauf verzichten einzelne Textbausteine wie Absätze oder Listen mit Schriftgrößen zu versehen sondern ganze Inhaltsbereiche wie Navi oder die Sidebar. Wem das zu kompliziert ist, der darf auf <abbr title="Cascading Stylesheets 3">CSS3 </abbr>hoffen, dass mit <a href="http://www.w3.org/TR/css3-values/#relative0"><code>rem</code> eine Einheit einführt</a>, die sich auf das Wurzelelement bezieht und somit das Verschachtelungs-„problem“ umgeht.</p>
<p>Bleibt noch die Ungenauigkeit die <code>em</code>, bzw. auch <code>rem</code> als Nachteil ausgelegt wird. Jonathan fängt an rumzurechnen: auf Basis der Standardschriftgröße (in den meisten Fällen 16) versucht er, das Verhältniss 10:1 für <code>px</code>:<code>em</code> in der Darstellung zu erreichen und kommt auf einen Umrechnungsfaktor von 62,5%. Wem die Zahl bekannt vorkommt: Diese <a href="http://toscho.de/2009/mythos-font-size-62dot5-prozent/">Idee war schon vor über 5 Jahren schlecht</a> und sie ist es noch heute, denn es läuft auf das selbe Problem hinaus: die Ignorierung der Schriftgröße im Browser. Diese um über ein Drittel zu reduzieren nötigt Betroffene einmal mehr zur Mindestschriftgröße zu greifen. Schade eigentlich.</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2011/und-alle-so-px-oder-em-oder-rem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gutmensch</title>
		<link>http://dnaber.de/blog/2011/gutmensch/</link>
		<comments>http://dnaber.de/blog/2011/gutmensch/#comments</comments>
		<pubDate>Sun, 13 Mar 2011 16:08:15 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[In eigener Sache]]></category>
		<category><![CDATA[Vermischtes]]></category>

		<guid isPermaLink="false">http://dnaber.de/?p=1419</guid>
		<description><![CDATA[Eine Begriffsdefinition.]]></description>
			<content:encoded><![CDATA[<p>Gut|mensch, der; -en: Vernunftbegabte Person, die sich durch die Fähigkeit einer differenzierten Betrachtungsweise auszeichnet. Diese und kritisches Denken bilden die Grundlage der Meinungsbildung des G. und befähigen ihn diese in sachlichen Argumenten zu artikulieren. Der Begriff G. wird häufig abwertend von Menschen, deren politische Überzeugung als – dem konservativen bis rechts-nationalen Spektrum zugehörig – zu beschreiben ist, verwendet, um die Fähigkeiten den G. zu diffamieren und die mangelnden, bzw. fehlenden charakteristischen Eigenschaften des G. bei sich selbst zu verschleiern.</p>
<p><em>Angesichts <a href="http://meta.tagesschau.de/id/46888/hintergrund-was-passiert-bei-einer-kernschmelze#comment-308963">solcher Kommentare</a> zur aktuellen Lage in Japan, erschien mir eine Definition dieses Begriffs nötig.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2011/gutmensch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Für eine handvoll Popcorn</title>
		<link>http://dnaber.de/blog/2011/fuer-eine-handvoll-popcorn/</link>
		<comments>http://dnaber.de/blog/2011/fuer-eine-handvoll-popcorn/#comments</comments>
		<pubDate>Tue, 01 Feb 2011 19:34:12 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Gesellschaft]]></category>
		<category><![CDATA[Internet]]></category>

		<guid isPermaLink="false">http://dnaber.de/?p=1373</guid>
		<description><![CDATA[Über das unmoralisch intransparente Geschäftsmodell von Facebook, bei dem man sich neuerdings selbst zur Werbefigur abstempeln kann.]]></description>
			<content:encoded><![CDATA[<p>Mark Zuckerberg ist einer der jüngsten Selfmade-Milliardäre der Welt. Innerhalb von fünf Jahren ist es ihm gelungen aus <del>Schei</del>… scheinbar Nichts Geld zu machen. Der Wert seines sozialen Netzwerks Facebook wird auf bis zu 55 Mrd. $ geschätzt und ist darüber hinaus zum Quasi-Standard im Web 2.0 geworden. Zwar kenne ich Zuckerberg nicht persönlich – woher auch – dennoch ist er mir herzlich unsympatisch. Facebooks enormer virtueller Wert schöpft sich nicht aus einer besonders kreativen Leistung, oder einem inovativen Produkt, nein, Ware und Wert sind die Nutzer.</p>
<p>Facebook war nicht Zuckerbergs erstes Projekt. Aus einer Idee, unanttraktive Bilder seiner Kommilitonen mit Fotos von Tieren zu vergleichen, die ihm nach eigenen Angaben <del>im Suff</del> unter Alkoholeinfluss kam, entstand FaceMash.com, ein visuelles Bewertungssystem für Studenten. Die Bilder dafür »besorgte« Zuckerberg sich übrigens aus den geschützten Netzwerken der Harvard-Uni. Erst Später folgte Facebook, das schrittweise erst Studenten, später auch Schülern der Vereinigten Staaten und schließlich allen zur freien Nutzung geöffnet wurde. Es stellte sich als das bessere Geschäftsmodell heraus.</p>
<p>Heute sind weltweit über 500 Millionen Nutzer bei Facebook registriert. Unzählige Websites bieten einen Facebook-Link an, oft kann man sich sogar mit dem Facebook-Account bei anderen Diensten anmelden. Dem Nutzer bieten sich eine Fülle von Möglichkeiten sämtliche Kontakte zentral zu verwalten und sich selbst zu präsentieren in dem man Fotos oder Videos hochläd oder einen Weblog führt. Dabei entscheidet jeder selbst, was und wieviel er von sich preis gibt und kann einstellen, wer die Informationen einsehen darf. (Ein Fortschritt im Vergleich zu Zuckerbergs erstem Projekt.) Eine derart prall gefüllte Datenbank, voll von persönlichen Interessen,  Personenbeziehungen oder auch dem aktuellem Standort, beschert  Facebook dennoch regelmäßig finanzkräftige Investoren.</p>
<p>Was erhält man, wenn man die Schnittmenge aus Kunden eines bekannten Internetdienstanbieters und einer großen Handelskette mit Rabattsystem auf Basis persönlicher Kundenkarten bildet? Eine beachtenswert große Versuchsgruppe, an der man die nachhaltige Wirkung von Werbung nachweisen kann, völlig ohne das Wissen der Probanden. So geschehen bei einem <a href="http://www.zeit.de/wirtschaft/2011-01/werbung-internet">Experiment</a> das in Kooperation zwischen Yahoo und einer nicht genannten Handelskette in den USA stattfand. Das Ergebnis ist erschreckend eindeutig: die 80% der Versuchsobjekte, die regelmäßig Werbung des Händlers eingeblendet bekamen, gingen deutlich häufiger bei diesem einkaufen und gaben auch mehr Geld pro Einkauf aus, ohne dass es ihnen bewusst gewesen wäre. Dabei war es unerheblich, ob die Bannerwerbung angeklickt wurde oder nicht. Diese Art der <del>Manipulation</del> Werbung ist also hoch effektiv und darüber hinaus kostengünstig. Um die Effektivität dieser suggestiven Kundenaquise weiter zu steigern müsste man die eingeblendete Werbung nur noch auf die persönlichen Interessen des Menschen vor dem Bildschirm anpassen. Und wo würde man genauere Informationen über die »Wünsche« des »Kunden« erfahren als in den Datenbanken eines omnipräsenten sozialen Netzwerks?</p>
<p>Seit Neuestem kann man sich bei Facebook auch aktiv zum Objekt der Werbekampagnen degradieren. Dazu reicht es, der Welt über sein Smartphone mitzuteilen, dass man sich gerade in der Filiale eines Geschäftspartners von Facebook aufhält. Als Gegenleistung erhält man kostenlos eine Tüte Popcorn von der Lieblings-Kinokette oder einen Fanschal des Lieblingsvereins. Wäre es nicht sogar echt praktisch, wenn im Anschluss an den Kinobesuch sich der Lieblingsklamottenladen meldet, der zufällig ein Superschnäppchen nur für »Dich«  und noch zufälliger, genau in deiner Größe parat hat?</p>
<p>Mark Zuckerberg, der die Privatsphäre für überholt hällt, behauptet, die Leute würden freiwillig immer mehr Daten über sich preisgeben um sie mit anderen zu teilen. Facebook würde sich diesem Trend lediglich anpassen. Damit mag er recht haben. Ich unterstelle ihm, dass sich Facebook diesem Trend nicht nur anpasst, sondern ihn maßgeblich antreibt und zwar nicht um den Leuten die Möglichkeit zu geben sich mit anderen auszutauschen, sondern mit diesen Informationen Geld zu verdienen – möglichst ohne das die Nutzer davon wissen.</p>
<p>Es ist also nicht der lockere Umgang mit persönlichen Daten, den man Facebook vorwerfen muss, liebe Frau Aigner. Selbst bei völliger Transparenz der Datenschutzeinstellungen, Facebook muss niemandem direkten Zugriff auf seine Datenbanken geben, oder Adressen verkaufen, wie es in der <a href="http://dnaber.de/p200">Dialogmarketingbranche gern gemach wird</a>. Es reicht, die entsprechenden »Werbeflächen« für Kundenprofile zu verkaufen, die nahezu beliebig scharf abgegrenz werden können. Anstatt also zu laschen Datenschutz anzuprangern, sollten Sie vieleicht lieber Anfangen, die Leute aufzuklären, welchen Preis sie für ihre Mitgliedschaft wirklich zahlen. Aber das könnte ja langfristig indirekt der Binnennachfrage schaden.</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2011/fuer-eine-handvoll-popcorn/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sächsischer Landtag winkt JMStV durch</title>
		<link>http://dnaber.de/blog/2010/sachsischer-landtag-winkt-jmstv-durch/</link>
		<comments>http://dnaber.de/blog/2010/sachsischer-landtag-winkt-jmstv-durch/#comments</comments>
		<pubDate>Wed, 15 Dec 2010 14:28:26 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Dresden]]></category>
		<category><![CDATA[Internet]]></category>

		<guid isPermaLink="false">http://dnaber.de/?p=1343</guid>
		<description><![CDATA[Bar jeder Vernunft nicken die Konservativen und die „freien“ Demokraten einen Staatsvertrag ab, der dem Jugendschutz nicht dient.]]></description>
			<content:encoded><![CDATA[<p>Entgegen der <a href="http://dnaber.de/blog/2010/anhorung-zum-jmstv-im-saechsischen-landtag/">erdrückenden Last der Argumente</a> hat unser Landtag gestern den Jugendmedienschutz-Staatsvertrag durchgewunken. Höchstwahrscheinlich mit den Stimmen der CDU und der FDP, Informationen zur Abstimmungen sind leider rar gesät. Vom Sächsischen Landtag heißt es nur dass der Landtag „mehrheitlich zugestimmt hat“. Jedenfalls hatten sich Sprecher beider Fraktionen in der Debatte zuvor für eine Zustimmung ausgesprochen und gelogen ohne dabei rot zu werden. Von wegen Jugendschutz war bisher im Internet nicht möglich und der zur Abnickung stehende Staatsvertrag dient effektiv dem Jugendschutz im Internet.</p>
<p>Wie sehr es bei dem Staatsvertrag um das eigentliche Thema Jugendschutz geht, kann man abschätzen, wenn man das politische Kasperletheater in den einzelnen Länderparlamenten im Ganzen betrachtet. In Sachsen stimmt die CDU für den Staatsvertrag, im Rot-Rot regierten Berlin dagegen. Bei den Linken ist es andersrum. Grün ist in Sachsen dagegen, in Hamburg winkt man ihn noch schnell durch, bevor man die Regierung verlässt. Da ringt man mit sich, das Vertrauen in dieses verkrustete System nicht zu verlieren.</p>
<p>Den Vogel schoß derweil ein Herr Beermann von der CDU ab. An die Linke Julia Bonk gerichtet <a href="http://www.youtube.com/watch?v=yUGaZ3A6FNk">sagte er</a>:</p>
<blockquote><p>… den 14. Medienschutz-Staatsvertrag in seinem Lauf, … halten weder Ochs noch Esel auf.</p></blockquote>
<p>Was er damit ausdrücken wollte, kann man nur mutmaßen. Wahrscheinlich asoziiert er die Linke mit der sozialistischen DDR-Regierung, keine Ahnung. Was er hingegen gesagt <em>hat</em>, spiegelt auf eine wunderbar präzise Art und Weise die erkentnissresistente, starköpfige Ignoranz wieder, die ihn und seine Fraktionskolegen weit näher an die Haltung alter DDR-Regierungsmitglieder rücken, als die Linke jemals gewesen wäre. Auf jeden Fall zeigt es aber, wie abgehoben einige Volksvertreter inzwischen sind. Komm du mir noch mal auf den Wahlzettel!</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2010/sachsischer-landtag-winkt-jmstv-durch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Navigationsmenüs unter WordPress</title>
		<link>http://dnaber.de/blog/2010/navigationsmenus-unter-wordpress/</link>
		<comments>http://dnaber.de/blog/2010/navigationsmenus-unter-wordpress/#comments</comments>
		<pubDate>Tue, 16 Nov 2010 15:46:42 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Webdesign]]></category>

		<guid isPermaLink="false">http://dnaber.de/?p=1292</guid>
		<description><![CDATA[Ein kleines Plugin und zwei Kniffe für schlankes und semantisches HTML der Navigations-Menüs von WordPress 3.0.]]></description>
			<content:encoded><![CDATA[<p>Mit der Version 3 von WordPress kam ein ziemlich cooles Feature hinzu, welches einem gerade auf nicht-nur-Blog-Seiten sehr gelegen kam: die „Nav-Menus“ oder: die Möglichkeit die Navigation aus dem Backend zu steuern. Endlich muss ich nicht mehr in den Templates rumschreiben, wenn ich die Navigation ändern will. Die dazu passende Template-Funktion heißst <a href="http://codex.wordpress.org/Function_Reference/wp_nav_menu"><code>wp_nav_menus()</code></a>, wird im Header- oder Sidebar-Template (oder wo man es halt möchte) untergebracht und nimmt wie gewohnt einige Parameter in Form einens Arrays entgegen um z.B. HTML-Attribute wie Titel, ID und Klassen zu vergeben. Das role-Attribut ist leider nicht vorgesehen. Ich wollte schon nach den passenden Filtern suchen, um dieses Attribut mit einfügen zu können, als ich spaßeshalber folgendes probierte:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">wp_nav_menu <span style="color: #009900;">&#40;</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span>
              <span style="color: #0000ff;">'menu'</span> <span style="color: #339933;">=&gt;;</span> <span style="color: #0000ff;">'main_navigation'</span><span style="color: #339933;">,</span>
              <span style="color: #0000ff;">'container'</span> <span style="color: #339933;">=&gt;;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
              <span style="color: #666666; font-style: italic;">//Seit Version 3.1 geht das hier nicht mehr, Nachtrag beachten!</span>
              <span style="color: #0000ff;">'menu_id'</span> <span style="color: #339933;">=&gt;;</span> <span style="color: #0000ff;">'navigation&quot; role=&quot;navigation'</span><span style="color: #339933;">,</span>
              <span style="color: #0000ff;">'menu_class'</span> <span style="color: #339933;">=&gt;;</span> <span style="color: #0000ff;">''</span>
             <span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Zu meinem Erstaunen funktioniert das so einwandfrei. Ich kann mir zwar kaum vorstellen, dass das so gewollt ist und dauerhaft funktionieren wird, aber wenn es so einfach ist, braucht es vorerst keinen zusätzlichen Filter. (Zur Erläuterung: die Funktion zeigt das Menü mit dem Namen „main_navigation“ ohne umschließendes Element und ohne eine Klasse an, allerdings mit dem ID-Wert: <code>navigation" role="navigation</code> woraus der Quelltext<br />
<code><br />
&lt;ul id=&quot;navigation&quot; role=&quot;navigation&quot;&gt;&#038;lt/ul&gt;<br />
</code><br />
 resultiert.) Der Wert wird also ungefiltert übernommen, also aufpassen, was man reinschreibt.</p>
<p><strong>Nachtrag:</strong></p>
<p>Achtung! Spätestens seit Version 3.1 funktioniert das nicht mehr (wahr auch zu erwarten). Hier kann man zu folgender kurzer Funktion greifen, die man in den Filter <code>wp_nav_menu</code> einhängt:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/**
* fügt ein role-Attribut mit dem Wert 'navigation'
* dem Ersten öffnenden HTML-Tag von $a
* hinzu
*/</span>
<span style="color: #000000; font-weight: bold;">function</span> mytheme_add_nav_role<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: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'#^\s*&amp;lt; ([a-z]+)([^&amp;gt;]*)&amp;gt;#i'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'&amp;lt; ${1}${2} role=&quot;navigation&quot;&amp;gt;'</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: #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;">'wp_nav_menu'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'mytheme_add_nav_role'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>Seitenauswahl einrücken</h3>
<p>Jetzt aber ab ins Backend und das Menü anlegen um zu sehen, wie das funktioniert. In den meisten Fällen wird die Navigation sicher die Stuktur der angelegten Seiten abbilden. Warum die Seiten also nicht in ihrer hirarchischen Anordnung sondern in einer einfachen Liste, ihrem Titel nach sortiert, dargestellt werden, ist mir ein Räzel. Spätestens wenn die Seiten nicht mehr allein durch ihren Titel sondern durch die Beziehung zu anderen Seiten identifizierbar sind, steht man vor einem echten Problem.</p>
<p><img class="size-full wp-image-1296 alignnone" title="Unsortiertes Durcheinander" src="http://dnaber.de/wp-content/uploads/nav-menu-checklist.jpg" alt="" width="309" height="404" /></p>
<p>Dabei ist der Core-Code nur eine Zeile von der Lösung entfernt. Da in diesen untiefen des WordPress-Codes keine Möglichkeit besteht über die Plugin-API einzugreifen, habe ich die entsprechende Funktion und eine Klasse kurzerhand in einem Plugin geklont. Jetzt existiert eine weitere Metabox in der das Chaos weitgehend gebannt ist.</p>
<p><img class="size-full wp-image-1299 alignnone" title="Seiten in Baumstruktur" src="http://dnaber.de/wp-content/uploads/nav-menu-page-tree.jpg" alt="" width="291" height="392" /></p>
<p>Das Plugin trägt den schönen Namen „nav-menu-page-tree“ und kann hier herunter geladen werden:</p>
<p style="text-align: center;"><del><a title="Plugin obsolet, Nachtrag beachten!"class="download-link" href="http://dnaber.de/tools/plugins/nav-menu-page-tree.zip">nav-menu-page-tree.zip</a></del>.</p>
<p><strong>Nachtrag</strong><br />
<em>Mit Version 3.2 werden die existierenden Seiten von WordPress selbst auch hirarchisch geordnet dargestellt, womit das Plugin obsolet geworden ist</em>.</p>
<h3>Markup aufräumen</h3>
<p>Das durch <code>wp_nav_menus()</code> erzeugte Markup der Navigation im Frontend ist gewohnt tadellos, allerdings reichlich überladen. Jedes Listenelement hat eine ID und mehrere Klassen. Darauf kann ich getrost verzichten. Im Falle der ID geht das ganz unkompliziert mit folgendem Filter:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'nav_menu_item_id'</span><span style="color: #339933;">,</span><span style="color: #990000;">create_function</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'$a'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">' return &quot;&quot;; '</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Bevor Worpress das ID-Attribut in den Quelltext einfügt, wird geprüft, ob der Wert überhaupt existiert. Wir haben ihn hier gerade gelöscht. Bei den Klassen funktioniert das seltsamer weise nicht. Nachdem ein Filter die Klassen mit einem leeren String überschrieben hat, müssen vor der Ausgabe des Markups die leeren Attribute entfernt werden:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'nav_menu_css_class'</span><span style="color: #339933;">,</span><span style="color: #990000;">create_function</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'$a'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">' return array();'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'wp_nav_menu'</span><span style="color: #339933;">,</span><span style="color: #990000;">create_function</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'$a'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'return str_replace(&quot; class=\&quot;\&quot;&quot;,&quot;&quot;, $a);'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Diese zwei Maßnahmen sparen unter Umständen einen ganze Menge Quelltext. Man kann sich jetzt drüber streiten, ob die Einsparung der Datenmenge die längere Scriptlaufzeit aufhebt, aber als Freund sauberen Quellcodes ist mir das allemal lieber.</p>
<p>Die Funktion <code>wp_nav_menus()</code> schicke ich in den Templates überdies noch durch Thomas&#8217; Funktion <a href="http://toscho.de/2009/deppenlink-entfernen/#toc-alte-version"><code>remove_self_links()</code></a> um Links zu entfernen die auf die aktuell angezeigte Seite zeigen. Das klappt hoffentlich auch irgendwann mal von Hause aus.</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2010/navigationsmenus-unter-wordpress/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>12. Dresden Marathon</title>
		<link>http://dnaber.de/blog/2010/12-dresden-marathon/</link>
		<comments>http://dnaber.de/blog/2010/12-dresden-marathon/#comments</comments>
		<pubDate>Fri, 22 Oct 2010 14:01:55 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Dresden]]></category>

		<guid isPermaLink="false">http://dnaber.de/?p=1282</guid>
		<description><![CDATA[Wo man am Sonntag mit dem Auto durchkommt. Und wo nicht.]]></description>
			<content:encoded><![CDATA[<p>Kommenden Sonntag findet wieder der alljährliche <a href="http://de.wikipedia.org/wiki/Dresden-Marathon">Dresden Marathon</a> statt. Wer, wie ich, auf das Auto angewiesen ist, wird mit einigen Einschränkungen in der Innenstadt rechnen müssen, und sollte entsprechend viel Zeit einplanen.</p>
<p>Die Veranstalter haben die Straßensperrungen <a href="http://www.dresden-marathon.de/infosperren.aspx">tabellarisch zusammengefasst</a> was ich nicht sehr praktikabel finde, gerade für Ortsfremde. Ich habe die Sperrungen mal in eine <a href="http://maps.google.de/maps/ms?hl=de&amp;gl=de&amp;ie=UTF8&amp;oe=UTF8&amp;msa=0&amp;msid=104905904250457076817.00049332b4be2c27104af">Karte bei Google-Maps</a> eingetragen. Vieleicht hilft es ja dem einen oder anderen, der aus der Innenstadt raus muss (oder rein will). Der <a href="http://maps.google.de/maps?f=d&amp;source=s_d&amp;saddr=Ostra-Allee&amp;daddr=Schlesischer+Pl.%2FB6+to:51.060789,13.7382521+to:Theaterplatz+to:K%C3%A4the-Kollwitz-Ufer+to:Goetheallee+to:51.0605834,13.7835431+to:Blasewitzer+Str.+to:51.0413964,13.7676304+to:St%C3%BCbelallee+to:51.0298819,13.7713192+to:Querallee+to:51.0381498,13.7635118+to:51.04236,13.75155+to:Stra%C3%9Fburger+Pl.+to:51.0419298,13.7669275+to:51.04687,13.77181+to:Pillnitzer+Str.+to:Unbekannte+Stra%C3%9Fe+to:Unbekannte+Stra%C3%9Fe+to:Gro%C3%9Fe+Mei%C3%9Fner+Str.%2FB170+to:51.0557959,13.7350258+to:Devrientstra%C3%9Fe%2FB6&amp;geocode=FQgNCwMdQn3RAA%3BFV4vCwMd_KnRAA%3BFTUgCwMdDKHRAClvBrtwa88JRzHwRR45y7EhEw%3BFcAJCwMddpnRAA%3BFdkLCwMd_JnSAA%3BFdIaCwMd4FvSAA%3BFWcfCwMd91HSACn39w8GycgJRzGwsICGwY4gEw%3BFUMBCwMdszrSAA%3BFXTUCgMdzhPSACl7wAOtq8gJRzEg_yA5y7EhEw%3BFb_DCgMdmzzSAA%3BFXmnCgMdNyLSACm9Cm7rBMYJRzHA9iA5y7EhEw%3BFRy4CgMdrvLRAA%3BFcXHCgMdtwPSACmxOzgGAMYJRzFR9R45y7EhEw%3BFTjYCgMd_tTRACn5pKKZV88JRzEADR85y7EhEw%3BFQ7nCgMdhOLRAA%3BFYnWCgMdDxHSACnjeGIVq8gJRzEB8x45y7EhEw%3BFdbpCgMdIiTSACkXF0uhrcgJRzGA5ctqwY4gEw%3BFW78CgMdQMXRAA%3BFT4OCwMdMsTRAA%3BFR8RCwMd3qLRAA%3BFXoUCwMdtavRAA%3BFbMMCwMdcZTRACmvHYorac8JRzHgSnY7y7EhEw%3BFaQWCwMd6IHRAA&amp;hl=de&amp;mra=ls&amp;via=2,6,8,10,12,13,15,16,21&amp;dirflg=w&amp;sll=51.047245,13.764655&amp;sspn=0.037286,0.084972&amp;ie=UTF8&amp;z=14">Wegverlauf des Halbmarathons</a> ließ sich leider nicht über die Karte legen. (Vieleicht lieg es an dem Beta-Status des Fußgänger-Routenplaners.) Für den öffentlichen Nahverkehr <a href="http://www.dvb.de/de/Fahrplan/Linienaenderungen/detail.do/478437?uk_id=1287755346">gelten auch einige Einschränkungen</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2010/12-dresden-marathon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Anhörung zum JMStV im Sächsischen Landtag</title>
		<link>http://dnaber.de/blog/2010/anhorung-zum-jmstv-im-saechsischen-landtag/</link>
		<comments>http://dnaber.de/blog/2010/anhorung-zum-jmstv-im-saechsischen-landtag/#comments</comments>
		<pubDate>Tue, 14 Sep 2010 18:21:20 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Internet]]></category>

		<guid isPermaLink="false">http://dnaber.de/?p=1257</guid>
		<description><![CDATA[Sieben Sachverständige aus Wissenschaft und Medienverbänden sprachen vor dem Ausschuss für Wissenschaft und Hochschule, Kultur und Medien über den Jugendmedienschutz-Staatsvertrag.]]></description>
			<content:encoded><![CDATA[<p>Gestern lud der Ausschuss für Wissenschaft und Hochschule, Kultur und Medien sieben Sachverständige zu einer öffentlichen Anhörung zum Thema Jugendmedienschutz-Staatsvertrag ein. Neben Jürgen Ertelt und den  Professoren Kurt Starke und Hannes Federrath waren u.a. auch Vertreter der <abbr title="Kommision für Jugendmedienschutz der Landesmedienanstalten">KJM</abbr>, der Medienanstalt Sachsen-Anhalt und des Verbands Privater Rundfunk und Telemedien <abbr title="eingetragener Verein">e.V.</abbr> anwesend.</p>
<p>Alle anwesenden Sachverständigen waren sich dahingehend einig, dass Jugendschutz ein wichtiges Thema sei und dass man sich mehr Sachlichkeit in der Diskussion über das „Wie?“ wünscht. Schon mit dem zweiten Punkt nahm es nicht jeder so genau. So wurden Bedenken, dass durch diese Form des <abbr title="Jugendmedienschutz-Staatsvertrag">JMStV</abbr> neue Abmahnansätze geschaffen würden, von Herrn Heine (Medienanstalt <abbr title="Sachsen-Anhalt">ST</abbr>) flapsig beiseite gewischt. Jeder der eine Internetseite ins Netz stellt, habe sich zu informieren. Abmahnungen gebe es nun mal, damit müsse man leben. „Das Urheberrecht sei für Internetseitenersteller viel schwerer …“, so Heine. Der <abbr title="Jugendmedienschutz-Staatsvertrag">JMStV</abbr> macht den Braten also auch nicht mehr Fett. Ähnlich argumentierte Herr Grewing (<abbr title="Verband privater Rundfunk und Telemedien e.V.">VPRT</abbr>), der überzeugt ist, dass Sendezeiten für das Internet bald technisch möglich sind und sich für einen verpflichtenden Einsatz der Filter seitens der Accessprovider aussprach.</p>
<p>Mit etwas handfesteren Aussagen konnte zumindest Frau Braml von der <abbr title="Kommision für Jugendmedienschutz der Landesmedienanstalten">KJM</abbr> argumentieren. Ihre Kommission habe die bisher verfügbaren Jugendschutzfilter getestet. Das Ergebnis ist hinsichtlich der korrekten Funktion der Filter und des Preises der Programme allerdings unbefriedigend. Aus ihrer Sicht setzt der <abbr title="Jugendmedienschutz-Staatsvertrag">JMStV</abbr> dennoch positive Impulse für den Jugendschutz im Sinne der „regulierten Selbstregulierung“. Die praktische Umsetzung (sprich, die Kontrolle auf Entwicklungsbeeinträchtigende Inhalte) kann durch redaktionelle Betreuung von nutzergenerierten Inhalten (auf Nachfrage wenigstens 100 Mitarbeiter auf 10<sup>6</sup> Nutzer) oder „Beschwerde-Buttons“ erfolgen.</p>
<p>Jürgen Ertelt sprach, wie auch Prof. Dr. Frederrath, die technischen Probleme und vor allem gesellschaftlichen Konsequenzen an, die sich aus diesem <abbr title="Jugendmedienschutz-Staatsvertrag">JMStV</abbr> ergeben. Seine <a href="http://saubernetz.de">Argumente</a> decken sich weitgehend mit den Forderungen des AK-Zensur und lassen sich mit seinen Worten „Technik kann Erziehung nicht ersetzen“ wohl am besten zusammenfassen.</p>
<p>Einen sehr interessanten Beitrag zur Diskussion lieferte Prof. Dr. Kurt Starke, seines Zeichens Soziologe, Jugendforscher und Sexualwissenschaftler, der einen bis dahin völlig unbeachteten Aspekt des <abbr title="Jugendmedienschutz-Staatsvertrag">JMStV</abbr> beleuchtete. Die Tatsache, dass der Begriff der „Pornografie“ nicht klar definiert ist öffnet der Willkür „Tür und Tor“. Außerdem erfasst der Passus über „sexuelle Handlungen von, an oder vor unter 18-jährigen“ einen Großteil der Jugendsexualität. Laut Starke gibt es keine Untersuchung, die die Entwicklungsbeeinträchtigung von „Pornografie“ belegen kann. Etwas scheinbar Entwicklungsbeeinträchtigendes mit Altersbeschränkungen  zu kennzeichnen schafft aber gerade erst einen Reiz des Verbotenen und wird somit erst recht interessant. Bezüglich des Konsums von Pornografie wird Jugendlichen viel unterstellt, was nicht den Tatsachen entspreche. Wer Jugendliche schützen will, kommt mit einer Strategie der Bevormundung von Eltern und Jugendlichen nicht weit. Ethische Maßstäbe sind sinnvoller als Verbote.</p>
<p>Bisweilen fühlte man sich an die „Zensursula“-Debatte vor knapp einem Jahr erinnert. Ich kann es nachvollziehen, dass Herr Federrath es frustrierend findet, wie Argumente, die mit großem Sachverstand und Geduld aus den Fachrichtungen zusammengetragen werden, immer wieder beiseite Gewischt werden oder schlicht an Vorurteilen und festgefahrenen Meinungen abprallen.</p>
<p>Es bleibt zu hoffen, dass diese Anhörungen bei den Mitgliedern der Regierungsfraktionen berechtigten Zweifel an dem JMStV sähen konnte. Sonst steht uns bald der nächste Versuch, ein gesellschaftliches Problem mit technisch wirkungslosen Mitteln zu lösen, ins Haus, der in dieser Form allenfalls den Rechteverwertern zusagt und einigen Jugendschützern ein gutes Gewissen beschert.</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2010/anhorung-zum-jmstv-im-saechsischen-landtag/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<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">CAPTCHA</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>5</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: #009900; 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: #b1b100;">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[Nicht-Blogs]]></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>
	</channel>
</rss>

