<?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, 16 May 2012 16:42:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>daily</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Wo $wp_scripts drauf steht, ist WP_Scripts drin</title>
		<link>http://dnaber.de/blog/2012/wo-wp-scripts-drauf-steht-ist-wp-scripts-drin/</link>
		<comments>http://dnaber.de/blog/2012/wo-wp-scripts-drauf-steht-ist-wp-scripts-drin/#comments</comments>
		<pubDate>Wed, 16 May 2012 16:42:35 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Webdesign]]></category>

		<guid isPermaLink="false">http://dnaber.de/?p=1567</guid>
		<description><![CDATA[Verlass dich auf Annahmen und du bist verlassen.]]></description>
			<content:encoded><![CDATA[<p>Denkste. Hier hat sich für ein paar Tage der Fehlerteufel eingeschlichen. Und er wäre noch immer drin, hätte mich <a href="http://toscho.de/">Toscho</a> nicht darauf aufmerksam gemacht. In einem neuen <a href="https://github.com/dnaber-de/WP-Colored-Coding">Plugin</a>, dass ich hier gerade teste, soll möglichst flexibel aber sparsam mit externen Javascripts gearbeitet werden. WordPress handhabt das im Kern mit dem globalen Objekt <code>$wp_scripts</code>. Dessen Eigenschaft <code>queue</code> enthält alle registrierten, noch nicht im Template ausgespuckten Scripte. Ein blindes darauf-zugreifen führt dann zwangsläufig zum Crash, wenn das globale Objekt gar nicht gesetzt ist. Genau das ist – logischer weise – im <a href="/feed/">Feed</a> der Fall. Außer man ist angemeldet, dann schlummert in jener Eigenschaft das Script für die Adminbar. Auch im Feed.</p>
<p>Fazit: man sollte auch den eigenen Feed in irgend einem Reader haben und wenn man sich von den API-Funktionen von WordPress löst, lieber einmal öfter die benutzen Globalen prüfen. Und testen, testen, testen.</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2012/wo-wp-scripts-drauf-steht-ist-wp-scripts-drin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress: get_terms(), sortiert nach &#8216;description&#8217;</title>
		<link>http://dnaber.de/blog/2012/wordpress-get-terms-sortiert-nach-description/</link>
		<comments>http://dnaber.de/blog/2012/wordpress-get-terms-sortiert-nach-description/#comments</comments>
		<pubDate>Sun, 13 May 2012 16:21:37 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Webdesign]]></category>

		<guid isPermaLink="false">http://dnaber.de/?p=1556</guid>
		<description><![CDATA[Wie man Taxonomie-Begriffe nach dem Beschreibungstext sortiert.]]></description>
			<content:encoded><![CDATA[<p>Die Funktion <code>get_terms()</code> nimmt einiges an Parametern in Form eines Arrays entgegen, so auch einen der bestimmt, nach welchem Attribut sortiert werden soll – leider akzeptiert WP keinen Wert um nach der Beschreibung der Begriffe zu sortieren. Zum Glück wird dieser Teil des SQL-Statements auch durch einen Filter geschickt, dieser heißt <code>get_terms_orderby</code> und den kann man dann nutzen. Die Funktionsparameter werden zu einer Datenbankabfrage über die Tabellen <code>wp_terms</code> und <code>wp_term_taxonomy</code> zusammen gefügt. Dabei wird <code>wp_terms</code> der Alias <code>t</code> und <code>wp_term_taxonomy</code> der Alias <code>tt</code> zugewiesen. Die Beschreibung der Begriffe ist in der Tabelle<code> wp_term_taxonomy</code> gespeichert, die Spalte nach der sortiert werden soll benennt man also mit <code>tt.description</code> und platziert diese über den Filter an Ort und Stelle. Das geht so lange gut, bis sich das SQL-Schema der Funktion <code>get_terms</code> mal ändert, dann hat man im schlimmsten Fall einen SQL-Fehler produziert. Um sicher zu gehen, dass wenigstens der Alias der entsprechenden Tabelle stimmt, kann man die Spalte für die Anzahl der mit diesem Begriff verknüpften Posts, genannt <code>count</code>, heranziehen, der sich die Tabelle mit der <code>description</code> teilt. Die Sortierung nach der Anzahl wird von Hause aus nämlich unterstützt. Also:</p>
<div class="wp-cc wp-cc-php"><pre><code data-language="php">/**
 * get SQL-clause to 
 * sort by wp_term_taxonomy.description
 * 
 * @param string $orderby
 * @return string
 */
function order_terms_by_desc( $orderby ) {

	return str_replace( &#039;.count&#039;, &#039;.description&#039;, $orderby );
}
</code></pre></div>
<p>Um dann im Theme (oder wo man sonst möchte) diverse Begriffe nach der Beschreibung sortiert zu bekommen, setzt man den Filter vor dem Funktionsaufruf (und nimmt ihn anschließend wieder raus!):</p>
<div class="wp-cc wp-cc-php"><pre><code data-language="php">add_filter( &#039;get_terms_orderby&#039;, &#039;order_terms_by_desc&#039; );
$terms = get_terms( 
	&#039;eine-taxonomie&#039;,
	array(
		# some parameter
		&#039;orderby&#039; =&gt; &#039;count&#039; # important!
	)
);
remove_filter( &#039;get_terms_orderby&#039;, &#039;order_terms_by_desc&#039; );</code></pre></div>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2012/wordpress-get-terms-sortiert-nach-description/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mit PHP Klassen nach dem nth-child-Prinzip vergeben</title>
		<link>http://dnaber.de/blog/2012/mit-php-klassen-nach-dem-nth-child-prinzip-vergeben/</link>
		<comments>http://dnaber.de/blog/2012/mit-php-klassen-nach-dem-nth-child-prinzip-vergeben/#comments</comments>
		<pubDate>Mon, 07 May 2012 15:37:44 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Webdesign]]></category>

		<guid isPermaLink="false">http://dnaber.de/?p=1541</guid>
		<description><![CDATA[Ein Codeschnipsel für zwischendurch: HTML-Klassen vergeben die den nth-child-Selektor entsprechen.]]></description>
			<content:encoded><![CDATA[<p>Es könnte alles so einfach sein wenn da nicht der IE wäre, der bis einschließlich Version 8 nichts von der CSS Pseudoklasse <code>:nth-child</code> weiß. Ich versuche inzwischen, das weitgehend zu ignorieren solange es sich um Schönheitsfehler handelt und nicht um elementare Gestaltungsprobleme. Für den zweiten Fall habe ich mir eine <a href="https://gist.github.com/2627721">PHP-Klasse</a> geschrieben, die im Template den HTML-Elementen nach der Nth-Child-Syntyx eine Klasse verpasst um diese Elemente mit dem Klassenselektor anzusprechen. Gibt es bestimmt schon in hundert-facher Ausführung, aber ich hatte gerade mal Lust auf ein klein <em>wenig</em> Mathe.</p>
<p>Das ganze funktioniert dann so:</p>
<div class="wp-cc wp-cc-php"><pre><code data-language="php">&lt;?php
# alle außer den ersten 4
$n = new Nth_Child_Class( &#039;-n+4&#039;, &#039;greater-than-four&#039; );
?&gt;
&lt;ul&gt;
&lt;?php for ( $i = 1; $i &lt;= 10; $i++; ) : ?&gt;
	&lt;li class=&quot;&lt;?php $n-&gt;print_class(); ?&gt;&quot;&gt;…&lt;/li&gt;
&lt;?php endfor; ?&gt;
&lt;/ul&gt;</code></pre></div>
<p>Es  lässt sich z.B. auch auf WordPress-Posts anwenden, wenn man die Klasse um zwei Methoden ergänzt:</p>
<div class="wp-cc wp-cc-php"><pre><code data-language="php">/**
 * applied to the wp filter &#039;post_class&#039;
 *
 * @param array $classes
 * @param string $class
 * @param int $post_id
 * @return array
 */
public function wp_get_class( $classes, $class, $post_id ) {

	$nth_class = $this-&gt;get_class();
	if ( &#039;&#039; !== $nth_class )
		$classes[] = $nth_class;

	return $classes;
}

/**
 * clean up
 */
public function __destruct() {
	remove_filter( &#039;post_class&#039;, array( $this, &#039;wp_get_class&#039; ), 10, 3 );
}
</code></pre></div>
<p>und im Constructor den Filter setzt:</p>
<div class="wp-cc wp-cc-php"><pre><code data-language="php">add_filter( &#039;post_class&#039;, array( $this, &#039;wp_get_class&#039; ), 10, 3 );</code></pre></div>
<p>Im Theme wird die Klasse dann vor dem Loop einmal instanziert. Direkt danach räumt man mit <code>unset()</code> auf die Instanzvariable alles sauber auf.</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2012/mit-php-klassen-nach-dem-nth-child-prinzip-vergeben/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erkenntnisse Bloggen 2: Firefox&#8217; magische Paddings auf Listenelementen</title>
		<link>http://dnaber.de/blog/2012/firefox-magische-paddings-auf-listenelemente/</link>
		<comments>http://dnaber.de/blog/2012/firefox-magische-paddings-auf-listenelemente/#comments</comments>
		<pubDate>Mon, 19 Mar 2012 11:50:07 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Firefox]]></category>

		<guid isPermaLink="false">http://dnaber.de/?p=1497</guid>
		<description><![CDATA[… oder warum Reset-Stylesheets tückisch sind.]]></description>
			<content:encoded><![CDATA[<p>Firefox hat – wie ich seit heute weiß – die nette Angewohnheit, Listenelementen einen mysteriösen Innenabstand zu verpassen, wenn man <code>list-style-position</code> auf <code>inside</code> setzt. Auch dann, wenn der <code>list-style-type</code> auf <code>none</code> gesetzt ist. Warum das so ist, kann ich nicht genau sagen, Fakt ist, dass <em>alle</em> anderen bekannten Browser die – meiner Meinung nach – korrekte Darstellung zeigen. Folgendes Beispiel reproduziert das Verhalten: </p>
<div class="wp-cc wp-cc-html"><pre><code data-language="html">&lt;!DOCTYPE html&gt;
	&lt;!--
	  - some strange padding occurs on li-elements in firefox due to
	  - list-style-position: inside
	  --&gt;
&lt;html lang=&quot;en&quot;&gt;
	&lt;meta charset=&quot;utf-8&quot; /&gt;
	&lt;title&gt;Floated list elements&lt;/title&gt;
	&lt;style type=&quot;text/css&quot;&gt;
		* {
			margin: 0;
			padding: 0;
		}
		article {
			width: 50em;
			margin: 10px auto;
			padding: 10px;
			background: #ddd;
		}
		h1, ul {
			float:left;
		}
		ul {
			list-style-type: none;
			list-style-position: inside;
		}
		li {
			float: left;
			outline: 1px solid #000;
			border-right: 1px dotted #f00;
			padding-right: 0;
			margin-right: 0;
		}
		li span {
			background: #aaf;
			padding: 3px;
		}
		p:after {
			content:&quot;.&quot;;
			clear:left;
			display:block;
			wilih:0;
			height:0;
			text-indent: -9999px;
		}
	&lt;/style&gt;
	&lt;article&gt;
		&lt;h1&gt;List-style-possiton&lt;/h1&gt;
		&lt;ul&gt;
			&lt;li&gt;&lt;span&gt;one&lt;/span&gt;&lt;/li&gt;
			&lt;li&gt;&lt;span&gt;two&lt;/span&gt;&lt;/li&gt;
			&lt;li&gt;&lt;span&gt;foo&lt;/span&gt;&lt;/li&gt;
		&lt;/ul&gt;
	&lt;p&gt;Lorem Ipsum&lt;/p&gt;
	&lt;/article&gt;
&lt;/html&gt;	</code></pre></div>
<p>Was würde man in etwa erwarten?<br />
<img class="aligncenter size-full wp-image-1498" title="firefox-floated-lis" src="http://dnaber.de/wp-content/uploads/firefox-floated-lis.png" alt="" width="495" height="56" /><br />
Statt dessen erscheint einen Innenabstand, interessanter weise auf der rechten Seite der einzelnen Listenelemente:</p>
<p><img class="aligncenter size-full wp-image-1499" title="firefox-ghost-padding" src="http://dnaber.de/wp-content/uploads/firefox-ghost-padding.png" alt="" width="504" height="55" /></p>
<p>Danach sucht man gerne mal auch etwas länger. Das <code>float</code> hat dabei übrigens keinen Einfluss auf den mysteriösen Padding, er lässt sich auch nicht mit expliziten Angaben zum Verschwinden überreden. Was hilft ist entweder explizit den <code>list-style-type</code> auf <code>outside</code> zu setzen oder den Listenelementen als Inline-Block Elemente zu formatieren.  Zwar ist <code>outside</code> der Standard, sieht aber im Fließtext hässlich aus und wer verlässt sich schon gern auf Standards?</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2012/firefox-magische-paddings-auf-listenelemente/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erkenntnisse bloggen 1: WordPress Post-GUID sind nicht verlässlich</title>
		<link>http://dnaber.de/blog/2012/erkenntnisse-bloggen-1-wordpress-post-guid-sind-nicht-verlasslich/</link>
		<comments>http://dnaber.de/blog/2012/erkenntnisse-bloggen-1-wordpress-post-guid-sind-nicht-verlasslich/#comments</comments>
		<pubDate>Sun, 12 Feb 2012 18:22:50 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Webdesign]]></category>

		<guid isPermaLink="false">http://dnaber.de/?p=1493</guid>
		<description><![CDATA[Jede noch so banal erscheinende Einsicht ist es wert festgehalten zu werden.]]></description>
			<content:encoded><![CDATA[<p>Gerade habe ich mit <a href="http://toscho.de">Toscho</a> in einem kurzen Chat über die <a href="http://de.wikipedia.org/wiki/Globally_Unique_Identifier">GUIDs</a> in WordPress gesprochen und festgestellt, dass diese nicht immer so verlässlich sind, wie ich anfangs dachte. Darauf meinte er, dass solche Ensichten eigentlich gleich gebloggt werden müssen. Recht hat er.</p>
<p>Eine GUID ist eigentlich eine global eindeutige ID. Die WordPress GUID, die in der Posts-Tabelle ein eigenes Feld hat ist in aller Regel der Permalink zum Zeitpunkt an dem das Post angelegt wird und ändert sich nicht &#8211; theoretisch. Global bezieht sich hier auf den Blog, bzw. auf das Blognetzwerk einer Multisite-Umgebung. Für meine Zwecke reichte das.</p>
<p>Nun fristet die Post-GUID eher ein Nieschendasein (mir ist sie noch nie begegnet, entdeckt habe ich sie eher zufällig) und, so meint Toscho, wenn sie mal zu einer echten GUID mausert, dann war&#8217;s dass mit der Konsistenz der Daten, wenn man auf die GUID als Verknüpfung gesetzt hat. In meinem Fall hat dem entsprechend beim Import niemand an die GUID gedacht. In Zukunft werde ich gleich lieber ein Post-Meta mehr nehmen als an der falschen stelle zu sparen. Sogesehen kann ich froh sein, dass der große Chrash ausgeblieben ist und das Problem noch vor dem Release aufgefallen ist.</p>
]]></content:encoded>
			<wfw:commentRss>http://dnaber.de/blog/2012/erkenntnisse-bloggen-1-wordpress-post-guid-sind-nicht-verlasslich/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<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>
<div class="wp-cc"><pre><code data-language="">my-plugin/
	i18n/
		mce_locale.php
	js/
		editor_plugin.js
	my_plugin.php</code></pre></div>
<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>
<div class="wp-cc wp-cc-javascript"><pre><code data-language="javascript">// js/editor_plugin.js
/**
 * an example tinyMCE Plugin
 */
tinymce.create(
	&#039;tinymce.plugins.myPlugin&#039;,
	{
		/**
		 * @param tinymce.Editor editor
		 * @param string url
		 */
		init : function( editor, url ) {
			/**
			 * register a new button
			 */
			editor.addButton(
				&#039;my_plugin_button&#039;,
				{
					cmd : &#039;my_plugin_button_cmd&#039;,
					title : editor.getLang( &#039;myPlugin.buttonTitle&#039;, &#039;My Button&#039; ),
					image : url + &#039;/img/example.gif&#039;
				}
			);
			/**
		 	* and a new command
		 	*/
			editor.addCommand(
				&#039;my_plugin_cmd&#039;,
				function() {
					/**
					* @link http://www.tinymce.com/wiki.php/API3:method.tinymce.WindowManager.open
					* @param Object Popup settings
					* @param Object Arguments to pass to the Popup
					*/
					editor.windowManager.open(
						{
							file : url + &#039;/dialog.htm&#039;,
							width : 320,
							height : 120,
							inline : 1
						},
						{
							plugin_url : url,
							some_custom_arg : &#039;custom value&#039;
						}
					);
				}
			);
		}
	}
);
// register plugin
tinymce.PluginManager.add( &#039;myPlugin&#039;, tinymce.plugins.myPlugin );</code></pre></div>
<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>
<div class="wp-cc wp-cc-php"><pre><code data-language="php"># somewhere in my_plugin.php
if ( is_admin() ) {
	/**
	 * hook in only, if current user can
	 * see the editor and want to have
	 * a rich text editor
	 */
	if (
	    (    current_user_can( &#039;edit_posts&#039; )
          || current_user_can( &#039;edit_pages&#039; ) 
	    )
	    &amp;&amp; &#039;true&#039; == get_user_option( &#039;rich_editing&#039; )
	) {
		add_action( &#039;wp_footer&#039;, &#039;my_plugin_dialog&#039; );
	}
}

function my_plugin_dialog() { 
	?&gt;
	&lt;div style=&quot;display:none;&quot;&gt;
		&lt;form id=&quot;my_plugin_dialog&quot; tabindex=&quot;-1&quot; action=&quot;&quot;&gt;
			&lt;div&gt;
				&lt;input type=&quot;text&quot; name=&quot;foo&quot; /&gt;
			&lt;/div&gt;
			&lt;div&gt;
				&lt;input type=&quot;submit&quot; class=&quot;button-primary&quot; value=&quot;Go&quot; /&gt;
			&lt;/div&gt;
		&lt;/form&gt;
	&lt;/div&gt;
	&lt;?php
}

</code></pre></div>
<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>
<div class="wp-cc wp-cc-javascript"><pre><code data-language="javascript">// js/editor_plugin.js
/**
 * somewhere in the init-method
 * of the parameter object at
 * tinymce.create()...
 *
 * this requires the mce plugin WPDialog
 */
editor.addCommand(
	&#039;my_plugin_button_cmd&#039;,
	function() {
		/**
		 * @param Object Popup settings
		 * @param Object Arguments to pass to the Popup
		 */
		editor.windowManager.open(
			{
				 // this is the ID of the popups parent element
				 id : &#039;my_plugin_dialog&#039;,
				 width : 480,
				 title : editor.getLang( &#039;myPlugin.popupTitle&#039;, &#039;Default Title&#039; )
				 height : &#039;auto&#039;,
				 wpDialog : true,
			},
			{
				plugin_url : url
			}
    	);
	}
);</code></pre></div>
<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>
<div class="wp-cc wp-cc-php"><pre><code data-language="php"># somewhere in my_plugin.php
add_filter( &#039;mce_external_plugins&#039;, &#039;register_my_tinymce_plugin&#039; );
add_filter( &#039;mce_buttons&#039;, &#039;register_my_tinymce_button&#039; );

/**
 * register_my_tinymce_plugin
 *
 * @param array $mce_plugins
 * @return array $mce_plugins
 */
function register_my_tinymce_plugin( $mce_plugins ) {
	$mce_plugins[ &#039;myPlugin&#039; ] = plugins_url() . &#039;/my-plugin/js/editor_plugin.js&#039;;

	return $mce_plugins;
}

/**
 * register_my_tinymce_button
 *
 * @param array $buttons
 * @return array $buttons
 */
function register_my_tinymce_button( $buttons ) {
	array_push( $buttons, &#039;|&#039;, &#039;my_plugin_button&#039; );

	return $buttons;
}

</code></pre></div>
<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>
<div class="wp-cc wp-cc-php"><pre><code data-language="php">&lt;?php
# i18n/mce_locale.php
/**
 * @var string $strings a JavaScript snippet to add another language pack to TinyMCE
 * @var string $mce_locale an ISO 639-1 formated string of the current language e.g. en, de...
 * @deprecated wp_tiny_mce() at wp-admin/includes/post.php (for versions prior WP 3.3)
 * @see _WP_Editors::editor_settings in wp-includes/class-wp-editor.php
 */
$strings =
	&#039;tinyMCE.addI18n(
		&quot;&#039; . $mce_locale . &#039;.myPlugin&quot;,
		{
			buttonTitle : &quot;&#039; . esc_js( __( &#039;My Button Title:&#039;, &#039;my_textdomain&#039; ) ) . &#039;&quot;,
			popupTitle  : &quot;&#039; . esc_js( __( &#039;My Popup Title&#039;, &#039;my_textdomain&#039; ) ) . &#039;&quot;,
		}
	);&#039;;</code></pre></div>
<p>Das Laden übernimmt wieder WordPress:</p>
<div class="wp-cc wp-cc-php"><pre><code data-language="php">&lt;?php
# somewhere in my_plugin.php
# remember to load the plugin textdomain!
add_filter( &#039;mce_external_languages&#039;, &#039;my_mce_localisation&#039; );

/**
 * my_mce_localisation
 *
 * @see wp-admin/includes/post.php line 1474
 * @param array $mce_external_languages
 * @return array $mce_external_languages
 */
function my_mce_localisation( $mce_external_languages ) {
	$mce_external_languages[ &#039;myPlugin&#039; ] = plugin_dir_path( __FILE__ ) . &#039;i18n/mce_locale.php&#039;;

	return $mce_external_languages;
}</code></pre></div>
]]></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-cc wp-cc-php"><pre><code data-language="php">wp_nav_menu ( 
	array (
		&#039;menu&#039;       =&gt;; &#039;main_navigation&#039;,
		&#039;container&#039;  =&gt;; &#039;&#039;,
		# Seit Version 3.1 geht das hier nicht mehr, Nachtrag beachten!
		&#039;menu_id&#039;    =&gt;; &#039;navigation&quot; role=&quot;navigation&#039;,
		&#039;menu_class&#039; =&gt;; &#039;&#039;
	)
);</code></pre></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:<br />
<div class="wp-cc wp-cc-php"><pre><code data-language="php">/**
 * fügt ein role-Attribut mit dem Wert &#039;navigation&#039;
 * dem Ersten öffnenden HTML-Tag von $a
 * hinzu
 */
function mytheme_add_nav_role( $a ) {

    $a = preg_replace(
		&#039;#^\s*&lt;([a-z]+)([^&gt;]*)&gt;#i&#039;,
		&#039;&lt;${1}${2} role=&quot;navigation&quot;&gt;&#039;,
		$a
	);

    return $a;
}
add_filter( &#039;wp_nav_menu&#039;, &#039;mytheme_add_nav_role&#039; );</code></pre></div></p>
<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-cc wp-cc-php"><pre><code data-language="php">add_filter( &#039;nav_menu_item_id&#039;, create_function( &#039;$a&#039;, &#039; return &quot;&quot;; &#039;) );</code></pre></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-cc wp-cc-php"><pre><code data-language="php">add_filter( &#039;nav_menu_css_class&#039;, create_function( &#039;$a&#039;,&#039; return array();&#039; ) );
add_filter( &#039;wp_nav_menu&#039;, create_function( &#039;$a&#039;, &#039;return str_replace( &quot; class=\&quot;\&quot;&quot;,&quot;&quot;, $a );&#039; ) );</code></pre></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-cc wp-cc-php"><pre><code data-language="php">/**
 *  Ersetzt das letzte Komma durch ein »und« 
 * 
 * @param string $tags
 * @return string
 */
function mytheme_tag_list( $tags ) {

	# wenn mehr als ein link vorhanden ist
	if ( substr_count( $tags, &#039;&lt;a href=&quot;&#039; ) &gt; 1 ) {
		$pattern = &#039;#&lt;/a&gt;\s*,\s*&lt;a ([^&gt;]*)&gt;([^&lt;]*)&lt;/a&gt;\s?$#&#039;;
		$replace = &#039;&lt;/a&gt; und &lt;a $1&gt;$2&lt;/a&gt;&#039;;
		$tags = preg_replace($pattern,$replace,$tags);
	}

	return $tags;
}
add_filter( &#039;the_category&#039;, &#039;mytheme_tag_list&#039;);
add_filter( &#039;the_tags&#039;, &#039;mytheme_tag_list&#039; );</code></pre></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-cc wp-cc-php"><pre><code data-language="php">mail(
	&#039;mustermann@mail.de&#039;,
	&#039;Urlaubsgrüße&#039;,
	&#039;Hallo Max, Urlaub an der Ostsee ist toll!&#039;
);</code></pre></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-cc"><pre><code data-language="">AddDefaultCharset UTF-8</code></pre></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>
<div class="wp-cc wp-cc-html"><pre><code data-language="html">&lt;meta charset=&quot;utf-8&quot;&gt;</code></pre></div>
<p>Eine weitere Möglichkeit bestünde darin, das Formular um das Attribut „accept-charset“ zu erweitern.</p>
<div class="wp-cc wp-cc-html"><pre><code data-language="html">&lt;form accept-charset=&quot;utf-8&quot;&gt;
	&lt;!-- … --&gt;
&lt;/form&gt;</code></pre></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-cc wp-cc-php"><pre><code data-language="php">$email_header  = &quot;MIME-Version: 1.0 \r\n&quot;;
$email_header .= &quot;Content-Type: text/plain;charset=UTF-8 \r\n&quot;;
</code></pre></div>
<p>Die Variable <code>$email_header</code> wird als vierter Parameter der Funktion mail() übergeben:</p>
<div class="wp-cc wp-cc-php"><pre><code data-language="php"># E-Mail senden
mail( 
	$address,
	$subject,
	$content,
	$email_header
);</code></pre></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-cc wp-cc-php"><pre><code data-language="php"># Zeilenumbrüche haben im Header nix verloren
$subject = str_replace(
	array( &quot;\n&quot;, &quot;\r&quot; ),
	&#039;&#039;,
	$_POST[ &#039;subject&#039; ]
);

# Quoted-printable
$subject = &#039;=?utf-8?q?&#039; . imab_8bit( $subject ) . &#039;?=&#039;;

# alternativ: Base64
$subject = &#039;=?utf-8?b?&#039; . base64_encode( $subject ) . &#039;?=&#039;;

# senden
mail( $address, $subject, $content, $email_header );</code></pre></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>
	</channel>
</rss>

