<?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>Phpmonkeys</title>
	<atom:link href="http://www.phpmonkeys.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.phpmonkeys.de</link>
	<description>Coding in PHP</description>
	<lastBuildDate>Tue, 24 Aug 2010 12:34:12 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PHP und SecondLife</title>
		<link>http://www.phpmonkeys.de/2010/08/24/php-und-secondlife/</link>
		<comments>http://www.phpmonkeys.de/2010/08/24/php-und-secondlife/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 12:34:12 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[com]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Second Life]]></category>
		<category><![CDATA[SL]]></category>
		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=615</guid>
		<description><![CDATA[Das ehemals hochgelobte virtuelle Leben in Form von Second Life &#8482; ist in der Presse inzwischen eher untergegangen, aber genau wie Asterix und Obelix gibt es immer noch eine Menge Leute, die diese Welt nutzen. Viele Neulinge nehmen am Leben im Second Life passiv Teil. Dies kann man aber auch sehr aktiv gestalten und im [...]]]></description>
			<content:encoded><![CDATA[<p>Das ehemals hochgelobte virtuelle Leben in Form von <a href="http://secondlife.com/" target="_blank">Second Life &#8482;</a> ist in der Presse inzwischen eher untergegangen, aber genau wie Asterix und Obelix gibt es immer noch eine Menge Leute, die diese Welt nutzen. Viele Neulinge nehmen am Leben im Second Life passiv Teil. Dies kann man aber auch sehr aktiv gestalten und im Gegensatz zu einem 3D-Spiel (wie bspw. einem MMORPG) kann man neue Dinge selbst erstellen. Diese Dinge möchte man manchmal aus der abgeschirmten Welt von SL ausbrechen lassen. Kommunikation über die Grenzen von Second Life heraus ist daher heute das Thema.<br />
<span id="more-615"></span></p>
<p>Als Beispiel möchten wir die Systemlast eines Servers im SecondLife Chat-Fenster ausgegeben. Hierfür benötigt man auf Serverseite ein kleines PHP Script, das die Systemlast vorformatiert zurückliefert. Dieser Code sieht bspw so aus:</p>
<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p615code3'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6153"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p615code3"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> myNF<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> <a href="http://www.php.net/number_format"><span style="color: #990000;">number_format</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$load</span> <span style="color: #339933;">=</span> sys_getloadavg<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <a href="http://www.php.net/join"><span style="color: #990000;">join</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'|'</span><span style="color: #339933;">,</span><a href="http://www.php.net/array_map"><span style="color: #990000;">array_map</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;myNF&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$load</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>
<p>Es wird die <code>sys_getloadavg</code>-Funktion benutzt, um an die Systemlast zu gelangen. Diese wird noch ordentlich formatiert und in einem String zusammengefasst, wobei das &#8220;Pipe&#8221;-Symbol als Separator dient. Auf der anderen Seite möchten wir die einzelnen Strings ja auch wieder trennen und dabei noch etwas lernen; namlich wie man ein <code>explode</code> in LSL realisiert.</p>
<p>Im SecondLife benötigt man neben einem Benutzerkonto auch einen Platz, auf dem man Objekte generieren kann. Die Rechteverwaltung lässt dies nämlich nicht überall zu. Am einfachsten nutzt man für solche Tests die dafür vorgesehenen Sandboxen, die man über die Suche von SL sehr leicht finden kann.</p>
<p>Man generiert sich hier nun ein 3D-Objekt, mit dem man anschließen das eigentliche Skript verknüpft. Das Skript, das die Anfrage an den Server stellt, ist in LSL geschrieben. LSL steht für <a href="http://wiki.secondlife.com/wiki/LSL_Portal" target="_blank">Linden Scripting Language</a> und ist die Skriptsprache, die innerhalb von SL dem Benutzer zugänglich gemacht wird.</p>
<p>Im Content des 3D-Objekts legt man nun ein neues Skript an und ersetzt den Beispielquelltext durch den folgenden Code:</p>
<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p615code4'); return false;">View Code</a> LSL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6154"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="code" id="p615code4"><pre class="lsl" style="font-family:monospace;"><a href="/index.php?title=key"><span style="color: #007700;font-weight: bold; text-decoration: none;">key</span></a>    httpd_id;
&nbsp;
<a href="/index.php?title=default"><span style="color: #0000FF;font-weight: bold; text-decoration: none;">default</span></a>
<span style="color: #66cc66;">&#123;</span>
    <a href="/index.php?title=on_rez"><span style="color: #00A0A0;font-weight: bold; text-decoration: none;">on_rez</span></a><span style="color: #66cc66;">&#40;</span><a href="/index.php?title=integer"><span style="color: #007700;font-weight: bold; text-decoration: none;">integer</span></a> param<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        <a href="/index.php?title=llResetScript"><span style="color: #A00000;font-weight: bold; text-decoration: none;">llResetScript</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <a href="/index.php?title=touch_start"><span style="color: #00A0A0;font-weight: bold; text-decoration: none;">touch_start</span></a><span style="color: #66cc66;">&#40;</span><a href="/index.php?title=integer"><span style="color: #007700;font-weight: bold; text-decoration: none;">integer</span></a> num<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        <a href="/index.php?title=if"><span style="color: #0000FF;font-weight: bold; text-decoration: none;">if</span></a><span style="color: #66cc66;">&#40;</span><a href="/index.php?title=llDetectedKey"><span style="color: #A00000;font-weight: bold; text-decoration: none;">llDetectedKey</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">==</span><a href="/index.php?title=llGetOwner"><span style="color: #A00000;font-weight: bold; text-decoration: none;">llGetOwner</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#123;</span>
            <span style="color: #FF7700;">// URL anpassen !</span>
            httpd_id <span style="color: #66cc66;">=</span> <a href="/index.php?title=llHTTPRequest"><span style="color: #A00000;font-weight: bold; text-decoration: none;">llHTTPRequest</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #00A000;">&quot;http://www.example.de/test.php&quot;</span>,<span style="color: #66cc66;">&#91;</span><a href="/index.php?title=Special:Search&go=Go&search=HTTP_METHOD"><span style="color: #0000A0;font-weight: bold; text-decoration: none;">HTTP_METHOD</span></a>,<span style="color: #00A000;">&quot;GET&quot;</span><span style="color: #66cc66;">&#93;</span>,<span style="color: #00A000;">&quot;&quot;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <a href="/index.php?title=http_response"><span style="color: #00A0A0;font-weight: bold; text-decoration: none;">http_response</span></a><span style="color: #66cc66;">&#40;</span><a href="/index.php?title=key"><span style="color: #007700;font-weight: bold; text-decoration: none;">key</span></a> id, <a href="/index.php?title=integer"><span style="color: #007700;font-weight: bold; text-decoration: none;">integer</span></a> status, <a href="/index.php?title=list"><span style="color: #007700;font-weight: bold; text-decoration: none;">list</span></a> metadata, <a href="/index.php?title=string"><span style="color: #007700;font-weight: bold; text-decoration: none;">string</span></a> body<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        <a href="/index.php?title=if"><span style="color: #0000FF;font-weight: bold; text-decoration: none;">if</span></a> <span style="color: #66cc66;">&#40;</span> id <span style="color: #66cc66;">==</span> httpd_id <span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#123;</span>
            <a href="/index.php?title=list"><span style="color: #007700;font-weight: bold; text-decoration: none;">list</span></a> myList <span style="color: #66cc66;">=</span> <a href="/index.php?title=llParseString2List"><span style="color: #A00000;font-weight: bold; text-decoration: none;">llParseString2List</span></a><span style="color: #66cc66;">&#40;</span>body,<span style="color: #66cc66;">&#91;</span><span style="color: #00A000;">&quot;|&quot;</span><span style="color: #66cc66;">&#93;</span>,<span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
            <a href="/index.php?title=integer"><span style="color: #007700;font-weight: bold; text-decoration: none;">integer</span></a> i <span style="color: #66cc66;">=</span> <a href="/index.php?title=llGetListLength"><span style="color: #A00000;font-weight: bold; text-decoration: none;">llGetListLength</span></a><span style="color: #66cc66;">&#40;</span>myList<span style="color: #66cc66;">&#41;</span>;
            <a href="/index.php?title=integer"><span style="color: #007700;font-weight: bold; text-decoration: none;">integer</span></a> j <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span>;
            <a href="/index.php?title=for"><span style="color: #0000FF;font-weight: bold; text-decoration: none;">for</span></a><span style="color: #66cc66;">&#40;</span>; i<span style="color: #66cc66;">&gt;</span><span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&amp;&amp;</span> j<span style="color: #66cc66;">&lt;</span>i;j<span style="color: #66cc66;">++</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                <a href="/index.php?title=llSay"><span style="color: #A00000;font-weight: bold; text-decoration: none;">llSay</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span>,<a href="/index.php?title=llList2String"><span style="color: #A00000;font-weight: bold; text-decoration: none;">llList2String</span></a><span style="color: #66cc66;">&#40;</span>myList,j<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
            <span style="color: #66cc66;">&#125;</span>
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>
<p>Sobald dieser Code gespeichert wurde, wird durch Berühren des Objekt die Systemlast im Chat in 3 Zeilen ausgegeben. Zu beachten ist hierbei, dass nur der Besitzer des Objekts diese Aktion anstoßen kann. Somit ist in gewissem Maß ein Mißbrauch ausgeschlossen. </p>
<p>Im <code>default</code>-Block kann man 3 Eventhandler sehen <code>on_rez</code>, <code>touch_start</code> und <code>http_response</code>. </p>
<p><code>on_rez</code>:<br />
In diesem Handler wird das aktuelle Skript zurückgesetzt. Der Status des Skripts wird auf default gesetzt und die EventQueue geleert. Variablen werden auch neu initialisiert. Das <code>on_rez</code> Event wird beim Ablegen eines Objekts auf dem Boden gefeuert. Somit wird hier sichergestellt, dass man von einem wohldefinierten Zustand des Objekts ausgehen kann, wenn man es neu benutzen möchte.</p>
<p><code>touch_start</code>:<br />
Dieses Event wird gefeuert, wenn ein Avatar ein Objekt berührt. Genauer, wenn er damit beginnt es zu berühren. Im Gegensatz dazu steht touch_stop, was gefeurt wird, wenn der Avatar das Berühren beendet. Dazwischen wird beliebig oft das touch-Event gefeuert, dass besagt, dass ein Avatar das Objekt gerade berührt. Ein Avatar kann ein Objekt in SecondLife längere Zeit berühren, daher werden diese 3 Events notwendig. Im Beispiel-Skript wird auf das touch_start reagiert und in unserem Fall ein http-Request ausgeführt, der ein Beispielskript auf einem entfernten Webserver aufruft und dies per HTTP-GET erledigt.</p>
<p><code>http_response</code>:<br />
In diesem Handler erledigen wir endlich etwas mehr und können an LSL und dessen Funktionsumfang etwas mehr kratzen. Zuerst wird der String, der im http-Body zu finden ist, in eine Liste konvertiert, wobei das &#8220;Pipe&#8221;-Symbol als Separator identifiziert wird. Somit haben wir nun eine Liste mit den einzelnen Systemlast-Werten.<br />
Anschließend laufen wir in einer For-Schleife über dieses Liste, wandeln die einzelnen Listenelemente in Strings (llList2String) um und schreiben diese in den Chat (llSay).</p>
<p>Wichtig zu wissen ist, dass Skripte einen Größenlimitierung haben, die im kompilierten Zustand greift. Diese liegt aktuell bei 64kb. </p>
<p>Man kann sich nun vorstellen, dass man ein PHP-Skript nutzen kann, um an weitere Informationen zu kommen oder um Informationen zu speichern. Sehr vorteilhaft ist dabei, dass man ein Webinterface erstellen kann, um diese Daten zu verwalten. Bspw. bei einem Lizenz-System. Ein externes System ist im Übrigen die einzige Möglichkeit um größere Datenmengen (mehr als 255 Zeichen) permanent zu speichern.</p>
<p>Zum Schluß dieses Beitrags noch einen Dank an Peter, der mich zu diesem Beitrag motiviert und mit seiner SL-Expertise unterstützt hat.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2010/08/24/php-und-secondlife/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Das Iterator-Interface</title>
		<link>http://www.phpmonkeys.de/2010/08/17/das-iterator-interface/</link>
		<comments>http://www.phpmonkeys.de/2010/08/17/das-iterator-interface/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 14:26:42 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[iterator]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=600</guid>
		<description><![CDATA[Diese Woche gibt es leider nur einen kurzen Artikel, da ich keinen vernünftigen Zugang ins Internet habe und somit meine Recherche-Möglichkeiten begrenzt sind. Darum betrachte ich heute kurz das Iterator-Interface. Da dieses Interface auch für PHP 5.3 wichtig ist, sollte dieses Interface dem interessierten Entwickler bekannt sein.
Das Interface stellt eine Möglichkeit bereit über eine Menge [...]]]></description>
			<content:encoded><![CDATA[<p>Diese Woche gibt es leider nur einen kurzen Artikel, da ich keinen vernünftigen Zugang ins Internet habe und somit meine Recherche-Möglichkeiten begrenzt sind. Darum betrachte ich heute kurz das Iterator-Interface. Da dieses Interface auch für PHP 5.3 wichtig ist, sollte dieses Interface dem interessierten Entwickler bekannt sein.<br />
<span id="more-600"></span></p>
<p>Das Interface stellt eine Möglichkeit bereit über eine Menge von Objekten zu iterieren. Ein Beispiel für eine Implementierung ist das <code>array</code>. In verschiedenen Projekten habe ich die Variante gesehen, dass die Objekte intern in einem Array verwaltet wurden. Sobald man über diese Objekte iterieren wollte, wurde das Array nach außen gegeben, damit man das <code>foreach</code>-Konstrukt nutzen konnte. Heutzutage sollte man lieber die Kapselung geschlossen lassen und das Iterator-Interface implementieren.</p>
<p>Als Beispiel entwickeln wir ein Objekt, dass mit einem String instanziiert wird und über das man anschließend mit foreach laufen kann. Es werden &#8220;Wörter&#8221; als einzelne Rückgabewerte betrachtet. Also wird der Eingabe-String an einem Whitespace bzw. Komma-Zeichen gesplittet. Die &#8220;WordObject&#8221;-Klasse muss nun das mehrfach angesprochene Iterator-Interface implementieren. Hierzu sind die Methoden <code>rewind</code>, <code>current</code>, <code>key</code>, <code>next</code> und <code>valid</code> zu implementieren.</p>
<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p600code9'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6009"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code" id="p600code9"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> WordObject implements Iterator <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$innerArray</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$pointer</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$inputstring</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">innerArray</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/preg_split"><span style="color: #990000;">preg_split</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/[\s,]+/&quot;</span><span style="color: #339933;">,</span>  <a href="http://www.php.net/trim"><span style="color: #990000;">trim</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$inputstring</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <a href="http://www.php.net/current"><span style="color: #990000;">current</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">innerArray</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointer</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <a href="http://www.php.net/key"><span style="color: #990000;">key</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointer</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <a href="http://www.php.net/next"><span style="color: #990000;">next</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #339933;">++</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointer</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <a href="http://www.php.net/rewind"><span style="color: #990000;">rewind</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointer</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> valid<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <a href="http://www.php.net/isset"><span style="color: #990000;">isset</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">innerArray</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointer</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>
<p>Man kann das Objekt nun bspw. so nutzen:</p>
<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p600code10'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p60010"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p600code10"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$example</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> WordObject<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Hello World, this is a Iterator test&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$example</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;: &quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$value</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>
<p>Dieser Code gibt dann &#8211; wie erwartet &#8211; folgende Ausgabe aus:</p>
<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p600code11'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p60011"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p600code11"><pre class="bash" style="font-family:monospace;"><span style="color: #000000;">0</span>: Hello
<span style="color: #000000;">1</span>: World
<span style="color: #000000;">2</span>: this
<span style="color: #000000;">3</span>: is
<span style="color: #000000;">4</span>: a
<span style="color: #000000;">5</span>: Iterator
<span style="color: #000000;">6</span>: <span style="color: #7a0874; font-weight: bold;">test</span></pre></td></tr></table></div>
<p><em>Update und Anmerkung</em>:<br />
Wie in den Kommentaren angemerkt, kann man den obigen Code auch einfacher darstellen. Dafür muss das IteratorAggregate-Interface implementiert werden. Den Vorteil kann man vor allem deshalb nutzen, weil intern ein Array genutzt wird. Der Code für die vereinfachte Variante sieht so aus:</p>
<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p600code12'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p60012"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p600code12"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> WordObject implements IteratorAggregate <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$innerArray</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$inputstring</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">innerArray</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/preg_split"><span style="color: #990000;">preg_split</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/[\s,]+/&quot;</span><span style="color: #339933;">,</span>  <a href="http://www.php.net/trim"><span style="color: #990000;">trim</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$inputstring</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getIterator<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> ArrayObject<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">innerArray</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2010/08/17/das-iterator-interface/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>PHP 5.3 Certification &#8211; ein Review</title>
		<link>http://www.phpmonkeys.de/2010/08/10/php-5-3-certification-ein-review/</link>
		<comments>http://www.phpmonkeys.de/2010/08/10/php-5-3-certification-ein-review/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 13:26:24 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Betatest]]></category>
		<category><![CDATA[php 5.3]]></category>
		<category><![CDATA[Zertifizierung]]></category>
		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=585</guid>
		<description><![CDATA[Wie bereits angekündigt habe ich am letzten Freitag die Beta-Version der PHP 5.3 Zertifizierung gemacht. Das Ergebnis wird mir in ca. 1 Monat mitgeteilt, da der Clou an einem Betatest ja die Auswertung für den Testersteller (in diesem Fall Zend) ist. Da dieser Test zu gegebener Zeit der breiten Öffentlichkeit zur Verfügung stehen wird, will [...]]]></description>
			<content:encoded><![CDATA[<p>Wie bereits angekündigt habe ich am letzten Freitag die Beta-Version der PHP 5.3 Zertifizierung gemacht. Das Ergebnis wird mir in ca. 1 Monat mitgeteilt, da der Clou an einem Betatest ja die Auswertung für den Testersteller (in diesem Fall Zend) ist. Da dieser Test zu gegebener Zeit der breiten Öffentlichkeit zur Verfügung stehen wird, will ich hier mal kurz vorstellen aus welchen Themenbereichen ich befragt wurde.<br />
<span id="more-585"></span><br />
Die genauen Fragen habe einerseits nicht auswendig gelernt, andererseits bezweilfe ich, dass es rechtlich unbednklich wäre diese zu veröffentlichen. Somit gibt es kein Gedächtnisprotokoll oder ähnliches. Diesen Test habe ich in <a href="http://www.com-training.com/com-trainingscenter/saarbruecken/com-trainingscenter/ihr-trainingscenter/saarbruecken.html" target_"blank">Saarbrücken</a> absolviert. Die Leute waren freundlich und der Testraum war sehr hell mit Ausblick auf die Umgebung. Somit konnte man beim Nachdenken vorbeilaufende Jogger etc sehen. Der Test hatte wie üblich 70 Fragen bei 90 Minuten Bearbeitungszeit.  </p>
<p>Insgesamt waren die Fragen überwiegend Multiple-Choice-Fragen, die genau 1 richtige Lösung hatten. Daneben gab es noch 3-4 MC-Fragen mit mehreren richtigen Antworten und ca. 2 Fragen mit einer Freitext-Antwort.  </p>
<p><em>Themenbereiche</em></p>
<ul>
<li>Grundsätzlich wurden Zusammenhänge abgefragt. Also viele Aufgaben könnte man mit &#8220;Interpreter im Kopf&#8221; beschreiben. Benötigt wird hierfür <strong>grundsätzliches Wissen über PHP</strong> an sich. Es wird also genau die Fähigkeit geprüft, die ein Entwickler beim Lesen von fremden Quellcode benötigt. Komplizierte Strukturen gab es mE nicht.</li>
<li>Fragen zu <strong>Namespaces</strong> gab es sehr wenige (vielleicht 2-3)</li>
<li>Die <code>Iterator</code>- und <code>ArrayAccess</code>-<strong>Interfaces</strong> wurden ausgiebig abgefragt (ca 10 Fragen). Das finde ich persönlich komisch, da für mich ein Interface nicht so ganz außergewöhnlich ist. Aber okay, die Fragen werden vielleicht zufällig ausgewählt.</li>
<li><strong>Datenbank</strong>fragen gab es auch ein paar. Diese gingen in Richtung PDO und SQL. Nicht unbedingt spezifisch auf MySQL oder ein anderes DB-Server-System. Diese allgemeinen Fragen finde ich gut.</li>
<li>Fragen zu <strong>OOP</strong> waren zu erwarten und sind natürlich auch vorgekommen. Hier waren die Themen &#8220;Late static binding&#8221;, der static Modifier und die sonstigen Modifier an sich die Hauptpunkte. Ableitungen von Klassen, abstrakte Methoden und Klassen durften auch nicht fehlen. Ein guter Querschnitt über OOP. Design Patterns wurden nicht abgefragt.</li>
<li>Allgemeines Wissen aus dem Bereich der <strong>Informatik</strong> wurde auch geprüft. Bspw. welche Verschlüsselungssysteme symmetrisch sind; ohne tiefer in die Materie einzugehen.</li>
</ul>
<p>Insgesamt waren die Fragen abwechslungsreiche und der Test hat Spaß gemacht. Wer beruflich PHP entwickeln möchte sollte sich zertifizieren lassen. Der Test an sich ist günstig und wenn man tagtäglich mit PHP arbeitet, sind die Fragen ohne lange Vorbereitungszeit zu beantworten. </p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2010/08/10/php-5-3-certification-ein-review/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>PHP 5.3 Certification</title>
		<link>http://www.phpmonkeys.de/2010/08/06/php-5-3-certification/</link>
		<comments>http://www.phpmonkeys.de/2010/08/06/php-5-3-certification/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 07:30:39 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[certification]]></category>
		<category><![CDATA[php 5.3]]></category>
		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=581</guid>
		<description><![CDATA[Heute gibt es mal etwas besonderes. Vor knapp einem Monat gab es vom PHP Gangsta einen Beitrag, dass für die PHP 5.3 Zertifizierung Beta Tester gesucht werden. Ich habe mich da natürlich auch registriert und sitze jetzt, da ihr diese Zeilen lest, vor einem Computer in einem Testinstitut. Meine Erfahrungen werde ich in den nächsten [...]]]></description>
			<content:encoded><![CDATA[<p>Heute gibt es mal etwas besonderes. Vor knapp einem Monat gab es vom <a href="http://www.phpgangsta.de/neue-php-5-3-zertifizierung-beta-tester-gesucht" target="_blank">PHP Gangsta</a> einen Beitrag, dass für die PHP 5.3 Zertifizierung Beta Tester gesucht werden. Ich habe mich da natürlich auch registriert und sitze jetzt, da ihr diese Zeilen lest, vor einem Computer in einem Testinstitut. Meine Erfahrungen werde ich in den nächsten Tagen hier niederschreiben.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2010/08/06/php-5-3-certification/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Die Modifiers in PHP – Teil 3</title>
		<link>http://www.phpmonkeys.de/2010/08/03/die-modifiers-in-php-%e2%80%93-teil-3/</link>
		<comments>http://www.phpmonkeys.de/2010/08/03/die-modifiers-in-php-%e2%80%93-teil-3/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 08:10:18 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[access control]]></category>
		<category><![CDATA[modifier]]></category>
		<category><![CDATA[oop]]></category>
		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=570</guid>
		<description><![CDATA[Im dritten und letzten Teil der Modifier-Reihe geht es um final und abstract. Diese Modifier beeinflußen nicht die &#8220;Sichtbarkeit&#8221; und erlauben weitere Aspekte der objektorientierten Programmierung.
Möchte man eine Methode außerhalb der Klasse verfügbar machen, so nutzt man den public-Modifier. Da man von dieser Klasse eine andere Klasse ableiten kann, ist diese public-Methode automatisch überschreibbar. Wenn [...]]]></description>
			<content:encoded><![CDATA[<p>Im dritten und letzten Teil der Modifier-Reihe geht es um final und abstract. Diese Modifier beeinflußen nicht die &#8220;Sichtbarkeit&#8221; und erlauben weitere Aspekte der objektorientierten Programmierung.<br />
<span id="more-570"></span><br />
Möchte man eine Methode außerhalb der Klasse verfügbar machen, so nutzt man den <code>public</code>-Modifier. Da man von dieser Klasse eine andere Klasse ableiten kann, ist diese <code>public</code>-Methode automatisch überschreibbar. Wenn man dies verhindern möchte, muss man <code>final</code> benutzen. Damit wird eine Methode als nicht überschreibbar definiert. Diesen Modifier kann man natürlich auch auf die Klasse anwenden, sodass eine Klasse nicht mehr ableitbar ist.</p>
<p>Möchte man das Gegenteil bewirken, gibt es den abstract-Modifier. Dieser besagt, das eine Methode unbedingt überschrieben werden muss. Auch dieser Modifier kann auf die gesamte Klasse angewendet werden. Grundsätzlich ist eine abstrakte Klasse mit abstrakten Methoden ähnlichem einem Interface. Jedoch kann eine Klasse nur von genauer einer Klasse abgeleitet sein, was bei einem Interface nicht gilt. Eine weitere Besonderheit ist die Möglichkeit in einer abstrakten Klasse die Modifier zu mischen. Es gibt also bspw. 2 abstrakte Methoden und 1 protected. Somit darf diese Methode ganz normalen Code enthalten und kann in der konkreten Klasse genutzt werden.</p>
<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p570code14'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p57014"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code" id="p570code14"><pre class="php" style="font-family:monospace;">&nbsp;
abstract <span style="color: #000000; font-weight: bold;">class</span> Car <span style="color: #009900;">&#123;</span>
&nbsp;
     <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> turnLeft<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #666666; font-style: italic;">// nach links</span>
     <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * tanken
     */</span>
    abstract <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> refuel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> DieselCar <span style="color: #000000; font-weight: bold;">extends</span> Car <span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> refuel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #666666; font-style: italic;">// tanke Diesel</span>
     <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>
<p>Die abstrakte Klasse <code>Car</code> bietet eine Methode um nach links zu fahren. Diese ist ausimplementiert (im Beispiel nur ein Kommentar). Daneben gibt es noch eine abstrakte Methode, um das Auto zu betanken. Das davon abgeleitete Auto muss nun die <code>refuel</code>-Methode implementieren. </p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2010/08/03/die-modifiers-in-php-%e2%80%93-teil-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Die Modifiers in PHP – Teil 2</title>
		<link>http://www.phpmonkeys.de/2010/07/27/die-modifiers-in-php-%e2%80%93-teil-2/</link>
		<comments>http://www.phpmonkeys.de/2010/07/27/die-modifiers-in-php-%e2%80%93-teil-2/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 11:11:02 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[private]]></category>
		<category><![CDATA[public]]></category>
		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=562</guid>
		<description><![CDATA[Im letzten Beitrag habe ich den public Modifier betrachtet und als Fazit aus dem Beispiel den private Modifier gefordert. Und um genau diesen geht es heute.
Der private-Modifier ist genau das Gegenteil von public. Programmiert man eine Klasse mit private Modifiern, so kann weder von außen noch von einer abgeleiteten Klasse auf diese Elemente zugegriffen werden. [...]]]></description>
			<content:encoded><![CDATA[<p>Im letzten Beitrag habe ich den <code>public</code> Modifier betrachtet und als Fazit aus dem Beispiel den <code>private</code> Modifier gefordert. Und um genau diesen geht es heute.<br />
<span id="more-562"></span><br />
Der <code>private</code>-Modifier ist genau das Gegenteil von <code>public</code>. Programmiert man eine Klasse mit private Modifiern, so kann weder von außen noch von einer abgeleiteten Klasse auf diese Elemente zugegriffen werden. Sie sind eben privat. Das einfachste Beispiele sind Attribute, die man nur durch einen validierten Zugriff verfügbar machen möchte. Diese sind an sich private und der Entwickler bietet bspw. public Getter und Setter an. Auch kann man private Methoden nutzen, um das divide and conquer Prinzip in einer Klasse zu forcieren. So werden Teilalgorithmen in diese private Methoden ausgelagert. </p>
<p>Diese Methoden können nur von der eigenen Klasse genutzt werden und sind sowohl gegen den Zugriff von außen, als auch durch eine abgeleitete Klasse geschützt. </p>
<p>Nun gibt es gelgentlich das Problem, dass man bestimmte Variablen und Methoden in einer Klasse definiert und diese in einer abgeleiteten Klasse nutzen möchte, aber auch nur in dieser Klasse. Diese Methoden sollen nicht allgemein zugänglich sein. Hierfür gibt es den <code>protected</code> Modifier. Dieser stellt genau diese Funktionalität zu Verfügung.</p>
<p>Nun fehlen noch die <code>final</code>- und <code>abstract</code>-Modifier. Diese werden im nächsten Teil der Reihe beschrieben.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2010/07/27/die-modifiers-in-php-%e2%80%93-teil-2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Die Modifiers in PHP &#8211; Teil 1</title>
		<link>http://www.phpmonkeys.de/2010/07/20/die-modifiers-in-php-teil-1/</link>
		<comments>http://www.phpmonkeys.de/2010/07/20/die-modifiers-in-php-teil-1/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 18:30:07 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[Klassen]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[private]]></category>
		<category><![CDATA[protected]]></category>
		<category><![CDATA[public]]></category>
		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=553</guid>
		<description><![CDATA[Damals &#8211; als wir noch mit PHP4 unterwegs waren &#8211; gab es keine Modifier. Alle Attribute und Methoden einer Klasse waren grundsätzlich public und man behalf sich mit Konstruktionen wie &#8220;Methoden, die mit Unterstrich anfangen, sind private&#8221;. Dies muss aber nicht sein und mit PHP 5 gibt es mehrer Modifier, die das Entwicklerherz höher schlagen [...]]]></description>
			<content:encoded><![CDATA[<p>Damals &#8211; als wir noch mit PHP4 unterwegs waren &#8211; gab es keine Modifier. Alle Attribute und Methoden einer Klasse waren grundsätzlich public und man behalf sich mit Konstruktionen wie &#8220;Methoden, die mit Unterstrich anfangen, sind private&#8221;. Dies muss aber nicht sein und mit PHP 5 gibt es mehrer Modifier, die das Entwicklerherz höher schlagen lassen. Diese sind public, private, protected und abstract, final. Hier gibt es nun eine kleine Beitragsreihe, die die Modifier vorstellt und an Beispielen erklärt. Beginnen wir mit dem aus PHP4 übernommenen, dem public-Modifier.<br />
<span id="more-553"></span><br />
Der public-Modifier kann explizit angegeben werden oder man kann ihn auch weglassen. Ich persönlich gebe den Modifier explizit an. Einerseits unterstützen morderne IDEs die Entwicklung mit den Modifiern, andererseits kann ein zweiter Programmierer direkt sehen, dass ich eine Methode aus Absicht public deklariert habe und nicht einfach nur vergessen habe den Scope zu setzen.<br />
Public-deklarierte Methoden kann man nun immer aufrufen und in abgeleiteten Klassen natürlich auch nutzen. Daneben darf man die Methode überschreiben. Bei Attributen wirkt public so, dass man direkt auf die Attribute von außen zugreifen kann. Dies ist normalerweise nicht gewünscht. Man nutzt hier üblicherweise Setter und Getter, damit man die Möglichkeit hat, Daten vor dem Speichern im Attribut zu validieren (z.B.). Bei einem direkten Zugriff funktioniert dies nicht. Der Trick mit dem magic <code>__get</code> und <code>__set</code> kann dies zwar auch bewerkstelligen, wird aber schnell unschön, wenn verschiedene Attribute verschieden Validatoren benötigen.</p>
<p>Als Beispiel packe ich wieder mal ein paar Autos aus:</p>
<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p553code16'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p55316"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code" id="p553code16"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> car <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$engine</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> start<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
         <span style="color: #000088;">$engine</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$myCar</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Car<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$myCar</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">engine</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$myCar</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>
<p>Wir haben nun ein Auto mit einem Motor. Da der Motor public ist, kann er auch durch Luft (oder einfach nichts) ersetzt werden. Startet man das Auto, fällt die Anwedung auf die Nase und man hat schon den beschriebenen Fall. Hätten wir einen private Modifier, könnte man den Motor durch den Zugriff von außen schützen und das sehen wir im Beitrag Teil 2.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2010/07/20/die-modifiers-in-php-teil-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Schreib mal wieder</title>
		<link>http://www.phpmonkeys.de/2010/07/13/schreib-mal-wieder/</link>
		<comments>http://www.phpmonkeys.de/2010/07/13/schreib-mal-wieder/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 11:47:22 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[fluent interface]]></category>
		<category><![CDATA[mailer]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[swiftmailer]]></category>
		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=537</guid>
		<description><![CDATA[Diesen Slogan nutze die Post in meiner Jugend. Inzwischen werden statt Briefe eher Emails verschickt und das wollen wir jetzt auch mal mit PHP machen. Eine Mail mit PHP zu versenden ist grundsätzlich einfach. Man benutzt einfach die mail-Funktion. Diese ist aber nicht ganz so übersichtlich und es ist auch nicht so einfach eine schöne [...]]]></description>
			<content:encoded><![CDATA[<p>Diesen Slogan nutze die Post in meiner Jugend. Inzwischen werden statt Briefe eher Emails verschickt und das wollen wir jetzt auch mal mit PHP machen. Eine Mail mit PHP zu versenden ist grundsätzlich einfach. Man benutzt einfach die <a href="http://php.net/manual/de/function.mail.php" target="_blank">mail</a>-Funktion. Diese ist aber nicht ganz so übersichtlich und es ist auch nicht so einfach eine schöne Email zusammenzubauen, die Anhänge und sowohl Html als auch Plain-Text enthält. Um diese Erstellung zu vereinfachen existieren einige Bibliotheken. Beispielhaft schauen wir uns <a href="http://swiftmailer.org/" target="_blank">Swiftmailer</a> an.<br />
<span id="more-537"></span><br />
Swiftmailer ist eine Bibliothek die objektorientiert entwickelt wurde. Die Hauptbestandteile sind eine Message, ein Transport und der Mailer. Man baut sich also eine Email zusammen, erstellt sich einen Transport und sendet die Email über den Transport. Der letzte Schritt wird vom Mailer übernommen. Das Erstellen einer Email funktioniert auf 2 mögliche Arten. Entweder herkömmlich durch den Aufruf diverser Setter, die auf einem <a href="http://github.com/swiftmailer/swiftmailer/blob/master/lib/classes/Swift/Message.php" target="_blank"><code>Swift_Message</code></a> Objekt arbeiten oder man nutzt das <a href="http://en.wikipedia.org/wiki/Fluent_interface" target="_blank">Fluent Interface</a> und kann die Methoden verketten (Chaining).</p>
<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p537code22'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p53722"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p537code22"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Message Objekt erzeugen</span>
<span style="color: #000088;">$message</span> <span style="color: #339933;">=</span> Swift_Message<span style="color: #339933;">::</span><span style="color: #004000;">newInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Subjekt setzen</span>
<span style="color: #000088;">$message</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setSubject</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;PM Test&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Mail Text setzen (hier in Html)</span>
<span style="color: #000088;">$message</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setBody</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&lt;i&gt;Dies&lt;/i&gt; ist ein &lt;u&gt;Test&lt;/u&gt;&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;text/html&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// alternativen Mailtext hinzufuegen (hier Plaintext)</span>
<span style="color: #000088;">$message</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addPart</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Dies ist ein Test&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;text/plain&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Absender setzen</span>
<span style="color: #000088;">$message</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFrom</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;sender@adres.se&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Empfaenger setzen</span>
<span style="color: #000088;">$message</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setTo</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;receiver@adres.se&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>
<p>Um einen Dateianhang hinzuzufügen bietet Swiftmailer die <a href="http://github.com/swiftmailer/swiftmailer/blob/master/lib/classes/Swift/Attachment.php" target="_blank"><code>Swift_Attachment</code></a>-Klasse an. Damit lassen sich Dateien und auch Daten aus einer Variable als Anhang in ein Swift_Message-Objekt integrieren. Wenn man das obige Beispiel in der Fluent Interface Variante nutzt sieht das dann so aus:</p>
<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p537code23'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p53723"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p537code23"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$message2</span> <span style="color: #339933;">=</span> Swift_Message<span style="color: #339933;">::</span><span style="color: #004000;">newInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #004000;">setSubject</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;PM Test 2&quot;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #004000;">setBody</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&lt;i&gt;Dies&lt;/i&gt; ist ein &lt;u&gt;Test&lt;/u&gt;&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;text/html&quot;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #004000;">addPart</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Dies ist ein Test&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;text/plain&quot;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #004000;">attach</span><span style="color: #009900;">&#40;</span>
          Swift_Attachment<span style="color: #339933;">::</span><span style="color: #004000;">fromPath</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;run.php&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;text/plain&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFilename</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;test.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFrom</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;sender@adres.se&quot;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #004000;">setTo</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;receiver@adres.se&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>
<p>Die generierte Email kann man als String ausgeben. So hat man auch die Möglichkeit zu kontrollieren, ob die Mail das gewünschte Ergebnis liefern wird.</p>
<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p537code24'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p53724"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p537code24"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">echo</span> <span style="color: #000088;">$message</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>
<p>Diese Mail soll nun auch noch verschickt werden. Hierfür benötigt man zuerst einen Transport. Beispielhaft ist hier der <a href="http://github.com/swiftmailer/swiftmailer/blob/master/lib/classes/Swift/SmtpTransport.php" target="_blank"><code>Swift_SmtpTransport</code></a> vorgestellt. Interessant an dieser Sache ist, dass man den Transport bspw per Dependency Injection einbinden und somit sehr einfach wechseln kann &#8211; falls notwendig.</p>
<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p537code25'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p53725"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p537code25"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$transport</span> <span style="color: #339933;">=</span> Swift_SmtpTransport<span style="color: #339933;">::</span><span style="color: #004000;">newInstance</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'smtphost'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">25</span><span style="color: #009900;">&#41;</span>
  <span style="color: #339933;">-&gt;</span><span style="color: #004000;">setUsername</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#41;</span>
  <span style="color: #339933;">-&gt;</span><span style="color: #004000;">setPassword</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'password'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>
<p>Jetzt muss man Transport und Message nur noch verbinden, um die Email auch zu versenden. Dies übernimmt die <a href="http://github.com/swiftmailer/swiftmailer/blob/master/lib/classes/Swift/Mailer.php" target="_blank"><code>Swift_Mailer</code></a>-Klasse. Der Mail-Versand kann dann mit einer einfachen Zeile realisiert werden.</p>
<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p537code26'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p53726"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p537code26"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$mailer</span> <span style="color: #339933;">=</span> Swift_Mailer<span style="color: #339933;">::</span><span style="color: #004000;">newInstance</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$transport</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">send</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>
<p>Weitere Informationen findet man in der recht ordentlichen <a href="http://swiftmailer.org/docs/introduction" target="_blank">Doku</a> des Swiftmailers. </p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2010/07/13/schreib-mal-wieder/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>&#8220;The key to the cloud&#8221;</title>
		<link>http://www.phpmonkeys.de/2010/07/05/the-key-to-the-cloud/</link>
		<comments>http://www.phpmonkeys.de/2010/07/05/the-key-to-the-cloud/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 21:13:26 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[yubico]]></category>
		<category><![CDATA[yubikey]]></category>
		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=511</guid>
		<description><![CDATA[Mit dieser Überschrift habe ich das ungetilte Interesse aller Buzzword-Freunde, aber für den Rest gibt es auch interessante Informationen. Ich möchte heute den Yubikey der Firma Yubico vorstellen. Es handelt sich dabei um ein OTP-Token, das man eigentlich an jedem Computer mit USB-Anschluß nutzen kann. Keine Treiber sind notwendig, aber der Nutzen ist &#8211; wie [...]]]></description>
			<content:encoded><![CDATA[<p>Mit dieser Überschrift habe ich das ungetilte Interesse aller Buzzword-Freunde, aber für den Rest gibt es auch interessante Informationen. Ich möchte heute den Yubikey der Firma <a href="http://yubico.com/home/index/" target="_blank">Yubico</a> vorstellen. Es handelt sich dabei um ein OTP-Token, das man eigentlich an jedem Computer mit USB-Anschluß nutzen kann. Keine Treiber sind notwendig, aber der Nutzen ist &#8211; wie ich meine &#8211; enorm. Da ich von dieser Firma ja nicht gesponsort werde, ist die Hardware nur die Spielerei für eine simple PHP-Bibliothek, die man für eine Two-Factor-Authentication nutzen kann.<br />
<span id="more-511"></span><br />
<em>Die Hardware:</em><br />
Der <a href="http://yubico.com/products/yubikey/" target="_blank">Yubikey</a> ist ein kleiner USB-Stick, der ca 1cm x 2cm x 2mm groß bzw klein ist. Es gibt ein Loch, um den Key an einem Schlüsselbund zu befestigen. Kontakte für den USB-Anschluß und einen Knopf zur &#8220;Aktivierung&#8221; gibt es auch. Der Yubikey erzeugt &#8211; und das ist die Hauptaufgabe &#8211; One-Time-Passwords. RSA-Tokens kennt man ja bereits von Ebay oder Paypal, aber dieser Stick arbeitet anders. Er gibt sich als Tastatur aus und durch tippen auf den Knopf, wird ein OTP &#8220;eingetippt&#8221;. Die Tastenkommandos kommen auch mit einer leichten Verzögerung, sodass das Betriebssystem damit klarkommt. Die Verzögerung ist aber so gering, dass die Zeichen sehr schnell auf dem Bildschirm erscheinen.<br />
Wie man ja weiß, muss es bei einem OTP auch eine Gegenstelle geben, die überprüft, ob das Passwort gültig ist und ob es sich nicht um eine Wiederholung handelt. Jemand könnte das Passwort ja abfangen! Diese Gegenstelle ist der Yubico Server (bzw sind es afaik 5). Wenn man Yubico nicht traut, oder einfach nur einen Gegenstelle im lokalen Intranet benötigt, kann man diese Infrastruktur mit Java oder PHP nachbilden. Für beide Sprachen bietet Yubico OpenSource Server an. Dann muss man den Schlüssel aber umprogrammieren, was mit einem Windows und Macos Tool sehr einfach geht.<br />
Der Yubikey ist preislich noch locker im &#8220;Kann man ruhig mal zum Spielen kaufen&#8221;-Rahmen, nämlich bei 25$, die RFID Version &#8211; mit der ich mich nicht weiter auseinander gesetzt habe &#8211; liegt bei 35$.</p>
<p><em>Funktionsweise:</em><br />
Um den Yubikey zu nutzen, gibt es mehrere Arten. Ich beschreibe nun zwei, die ich ganz praktisch finde. Hierfür benötigt man immer eine Verbindung ins Internet &#8211; ist aber bei PHP-Seiten üblicherweise gegeben (ja, im Intranet nicht <img src='http://www.phpmonkeys.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ). <strong>Methode 1</strong> nutzt den KeyGenius-Server. Dieser ist eine Passwortablage. Jedes Passwort wird über den eindeutigen Key-Identifier und ein Zufallspasswort verschlüsselt, dass bei der Ablage einmalig erzeugt wird. Jeder Key hat somit eine eigene Verschlüsselung. Auf der Client Seite benötigt man im Browser Greasemonkey. Für dieses Plugin gibt es ein Javascript, dass die Passworteingabe auf der angesurften Seite sucht und durch eine eigene ersetzt. Man gibt nun sein Login ein und anstelle des herkömmlichen Passworts einen Yubikey-OTP. Das Greasemonkey Skript betreibt jetzt im Hintergrund viel Magie. Der Key wird an den Keygenius Server inkl. Adresse und Login geschickt, dieser validiert das OTP über den yubico Server und sendet das echte Passwort zurück, dieses wird im Passwortfeld eingesetzt und ein Submit des Login Formulars durchgeführt. Der Keygenius Server liegt auch im <a href="http://code.google.com/p/keygenius/" target="_blank">Quellcode</a> vor, benötigt aber <a href="http://www.symfony-project.org/" target="_blank">Symfony</a>. Die eigentliche Logik zu extrahieren ist aber recht simpel, so kann man ein plain-PHP5 kompatible Version basteln.<br />
Nun die Methode 2, die etwas spannender ist und die endlich als Überleitung zum heutige PHP-Source dient. Hierbei wird eine kleine Bibliothek genutzt, die man in seine eigene Applikation einbaut. Das übliche Login Formular wird angepasst. Hier kann man entweder dem Benutzer einen Key Identifier zuordnen und diesen sozusagen als Passwort nutzen. Oder man nutzt eine Two-Factor-Authentication und hat neben dem herkömmlichen Passwort Feld noch ein zweites Passwort Feld, dass ein OTP erwartet. Für welche Variante man sich entscheidet, benötigt man auf jeden Fall eine Bibliothek, um die Validierung des Yubikeys durchführen zu können. Die von <a href="http://code.google.com/p/php-yubico/" target="_blank">Yubico angebotene</a> ist in PHP4 geschrieben und das passt mir natürlich nicht. Eine Alternative ist die PHP5 Variante, die in Keygenius genutzt wird. Heute stelle ich eine 3. Möglichkeit vor. Eine simple PHPMonkeys-Yubico Validierungsbibliothek.</p>
<p><em>Die Validierungs-Lib:</em><br />
Für die Validierung wird ein Webservice angefragt, der zu den gegebenen GET-Parametern eine einfache Seite zurückgibt, die einer Txt-Datei entspricht. In unserer simplen Variante wird eine ID, ein OTP und ein &#8220;Nonce&#8221; benötigt. ID entspricht dem Api-Key, den man sich als Yubikey Besitzer <a href="https://upgrade.yubico.com/getapikey/" target="_blank">gratis bei Yubico erstellen</a> lassen kann. Hier bekommt man auch den Signature-Key (in <a href="http://en.wikipedia.org/wiki/Base64" target="_blank">Base64</a> codiert) &#8211; dazu später mehr. Das One-Time-Passwort ist selbstverständlich und der/die/das Nonce wird als zusätzliche Sicherheit benutzt, dass die Antwort auch zur Anfrage gehört, da dieser String vom Server einfach wieder zurückgegeben wird. Nun hört sich die ganze Geschichte recht unsicher an, aber dafür gibt es noch ein Hash-Parameter. Dabei handelt es sich um einen <a href="http://en.wikipedia.org/wiki/HMAC" target="_blank">HMAC</a> (Hash-based Message Authentication Code). Yubico nutzt hier einen HMAC-Sha1, das bedeutet, dass Sha1 für die Hashbildung genutzt wird. Die Nachricht, deren Echtheit man überprüfen will, ist der QueryString der GET Anfrage ohne den Hash (ist ja auch logisch). Man nutzt aber nicht einfach Sha1, weil man noch einen Signature-Key nutzen will. Dieser wird beim generieren der <a href="https://upgrade.yubico.com/getapikey/" target="_blank">API-ID</a> miterzeugt und ist das shared Secret, das sowohl bei Yubico, als auch beim Nutzer der Bibliothek bekannt ist. Der String wird in der Übertragung nirgends erwähnt und somit kann ein Angreifer die Nachricht nicht authentifizieren und somit auch nicht Parameter ändern. Weder in Richtung Server, noch vom Server zum Client.<br />
Der Server baut sich nun aus den gegebenen Daten einen eigenen Hash und vergleicht diesen mit dem übermittelten, so kann man feststellen, wenn die Daten auf dem Weg (&#8220;Man-in-the-middle&#8221;) manipuliert wurden. Der Server antwortet nun auf eine solche Anfrage mit einem Text, der aus Key-Value-Paaren besteht die durch ein Gleichheitszeichen getrennt sind. In jeder Zeile findet sich ein solches Paar. Als Antwort erhält man natürlich einen HMAC-Sha1. Dann gibt es den Status, die Nonce und ein Timestamp. Über den Timestamp kann man die Anfrage noch an ein Zeitfenster binden. Die simple Bibliothek, die ich vorstelle hat dieses Feature (noch) nicht. Als Client kann man diese Infos nun parsen, verschiedene Vergleiche anstellen und damit die Antwort des Servers bestätigen. Dieser sendet im Status Feld ein &#8220;OK&#8221;, falls alles passt. Beliebt, vor allem beim Testen, ist der REPLAYED_OTP Status. Dies tritt auf, wenn man den Key bereits erfolgreich validiert hat und es ein zweites mal versucht. Ist ja schließlich ein <em>One</em>-Time-Password. Andere Status kann man der <a href="http://www.yubico.com/developers/api/" target="_blank">Webservice API</a> entnehmen. Es ist eigentlich jeder Fall abgedeckt. </p>
<p>Die kleine Bibliothek finde man <a href='http://www.phpmonkeys.de/wp-content/uploads/2010/07/PMYubikey.php_.gz'>hier</a> oder wie immer auch im SVN. Dort gibt es auch ein kleines Beispiel, wie so ein Aufruf aussieht.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2010/07/05/the-key-to-the-cloud/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Code Reviews &#8211; Teil 2</title>
		<link>http://www.phpmonkeys.de/2010/06/28/code-reviews-teil-2/</link>
		<comments>http://www.phpmonkeys.de/2010/06/28/code-reviews-teil-2/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 16:48:00 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[code review]]></category>
		<category><![CDATA[email pass-around]]></category>
		<category><![CDATA[peer review]]></category>
		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=500</guid>
		<description><![CDATA[Im ersten Teil dieser Serie habe ich neben einer allgemeinen Einführung auch ein formalles Vorgehen beschrieben. Heute stelle ich 2 informelle Vorgehen vor, die man nutzen kann, um spontane Reviews durchzuführen. Dabei handelt es sich um &#8220;Email Pass-Around&#8221; und &#8220;Peer Review&#8221;.
Email Pass-Around:
Im Gegensatz zu dem formellen Vorgehen benötigt man beim &#8220;Email Pass-Around&#8221;-Verfahren keinen großen verwaltungstechnischen [...]]]></description>
			<content:encoded><![CDATA[<p>Im ersten Teil dieser Serie habe ich neben einer allgemeinen Einführung auch ein formalles Vorgehen beschrieben. Heute stelle ich 2 informelle Vorgehen vor, die man nutzen kann, um spontane Reviews durchzuführen. Dabei handelt es sich um &#8220;Email Pass-Around&#8221; und &#8220;Peer Review&#8221;.<br />
<span id="more-500"></span></p>
<p><em>Email Pass-Around</em>:<br />
Im Gegensatz zu dem formellen Vorgehen benötigt man beim &#8220;Email Pass-Around&#8221;-Verfahren keinen großen verwaltungstechnischen Aufwand, um das Review zu organisieren. Der Entwickler schickt einfach die Codeänderungen per Mail an alle Kollegen. Diesen Vorgang kann man mit einem Commit-Hook automatisieren. Vorteil bei diesem Vorgehen ist, dass jeder Entwickler, der an dem Projekt arbeitet, den Code anschauen und beurteilen kann. Das Ganze kann durchaus asynchron passieren, somit kann das Review zu einem passenden Zeitpunkt durchgeführt werden. Nachteil ist, das im &#8220;worst case&#8221; niemand den Code anschaut. Hier muss unter den Entwicklern eine entsprechnde Disziplin herrschen. Auf der anderen Seite ist ein Entwickler normalerweise daran interessiert ein bestmögliches Produkt zu erstellen.</p>
<p><em>Peer Reviews</em>:<br />
Möchte man sicherstellen, dass Code Reviews durchgeführt werden, aber den Overhead eines formellen Vorgehens vermeiden, bietet sich ein Peer Review an. Hierbei besprechen 2 Entwickler eine Codepassage. Einer der Entwickler sollten den Code programmiert haben. Die Länge des Codes is in der Regel zwischen 100 und 300 Zeilen. Für diese Codemenge muss man ca. 1 Stunde einplanen. Wichtig ist, dass man nicht von einer Lehrer-Schüler Beziehung ausgeht, sondern sich beide Entwickler als gleichberechtigt verstehen. Problem bei Peer Reviews ist, dass diese nicht &#8220;von oben&#8221; gesteuert werden können. Wenn man dies trotzdem versucht, wird ein solches Vorgehen schnell zu einem Muss und wird nur noch halbherzig duchgeführt, was dann weder die Verbreitung des Wissens beschleunigt, noch die Codequalität verbessert.</p>
<p><em>Fazit:</em><br />
Aus persönlicher Erfahrung kann ich sagen, dass in einer angenehmen Atmosphäre Peer Reviews am meisten bringen und dabei auch noch Spaß machen. Bei uns hat sich eingebürgert die Peer Reviews in einem kleinen Konferenzraum durchzuführen. So können beide Entwickler auf einem Beamer oder großem Monitor den Code anschauen und bei der Diskussion fühlt sich auch kein Kollege gestört. Eine Tasse Kaffee gehört ebenfalls zu einem Review. Anmerkungen werden gleich in den Code als TODO geschrieben und zeitnah angegangen.</p>
<p>Email Pass-Around nutzen wir schon seit Jahren und dieses Verfahren funktioniert relativ gut und hat schon den ein oder anderen Patzer im Code aufgedeckt. Die Asynchronität ist hier ein sehr spannender Aspekt. Und wer seine Firmenmails aufs Handy bekommt, kann überall mal schauen, was am Code gearbeitet wird &#8211; sofern man denn will.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2010/06/28/code-reviews-teil-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
