<?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>Brusdeylins &#187; Problem</title>
	<atom:link href="http://brusdeylins.info/tag/problem/feed/" rel="self" type="application/rss+xml" />
	<link>http://brusdeylins.info</link>
	<description></description>
	<lastBuildDate>Wed, 28 Jul 2010 18:25:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Probleme mit ShortCodes</title>
		<link>http://brusdeylins.info/wordpress/probleme-mit-shortcodes/</link>
		<comments>http://brusdeylins.info/wordpress/probleme-mit-shortcodes/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 17:08:22 +0000</pubDate>
		<dc:creator>Matthias Brusdeylins</dc:creator>
				<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[Problem]]></category>
		<category><![CDATA[RegEx]]></category>
		<category><![CDATA[Regular Expression]]></category>

		<guid isPermaLink="false">http://neu.brusdeylins.info/?p=99</guid>
		<description><![CDATA[
Dies sieht sehr verd&#228;chtig nach einem Speicher-Problem aus. Doch wo genau tritt der Fehler auf und was kann man dagegen unternehmen? Ein kleiner Suchtrip durch den Quellcode von WordPress (zum Zeitpunkt dieses Artikels in der Version  2.7 ) zeigte bald, dass der Inhalt einer meiner langen Artikel in der Funktion wpautop() in der Datei [...]]]></description>
			<content:encoded><![CDATA[<p><!--:de-->
<a href="http://brusdeylins.info/media/post-images/wordpress.jpg" title="WordPress-Logo" rel="lightbox[singlepic37]" >
	<img class="ngg-singlepic ngg-right" src="http://brusdeylins.info/media/cache/37__150x400_wordpress.jpg" alt="WordPress-Logo" title="WordPress-Logo" />
</a>
Seid WordPress 2.5 bietet das Blogging-System seinen Erweiterungen (Plugins) die neue M&#246;glichkeit an,  mit so genannten <a title="ShortCode API" href="http://codex.wordpress.org/Shortcode_API" target="_blank">ShortCodes</a> Inhalte einfach und dynamisch zu modifizieren. Dazu muss eine Modifikations-Funktion auf einen entsprechenden ShortCode registriert werden, welcher dann automatisch aufgerufen wird. Ein ShortCode kann dabei noch zus&#228;tzliche Parameter definieren, die dann dieser Funktion zur Auswertung durchgereicht werden (Beispiel mit zwei Parameter: <code>[ShortCode Param1=Wert1 Param2=Wert2]</code>). Eines der ber&#252;hmtesten WordPress-Erweiterungen, welche in der neusten Version diese Technologie einsetzt, ist die Gallery-Verwaltung <a title="NextGEN Gallery at alex.rabe" href="http://alexrabe.boelinger.com/wordpress-plugins/nextgen-gallery/" target="_blank">NextGEN Gallery</a>. Und mit ihrem Einsatz f&#228;llt ein kleiner Fehler in WordPress auf: ShortCodes kombiniert mit sehr langen Beitr&#228;gen f&#252;hren bei der Anzeige gerne zu einem leeren Ergebnis.<!--:--><span id="more-99"></span><!--:de--></p>
<p>Dies sieht sehr verd&#228;chtig nach einem Speicher-Problem aus. Doch wo genau tritt der Fehler auf und was kann man dagegen unternehmen? Ein kleiner Suchtrip durch den Quellcode von WordPress (zum Zeitpunkt dieses Artikels in der Version  2.7 ) zeigte bald, dass der Inhalt einer meiner langen Artikel in der Funktion <code>wpautop()</code> in der Datei <em>./wp-includes/formatting.php</em> verloren ging. Und zwar genau in der vorletzte Zeile der Funktion:</p>
<pre>$pee = preg_replace('/&lt;p&gt;\s*?(' . get_shortcode_regex() . ')\s*&lt;\/p&gt;/s', '$1', $pee); // don't auto-p wrap shortcodes that stand alone</pre>
<p>(WordPress 2.7, Datei <em>formatting.php</em>, Funktion <code>wpautop()</code>, Zeile 153)</p>
<p>Diese Funktion sorgt daf&#252;r, dass vor der Ausgabe der Beitr&#228;ge Zeilenumbr&#252;che in HTML-Zeilenumbr&#252;che (<code>&lt;br /&gt;</code>) und HTML-Paragraphen (<code>&lt;p /&gt;</code>) umgewandelt werden. Sie wird vor der Ersetzung der ShortCodes aufgerufen. Die letzte Ersetzung sucht nun allein stehende ShortCodes und entfernt m&#246;gliche (automatisch hinzugef&#252;gte) Paragraphen um diese. Die hier aufgerufene Methode <code>get_shortcode_regex()</code> liefert dabei das Suchmuster f&#252;r die definierten ShortCodes zur&#252;ck. Diese befindet sich in der Datei <em>./wp-includes/shortcodes.php</em> ab der Zeile 165. Der hier zur&#252;ck gelieferte regul&#228;re Ausdruck sucht nach einem Muster in der folgenden Form:<br />

<a href="http://brusdeylins.info/media/post-images/shortcodes.jpg" title="Problem in Wordpress 2.7 RegEx - Bildquelle: Brusdeylins.Info" rel="lightbox[singlepic41]" >
	<img class="ngg-singlepic ngg-center" src="http://brusdeylins.info/media/cache/41__530x400_shortcodes.jpg" alt="WP 2.7 RegEx" title="WP 2.7 RegEx" />
</a>
In diesem Ausdruck werden zwei nicht-gierige (non-greedy, lazy) Quantoren eingesetzt. Dies bedeutet, es wird sehr viel Backtracking betrieben: die RegEx-Engine &#252;berspringt im ersten Schritt die Zeichen, welche auf solche nicht-gierigen Quantoren passen, da ja an dieser Stelle versucht wird, so wenig wie m&#246;glich einzufangen. Trotzdem merkt sich die Engine, wo sie notfalls nachschauen muss, falls der ganze restliche Text so erstmal nicht in das Suchmuster passt. Der &#8220;ganze Rest&#8221; bei gro&#223;en Beitr&#228;gen mit mehreren nicht-gierigen Quantoren kann ganz sch&#246;n viel sein, was die Historie gerne anwachsen l&#228;sst. Wir d&#252;rfen nicht vergessen: die RegEx-Engine geht am Ende nach und nach wieder ein Schritt zur&#252;ck und pr&#252;ft erneut nach, ob sie ein Ergebnis findet (Backtracking). Um den Aufwand zu minimieren, bietet es sich an, den zu &#252;berpr&#252;fenden &#8220;Rest&#8221; lokal einzuschr&#228;nken. In unserem Fall wird der Zeichenbereich der Parameterpaare mit dem Endzeichen &#8220;<code>]</code>&#8221; eines Tags begrenzt. &#196;ndern wir nun den roten Abschnitt <span style="color: #ff0000;"><code>(.*?)</code></span> zu <span style="color: #ff0000;"><code>([^\]]*?)</code></span>, trennen wir somit die Non-Greedy-Bereiche (Parameterpaare und m&#246;gliche Zwischeninhalte) und minimieren den Aufwand und somit den Speicherverbrauch. Unser &#252;berlanger Artikel m&#252;sste wieder erscheinen.</p>
<p>Mit einer kleine Sch&#246;nheitsoperation k&#246;nnen wir noch die (in meinen Augen) unn&#252;tze gr&#252;ne, nicht-einfangende Klammerung um den eingefangenen optionale Schr&#228;gstrich entfernen: <span style="color: #009000;"><code>(?:(\/))?</code></span> zu <span style="color: #009000;"><code>(\/)?</code></span>. Die modifizierte Methode <code>get_shortcode_regex()</code> sieht nun wie folgt aus:</p>
<pre>function get_shortcode_regex() {
    global $shortcode_tags;
    $tagnames = array_keys($shortcode_tags);
    $tagregexp = join( '|', array_map('preg_quote', $tagnames) );

    return '\[('.$tagregexp.')\b([^\]]*?)(\/)?\](?:(.+?)\[\/\1\])?';
}</pre>
<p>(WordPress 2.7, Datei <em>shortcodes.php</em>, Funktion <code>get_shortcode_regex()</code>, Zeile 165)</p>
<p>(Problems in Wordpress with long posts and plugins like NextGEN Gallery)<!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://brusdeylins.info/wordpress/probleme-mit-shortcodes/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Finder-Lightroom-Problem</title>
		<link>http://brusdeylins.info/mac-os-x/finder-lightroom-problem/</link>
		<comments>http://brusdeylins.info/mac-os-x/finder-lightroom-problem/#comments</comments>
		<pubDate>Mon, 19 Nov 2007 23:18:54 +0000</pubDate>
		<dc:creator>Matthias Brusdeylins</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Problem]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.brusdeylins.info/mac-os-x/finder-lightroom-problem/</guid>
		<description><![CDATA[
Das Problem wird durch bestimmte Metadaten in der Extensible Metadata Platform von Adobe verursacht. XMP ist eins von vielen Metadaten-Formaten welche in Grafikdateien eingesetzt werden und bietet den Vorteil, dass beliebige Informationen darin abgelegt werden k&#246;nnen. Konkret handelt es sich dabei um ein Format zum Einbetten von RDF-Daten (Resource Description Framework) in Bin&#228;rdateien. Das Format [...]]]></description>
			<content:encoded><![CDATA[<p><!--:de-->
<a href="http://brusdeylins.info/media/post-images/lightroom.jpg" title="Adobe Lightroom verwaltet und justiert professionell Bilder" rel="lightbox[singlepic24]" >
	<img class="ngg-singlepic ngg-right" src="http://brusdeylins.info/media/cache/24_web20_150x400_lightroom.jpg" alt="Adobe Lightroom" title="Adobe Lightroom" />
</a>
Seit der neuen Version des Apple-Betriebssystem OS X 10.5 Leopard sind Benutzer des Profi-Tools <a href="http://www.adobe.com/de/products/photoshoplightroom/" target="_blank">Lightroom von Adobe</a> mit einem Problem konfrontiert: Bilder, welche in Adobe Lightroom bearbeitet wurden, k&#246;nnen im Finder nicht mehr angezeigt werden. Beim Versuch eine Vorschau anzuzeigen bzw. die Bilder in Coverflow zu repr&#228;sentieren st&#252;rzt der Finder ab. Dies ist vor allem auch problematisch, wenn entsprechende Bilder herunter geladen wurden und in dem Download-Stapel des Docks landen. Hier befindet man sich schnell in einer Endlosschleife zwischen Absturz und Neustart des Docks.<!--:--><span id="more-50"></span><!--:de--></p>
<p>Das Problem wird durch bestimmte Metadaten in der <a href="http://www.adobe.com/products/xmp/" target="_blank">Extensible Metadata Platform von Adobe</a> verursacht. XMP ist eins von vielen Metadaten-Formaten welche in Grafikdateien eingesetzt werden und bietet den Vorteil, dass beliebige Informationen darin abgelegt werden k&#246;nnen. Konkret handelt es sich dabei um ein Format zum Einbetten von RDF-Daten (Resource Description Framework) in Bin&#228;rdateien. Das Format wird bereits von allen aktuellen Adobe-Produkten und einigen CMS-Anbietern unterst&#252;tzt. Auch Lightroom speichert so <a href="http://lightroom-news.com/2007/11/05/leopard-problems-with-lightroom-edited-files/#more-2251" target="_blank">zus&#228;tzliche Informationen</a> ab, welche anscheinend von der Core Graphics Bibliothek des OS X 10.5.1 Betriebssystems nicht verstanden werden. Leider f&#252;hrt dies in den meisten F&#228;llen zum Absturz einiger Anwendungen, welche diese Bibliothek einsetzen. In dem hier beschriebenen Fall verabschiedet sich der Finder.</p>
<p>Eine m&#246;gliche L&#246;sung des Problems besteht nun darin, dass alle XMP-Metadaten wieder komplett aus den Bildern entfernt werden. Wenn die digitale Kamera ihre Informationen in einem anderen Metadatenformat ablegt (z.B. EXIF, GPS, IPTC&#8230;) und man nicht auf die XMP-Angaben in den Dateien angewiesen ist, stellt dieser Vorgang auch kein Problem da. Allerdings sollte man vor der Bearbeitung logischerweise ein Backup seiner Medien anlegen.</p>
<p>Ein sehr hilfreiches Tool nennt sich <a href="http://www.sno.phy.queensu.ca/~phil/exiftool/" target="_blank">ExifTool</a> und kommt von Phil Harvey. Hiermit lassen sich unterschiedliche Metadaten-Formate in Medien ausgeben und bearbeiten. In den <a href="http://linux.die.net/man/1/exiftool" target="_blank">Manpages</a> von ExifTool findet man auch schnell alle n&#246;tigen Parameter sowie einige Beispiele f&#252;r den Umgang mit diesem Tool. Mit folgendem Befehl in der Konsole k&#246;nnen nun die XMP-Metadaten rekursiv aus allen Dateien in einem Verzeichnis und dessen Unterverzeichnissen gel&#246;scht werden:</p>
<pre>exiftool ./ -xmp:All= -r -overwrite_original</pre>
<p>Hierbei haben die &#252;bergebenen Parameter folgende Bedeutung:</p>
<ol>
<li>-xmp:All=<br />
XMP-Tag aus der Datei komplett l&#246;schen.</li>
<li>-r<br />
Rekursiv durch alle Unterverzeichnisse durchgehen. Dies setzt voraus, dass die &#220;bergebene Datei-Angabe ein Verzeichnis ist (hier &#8220;./&#8221; f&#252;r das aktuelle Verzeichnis in der Konsole).</li>
<li>-overwrite<br />
&#220;berschreibt die originale Datei (Backup nicht vergessen!). Wird dieser Parameter weggelassen, benennt das ExifTool die originale Datei um, indem dem vorhandenen Dateiname der String &#8220;_original&#8221; angeh&#228;ngt wird.</li>
</ol>
<p>Leider brachte das Update auf Lightroom 1.3 hier keine L&#246;sung, was auch verst&#228;ndlich ist. XMP soll ja weiterhin beliebige Metadaten speichern k&#246;nnen ohne dass Programme oder Bibliotheken, welche nicht alle Angaben verstehen, sich verabschieden. Bleibt nun nur noch die Hoffnung, dass Apple hier bald eine L&#246;sung in einem weiteren Update liefert, nachdem die OS X Version 10.5.1 dieses Problem auslie&#223;.<!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://brusdeylins.info/mac-os-x/finder-lightroom-problem/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Problem in bb-settings</title>
		<link>http://brusdeylins.info/bbpress/problem-in-bb-settings/</link>
		<comments>http://brusdeylins.info/bbpress/problem-in-bb-settings/#comments</comments>
		<pubDate>Thu, 15 Nov 2007 02:03:30 +0000</pubDate>
		<dc:creator>Matthias Brusdeylins</dc:creator>
				<category><![CDATA[bbPress]]></category>
		<category><![CDATA[Problem]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.brusdeylins.info/bbpress/problem-in-bb-settings/</guid>
		<description><![CDATA[
Die Funktion glob() liefert alle Verzeichnisnamen in einem Array zur&#252;ck, die zu dem &#252;bergebenen Such-Pattern passen. Hierbei wird die glob() Funktion aus libc eingesetzt. Werden keine Dateien bzw. Verzeichnisse gefunden, die auf das Suchkriterium passen, liefert die Funktion ein leeres Array zur&#252;ck. Tritt ein Fehler bei der Ausf&#252;hrung auf, ist das Ergebnis FALSE. Und genau [...]]]></description>
			<content:encoded><![CDATA[<p><!--:de-->
<a href="http://brusdeylins.info/media/post-images/bbpress.jpg" title="bbPress-Logo" rel="lightbox[singlepic5]" >
	<img class="ngg-singlepic ngg-right" src="http://brusdeylins.info/media/cache/5__150x400_bbpress.jpg" alt="bbPress-Logo" title="bbPress-Logo" />
</a>
Nach dem Update auf PHP 5.2.5 bekam ich auf einer meiner verwalteten Webpr&#228;senzen mit einem bbPress-Forum in der Version  0.8.3  nun folgende Fehlermeldung:<br />
<code>Warning: Invalid argument supplied for foreach() in /.../bb-settings.php on line 173 / 169</code></p>
<p>Hier bekommt die ForEach-Schleife ein ung&#252;ltiges Array von der Funktion <code>glob()</code> geliefert, wenn diese auf einen Fehler trifft. Damit in solch einem Fehlerfall die nervige Fehlermeldung nicht mehr auftaucht, muss der Code in <em>bb-settings.php</em> angepasst werden.<!--:--><span id="more-49"></span><!--:de--></p>
<p>Die Funktion <code>glob()</code> liefert alle Verzeichnisnamen in einem Array zur&#252;ck, die zu dem &#252;bergebenen Such-Pattern passen. Hierbei wird die <code>glob()</code> Funktion aus <code>libc</code> eingesetzt. Werden keine Dateien bzw. Verzeichnisse gefunden, die auf das Suchkriterium passen, liefert die Funktion ein leeres Array zur&#252;ck. Tritt ein Fehler bei der Ausf&#252;hrung auf, ist das Ergebnis <code>FALSE</code>. Und genau dieser Fehlerfall f&#252;hrt zu der oben beschriebenen Fehlermeldung.</p>
<p><code>FALSE</code> ist ein Wahrheitswert (boolean) und kein Array und darf somit nicht dem ForEach-Kommando in <em>bb-settings.php</em> in der Zeile 173 (bzw. in der Version 0.8.3.1 in Zeile 169) &#252;bergeben werden. Um dies zu verhindern, muss dieser Fehlerfall vorher &#252;berpr&#252;ft werden. Dies kann mit der folgenden Code-Anpassung erreicht werden:</p>
<p>Originaler Code in <em>bb-settings.php</em> der Version 0.8.3 ab Zeile 172 / 168:</p>
<pre>if ( is_callable( 'glob' ) )
    foreach ( glob(BBPLUGINDIR . '_*.php') as $_plugin )
        require($_plugin);</pre>
<p>Anpassung:</p>
<pre>if ( is_callable( 'glob' ) ) {
    $pluginarray = glob(BBPLUGINDIR . '_*.php');
    if ($pluginarray)
        foreach ( $pluginarray as $_plugin )
            require($_plugin);
}</pre>
<p>Es sei hier noch erw&#228;hnt, dass mit dieser &#196;nderung nicht gleich auff&#228;llt, ob PlugIns, welche mit einem Unterstrich anfangen, auch wirklich geladen werden oder ob hier ein Fehler auftritt. Man merkt dies aber dann, wenn eben die gew&#252;nschte Erweiterung nicht vorhanden ist.<!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://brusdeylins.info/bbpress/problem-in-bb-settings/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Probleme mit gettext</title>
		<link>http://brusdeylins.info/wordpress/probleme-mit-gettextphp/</link>
		<comments>http://brusdeylins.info/wordpress/probleme-mit-gettextphp/#comments</comments>
		<pubDate>Sun, 21 Oct 2007 14:18:22 +0000</pubDate>
		<dc:creator>Matthias Brusdeylins</dc:creator>
				<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Pordpress]]></category>
		<category><![CDATA[Problem]]></category>

		<guid isPermaLink="false">http://www.brusdeylins.info/wordpress/probleme-mit-gettextphp/</guid>
		<description><![CDATA[Vor geraumer Zeit begegnete ich immer wieder einer nervigen Fehlermeldung:
Warning: unpack() [function.unpack]: Type V: not enough input,
need 4, have 0 in /***/wp-includes/gettext.php on line 85
ierbei handelt es sich um PHP-Dateien einer WordPress-Installation (Version 2.2.3 DE und Version 2.3 DE). Unter Unix ist GNU gettext eine weit verbreitete Bibliothek. Sie macht im Grunde nichts anderes, als [...]]]></description>
			<content:encoded><![CDATA[<p><!--:de-->Vor geraumer Zeit begegnete ich immer wieder einer nervigen Fehlermeldung:<br />
<code>Warning: unpack() [function.unpack]: Type V: not enough input,<br />
need 4, have 0 in /***/wp-includes/gettext.php on line 85</code><br />

<a href="http://brusdeylins.info/media/post-images/wordpress.jpg" title="WordPress-Logo" rel="lightbox[singlepic37]" >
	<img class="ngg-singlepic ngg-right" src="http://brusdeylins.info/media/cache/37__150x400_wordpress.jpg" alt="WordPress-Logo" title="WordPress-Logo" />
</a>
Hierbei handelt es sich um PHP-Dateien einer WordPress-Installation (Version 2.2.3 DE und Version 2.3 DE). Unter Unix ist <a href="http://www.gnu.org/software/gettext/" target="_blank">GNU gettext</a> eine weit verbreitete Bibliothek. Sie macht im Grunde nichts anderes, als einen &#252;bergebenen “originalen” String (in der Regel ein englischer Text) in einen entsprechenden String einer anderen Sprache zu &#252;bersetzen. Das Mapping zwischen diesen Strings befindet sich in so genannten MO-Dateien (z.B. “de_DE.mo”). Auch WordPress setzt solche Dateien f&#252;r die &#220;bersetzung ein.<!--:--><span id="more-47"></span><!--:de--></p>
<p><strong>(Gel&#246;st mit WordPress 2.6.1 &#8211; Details weiter unten</strong>&#8230;)<br />
PHP k&#246;nnte direkt mit gettext-Support kompiliert werden. Dadurch st&#252;nden entsprechende Funktionen direkt zur Verf&#252;gung. Doch w&#252;rde solch ein Programm nicht auf einem Rechner ohne entsprechende Unterst&#252;tzung laufen. Aus diesem Grund wurde in WordPress das Projekt <a href="https://savannah.nongnu.org/projects/php-gettext/" target="_blank">PHP gettext</a> integriert. Die Implementierung liegt in den Dateien “gettext.php” und “streams.php” im “wp-includes”-Verzeichnis. WordPress erh&#228;lt dadurch die F&#228;higkeit diese MO-Dateien einzulesen. Doch genau hier entstanden ab und zu Probleme.</p>
<h3>Betrachtung des Problems</h3>
<p>Die oben dargestellte Fehlermeldung kam bei mir sporadisch. Und ich kenne die Fehlerstelle genau. Sie befindet sich in der Datei “streams.php” in der Klasse <code>StringReader</code>. Und dort in der Funktion <code>read($bytes)</code>. Hier lieferte die Zeile <code>$data = substr($this-&gt;_str, $this-&gt;_pos, $bytes);</code> nicht immer den richtigen Teilstring zur&#252;ck. Manchmal war der Inhalt genau um ein Byte verschoben. Dadurch wurden in der Datei “gettext.php” in der Funktion gettext_reader(…) Strukturinformationen einer MO-Datei falsch interpretiert, was wiederum dazu f&#252;hrte, dass Mengenangaben komplett falsch eingelesen wurden. In solch einem Fehlerfall wurde die <code>seekto()</code> Funktion mit einem gro&#223;en negativen Wert aufgerufen, was dazu f&#252;hrte, dass der Stream-Positionszeiger an das Ende der Daten gesetzt wurde. Dadurch lieferte jeder weitere Aufruf der Lesemethode einen Leerstring zur&#252;ck. Und genau solch ein Leerstring wurde der Methode <code>unpack()</code> in der Datei “gettext.php” in der Zeile 85 &#252;bergeben, was zu der oben besagten Meldung f&#252;hrte.</p>
<p>Es ist zwar nicht wirklich eine L&#246;sung, doch hatte ich die oben benannte Codezeile tempor&#228;r mit folgenden Kommandos ausgetauscht:</p>
<p>Alter Code:</p>
<pre>$data = substr($this-&gt;_str, $this-&gt;_pos, $bytes);</pre>
<p>Neuer Code, der immer den richtigen Teilstring ermittelt:</p>
<pre>$data = "";
for ($i=0; $i&lt;$bytes; $i++) {
    $data .= $this-&gt;_str[$this-&gt;_pos+$i];
};</pre>
<p>Gibt man hier noch eine Meldung aus, sobald die beiden ermittelten Teilstrings unterschiedlich sind, dann merkte man, dass diese gleichzeitig mit dem hier beschriebenen Fehler auftauchte. Verglich man die Inhalte, sah man, dass bei einer Startposition &gt; 0 der Teilstring aus <code>substr()</code> um ein Zeichen/Byte verschoben war. Statt z.B. den Inhalt von Index 4-7 zu ermitteln, lieferte diese Methode dann die Zeichen 5-8. Wohl bemerkt, dies aber nur sehr sporadisch!</p>
<p>Eigentlich eine fatale Sache, wenn ein regul&#228;rer PHP-Befehl Probleme verursacht. Dieser Befehl, der Teile aus gegebenen Texten extrahiert, kommt in WordPress h&#228;ufiger zum Einsatz. Am sichtbarsten ist er in Kombination mit der Datei “gettext.php”, da hier ein Fehler geworfen wird. Aber mir ist ebenfalls aufgefallen, dass es auch Probleme mit dem Abspeichern geschriebener Inhalte gab. Hier kam es vor, dass an Stellen eingebundener Steuercodes (Links, Code-Tags) Teile des Inhaltes verschwanden. Man bemerkte die Fehlersituation, da der ber&#252;hmte gettext-Fehler auftrat. Aus diesem Grund lie&#223; ich die oben beschriebenen neuen Codezeilen auch nicht in meiner Installation. Mir sind mit diesem Code schon Inhalte verschwunden, ohne dass ich dies sofort bemerkte.</p>
<h3>L&#246;sungswege</h3>
<p>Auf jeden Fall musste die Problemursache an einer Server-Konfiguration oder –Komponente liegen. Ich verwalte noch eine weitere WordPress-Webseite und dort bekam ich noch keine Fehler. Zu erw&#228;hnen ist auch, das beide Seiten beim gleichen Provider gehostet werden, die gleiche PHP-Version installiert war und inzwischen bei beiden WordPress in der Version 2.3 vorlag.</p>
<p>Meine tempor&#228;re L&#246;sung bestand darin, dass ich auf meiner Seite die originale englische Version von WordPress installierte. Somit trat der Fehler seltener auf, da eine Sprachdatei weniger eingelesen werden musste. Er verschwand aber nicht komplett, weil noch PlugIns mit Sprachdateien installiert waren. Dies machte sich dann aber eher im Admin-Bereich, vor allem beim Speichern der Beitr&#228;ge bemerkbar.</p>
<p>Dank dem schnellen und motivierten Support meines Providers <a href="http://www.all-inkl.de/" target="_blank">All-Inkl.de</a> dachten wir zuerst, dass wir den Fehler eind&#228;mmen konnten. Der erste Versuch bestand darin, den ZEND-Optimizer zu installieren und weitere PHP-Parameter an den Parametern des Servers meiner anderen WordPress-Pr&#228;senz anzupassen. Leider ohne dem gew&#252;nschten Ergebnis. Ein Update der PHP-Installation von der Version 5.2.3 auf 5.2.4, sowie die Aktualisierung der Apache-Installation von der Version 2.2.4 auf 2.2.6 lie&#223;en den nervigen Fehler dann kurzzeitig doch verschwinden. Vermutlich besitzt <code>substr()</code> in PHP 5.2.3 nicht die erhoffte Stabilit&#228;t.</p>
<p><strong>Update 24.10.07:</strong><br />
Das Problem tritt seit heute leider wieder auf! Wom&#246;glich lag es doch nicht an der alten PHP-Version. Ich verfolge das weiter…</p>
<p><strong>Update 30.10.07:</strong><br />
Das ist schade, aber auch das Update auf Wordpress 2.3.1 DE brachte nicht den erhofften Erfolg. Wir sind leider so langsam am Ende mit dem Suchen, auch mit der Geduld. Der n&#228;chste Schritt besteht wohl darin, meinen Webspace innerhalb meines Providers auf einen anderen Server zu verschieben. Zur Zeit habe ich die Datei “/wp-includes/languages/de_DE.mo” entfernt, damit der Fehler nicht mehr so h&#228;ufig auftritt.</p>
<p><strong>Update 03.11.07:</strong><br />
Mein Provider All-Inkl hat nun meine Webseite auf einen anderen Server installiert. Seit dem scheint die Webseite ohne Probleme zu funktionieren. Schade ist nur, dass wir nun nicht genau wissen, welche Server-Einstellung / Hardware-Kombination hier wohl Probleme mit der Funktion <code>substr()</code> aus PHP 5 verursacht.</p>
<p><strong>Update:</strong><br />
Der Fehler taucht wieder auf&#8230;</p>
<p><strong>Update 15.11.07:</strong><br />
Heute wurde PHP 5.2.5 auf dem Webserver installiert. Laut All-Inkl bin ich der Erste, der diese Installation testen darf. Ich laufe nun auch wieder auf der originalen deutschen Version. Bis jetzt sind mir noch keine Probleme begegnet. Die Zeit wird zeigen, ob das die L&#246;sung war&#8230;</p>
<p><strong>Update 26.02.08:</strong><br />
Im <a href="http://www.brusdeylins.info/wordpress/probleme-mit-gettextphp/#comment-91">Kommentar Nr. 48</a> berichtet <em>Niko_K</em>, dass das Problem wohl durch nicht &#252;bereinstimmende Spracheinstellungen zwischen der WordPress-Configuration und dem Linux-System (Variable LANG) auftritt. Danke!</p>
<p>Ich <em>vermute</em> stark, dass PHP-String-Funktionen wie das <code>substr()</code> wohl abh&#228;ngig von den Systemeinstellungen sind und somit mit den richtigen Daten bef&#252;ttert werden m&#252;ssen.</p>
<p><strong>Update 25.04.08:</strong><br />
Im <a href="http://www.brusdeylins.info/wordpress/probleme-mit-gettextphp/#comment-271">Kommentar Nr. 60</a> berichtet <em>Kretzschmar </em>dar&#252;ber, dass der Fehler unter PHP 4 nicht mehr auftaucht. Die Umstellung von PHP 5 auf PHP 4 kann beim Provider All-Inkl wohl selbst vorgenommen werden.</p>
<p><strong>Ubdate 24.06.08:</strong><br />
Der Bug ist inzwischen schon bei Wordpress registriert (<a href="http://trac.wordpress.org/ticket/5599" target="_blank">Bug 5599</a> &#8211; danke an Codestyler f&#252;r den Hinweis). Hier wird aktuell eine Alternative zu <code>substr()</code> eingesetzt. Diese L&#246;sung ist eleganter als die oben beschriebene. Leider ist die korrigierte Stelle nicht die einzige mit dem Befehl <code>substr()</code>, weswegen man trotzdem ein Fehlverhalten bzw. Datenverlust in der Anwendung erwarten kann.</p>
<p><strong>Update 15.08.08:</strong><br />
Endlich! Wordpress 2.6.1 liefert nun ein <a href="http://blog.wordpress-deutschland.org/2008/08/15/aenderungen-in-wordpress-261.html" target="_blank">Bugfix</a> zu diesem Problem. Der Fehler tritt auf, sobald man in der <code>php.ini</code> den Eintrag <code>mbstring.func_overload</code> auf einen anderen Wert als 0 stellt. Meist erlauben die Provider es, diesen Wert f&#252;r die eigene Web-Pr&#228;senz zu &#228;ndern. Ein Bug im Apache-Modul <code>mod_php</code> sorgt allerdings bei dieser Art der Umstellung daf&#252;r, dass sie f&#252;r alle V-Hosts des Servers gilt! Sobald also ein User des gleichen V-Hosts an dieser Einstellung dreht, erscheinen bei den anderen WordPress-Pr&#228;senzen auf dem Server wohl diese Fehler, zumindes bis eine andere Pr&#228;senz diesen Wert wieder auf 0 stellt. N&#228;heres hierzu unter <a href="http://www.code-styling.de/deutsch/wordpress-fehler-durch-sprachdateien-die-ursache" target="_blank">code-styling.de</a>.</p>
<h3>Native L&#246;sung</h3>
<p>Es lief einige Tage gut, nun sind seit heute (06.11.2007) alle WordPress-Seiten auf dem neuen Server wohl auch betroffen&#8230;</p>
<p>Im <a href="http://forum.wordpress-deutschland.org/sprachdatei/24-wordpress-deutscher-sprache-7.html#post55919" target="_blank">deutschsprachigen WordPress-Forum</a> bin ich nun auf eine weitere L&#246;sung gesto&#223;en: Einsatz des originalen gettext() Kommandos. Diese L&#246;sung kann leider nur dann angewendet werden, wenn gettext auf dem entsprechenden Server installiert ist. Ein Blick in die PHP-Info liefert hierzu Informationen:<br />
<code>GetText Support enabled</code></p>
<p>Worin besteht die L&#246;sung? In der WordPress-Datei /wp-includes/l10n.php wird die WordPress-Version von gettext() aufgerufen. Der Code wird nun so ge&#228;ndert, dass die installierte Funktion gettext() anstelle der problematischen gettext-Vertretung aufgerufen wird. Dazu muss die Sprachdatei /wp-includes/languages/de_DE.mo zu wordpress.mo umbenannt und in ein neues Verzeichnis kopiert werden. Der Name des Verzeichnisses ist abh&#228;ngig von der eingestellten Codierung in der Datei wp-config.php:</p>
<p>Eine Sprachdefinition define (&#8217;WPLANG&#8217;, &#8216;de_DE.UTF-8&#8242;); ben&#246;tigt das Verzeichnis wp-includes/locale/de_DE.UTF-8/LC_MESSAGES/.</p>
<p>Lautet die Sprachdefinition define (&#8217;WPLANG&#8217;, &#8216;de_DE&#8217;); muss das Verzeichnis den Namen wp-includes/locale/de_DE/LC_MESSAGES/ tragen.</p>
<p>Wenn man will, kann man in der Datei wp-settings.php die Zeilen<br />
<code>include_once(ABSPATH . WPINC . ‘/gettext.php’);</code><br />
<code>include_once(ABSPATH . WPINC . '/streams.php');</code><br />
auskommentieren und die Dateien gettext.php und streams.php l&#246;schen.</p>
<p>Damit die Umstellung schnell vollzogen werden kann, hab ich f&#252;r WordPress 2.3.1 Deutsch ein kleines ZIP-File mit allen n&#246;tigen &#196;nderungen erstellt:</p>
<p><a href="http://brusdeylins.info/content/projects/native_gettext/native_gettext_WordPress_2.3.1.zip">Native_gettext_WordPress_2.3.1.zip</a></p>
<p>ACHTUNG:<br />
hier bitte auf die richtige Codierung achten, damit beim Posten keine Inhalte verloren gehen. Am Besten vorher ein Backup der Datenbank anlegen. Wenn eine andere Wordpress-Version unterst&#252;tzt werden soll, dann einfach die Sprachdateien aus dem ZIP-File entsprechend der obigen Anleitung selbst generieren.</p>
<p>Und nicht vergessen: somit ist das Anzeige-Problem gel&#246;st, der Fehler taucht nicht mehr auf, aber es gibt noch viele andere substr()-Aufrufe, welche schief laufen k&#246;nnen. Auff&#228;llig ist dabei Datenverlust an den Steuer-Tags aus der Code-Ansicht.<!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://brusdeylins.info/wordpress/probleme-mit-gettextphp/feed/</wfw:commentRss>
		<slash:comments>78</slash:comments>
		</item>
		<item>
		<title>Fuchsjagd</title>
		<link>http://brusdeylins.info/tips_and_tricks/fuchsjagd/</link>
		<comments>http://brusdeylins.info/tips_and_tricks/fuchsjagd/#comments</comments>
		<pubDate>Tue, 16 Oct 2007 00:38:36 +0000</pubDate>
		<dc:creator>Matthias Brusdeylins</dc:creator>
				<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Problem]]></category>

		<guid isPermaLink="false">http://www.brusdeylins.info/tips_and_tricks/fuchsjagt/</guid>
		<description><![CDATA[
Versteckte Optionen
Nicht alle Optionen, die der Firefox versteht, sind &#252;ber normale Konfigurations-Dialoge erreichbar. Dies hat auch seinen Grund. Manche Optionen sollten nur ver&#228;ndert werden, wenn man sich seiner Tat sicher ist. Mittels der Eingabe von &#8220;about:config&#8221; in der Adressleiste erreicht man die &#220;bersicht aller eingestellten Optionen. Gibt man in dem nun sichtbaren Suchfeld einen (Teil-)Text [...]]]></description>
			<content:encoded><![CDATA[<p><!--:de-->
<a href="http://brusdeylins.info/media/post-images/firefox_logo.jpg" title="Das FireFox-Logo" rel="lightbox[singlepic15]" >
	<img class="ngg-singlepic ngg-right" src="http://brusdeylins.info/media/cache/15_web20_150x400_firefox_logo.jpg" alt="Das FireFox-Logo" title="Das FireFox-Logo" />
</a>
Der Browser Firefox geh&#246;rt zu den besten Browsern auf dem Markt. Seine St&#228;rke liegt meiner Meinung nach in der gro&#223;en Anzahl der frei verf&#252;gbaren <a href="https://addons.mozilla.org/de/firefox/" target="_blank">Erweiterungen</a> (Plugins/Addons). Leider hat er aber auch seine Schw&#228;chen. Er ist nicht der Schnellste, wenn es darum geh Webinhalte aus dem Netz anzuzeigen. Dies liegt wom&#246;glich daran, dass die Standardkonfiguration des Firefox auf schmale Bandbreiten ausgerichtet ist. Auch beklagen viele Anwender einen hohen Speicher- und CPU-Verbrauch. Bei der Darstellung einiger Webseiten, welche zum Beispiel Grafiken, Charts oder WebCam-Bilder mittels JavaScript und URL-Modifikationen in regelm&#228;&#223;igen Abst&#228;nden aktualisieren, kann es sehr schnell passieren, dass der Browser nahezu ein Gigabyte Speicher belegt. Vermutlich liegt die Ursache hier ebenfalls an der Optimierung f&#252;r langsame Internet Verbindungen. Es werden viele Daten im Browser-Cache abgelegt. Aber f&#252;r die meisten &#8220;Schw&#228;chen&#8221; gibt es nat&#252;rlich Abhilfe.<!--:--><span id="more-46"></span><!--:de--></p>
<h3>Versteckte Optionen</h3>
<p>Nicht alle Optionen, die der Firefox versteht, sind &#252;ber normale Konfigurations-Dialoge erreichbar. Dies hat auch seinen Grund. Manche Optionen sollten nur ver&#228;ndert werden, wenn man sich seiner Tat sicher ist. Mittels der Eingabe von &#8220;<code>about:config</code>&#8221; in der Adressleiste erreicht man die &#220;bersicht aller eingestellten Optionen. Gibt man in dem nun sichtbaren Suchfeld einen (Teil-)Text ein, werden die Optionen entsprechend gefiltert. Einzelne Optionen k&#246;nnen hier ver&#228;ndert werden. Wird ein neuer Eintrag mittels der rechten Maustaste angelegt, hat man die Typ-Auswahl zwischen Zahl (Integer), Wahrheitswert (Boolean) oder Text (String). Die hier beschriebenen Einstellungen m&#252;ssen also genau auf dieser Seite vorgenommen werden, notfalls m&#252;ssen die einzelnen Parameter neu erstellt werden. (Anmerkung: das Plugin <a href="http://www.mrtech.com/extensions/#about" target="_blank">About:About</a> von MrTech bietet einen einfachen Zugriff auf alle <em>about:*</em>-Seiten des Firefox)</p>
<h3>Speicherverbrauch reduzieren</h3>
<p>Seine St&#228;rke kann gleichzeitig auch seine Schw&#228;che werden. Einige Erweiterungen ben&#246;tigen unn&#246;tig viel Speicher und CPU-Kapazit&#228;t. Auf der Webseite von <a href="http://kb.mozillazine.org/Problematic_extensions" target="_blank">MozillaZine.org</a> findet man eine Liste der g&#228;ngigsten PlugIns mit bekanten Problemen.</p>
<p>Ein weiteres &#8220;Feature&#8221;, wie es Firefox Lead Engineer Ben Goodger in seinem <a href="http://weblogs.mozillazine.org/ben/archives/009749.html" target="_blank">Blog-Beitrag</a> bezeichnet, besteht in dem Zwischenspeichern der zuletzt besuchten Seiten. Die Intention dieser Vorgehensweise r&#252;hrt von der Erkenntnis, dass viele Seiten mittels dem &#8220;Zur&#252;ck-Button&#8221; wieder verlassen werden. Somit k&#246;nnen die vorherigen Webseiten schnell wieder dargestellt werden, ohne dass die Daten vom Server noch einmal angefragt werden m&#252;ssen. Verf&#252;gt man allerdings &#252;ber eine nicht allzu schmale Bandbreite, kann man diese Option zu Gunsten des Speicherverbrauches abschalten. Hierzu muss lediglich die Option <code>browser.sessionhistory.max_total_viewers = 0</code> eingetragen werden.</p>
<p>Die Cache-Gr&#246;&#223;en an sich k&#246;nnen ebenfalls definiert werden. Dabei muss darauf geachtet werden, dass die angegebenen Werte ein Vielfaches von 8 sind, ansonsten werden sie ignoriert. Der Parameter <code>browser.cache.disk.capacity</code> (mit <code>browser.cache.disk.enable</code>) definiert die Gr&#246;&#223;e des Zwischenspeichers auf der Festplatte, w&#228;hrend der Parameter <code>browser.cache.memory.capacity</code> (mit <code>browser.cache.memory.enable</code>) den reservierten Platz im Hauptspeicher bestimmt. Setzt man den Firefox unter Windows ein, kann einem die Option <code>config.trim_on_minimize = true</code> behilflich sein. Sie veranlasst den Firefox seine Caches zu leeren, sobald das Fenster in die Taskleiste minimiert wird.</p>
<h3>&#220;bertragungsgeschwindigkeit</h3>
<p>Die meisten Webseiten im Internet werden mittels des HTTP-Protokolls &#252;bertragen. In der Version 1.1 k&#246;nnen mehrere Anfragen an einen Server gestellt werden, ohne dass zuvor auf eine Antwort gewartet werden muss. Dieses Verfahren nennt sich Pipelining. Dadurch wird die Ladezeit der einzelnen Seiten verk&#252;rzt, da mehrere Inhalte gleichzeitig empfangen werden. Dies macht nat&#252;rlich nur Sinn, wenn man &#252;ber eine vern&#252;nftige Bandbreite verf&#252;gt. Nicht alle Web-Server unterst&#252;tzen das HTTP-Protokoll in der Version 1.1 bzw. Pipelining. Im ung&#252;nstigsten Fall bekommt man Probleme bei der Anzeige gew&#252;nschter Seiten.</p>
<p>Folgende Einstellungen k&#246;nnen in der Firefox-Konfiguration vorgenommen werden und sind nach einem Neustart aktiv:</p>
<pre>network.http.keep-alive  = true
network.http.version = 1.1
network.http.pipelining = true
network.http.pipelining.firstrequest = true
network.http.pipelining.maxrequests = 10</pre>
<h3>PlugIn</h3>
<p>Man kann sich nun die M&#252;he machen und all diese Einstellungen von Hand in die Konfiguration des Browsers eintippen, oder aber einfach ein entsprechendes PlugIn wie z.B. <a href="http://fasterfox.mozdev.org/" target="_blank">Fasterfox</a> bzw. <a href="https://addons.mozilla.org/de/firefox/addon/1881" target="_blank">CacheStatus</a> installieren. Hier k&#246;nnen unter anderem die hier beschriebenen Einstellungen einfach vorgenommen werden.<!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://brusdeylins.info/tips_and_tricks/fuchsjagd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
