<?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; PHP</title>
	<atom:link href="http://brusdeylins.info/tag/php/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>PHP 5 Kochbuch</title>
		<link>http://brusdeylins.info/publication/php-5-kochbuch/</link>
		<comments>http://brusdeylins.info/publication/php-5-kochbuch/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 12:22:12 +0000</pubDate>
		<dc:creator>Matthias Brusdeylins</dc:creator>
				<category><![CDATA[Publikationen]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Publikation]]></category>

		<guid isPermaLink="false">http://www.brusdeylins.info/?p=357</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><!--:de-->
<a href="http://brusdeylins.info/media/post-images/phpckbk3ger-s.gif" title="Die 3. Auflage von Matthias Brusdeylins und Carsten Lucke - Bildquelle: O’Reilly" rel="lightbox[singlepic47]" >
	<img class="ngg-singlepic ngg-right" src="http://brusdeylins.info/media/cache/47_web20_150x198_phpckbk3ger-s.gif" alt="PHP Kochbuch 5" title="PHP Kochbuch 5" />
</a>
Es ist nun soweit! Zusammen mit <a href="http://lucke.info/" target="_blank">Carsten Lucke</a> konnte ich eine weitere PHP Publikation anfertigen. Dabei handelt es sich um die 3. Auflage des beliebten <a href="http://www.oreilly.de/catalog/phpckbk3ger/index.html" target="_blank">PHP-Kochbuchs</a> des O&#8217;Reilly-Verlags. Ende September werden die ersten Exemplare geliefert. In dieser Auflage wird das aktuelle PHP 5.3 und dessen wichtigsten Neuerungen genauer erl&#228;utert und mit einfachen und verst&#228;ndlichen Beispielen n&#228;her gebracht. Inhalte die hier neu behandelt werden sind unter anderem Namespaces, Closures, Late static binding und PHAR.<!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://brusdeylins.info/publication/php-5-kochbuch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Alles unter Kontrolle</title>
		<link>http://brusdeylins.info/publication/alles-unter-kontrolle/</link>
		<comments>http://brusdeylins.info/publication/alles-unter-kontrolle/#comments</comments>
		<pubDate>Wed, 12 Nov 2008 21:14:45 +0000</pubDate>
		<dc:creator>Matthias Brusdeylins</dc:creator>
				<category><![CDATA[Neues]]></category>
		<category><![CDATA[Publikationen]]></category>
		<category><![CDATA[Artikel]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.brusdeylins.info/allgemein/alles-unter-kontrolle/</guid>
		<description><![CDATA[
Dieser Artikel erkl&#228;rt die Mechanismen der Authentifizierung und Autorisierung, gibt einen Einblick in den Request-Lebenszyklus des Zend Frameworks und zeigt anhand eines Beispiel-Algorithmus, wie die Zugriffsteuerung zentral integriert werden kann.
Autoren: Matthias Brusdeylins
Sprache: Deutsch
Zeichen: 37011
Links: Ausgabe 1.2009, Artikel-Quellcodes
]]></description>
			<content:encoded><![CDATA[<p><!--:de-->
<a href="http://brusdeylins.info/media/post-images/phpmag_1_2009.jpg" title="Alles unter Kontrolle - Bildquelle: PHP Magazin" rel="lightbox[singlepic27]" >
	<img class="ngg-singlepic ngg-right" src="http://brusdeylins.info/media/cache/27_web20_150x210_phpmag_1_2009.jpg" alt="PHP Magazin" title="PHP Magazin" />
</a>
In der neuen <a href="http://it-republik.de/php/php-magazin-ausgaben/PHP-meets-Maven-000277.html" target="_blank">Ausgabe 1.2009</a> des PHP-Magazins erschien nun mein Artikel &#8220;Alles unter Kontrolle&#8221;:</p>
<p><em>&#8220;Die Prinzipien der kontrollierten Zugriffssteuerung sind Bestandteil jeder modernen Webanwendung und m&#252;ssen bei deren Entwicklung verstanden sein. Das Zend Framework bietet hierf&#252;r die n&#246;tigen Komponenten und Mechanismen an. In diesem Artikel erkl&#228;ren wir dessen Funktionsweisen und zeigen, wie diese elegant eingesetzt werden.&#8221;</em><!--:--><span id="more-67"></span><!--:de--></p>
<p>Dieser Artikel erkl&#228;rt die Mechanismen der Authentifizierung und Autorisierung, gibt einen Einblick in den Request-Lebenszyklus des Zend Frameworks und zeigt anhand eines Beispiel-Algorithmus, wie die Zugriffsteuerung zentral integriert werden kann.</p>
<p><strong>Autoren:</strong> Matthias Brusdeylins<br />
<strong>Sprache:</strong> Deutsch<br />
<strong>Zeichen:</strong> 37011<br />
<strong>Links:</strong> <a href="http://it-republik.de/php/php-magazin-ausgaben/PHP-meets-Maven-000277.html" target="_blank">Ausgabe 1.2009</a>, <a href="http://it-republik.de/zonen/magazine/ausgaben/psfile/source_file/20/brusdeylin491994836b67e.zip" target="_blank">Artikel-Quellcodes</a><!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://brusdeylins.info/publication/alles-unter-kontrolle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zend Studio for Eclipse</title>
		<link>http://brusdeylins.info/publication/zend-studio-for-eclipse/</link>
		<comments>http://brusdeylins.info/publication/zend-studio-for-eclipse/#comments</comments>
		<pubDate>Mon, 19 May 2008 07:59:12 +0000</pubDate>
		<dc:creator>Matthias Brusdeylins</dc:creator>
				<category><![CDATA[Neues]]></category>
		<category><![CDATA[Publikationen]]></category>
		<category><![CDATA[Artikel]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Studio]]></category>

		<guid isPermaLink="false">http://www.brusdeylins.info/news/zend-studio-for-eclipse/</guid>
		<description><![CDATA[
Dieser Artikel bietet einen &#220;berblick und Erfahrungsbericht &#252;ber die Features der neuen Entwicklungsumgebung von Zend.  Einige der Schl&#252;sselthemen sind dabei die hervorragende Integration des PHP-Debuggers von Zend in die Eclipse-Umgebung,  das Profiling einer PHP-Anwendung, PHP-Unit-Test sowie die exellente PHP-Code-Formatierung und Code- Unterst&#252;tzung.
Autoren: Carsten Lucke, Matthias Brusdeylins
Sprache: Deutsch
Zeichen: 31377
Links: Mai-Juni-Ausgabe, Zend Studio
]]></description>
			<content:encoded><![CDATA[<p><!--:de-->
<a href="http://brusdeylins.info/media/post-images/php-solmag-zsfe.jpg" title="Zend Studio for Eclipse - Bildquelle: PHP Solutions Magazine" rel="lightbox[singlepic26]" >
	<img class="ngg-singlepic ngg-right" src="http://brusdeylins.info/media/cache/26_web20_150x240_php-solmag-zsfe.jpg" alt="PHP Solutions Magazine" title="PHP Solutions Magazine" />
</a>
Die <a href="http://www.phpsolmag.org/prt/view/php-solutions/issue/822.html" target="_blank">Mai-Juni-Ausgabe</a> des Magazins <em>PHP-Solutions</em> bringt unseren Artikel &#8220;<em>Zend Studio for Eclipse</em>&#8221; heraus:</p>
<p><em>&#8220;Nach einem ausgiebigen Betatest hat die Firma Zend Anfang dieses Jahres die finale Version ihrer kommerziellen Entwicklungsumgebung f&#252;r PHP auf den Markt gebracht – das Zend Studio for Eclipse. Zu den wichtigsten Funktionen geh&#246;ren Code Generation, Refactoring, Unit Testing sowie Debugging und Profiling. Vollmundig verspricht Zend, dass es sich hier um die „leistungsst&#228;rkste PHP IDE f&#252;r das Entwickeln umfassender Webapplikationen“ handelt. Die Autoren haben das Zend Studio for Eclipse genauer unter die Lupe genommen und berichten im vorliegenden Artikel von ihren Erkenntnissen.&#8221;</em><!--:--><span id="more-65"></span><!--:de--></p>
<p>Dieser Artikel bietet einen &#220;berblick und Erfahrungsbericht &#252;ber die Features der neuen Entwicklungsumgebung von Zend.  Einige der Schl&#252;sselthemen sind dabei die hervorragende Integration des PHP-Debuggers von Zend in die Eclipse-Umgebung,  das Profiling einer PHP-Anwendung, PHP-Unit-Test sowie die exellente PHP-Code-Formatierung und Code- Unterst&#252;tzung.</p>
<p><strong>Autoren:</strong> Carsten Lucke, Matthias Brusdeylins<br />
<strong>Sprache:</strong> Deutsch<br />
<strong>Zeichen:</strong> 31377<br />
<strong>Links:</strong> <a href="http://www.phpsolmag.org/prt/view/php-solutions/issue/822.html" target="_blank">Mai-Juni-Ausgabe</a>, <a href="http://www.zend.com/de/products/studio/" target="_blank">Zend Studio</a><a href="http://it-republik.de/zonen/magazine/ausgaben/psfile/source_file/20/brusdeylin491994836b67e.zip" target="_blank"></a><!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://brusdeylins.info/publication/zend-studio-for-eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yahoo! Finance API</title>
		<link>http://brusdeylins.info/projects/yahoo-finance-api/</link>
		<comments>http://brusdeylins.info/projects/yahoo-finance-api/#comments</comments>
		<pubDate>Sun, 18 May 2008 17:20:34 +0000</pubDate>
		<dc:creator>Matthias Brusdeylins</dc:creator>
				<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Finance]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projekt]]></category>
		<category><![CDATA[Yahoo]]></category>

		<guid isPermaLink="false">http://www.brusdeylins.info/projects/yahoo-finance-api/</guid>
		<description><![CDATA[
F&#252;r das Ermitteln unterschiedlicher Kursdaten bietet Yahoo!Finance (auch f&#252;r Deutschland) verschiedene CSV-Export-Services an. CSV steht f&#252;r &#8220;Comma Separated Values&#8221; und bedeutet hier nichts anderes, als dass die ganzen Kennzahlen (wie z.B. Schluss-Kurs oder Volumen) in reiner Textform mit Kommas   und Zeilenumbr&#252;chen getrennt ausgeliefert werden. Daten in solch einem Format kann ein Computerprogramm f&#252;r [...]]]></description>
			<content:encoded><![CDATA[<p><!--:de-->
<a href="http://brusdeylins.info/media/post-images/yahoo-finance.jpg" title="Yahoo-Finance API" rel="lightbox[singlepic39]" >
	<img class="ngg-singlepic ngg-right" src="http://brusdeylins.info/media/cache/39__150x240_yahoo-finance.jpg" alt="Yahoo-Finance API" title="Yahoo-Finance API" />
</a>
Moderne Broker-Portale bieten einem Investor die M&#246;glichkeit, Kurse seiner Aktien bzw. Optionen abzurufen. Dort findet er in der Regel auch Kurs-Charts und Chart-Analyse-Kurven zu den unterschiedlichsten Zeitr&#228;umen. Dem ein oder anderen privaten Investor sind diese Analysen vielleicht nicht ausreichend genug. Es mag unter ihnen Informatiker und Hobby-Programmierer geben, die den Wunsch &#228;u&#223;ern, mit Kursdaten mathematische Analysen durchzuf&#252;hren, um Indikatoren selbst zu berechnen. Nur wie gelangt ein Programmierer an die aktuellen und historischen Zahlen einzelner Aktienkurse? Dieser Beitrag soll die M&#246;glichkeiten der Yahoo!Finance-Schnittstelle n&#228;her bringen.<!--:--><span id="more-41"></span><!--:de--></p>
<p>F&#252;r das Ermitteln unterschiedlicher Kursdaten bietet <a href="http://finance.yahoo.com/" target="_blank">Yahoo!Finance</a> (<a href="http://de.finance.yahoo.com/" target="_blank">auch f&#252;r Deutschland</a>) verschiedene CSV-Export-Services an. CSV steht f&#252;r &#8220;Comma Separated Values&#8221; und bedeutet hier nichts anderes, als dass die ganzen Kennzahlen (wie z.B. Schluss-Kurs oder Volumen) in reiner Textform mit Kommas   und Zeilenumbr&#252;chen getrennt ausgeliefert werden. Daten in solch einem Format kann ein Computerprogramm f&#252;r Analysezwecke leicht verarbeiten. Im Folgenden werden die bekannten Schnittstellen genauer erl&#228;utert und dazu passende Beispiele und PHP-Scripte pr&#228;sentiert. Da mir keine offizielle API von Yahoo!Finance bekannt ist und ich die hier beschriebene Schnittstelle durch Ausprobieren und Studium ermittelt habe, kann ich f&#252;r eine Vollst&#228;ndigkeit des aufgezeigten Funktionsumfanges nicht garantieren. F&#252;r Hinweise bin ich daher sehr dankbar. Verwendet ein Entwickler die Services von Yahoo!Finance, so sollte er sich vorher die <a href="http://developer.yahoo.com/usagePolicy/" target="_blank">Nutzungsbedingungen</a> (<a href="http://info.yahoo.com/guidelines/us/yahoo/ydn/ydn-3955.html" target="_blank">siehe auch</a>) genau durchlesen.</p>
<h2>Aktuelle Kursdaten ermitteln</h2>
<p>Ganz ehrlich, &#8220;aktuell&#8221; bedeutet bei der kostenlosen Yahoo!Finance-Schnittstelle leider eine Verz&#246;gerung von 15 Minuten f&#252;r NASDAQ Werte, bis hin zu 60 Minuten f&#252;r andere B&#246;rsenpl&#228;tze (<a href="http://de.biz.yahoo.com/sd/index.html" target="_blank">n&#228;heres auf Yahoo!Finance</a>). Doch f&#252;r die meisten Verwendungszwecken bzw. westlichen B&#246;rsenkurse d&#252;rfte diese Verz&#246;gerung kein Problem darstellen. Yahoo! bietet Kurse aus den unterschiedlichsten B&#246;rsenpl&#228;tzen an. Die Selektion des entsprechenden Handelsplatzes findet in der URL selbst, sowie in einem Anhang (Suffix) an der Symbolangabe statt. Im Kapitel &#8220;L&#228;nderunterschiede&#8221; werden die Unterschiede aufgelistet. Zum besseren Verst&#228;ndnis zeige ich hier nur die Basis-URL, welche vor allem f&#252;r die US-B&#246;rsenkurse g&#252;ltig ist. Das Ergebnis ist eine Werteliste, die durch Kommas getrennt pr&#228;sentiert wird. Die Serviceadressen f&#252;r aktuelle Kursinformationen lautet <code>http://finance.yahoo.com/d/quotes.csv?</code> und nimmt die folgenden drei bekannten Parameter entgegen:</p>
<table class="full" border="0">
<tbody>
<tr>
<th>Parameter</th>
<th>Beschreibung</th>
</tr>
<tr>
<td>s=</td>
<td>Das <strong>Symbol</strong> des Wertpapiers wird mit dem Parameter &#8220;s&#8221; angegeben. Z.B. liefert hier &#8220;<code>s=AAPL</code>&#8221; die aktuellen Kursdaten von Apple Inc. Eine Kombination mehrere durch ein Pluszeichen getrennte Symbole ist ebenfalls m&#246;glich (zum Beispiel &#8220;<code>s=AAPL+MSFT</code>&#8221; f&#252;r Apple und Microsoft). Die Werte, getrennt durch Kommas, kommen dann jeweils in eine separaten Zeile pro Symbol zur&#252;ck.</td>
</tr>
<tr>
<td>f=</td>
<td><strong>Die Format-Codes</strong> werden hier mit dem Parameter &#8220;f&#8221; angegeben. Dabei handelt es sich hier um einen Textzug mit lauter aneinandergereihten K&#252;rzel. So gibt z.B. das Zeichen &#8220;s&#8221; an, dass das Symbol der Aktie ausgegeben werden soll. &#8220;n&#8221; liefert den Namen, &#8220;a&#8221; den aktuellen Anfrage-Kurs. Die Werte werden exakt in der Reihenfolge ausgegeben, wie sie hier angefordert werden. Eine Liste aller bekannten Format-Codes wird weiter unten um Kapitel &#8220;Die Format-Codes&#8221; aufgelistet. Beispiel: <code>f=sna</code></td>
</tr>
<tr>
<td>e=.cvs</td>
<td>Die <strong>Exportart</strong> wird mit dem Parameter &#8220;e&#8221; angegeben. Hier sollte immer &#8220;<code>e=.csv</code>&#8221; f&#252;r ein &#8220;Comma Separated Values&#8221; Ergebnis &#252;bermittelt werden. Erfahrungen haben gezeigt, dass dieser Parameter wohl optional ist.</td>
</tr>
</tbody>
</table>
<p>Das folgende Beispiel ermittelt von Apple und Microsoft das Symbol, den Firmen-Namen, den aktuellen Anfrage-Kurs und die dazu geh&#246;rige Zeit ab. Dabei sind Zeit und Kurswert immer l&#228;nderspezifisch zu verstehen (US-Zeit und Dollar). Wenn Sie diese URL in den Browser eingeben, k&#246;nnen Sie das Ergebnis abspeichern. Danach k&#246;nnen Sie die Rohdaten in einem Texteditor &#246;ffnen und betrachten (nicht mit Excel &#246;ffnen, da hier die Formatierung nicht ersichtlich wird).</p>
<pre>http://finance.yahoo.com/d/quotes.csv?s=AAPL+MSFT&amp;f=snat1
---
"AAPL","APPLE INC",151.47,"3:31pm"
"MSFT","MICROSOFT CP",29.09,"3:31pm"</pre>
<p>Ein Programm kann nun diese Daten in einem mehrdimensionalen Array ablegen. Dabei enthalten die Spalten die Inhalte der Werte, welche durch die Format-Codes angefordert wurden. Die Zeilen bilden jeweils das Zahlentupel eines Wertpapiers ab. Eine PHP-Funktion zur Ermittlung der Kursdaten k&#246;nnte somit folgenderma&#223;en aussehen:</p>
<pre>&lt;?php
    /*
     * Getting current quotes:
     * Reading multible lines of values into an array depending on the given symbols and function tags.
     * Each line holds the values of one symbol. In the argument, symbols are separated by "+".
     *
     * (c) Matthias Brusdeylins, 2008
     * License: CC-GNU GPL (http://creativecommons.org/licenses/GPL/2.0/)
     */    

    define ("QUOTES_URL", "http://finance.yahoo.com/d/quotes.csv?");
    function loadYahooQuotes ($symbol,
                              $tags)
    {
        $lineCount = 0;
        $stocks = array();

        // load the stock quotes: we are opening it for reading
        // http://finance.yahoo.com/d/quotes.csv?s=  STOCK SYMBOLS  &amp;f=  FORMAT TAGS
        $URL = QUOTES_URL."s=$symbol&amp;f=$tags&amp;e=.csv";
        $fileHandle = fopen ($URL,"r");

        if ($fileHandle) {
            // use the fgetcsv function to store quote values into an array $lineValues
            // one symbol in one line
            do {
                $stockValues = fgetcsv ($fileHandle, 999999, ",");
                if ($stockValues) {
                    $lineCount++;
                    $stocks[$lineCount] = $stockValues;
                }
            } while ($stockValues);

        fclose ($fileHandle);
        } else {
            // ERROR-Message in the array
            $stocks[0][0] = "ERROR";
            $stocks[0][1] = "No data found.";
        }

        return $stocks;
    }
?&gt;</pre>
<h2>Devisen</h2>
<p>Sie k&#246;nnen nicht nur einzelne Aktienkurse erfragen, sondern auch Devisenkurse. Dazu m&#252;ssen Sie an der oben vorgestellten Adresse als Symbol-Parameter ein spezielles Konstrukt der Form <code>AB=X</code> &#252;bermitteln. Hier steht der Buchstabe <code>A</code> f&#252;r die erste zu vergleichende W&#228;hrung und der Buchstabe <code>B</code> dann nat&#252;rlich f&#252;r die zweite W&#228;hrung.  <code>X</code> steht wohl f&#252;r Exchange und wird nicht ersetzt. Wollen Sie mehrere W&#228;hrungen abfragen, k&#246;nnen mehrere Konstrukte mittels dem Pluszeichen &#8220;<code>+</code>&#8221; aneinander geh&#228;ngt werden. Folgendes Beispiel soll dies verdeutlichen:</p>
<pre>http://quote.yahoo.com/d/quotes.csv?s=USDCAD=X+JPYUSD=X&amp;f=nl1d1t1
---
"USD to CAD",1.0088,"4/4/2008","5:02pm"
"JPY to USD",0.0098,"4/4/2008","5:26pm"</pre>
<p>Die K&#252;rzel der W&#228;hrungen bestehen aus drei Buchstaben und werden hier aufgelistet:</p>
<table class="full" border="0">
<tbody>
<tr>
<th>Land</th>
<th width="20%">K&#252;rzel</th>
</tr>
<tr>
<td>Afganistan Afghani</td>
<td>AFA</td>
</tr>
<tr>
<td>Albanian Lek</td>
<td>ALL</td>
</tr>
<tr>
<td>Algerian Dinar</td>
<td>DZD</td>
</tr>
<tr>
<td>Argentinian Peso</td>
<td>ARS</td>
</tr>
<tr>
<td>Aruban Florin</td>
<td>AWG</td>
</tr>
<tr>
<td>Australian Dollar</td>
<td>AUD</td>
</tr>
<tr>
<td>Austrian Schilling</td>
<td>ATS</td>
</tr>
<tr>
<td>Bahraini Dinar</td>
<td>BHD</td>
</tr>
<tr>
<td>Bangladesh Taka</td>
<td>BDT</td>
</tr>
<tr>
<td>Barbados Dollar</td>
<td>BBD</td>
</tr>
<tr>
<td>Belgian Franc</td>
<td>BEF</td>
</tr>
<tr>
<td>Belize Dollar</td>
<td>BZD</td>
</tr>
<tr>
<td>Bermuda Dollar</td>
<td>BMD</td>
</tr>
<tr>
<td>Bhutan Ngultrum</td>
<td>BTN</td>
</tr>
<tr>
<td>Bolivian Boliviano</td>
<td>BOB</td>
</tr>
<tr>
<td>Botswana Pula</td>
<td>BWP</td>
</tr>
<tr>
<td>Brazilian Real</td>
<td>BRL</td>
</tr>
<tr>
<td>British Pound</td>
<td>GBP</td>
</tr>
<tr>
<td>Brunei Dollar</td>
<td>BND</td>
</tr>
<tr>
<td>Bulgarian Lev</td>
<td>BGN</td>
</tr>
<tr>
<td>Cambodian Riel</td>
<td>KHR</td>
</tr>
<tr>
<td>Canadian Dollar</td>
<td>CAD</td>
</tr>
<tr>
<td>Cape Verde Escudo</td>
<td>CVE</td>
</tr>
<tr>
<td>Cayman Islands Dollar</td>
<td>KYD</td>
</tr>
<tr>
<td>CFA Franc (BCEAO)</td>
<td>XOF</td>
</tr>
<tr>
<td>CFA Franc(BEAC)</td>
<td>XAF</td>
</tr>
<tr>
<td>CFP Franc</td>
<td>XPF</td>
</tr>
<tr>
<td>Chilean Peso</td>
<td>CLP</td>
</tr>
<tr>
<td>Colombian Peso</td>
<td>COP</td>
</tr>
<tr>
<td>Comoros Franc</td>
<td>KMF</td>
</tr>
<tr>
<td>Costa Rican Colon</td>
<td>CRC</td>
</tr>
<tr>
<td>Croatian Kuna</td>
<td>HRK</td>
</tr>
<tr>
<td>Cuban Peso</td>
<td>CUP</td>
</tr>
<tr>
<td>Cypriot Pound</td>
<td>CYP</td>
</tr>
<tr>
<td>Czech Koruna</td>
<td>CZK</td>
</tr>
<tr>
<td>Danish Krone</td>
<td>DKK</td>
</tr>
<tr>
<td>Djibouti Franc</td>
<td>DJF</td>
</tr>
<tr>
<td>Dominican Peso</td>
<td>DOP</td>
</tr>
<tr>
<td>Dutch Guilder</td>
<td>NLG</td>
</tr>
<tr>
<td>East Caribbean Dollar</td>
<td>XCD</td>
</tr>
<tr>
<td>Egyptian Pound</td>
<td>EGP</td>
</tr>
<tr>
<td>El Salvador Colon</td>
<td>SVC</td>
</tr>
<tr>
<td>Estonian Kroon</td>
<td>EEK</td>
</tr>
<tr>
<td>Ethiopian Birr</td>
<td>ETB</td>
</tr>
<tr>
<td>Euro</td>
<td>EUR</td>
</tr>
<tr>
<td>Fiji Dollar</td>
<td>FJD</td>
</tr>
<tr>
<td>Finnish Markka</td>
<td>FIM</td>
</tr>
<tr>
<td>French Franc</td>
<td>FRF</td>
</tr>
<tr>
<td>Gambia Dalasi</td>
<td>GMD</td>
</tr>
<tr>
<td>German Mark</td>
<td>DEM</td>
</tr>
<tr>
<td>Ghanaian Cedi</td>
<td>GHC</td>
</tr>
<tr>
<td>Gibraltar Pound</td>
<td>GIP</td>
</tr>
<tr>
<td>Greek Drachma</td>
<td>GRD</td>
</tr>
<tr>
<td>Guatemala Quetzal</td>
<td>GTQ</td>
</tr>
<tr>
<td>Guinea Franc</td>
<td>GNF</td>
</tr>
<tr>
<td>Guyana Dollar</td>
<td>GYD</td>
</tr>
<tr>
<td>Haitian Gourde</td>
<td>HTG</td>
</tr>
<tr>
<td>Honduras Lempira</td>
<td>HNL</td>
</tr>
<tr>
<td>Hong Kong Dollar</td>
<td>HKD</td>
</tr>
<tr>
<td>Hungarian Forint</td>
<td>HUF</td>
</tr>
<tr>
<td>Iceland Krona</td>
<td>ISK</td>
</tr>
<tr>
<td>Indian Rupee</td>
<td>INR</td>
</tr>
<tr>
<td>Indonesian Rupiah</td>
<td>IDR</td>
</tr>
<tr>
<td>Irish Punt</td>
<td>IEP</td>
</tr>
<tr>
<td>Israeli Shekel</td>
<td>ILS</td>
</tr>
<tr>
<td>Italian Lira</td>
<td>ITL</td>
</tr>
<tr>
<td>Jamaican Dollar</td>
<td>JMD</td>
</tr>
<tr>
<td>Japanese Yen</td>
<td>JPY</td>
</tr>
<tr>
<td>Jordanian Dinar</td>
<td>JOD</td>
</tr>
<tr>
<td>Kenyan Shilling</td>
<td>KES</td>
</tr>
<tr>
<td>Kuwaiti Dinar</td>
<td>KWD</td>
</tr>
<tr>
<td>Laos Kip</td>
<td>LAK</td>
</tr>
<tr>
<td>Latvian Lats</td>
<td>LVL</td>
</tr>
<tr>
<td>Lebanese Pound</td>
<td>LBP</td>
</tr>
<tr>
<td>Lesotho Loti</td>
<td>LSL</td>
</tr>
<tr>
<td>Lithuanian Litas</td>
<td>LTL</td>
</tr>
<tr>
<td>Malagasy Franc</td>
<td>MGF</td>
</tr>
<tr>
<td>Malawi Kwacha</td>
<td>MWK</td>
</tr>
<tr>
<td>Malaysian Ringgit</td>
<td>MYR</td>
</tr>
<tr>
<td>Maldives Rufiyan</td>
<td>MVR</td>
</tr>
<tr>
<td>Maltese Pound</td>
<td>MTL</td>
</tr>
<tr>
<td>Mauritania Ouguiya</td>
<td>MRO</td>
</tr>
<tr>
<td>Mauritius Rupee</td>
<td>MUR</td>
</tr>
<tr>
<td>Mexican Peso</td>
<td>MXN</td>
</tr>
<tr>
<td>Mongolian Tugrik</td>
<td>MNT</td>
</tr>
<tr>
<td>Moroccan Dirham</td>
<td>MAD</td>
</tr>
<tr>
<td>Mozambique Metical</td>
<td>MZM</td>
</tr>
<tr>
<td>Myanmar Kyat</td>
<td>MMK</td>
</tr>
<tr>
<td>Namibian Dollar</td>
<td>NAD</td>
</tr>
<tr>
<td>Nepal Rupee</td>
<td>NPR</td>
</tr>
<tr>
<td>Netherlands Antilles Guilder</td>
<td>ANG</td>
</tr>
<tr>
<td>New Zealand Dollar</td>
<td>NZD</td>
</tr>
<tr>
<td>Nicaraguan Cordoba</td>
<td>NIO</td>
</tr>
<tr>
<td>Nigerian Naira</td>
<td>NGN</td>
</tr>
<tr>
<td>Norwegian Krone</td>
<td>NOK</td>
</tr>
<tr>
<td>Oman Rial</td>
<td>OMR</td>
</tr>
<tr>
<td>Pakistani Rupee</td>
<td>PKR</td>
</tr>
<tr>
<td>Papua New Guinea Kina</td>
<td>PGK</td>
</tr>
<tr>
<td>Peruvian Sol</td>
<td>PEN</td>
</tr>
<tr>
<td>Philippines Peso</td>
<td>PHP</td>
</tr>
<tr>
<td>Polish Zloty</td>
<td>PLN</td>
</tr>
<tr>
<td>Portuguese Escudo</td>
<td>PTE</td>
</tr>
<tr>
<td>Qatari Rial</td>
<td>QAR</td>
</tr>
<tr>
<td>Renmimbi Yuan</td>
<td>CNY</td>
</tr>
<tr>
<td>Romanian Leu</td>
<td>ROL</td>
</tr>
<tr>
<td>Russian Ruble</td>
<td>RUB</td>
</tr>
<tr>
<td>Salomon Islands Dollar</td>
<td>SBD</td>
</tr>
<tr>
<td>Sao Tome &amp; Principe Dobra</td>
<td>STD</td>
</tr>
<tr>
<td>Saudi Arabian Riyal</td>
<td>SAR</td>
</tr>
<tr>
<td>Seychelles Rupee</td>
<td>SCR</td>
</tr>
<tr>
<td>Sierra Leone Leone</td>
<td>SLL</td>
</tr>
<tr>
<td>Singapore Dollar</td>
<td>SGD</td>
</tr>
<tr>
<td>Slovak Koruna</td>
<td>SKK</td>
</tr>
<tr>
<td>Slovenian Tolar</td>
<td>SIT</td>
</tr>
<tr>
<td>South African Rand</td>
<td>ZAR</td>
</tr>
<tr>
<td>South Korean Won</td>
<td>KRW</td>
</tr>
<tr>
<td>Spanish Peseta</td>
<td>ESP</td>
</tr>
<tr>
<td>Sri Lanka Rupee</td>
<td>LKR</td>
</tr>
<tr>
<td>St. Helena Pound</td>
<td>SHP</td>
</tr>
<tr>
<td>Sudanese Dinar</td>
<td>SDD</td>
</tr>
<tr>
<td>Surinam Guilder</td>
<td>SRG</td>
</tr>
<tr>
<td>Swaziland Lilangeni</td>
<td>SZL</td>
</tr>
<tr>
<td>Swedish Krona</td>
<td>SEK</td>
</tr>
<tr>
<td>Swiss Franc</td>
<td>CHF</td>
</tr>
<tr>
<td>Syria Pound</td>
<td>SYP</td>
</tr>
<tr>
<td>Taiwan New Dollar</td>
<td>TWD</td>
</tr>
<tr>
<td>Tanzanian Shilling</td>
<td>TZS</td>
</tr>
<tr>
<td>Thai Baht</td>
<td>THB</td>
</tr>
<tr>
<td>Tonga Isl Pa’anga</td>
<td>TOP</td>
</tr>
<tr>
<td>Trinidad Dollar</td>
<td>TTD</td>
</tr>
<tr>
<td>Tunisian Dinar</td>
<td>TND</td>
</tr>
<tr>
<td>Turkish Lira</td>
<td>TRL</td>
</tr>
<tr>
<td>Ugandan Shilling</td>
<td>UGX</td>
</tr>
<tr>
<td>Ukraine Hryvnia</td>
<td>UAH</td>
</tr>
<tr>
<td>United Arab Emirates Dirham</td>
<td>AED</td>
</tr>
<tr>
<td>US Dollar</td>
<td>USD</td>
</tr>
<tr>
<td>Vanuatu Vatu</td>
<td>VUV</td>
</tr>
<tr>
<td>Venezuelan Bolivar</td>
<td>VEB</td>
</tr>
<tr>
<td>Vietnam Dong</td>
<td>VND</td>
</tr>
<tr>
<td>Western Samoa Tala</td>
<td>WST</td>
</tr>
<tr>
<td>Zambia Kwacha</td>
<td>ZMK</td>
</tr>
<tr>
<td>Zimbabwean Dollar</td>
<td>ZWD</td>
</tr>
</tbody>
</table>
<h2>Die Format-Codes</h2>
<p>F&#252;r den Parameter der Formate-Codes (”f”) stehen eine ganze Reihe akzeptierter Format-Tags zur Verf&#252;gung. Viele sind dabei wohl redundant und werden hier einfach zusammengefasst (z.B. “a” und “b2″ f&#252;r Anfrage-Kurs). Die folgende Tabelle listet alle bekannten Codes auf.</p>
<p><strong>Achtung: </strong>In einigen F&#228;llen liefert Yahoo!Finance mehrstellige Werte zur&#252;ck, die ebenfalls mit Kommas getrennt dargestellt werden. Dies ist an sich ungeschickt, da es f&#252;r Sie als Programmierer schwierig wird, die Kommas zwischen den einzelnen Werten von den Kommas in einem Wert zu unterscheiden. Hier empfehle ich, diese Parameter getrennt abzufragen.</p>
<table class="full" border="0">
<tbody>
<tr>
<th width="20%">Code</th>
<th>Bedeutung</th>
</tr>
<tr>
<td>a, a0, a4</td>
<td>Ask (sometimes) &#8211; Nicht alle Kursanfragen liefern hier einen Wert.</td>
</tr>
<tr>
<td>a3, b2</td>
<td>Ask &#8211; incl. Pre- und Post-Market Werte</td>
</tr>
<tr>
<td>a1</td>
<td>- unknown -</td>
</tr>
<tr>
<td>a2</td>
<td>Average Daily Volume</td>
</tr>
<tr>
<td valign="top">a5</td>
<td valign="top">Ask Size</p>
<p><strong>Achtung:</strong> hier wird der Wert unter Umst&#228;nden in Zahlengruppen, getrennt durch ein Komma zur&#252;ckgeliefert! Die Anzahl der durch Komma getrennten Gruppen variiert.</td>
</tr>
<tr>
<td>b, b0</td>
<td>Bid (sometimes) &#8211; Nicht alle Kursanfragen liefern hier einen Wert.</td>
</tr>
<tr>
<td>b1, b3</td>
<td>Bid &#8211; incl. Pre- und Post-Market Werte</td>
</tr>
<tr>
<td>b4</td>
<td>Book Value</td>
</tr>
<tr>
<td valign="top">b6</td>
<td valign="top">Bid Size</p>
<p><strong>Achtung:</strong> hier wird der Wert unter Umst&#228;nden in Zahlengruppen, getrennt durch ein Komma zur&#252;ckgeliefert! Die Anzahl der durch Komma getrennten Gruppen variiert.</td>
</tr>
<tr>
<td>c, c2, q1</td>
<td>Change &amp; Percent Change</td>
</tr>
<tr>
<td>c1, c0, c6, c7</td>
<td>Change</td>
</tr>
<tr>
<td>c3</td>
<td>Commission</td>
</tr>
<tr>
<td>c4</td>
<td>Currency</td>
</tr>
<tr>
<td>c5</td>
<td>- unknown -</td>
</tr>
<tr>
<td valign="top">c8</td>
<td valign="top">After Hours Change</td>
</tr>
<tr>
<td valign="top">d, d0</td>
<td valign="top">Dividend/Share</td>
</tr>
<tr>
<td valign="top">d1</td>
<td valign="top">Last Trade Date</td>
</tr>
<tr>
<td valign="top">d2</td>
<td valign="top">Trade Date</td>
</tr>
<tr>
<td>d3</td>
<td>Last Trade Date (text)</td>
</tr>
<tr>
<td valign="top">e, e0</td>
<td valign="top">Earnings/Share</td>
</tr>
<tr>
<td valign="top">e1</td>
<td valign="top">Error Indication (returned for symbol changed / invalid)</td>
</tr>
<tr>
<td>e2</td>
<td>Verfallsdatum bei Optionsscheinen</td>
</tr>
<tr>
<td>e3</td>
<td>- unknown -</td>
</tr>
<tr>
<td>e4</td>
<td>- unknown -</td>
</tr>
<tr>
<td valign="top">e7</td>
<td valign="top">EPS Estimate Current Year</td>
</tr>
<tr>
<td valign="top">e8</td>
<td valign="top">EPS Estimate Next Year</td>
</tr>
<tr>
<td valign="top">e9</td>
<td valign="top">EPS Estimate Next Quarter</td>
</tr>
<tr>
<td>f, f0, f1, f2, f3, f4, f5, g2</td>
<td><em>- HTML Fragment mit Company name, market place und Trade Link -</em></td>
</tr>
<tr>
<td valign="top">f6</td>
<td valign="top">Float Shares</p>
<p><strong>Achtung:</strong> hier wird der Wert unter Umst&#228;nden in Zahlengruppen, getrennt durch ein Komma zur&#252;ckgeliefert! Die Anzahl der durch Komma getrennten Gruppen variiert.</td>
</tr>
<tr>
<td valign="top">f7, f8,</td>
<td valign="top"><em>- HTML Fragment mit Trade-Link -</em></td>
</tr>
<tr>
<td valign="top">g, g0</td>
<td valign="top">Day&#8217;s Low</td>
</tr>
<tr>
<td valign="top">g1</td>
<td valign="top">Holdings Gain Percent</td>
</tr>
<tr>
<td valign="top">g3</td>
<td valign="top">Annualized Gain</td>
</tr>
<tr>
<td valign="top">g4, g6</td>
<td valign="top">Holdings Gain</td>
</tr>
<tr>
<td valign="top">g5</td>
<td valign="top">Holdings Gain Percent</td>
</tr>
<tr>
<td valign="top">h, h0</td>
<td valign="top">Day&#8217;s High</td>
</tr>
<tr>
<td valign="top">h1, h2, h3, h4, h5, h6</td>
<td valign="top"><em>- HTML Fragment -</em></td>
</tr>
<tr>
<td valign="top">i, i0</td>
<td valign="top">More Info</td>
</tr>
<tr>
<td>i2</td>
<td>- unknown -</td>
</tr>
<tr>
<td>i3</td>
<td>- unknown -</td>
</tr>
<tr>
<td>i4</td>
<td>- unknown -</td>
</tr>
<tr>
<td valign="top">i5</td>
<td valign="top">Order Book</td>
</tr>
<tr>
<td>i6</td>
<td>- unknown -</td>
</tr>
<tr>
<td valign="top">i7, l1, l7, l9, q2, v2, y2</td>
<td valign="top">Last Trade (price only)</td>
</tr>
<tr>
<td valign="top">j, j0</td>
<td valign="top">52-week Low</td>
</tr>
<tr>
<td valign="top">j1</td>
<td valign="top">Market Capitalization</td>
</tr>
<tr>
<td valign="top">j2</td>
<td valign="top">Shares Outstanding</p>
<p><strong>Achtung:</strong> hier wird der Wert unter Umst&#228;nden in Zahlengruppen, getrennt durch ein Komma zur&#252;ckgeliefert! Die Anzahl der durch Komma getrennten Gruppen variiert.</td>
</tr>
<tr>
<td valign="top">j3</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">j4</td>
<td valign="top">EBITDA</td>
</tr>
<tr>
<td valign="top">j5</td>
<td valign="top">Change From 52-week Low</td>
</tr>
<tr>
<td valign="top">j6</td>
<td valign="top">Percent Change From 52-week Low</td>
</tr>
<tr>
<td valign="top">k, k0</td>
<td valign="top">52-week High</td>
</tr>
<tr>
<td valign="top">k1</td>
<td valign="top">Last Trade (with -unknown-)</td>
</tr>
<tr>
<td valign="top">k2</td>
<td valign="top">Change Percent (with -unknown-)</td>
</tr>
<tr>
<td valign="top">k3</td>
<td valign="top">Last Trade Size</p>
<p><strong>Achtung:</strong> hier wird der Wert unter Umst&#228;nden in Zahlengruppen, getrennt durch ein Komma zur&#252;ckgeliefert! Die Anzahl der durch Komma getrennten Gruppen variiert.</td>
</tr>
<tr>
<td valign="top">k4</td>
<td valign="top">Change From 52-week High</td>
</tr>
<tr>
<td valign="top">k5</td>
<td valign="top">Percebt Change From 52-week High</td>
</tr>
<tr>
<td valign="top">l, l0, n1, n5, y1</td>
<td valign="top">Last Trade (with Date)</td>
</tr>
<tr>
<td valign="top">l2</td>
<td valign="top">High Limit</td>
</tr>
<tr>
<td valign="top">l3</td>
<td valign="top">Low Limit</td>
</tr>
<tr>
<td valign="top">l4</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">l5</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">l6</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">m, m0</td>
<td valign="top">Day&#8217;s Range</td>
</tr>
<tr>
<td valign="top">m1</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">m2</td>
<td valign="top">- unknown &#8211; (Day?) Range</td>
</tr>
<tr>
<td valign="top">m3</td>
<td valign="top">50-day Moving Average</td>
</tr>
<tr>
<td valign="top">m4</td>
<td valign="top">200-day Moving Average</td>
</tr>
<tr>
<td valign="top">m5</td>
<td valign="top">Change From 200-day Moving Average</td>
</tr>
<tr>
<td valign="top">m6</td>
<td valign="top">Percent Change From 200-day Moving Average</td>
</tr>
<tr>
<td valign="top">m7</td>
<td valign="top">Change From 50-day Moving Average</td>
</tr>
<tr>
<td valign="top">m8</td>
<td valign="top">Percent Change From 50-day Moving Average</td>
</tr>
<tr>
<td valign="top">n, n0</td>
<td valign="top">Name</td>
</tr>
<tr>
<td valign="top">n2</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">n3</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">n4</td>
<td valign="top">Notes</td>
</tr>
<tr>
<td valign="top">n6</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">n7</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">n8</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">n9</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">o, o0</td>
<td valign="top">Open</td>
</tr>
<tr>
<td valign="top">o1, o2</td>
<td valign="top">Open Interest bei Optionsscheinen</td>
</tr>
<tr>
<td valign="top">o4</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">o5</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">p, p0, p8</td>
<td valign="top">Previous Close</td>
</tr>
<tr>
<td valign="top">p1</td>
<td valign="top">Price Paid</td>
</tr>
<tr>
<td valign="top">p2,  p4</td>
<td valign="top">Change in Percent</td>
</tr>
<tr>
<td valign="top">p3</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">p5, p9</td>
<td valign="top">Price/Sales</td>
</tr>
<tr>
<td valign="top">p6</td>
<td valign="top">Price/Book</td>
</tr>
<tr>
<td valign="top">q, q0</td>
<td valign="top">Ex-Dividend Date</td>
</tr>
<tr>
<td valign="top">q3</td>
<td valign="top"><em>- HTML Fragment f&#252;r Zeitraumauswahl -</em></td>
</tr>
<tr>
<td valign="top">q4</td>
<td valign="top"><em>- HTML Fragment f&#252;r Auswahl des Grafentyps -</em></td>
</tr>
<tr>
<td valign="top">q5</td>
<td valign="top"><em>- HTML Fragment f&#252;r Auswahl der Skalierung -</em></td>
</tr>
<tr>
<td valign="top">q6</td>
<td valign="top"><em>- HTML Fragment f&#252;r Auswahl der Chart-Gr&#246;&#223;e -</em></td>
</tr>
<tr>
<td valign="top">q7</td>
<td valign="top"><em>- HTML Fragment f&#252;r Auswahl des Moving Avg. -</em></td>
</tr>
<tr>
<td valign="top">q8</td>
<td valign="top"><em>- HTML Fragment f&#252;r Auswahl des EMA -</em></td>
</tr>
<tr>
<td valign="top">q9</td>
<td valign="top"><em>- HTML Fragment f&#252;r Vergleichs-Formular -</em></td>
</tr>
<tr>
<td valign="top">r, r0</td>
<td valign="top">P/E Ratio</td>
</tr>
<tr>
<td valign="top">r1</td>
<td valign="top">Dividend Pay Date</td>
</tr>
<tr>
<td valign="top">r2</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">r3</td>
<td valign="top"><em>- HTML Fragment f&#252;r Auswahl der Indikatoren -</em></td>
</tr>
<tr>
<td valign="top">r4</td>
<td valign="top"><em>- HTML Fragment f&#252;r Auswahl der Overlays -</em></td>
</tr>
<tr>
<td valign="top">r5</td>
<td valign="top">PEG Ratio</td>
</tr>
<tr>
<td valign="top">r6</td>
<td valign="top">Price/EPS Estimate Current Year</td>
</tr>
<tr>
<td valign="top">r7</td>
<td valign="top">Price/EPS Estimate Next Year</td>
</tr>
<tr>
<td valign="top">r9</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">s, s0, s2, s4</td>
<td valign="top">Symbol</td>
</tr>
<tr>
<td valign="top">s1</td>
<td valign="top">Shares Owned</td>
</tr>
<tr>
<td valign="top">s3</td>
<td valign="top">Bezugspreis bei Optionsscheinen</td>
</tr>
<tr>
<td valign="top">s6</td>
<td valign="top">Revenue ?</td>
</tr>
<tr>
<td valign="top">s7</td>
<td valign="top">Short Ratio</td>
</tr>
<tr>
<td valign="top">t, t0, t2, u, u0, u2, u3</td>
<td valign="top"><em>- HTML Fragment f&#252;r ein Chart-Bild -</em></td>
</tr>
<tr>
<td valign="top">t1</td>
<td valign="top">Last Trade Time</td>
</tr>
<tr>
<td valign="top">t3</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">t4</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">t5</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">t6</td>
<td valign="top"><em>- HTML Fragment mit Trade-Link -</em></td>
</tr>
<tr>
<td valign="top">t7</td>
<td valign="top">Ticker Trend</td>
</tr>
<tr>
<td valign="top">t8</td>
<td valign="top">1 yr Target Price</td>
</tr>
<tr>
<td valign="top">v, v0, v6</td>
<td valign="top">Volume</td>
</tr>
<tr>
<td valign="top">v3</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">v4</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">v5</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">v1</td>
<td valign="top">Holdings Value</td>
</tr>
<tr>
<td valign="top">v7</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">w, w0</td>
<td valign="top">52-week Range</td>
</tr>
<tr>
<td valign="top">w1</td>
<td valign="top">Day&#8217;s Value Change</td>
</tr>
<tr>
<td valign="top">w4</td>
<td valign="top">- unknown -</td>
</tr>
<tr>
<td valign="top">x, x0</td>
<td valign="top">Stock Exchange</td>
</tr>
<tr>
<td valign="top">y, y0</td>
<td valign="top">Dividend Yield</td>
</tr>
<tr>
<td valign="top">z2</td>
<td valign="top"><em>- HTML Fragment -</em></td>
</tr>
<tr>
<td valign="top">z3</td>
<td valign="top"><em>- liefert &#8220;Oops!&#8221; -</em></td>
</tr>
</tbody>
</table>
<p>H&#246;here Indexwerte f&#252;hren nur noch zu einer Wiederholung der Inhalte. Vermutlich sollen die Codes zweistellig sein (Buchstabe + Zahl). F&#228;llt die Zahl weg, so wir automatisch der Index 0 angenommen.</p>
<h2>Daytrading-Daten</h2>
<p>Leider bietet Yahoo!Finance nur die letzten 100 Tages-Kurswerte zum Ermittlungszeitpunkt an. Auch hier wirkt die Verz&#246;gerung von 15-60 Minuten, wie im Abschnitt &#8220;Aktuelle Kursdaten&#8221; beschrieben.  Die Serviceadresse f&#252;r die Daytrading-Daten lautet <code>http://logtrade.finance.vip.ukl.yahoo.com/lastTrades?</code> und nimmt folgende drei bekannte Parameter entgegen:</p>
<table class="full" border="0">
<tbody>
<tr>
<th>Parameter</th>
<th>Beschreibung</th>
</tr>
<tr>
<td>s=</td>
<td>Das <strong>Symbol</strong> des Wertpapiers wird mit dem Parameter &#8220;s&#8221; angegeben. Z.B. liefert hier &#8220;<code>s=AAPL</code>&#8221; die letzten 100 Daytrading-Daten von Apple Inc.</td>
</tr>
<tr>
<td>output=user</td>
<td>Der Sinn dieses Parameters ist leider noch nicht bekannt. F&#252;r weitere Hinweise bin ich sehr dankbar.</td>
</tr>
<tr>
<td>i=eu</td>
<td>Auch hier ist mir der Sinn des Parameters noch nicht bekannt.</td>
</tr>
</tbody>
</table>
<p>Das Ergebnis einer solchen Abfrage liefert eine Liste mit Wertegruppen &#8211; eine Gruppe f&#252;r jeden Trade. Ein solches Tupel enth&#228;lt den Trading-Zeitpunkt, den Kurswert und die Volumina des Trades.</p>
<h2>Historische Kursdaten</h2>
<p>F&#252;r ein Wertpapier stehen bei Yahoo ebenfalls historische Daten zur Verf&#252;gung. Die Service-URL hierf&#252;r lautet <code>http://ichart.finance.yahoo.com/table.csv?</code> und besitzt Parameter f&#252;r das Symbol, sowie f&#252;r das Zeitintervall, innerhalb ein Entwickler die t&#228;glichen bzw. w&#246;chentlichen Kursdaten ermitteln will:</p>
<table class="full" border="0">
<tbody>
<tr>
<th>Parameter</th>
<th>Beschreibung</th>
</tr>
<tr>
<td>a=</td>
<td>Start-Monat -1 (Januar ist hier der Wert &#8220;0&#8243;)</td>
</tr>
<tr>
<td>b=</td>
<td>Start-Tag</td>
</tr>
<tr>
<td>c=</td>
<td>Start-Jahr</td>
</tr>
<tr>
<td>d=</td>
<td>End-Monat -1 (Januar ist hier der Wert &#8220;0&#8243;)</td>
</tr>
<tr>
<td>e=</td>
<td>End-Tag</td>
</tr>
<tr>
<td>f =</td>
<td>End-Jahr</td>
</tr>
<tr>
<td>g=</td>
<td>Chart-Abstufung (d=t&#228;gliche Werte, w=w&#246;chentliche Werte, m=monatliche Werte, v=Dividendenaussch&#252;ttungen)</td>
</tr>
<tr>
<td>s=</td>
<td>Symbol des Aktienkurses</td>
</tr>
<tr>
<td>ignore=.cvs</td>
<td>(konstanter Wert, aber optional)</td>
</tr>
<tr>
<td valign="top">y=</td>
<td valign="top">Verschiebung um eine angegebene Anzahl an Tagen/Wochen/Monaten. Macht eigentlich keinen Sinn, da oben bereits ein Intervall angegeben wurde. Trotzdem unterscheiden sich z.B. die Volumen-Werte eines Monats (g=m), wenn hier eine Verschiebung Y&gt;0 angegeben wird. F&#252;r weitere Hinweise bin ich hier dankbar!</td>
</tr>
</tbody>
</table>
<p>Das Ergebnis besteht aus einer Liste t&#228;glicher, w&#246;chentlicher oder monatlicher Werte zu dem &#252;bermittelten Zeitraum. Die erste Zeile enth&#228;lt die &#220;berschrift der einzelnen Spaltenwerte. In allen weiteren Zeilen liefert Yahoo!Finance danach das Datum, den Er&#246;ffnungskurs, den h&#246;chsten und tiefsten Kurswert, sowie den Tagesschlusskurs und das Handelsvolumen f&#252;r jeden einzelnen Tag. Da diese Werte gegen&#252;ber Splits und Dividenden unbereinigt sind, liefert Yahoo! in der letzten Spalte &#8220;Adj. Close&#8221; noch bereinigte Schlusskurse. Ein bisschen anders sieht das Ergebnis aus, wenn als Chart-Abstufung der Wert &#8220;v&#8221; f&#252;r die Dividendenaussch&#252;ttungen angegeben wird. Dann werden nur noch zwei Spalten mit einem Datum sowie dem Wert selbst zur&#252;ckgeliefert. Hier noch zwei Beispiele mit den ersten paar Zeilen der Ergebnisse:</p>
<pre>http://ichart.finance.yahoo.com/table.csv?s=AAPL&amp;d=3&amp;e=3&amp;f=2008&amp;g=d&amp;a=8&amp;b=7&amp;c=1984&amp;ignore=.cvs
---
Date,Open,High,Low,Close,Volume,Adj Close
2008-04-02,148.78,151.20,145.85,147.49,37253700,147.49
2008-04-01,146.30,149.66,143.61,149.53,36846400,149.53
2008-03-31,143.27,145.71,142.52,143.50,27418300,143.50
2008-03-28,141.80,144.65,141.60,143.01,25521800,143.01
...</pre>
<pre>http://itable.finance.yahoo.com/table.csv?s=AAPL&amp;d=3&amp;e=3&amp;f=2008&amp;g=v&amp;a=8&amp;b=7&amp;c=1984&amp;ignore=.cvs
---
Date,Dividends
1995-11-21,0.030000
1995-08-16,0.030000
1995-05-26,0.030000
...</pre>
<p>F&#252;r die programmatische Auswertung dieser Daten bietet sich auch hier das Array als Ergebnistr&#228;ger an. In jeder Zeile k&#246;nnen so die Werte eines Tages (bzw. einer Woche, eines Monats oder der Dividenden) abgelegt werden. Folgende PHP-Funktion soll dies verdeutlichen:</p>
<pre>&lt;?php
    /*
     * Getting historical quotes in a given time period
     * Parameters:
     * $symbol:                             symbol
     * $startDay, $startMonth, $startYear:  the first day for the historical quotes
     * $endDay, $endMonth, $endYear:        the last day for the historical quotes
     * $step  (d/w/m/v):                    d=daily, w=weekly, m=monthly, v=dividends
     *
     * (c) Matthias Brusdeylins, 2008
     * License: CC-GNU GPL (http://creativecommons.org/licenses/GPL/2.0/)
     */
    define ("HISTORY_QUOTES_URL", "http://ichart.yahoo.com/table.csv?");
    function loadHistoricalYahooQuotes ($symbol,
                                        $startDay,
                                        $startMonth,
                                        $startYear,
                                        $endDay,
                                        $endMonth,
                                        $endYear,
                                        $step)
    {
        $lineCount = 0;
        $days = array();

        // modify parameters
        $sM=$startMonth-1;
        $eM=$endMonth-1;

        // load the historical stock quotes: we are opening it for reading
        // http://ichart.yahoo.com/table.csv?s=  SYMBOL.COUNTRY  &amp;a,b,c START $d,e,f ENDE $g d=daily/w=weekly/m=monthly/v=dividends
        $URL = HISTORY_QUOTES_URL."s=$symbol&amp;a=$sM&amp;b=$startDay&amp;c=$startYear&amp;d=$eM&amp;e=$endDay&amp;f=$endYear&amp;g=$step&amp;y=0&amp;ignore=.cvs";
        $fileHandle = fopen ($URL,"r");

        if ($fileHandle) {
            // use the fgetcsv function to store quote values into a array $lineValues
            // store one symbol in one line
            do {
                $stockValues = fgetcsv ($fileHandle, 999999, ",");
                if ($stockValues) {
                    $lineCount++;
                    $days[$lineCount] = $stockValues;
                }
            } while ($stockValues);

            // close handle
            fclose ($fileHandle);
        } else {
            $days[0][0] = "ERROR";
            $days[0][1] = "No data found.";
        }        

        return $days;
    }
?&gt;</pre>
<h2>L&#228;nderunterschiede</h2>
<p>An der B&#246;rse werden nicht nur Aktien in unterschiedlichen W&#228;hrungen gehandelt, sondern auch Nebenwerte wie beispielsweise Optionsscheine. Der Handel solcher Wertpapiere ist meist auf ein Land bzw. B&#246;rsenplatz beschr&#228;nkt. Aus diesem Grund bietet Yashoo!Finance auch unterschiedliche Serviceadressen an. In diesem Artikel wurden bisher nur die Adressen f&#252;r US-B&#246;rsendaten aufgezeigt. So kann unter der URL <code>http://finance.yahoo.com/d/quotes.csv?</code> der aktuelle Kurs einer Aktie in US-Dollars ermittelt werden. Wollen Sie hingegen einen Kurs aus dem deutschen Raum ermitteln, steht Ihnen die URL <code>http://<strong>de</strong>.finance.yahoo.com/d/quotes.csv?</code> zur Verf&#252;gung.</p>
<p>Die folgende Tabelle zeigt die Adressen (URL) zum Yahoo!Finance-Service f&#252;r aktuelle B&#246;rsenkurse. In der ersten Spalte werden auch die Symbol-Suffixe aufgelistet, welche f&#252;r eine aktive B&#246;rsenplatz-Wahl an die Symbolangabe geh&#228;ngt werden k&#246;nnen (z.B. &#8220;<code>AAPL.DE</code>&#8221; f&#252;r den XETRA-Kurs des Apple-Aktie). Ein Besuch auf die Webseite von Yahoo! Finance hilft hier bei der Auswahl der richtigen Symbolbezeichnung.</p>
<table class="full" border="0">
<tbody>
<tr>
<th>Land &amp; Suffix</th>
<th>URLs</th>
</tr>
<tr>
<td class="left">Argentinien</p>
<p>.BA (Buenos Aires)</td>
<td><code>http://finance.yahoo.com/d/quotes.csv?</p>
<p>http://ar.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Australien</p>
<p>.AX (Australia)</td>
<td><code>http://au.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Belgien</p>
<p>.BR (Brussels)</td>
<td><code>http://finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Brasilien</p>
<p>.SA (São Paulo)</td>
<td><code>http://finance.yahoo.com/d/quotes.csv?</p>
<p></code><code>http://br.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>D&#228;nemark</p>
<p>.CO (Copenhagen)</td>
<td><code>http://finance.yahoo.com/d/quotes.csv?</p>
<p>http://dk.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Deutschland</p>
<p>.BE (Berlin-Bremen)</p>
<p>.DU (D&#252;sseldorf)</p>
<p>.F (Frankfurt)</p>
<p>.HM (Hamburg)</p>
<p>.HA (Hanover)</p>
<p>.MU (M&#252;nchen)</p>
<p>.SG (Stuttgart)</p>
<p>.DE (XETRA)</td>
<td><code>http://de.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>China</p>
<p>.SS (Shanghai)</p>
<p>.SZ (Shenzhen)</td>
<td><code>http://finance.yahoo.com/d/quotes.csv?</p>
<p>http://cn.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>England</p>
<p>.L (London)</td>
<td><code>http://uk.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Frankreich</p>
<p>.PA (Paris)</td>
<td><code>http://finance.yahoo.com/d/quotes.csv?</p>
<p>http://fr.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Hong Kong</p>
<p>.HK (Hong Kong)</td>
<td><code>http://hk.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Indien</p>
<p>.BO (Bombay)</p>
<p>.NS (Nationale B&#246;rse Indien)</td>
<td><code>http://in.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Indonesien</p>
<p>.JK (Jakarta)</td>
<td><code>http://sg.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Irland</p>
<p>.IR (Irish)</td>
<td><code>http://uk.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Israel</p>
<p>.TA (Tel Aviv)</td>
<td><code>http://finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Italien</p>
<p>.MI (Milano)</td>
<td><code>http://finance.yahoo.com/d/quotes.csv?</p>
<p>http://it.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td class="left">Kanada</p>
<p>.TO (Toronto)</p>
<p>.V (TSX Venture Exchange)</td>
<td><code>http://ca.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Korea (S&#252;d)</p>
<p>.KS (Korea)</p>
<p>.KQ (KOSDAQ)</td>
<td><code>http://kr.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td class="left">Malaysien</p>
<p>.KL (Kuala Lumpur) ?</td>
<td><code>http://sg.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Mexico</p>
<p>.MX (Mexico)</td>
<td><code>http://finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Neu Seeland</p>
<p>.NZ (New Zealand)</td>
<td><code>http://au.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Niederlande</p>
<p>.AS (Amsterdam)</td>
<td><code>http://finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Norwegen</p>
<p>.OL (Oslo)</td>
<td><code>http://finance.yahoo.com/d/quotes.csv?</p>
<p>http://no.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>&#214;sterreich</p>
<p>.VI (Vienna)</td>
<td><code>http://finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Pakistan</p>
<p>.KA (Karachi) ?</td>
<td><code>http://finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Portugal</p>
<p>.LS (Lissabon)</td>
<td><code>http://finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Schweden</p>
<p>.ST (Stockholm)</td>
<td><code>http://finance.yahoo.com/d/quotes.csv?</p>
<p>http://se.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Schweiz</p>
<p>.SW (Swiss)</p>
<p>.VX (Virt-X)</td>
<td><code>http://finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Singapore</p>
<p>.SI (Singapore)</td>
<td><code>http://sg.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td class="left">Spanien</p>
<p>.BC (Barcelona)</p>
<p>.BI (Bilbao)</p>
<p>.MF (Madrid Fixed Income Market)</p>
<p>.MC (Madrid SE C.A.T.S.)</p>
<p>.MA (Madrid)</td>
<td><code>http://es.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Taiwan</p>
<p>.TWO (OTC B&#246;rse Taiwan)</p>
<p>.TW (Taiwan)</td>
<td><code>http://sg.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td>Thailand</p>
<p>.BK (Bangkok)</td>
<td><code>http://sg.finance.yahoo.com/d/quotes.csv?</code></td>
</tr>
<tr>
<td class="left">USA</p>
<p>kein Suffix f&#252;r AMEX, NASDAQ und NYSE</p>
<p>.OB (OTC Bulletin Board Market)</p>
<p>.PK (Pink Sheets)</td>
<td><code>http://finance.yahoo.com/d/quotes.csv?</p>
<p></code></td>
</tr>
</tbody>
</table>
<h2>Download</h2>
<p>Die Klasse <code>Finance_API_Yahoo</code> bietet einen einfachen Zugriff auf die hier beschriebene Schnittstelle. Mit ihr lassen sich aktuelle, sowie historische Kursdaten ermitteln. Das Ergebnis wird in einem zweidimensionalen Array zur&#252;ckgeliefert (siehe Beispiele im Text). F&#252;r die Package-Struktur diente das <a href="http://framework.zend.com/" target="_blank">Zend-Framework</a> als Vorlage. Somit ist eine einfache Integration in dieses gew&#228;hrleistet.</p>
<p><a href="http://www.brusdeylins.info/content/projects/yahoo/YahooFinanceAPI_1.0.zip" target="_blank">Yahoo! Finance API, Version 1.0</a></p>
<h3>Change-Log</h3>
<table class="changelog" border="0">
<tbody>
<tr>
<td class="left">0.5</td>
<td>31.03.2008 &#8211; First release</td>
</tr>
<tr>
<td class="left">0.6</td>
<td>06.04.2008 &#8211; Function code list completed</td>
</tr>
<tr>
<td valign="top">1.0</td>
<td valign="top">04.05.2008 &#8211; Zend-Framework package structure integrated</td>
</tr>
</tbody>
</table>
<p><a href="http://creativecommons.org/licenses/GPL/2.0/deed.de" target="_blank"></p>
<p><img src="http://creativecommons.org/images/public/cc-GPL-a.png" border="0" alt="CC-GNU GPL" /></a></p>
<p>Diese Software und die hier gezeigten Codest&#252;cke fallen unter den Lizenzvertrag <a href="http://creativecommons.org/licenses/GPL/2.0/deed.de" target="_blank">CC-GNU GPL</a>.<!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://brusdeylins.info/projects/yahoo-finance-api/feed/</wfw:commentRss>
		<slash:comments>20</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>Easy-HTML-Metadata</title>
		<link>http://brusdeylins.info/projects/easy-html-metadata/</link>
		<comments>http://brusdeylins.info/projects/easy-html-metadata/#comments</comments>
		<pubDate>Fri, 24 Aug 2007 13:10:25 +0000</pubDate>
		<dc:creator>Matthias Brusdeylins</dc:creator>
				<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projekt]]></category>

		<guid isPermaLink="false">http://www.brusdeylins.info/blog/2007/09/08/easy-html-metadata/</guid>
		<description><![CDATA[
Damit solche Metadaten f&#252;r einzelne WordPress-Beitr&#228;ge individuell angegeben werden k&#246;nnen, wird ein sogenanntes WordPress-Plugin ben&#246;tigt. Ich will hier meine kleine Erweiterung "Easy-HTML-Metadata" vorstellen. Sie reagiert auf zuvor definierte "Benutzerdefinierte Felder" eines Beitrags bzw. einer Seite und gibt dessen Inhalte als Metadaten aus.
Installation
Nach dem Herunterladen der aktuellsten Version dieses Plugins (siehe unten) muss die PHP-Datei aus [...]]]></description>
			<content:encoded><![CDATA[<p><!--:de-->
<a href="http://brusdeylins.info/media/post-images/easy-html-metadata.jpg" title="Easy-HTML-Metadata - Bildquelle: Brusdeylins.Info" rel="lightbox[singlepic14]" >
	<img class="ngg-singlepic ngg-right" src="http://brusdeylins.info/media/cache/14_web20_150x400_easy-html-metadata.jpg" alt="Easy-HTML-Metadata" title="Easy-HTML-Metadata" />
</a>
HTML-Meta-Angaben in der Form <code>&lt;meta name="key" content="value"&gt;</code> enthalten verschiedene, meist dem Leser verborgene Anweisungen f&#252;r Web-Browser und -Server sowie Suchdienste. Leider wurden Metadaten immer wieder missbraucht, um die Suchmaschinen auszutricksen, indem hier Stichw&#246;rter aufgelistet wurden, die mit dem Inhalt nichts  zu tun hatten. Man erhoffte sich so eine bessere Positionierung in der Treffermenge der Suchmaschinen. Aus diesem Grund werden diese Metadaten von namenhaften Suchdiensten nur noch schwach bewertet. Statt dessen wird nun der Inhalt analysiert als auch die Anzahl der Referenzen <em>von </em>externen Internetseiten. Trotzdem geh&#246;rt zu einer gut gestalteten Webseite auch der sinnvolle Einsatz von Meta-Angaben zum Inhalt der aktuell angezeigten Seite, sowie die Angabe des Autors.<!--:--><span id="more-35"></span><!--:de--></p>
<p>Damit solche Metadaten f&#252;r einzelne WordPress-Beitr&#228;ge individuell angegeben werden k&#246;nnen, wird ein sogenanntes WordPress-Plugin ben&#246;tigt. Ich will hier meine kleine Erweiterung &#8220;Easy-HTML-Metadata&#8221; vorstellen. Sie reagiert auf zuvor definierte &#8220;Benutzerdefinierte Felder&#8221; eines Beitrags bzw. einer Seite und gibt dessen Inhalte als Metadaten aus.</p>
<h3>Installation</h3>
<p>Nach dem Herunterladen der aktuellsten Version dieses Plugins (siehe unten) muss die PHP-Datei aus dem Zip-File in das WordPress-Plugin-Verzeichnis (dies ist meist /wp-content/plugins/) kopiert werden. Hier kann man ggf. auch ein Unterverzeichnis anlegen, um so mehr &#220;berblick &#252;ber alle Plugins in seiner WordPress-Installation zu erlangen. Danach muss dieses Plugin in der Adminkonsole aktiviert werden.</p>
<h3>Einsatz</h3>
<p>Jetzt steht dem User unter den Einstellungen ein neuer Men&#252;punkt &#8220;HTML-Metadata&#8221; zur Verf&#252;gung, 
<a href="http://brusdeylins.info/media/post-images/easy-html-metadata-in-action.jpg" title="Easy-HTML-Metadata in Action - Bildquelle: Brusdeylins.Info" rel="lightbox[singlepic13]" >
	<img class="ngg-singlepic ngg-left" src="http://brusdeylins.info/media/cache/13_web20_150x400_easy-html-metadata-in-action.jpg" alt="Easy-HTML-Metadata in Action" title="Easy-HTML-Metadata in Action" />
</a>
 in dem die Standard-Sprache sowie die Namen der benutzerdefinierten Felder definiert werden k&#246;nnen (siehe Bild oben rechts). In der Regel bleiben die Feldnamen unver&#228;ndert. Nun kann man zu jedem Beitrag solche benutzerdefinierten Felder mit angeben. Als Schl&#252;ssel werden die zuvor definierten Namen eingesetzt, der Wert ist dann der Inhalt des zugeordneten Meta-Data-Elementes. Im Beispiel links sind die Meta-Angaben dieses Artikels (zum Zeitpunkt der Erstellung) sichtbar. Das Ergebnis der Version 1.2 im HTML-Kopf dieser hier sichtbaren Seite sieht dazu folgenderma&#223;en aus:</p>
<pre>&lt;meta name="MBEasyHTMLMetadata" content="1.0" /&gt;
&lt;meta name="language" content="de" /&gt;
&lt;meta name="content-language" content="de" /&gt;
&lt;meta name="description" content="Wordpress-Plugin f&#252;r inhaltliche HTML-Metaangaben." /&gt;
&lt;meta name="keywords" content="Wordpress, Plugin, Metadata, Metadaten, Description, Beschreibung, Keywords, Schl&#252;sselw&#246;rter" /&gt;
&lt;meta name="author" content="Matthias Brusdeylins" /&gt;
&lt;meta name="copyright" content="Copyright by Matthias Brusdeylins. Creative Commons 3.0 license - Some rights reserved." /&gt;</pre>
<p>Hier ist auch erkennbar, dass automatisch der volle Name des registrierten Autors mit ausgegeben wird. Das Plugin ben&#246;tigt keine &#196;nderungen an dem installierten WordPress-Theme.</p>
<h3>Download</h3>
<p><a href="http://www.brusdeylins.info/content/projects/ehmd/Easy_HTML_Metadata_1_2.zip" target="_blank">Easy-HTML-Metadata, Version 1.2</a></p>
<h3>Change-Log</h3>
<table class="changelog" border="0">
<tbody>
<tr>
<td class="left">1.2</td>
<td>08.09.2007 &#8211; Copyright information (if full name is defined) and Creative Commons 3.0 license added to the metadata</td>
</tr>
<tr>
<td class="left">1.1</td>
<td>02.09.2007 &#8211; Copyright information added to the admin dialog</td>
</tr>
<tr>
<td class="left">1.0</td>
<td>24.08.2007 &#8211; First release</td>
</tr>
<tr>
<td class="left"></td>
<td></td>
</tr>
</tbody>
</table>
<p><a href="http://creativecommons.org/licenses/GPL/2.0/deed.de" target="_blank"><br />
<img src="http://creativecommons.org/images/public/cc-GPL-a.png" border="0" alt="CC-GNU GPL" /></a><br />
Diese Software f&#228;llt unter den Lizenzvertrag <a href="http://www.brusdeylins.info/license/GPL-License.txt" target="_blank">CC-GNU GPL</a>.<!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://brusdeylins.info/projects/easy-html-metadata/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
