<?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>Zipfelmaus &#187; PHP</title>
	<atom:link href="http://www.zipfelmaus.com/blog/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zipfelmaus.com</link>
	<description>wie zipfelig</description>
	<lastBuildDate>Tue, 07 Feb 2012 18:12:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Advanced PHP: Decapsulating Objects</title>
		<link>http://www.zipfelmaus.com/blog/advanced-php-decapsulating-objects/</link>
		<comments>http://www.zipfelmaus.com/blog/advanced-php-decapsulating-objects/#comments</comments>
		<pubDate>Sun, 23 Oct 2011 11:48:30 +0000</pubDate>
		<dc:creator>Rocu</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[Decapsulator]]></category>
		<category><![CDATA[Mehtod]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Private]]></category>
		<category><![CDATA[Property]]></category>
		<category><![CDATA[Protected]]></category>
		<category><![CDATA[Static]]></category>
		<category><![CDATA[Test]]></category>

		<guid isPermaLink="false">http://www.zipfelmaus.com/?p=2611</guid>
		<description><![CDATA[In the past I had a reoccurring problems during testing. I wanted to access protected or private methods of Objects from the outside, in order to test them in isolation. On other occasions I wanted to check if the internal state of a object was affected by my test. I took several approaches to the [...]
Verwandte Artikel:<ol>
<li><a href='http://www.zipfelmaus.com/blog/php-snippet-nabaztag-per-api-textnachrichten-senden/' rel='bookmark' title='PHP-Snippet: Nabaztag per API Textnachrichten schicken'>PHP-Snippet: Nabaztag per API Textnachrichten schicken</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>In the past I had a reoccurring problems during testing. </p>
<p>I wanted to access protected or private methods of Objects from the outside, in order to test them in isolation. On other occasions I wanted to check if the internal state of a object was affected by my test.</p>
<p>I took several approaches to the problem and I finally found a nice solution.</p>
<div id="attachment_2614" class="wp-caption alignnone" style="width: 650px"><img src="http://www.zipfelmaus.com/wp-content/uploads/2011/10/2839948784_20a29a080e_z.jpg" title="Accessing protected stuff" width="606" /><p class="wp-caption-text">Bild &quot;Canis Lupus&quot; von Joriel &quot;Joz&quot; Jimenez (CC BY-NC-ND 2.0)</p></div>
<h2>The fools approach</h2>
<p>The fool&#8217;s approach would be to remove the private or protected keywords from the classes. It might work well if you are the only programmer in a project and are sure that you can remember what you did last year. I can&#8217;t and I am no fan of this.</p>
<p>These keywords are used for a good reason: You want to avoid interference from the outside and let the Object be master over its internal state.</p>
<h2>The manual approach</h2>
<p>Another aproach is to extend the class, change the method-declaration to be public and point to the parent-class.</p>
<pre class="brush: php; title: ; notranslate">
class Subject
{
  protected function fooBar($abc){}
}

class Mock_Subject
{
  public function fooBar($abc)
  {
   return parent::fooBar($abc);
  }
}
</pre>
<p>This works fine. Its a decent solution for testing one class &#8211; though it has problems:</p>
<ul>
<li>You have to duplicate every protected method declaration</li>
<li>The code is very specific to the subject in question</li>
<li>The tests get longer and longer</li>
<li>Knowledge about how the methods look like is in the <code>Mock_Subject</code> class as well and if you want to change a method you have to touch 2 classes</li>
<li>You can only test protected function but not private ones</li>
</ul>
<p>I tried to take this road and in general it works fine. The biggest problem was really that it bloated my tests and I got very impatient, because I felt that creating these Mock-Classes was completely uninteresting work.</p>
<p>Since I am a lazy guy I really wanted something else.</p>
<h2>The Reflection approach</h2>
<p>A Google search came up with another suggestion. Since PHP 5.3 we can reflect on Objects and Classes and access protected properties and methods.</p>
<pre class="brush: php; title: ; notranslate">
class Subject
{
  private function fooBar()
  {
    return &quot;foobar&quot;;
  }
}

$subject = new Subject();
$reflector = new ReflectionObject($subject);
$method = $reflector-&gt;getMethod(&quot;fooBar&quot;)
$method-&amp;gt;setAccessible(true);
$result = $method-&gt;invoke($subject);
echo $result;
</pre>
<p>This works just fine. Though of course its quite verbose. I didn&#8217;t want to go this road, because I thought that this might make my tests even more complicated.</p>
<h2>The &#8220;Decapsulator&#8221; approach</h2>
<p>I sticked with my Mock classes. But yesterday it dawned on me that there might be a very simple general concept. I realized that it is possible to write a nice Class that can decapsulate objects and act as a proxy between the object and my tests.</p>
<p>The api looks a lot like accessing the real object:</p>
<pre class="brush: php; title: ; notranslate">
class Subject
{
  private $foobar = &quot;hello&quot;;
}

$proxy = new Proxy(new Subject());
echo $proxy-&gt;foobar;
</pre>
<p>Quite nice. And reusable. </p>
<h2>The implementation</h2>
<p>How did I achieved it? Basically I combined the magic method <code>__get()</code>,  <code>__set()</code>,  <code>__call()</code>,  <code>__callStatic()</code> with the Reflection API.</p>
<p>The magic methods intercept the calls to the object, and the Decapsulator tries to forwards it to the Subject, using the Reflection API.</p>
<pre class="brush: php; title: ; notranslate">
class Decapsulator
{
  private $subject;
   public function __construct($subject)
   {
      $this-&gt;subject = $subject;
   }

   public function __get($name)
   {
     $reflector = new ReflectionObject($subject);
     $property= $reflector-&gt;getProperty($name)
     $property-&gt;setAccessible(true);
     return  $property-&gt;getValue($subject);
   }
}
</pre>
<p>The rest of the class follows the same scheme.</p>
<p>The end result looks like this:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Decapsulator
{
  private $subject;
  private $reflector;

  public function __construct($subject)
  {
    $this-&gt;subject = $subject;
    $this-&gt;reflector = new ReflectionObject($this-&gt;subject);
  }

  public function __set($name, $value)
  {
   try{
     $this-&gt;setProperty($name, $value);
   }
   catch(ReflectionException $e)
   {
     $this-&gt;subject-&gt;$name = $value;
   }
  }

  public function __get($name)
  {
    try{
      return $this-&gt;getProperty($name);
    }
    catch(ReflectionException $e)
    {
      return NULL;
    }
  }

  public function __call($name, $params)
  {
    return $this-&gt;callMethod($name, $params);
  }

  public function setStatic($name, $value)
  {
    $this-&gt;setProperty($name, $value);
  }

  public function getStatic($name)
  {
    return $this-&gt;getProperty($name);
  }

  public function callStatic($name, $params=array())
  {
    return $this-&gt;callMethod($name, $params);
  }

  /**
   * Calls a method on $subject
   * @param String $name of the method
   * @param Array $params of the method
   * @return mixed
   */
  private function callMethod($name, $params)
  {
    $method = $this-&gt;reflector-&gt;getMethod($name);
    $method-&gt;setAccessible(true);
    $params = array_merge(array($this-&gt;subject), $params);
    return call_user_func_array(array($method, &quot;invoke&quot;), $params);
  }

  /**
   * Returns a property from $subject
   * @param String $name of property
   * @return mixed
   */
  private function getProperty($name)
  {
    $property = $this-&gt;reflector-&gt;getProperty($name);
    $property-&gt;setAccessible(true);
    return $property-&gt;getValue($this-&gt;subject);
  }

  /**
   * Sets a property on $subject
   * @param String $name of property
   * @param mixed $val to set it to
   * @return void
   */
  private function setProperty($name, $val)
  {
    $property = $this-&gt;reflector-&gt;getProperty($name);
    $property-&gt;setAccessible(true);
    return $property-&gt;setValue($this-&gt;subject, $val);
  }
}
</pre>
<p>Clearly this is not made for use in production or to fight against bad design &#8211; but I think it will be very handy for testing.</p>
<p>You can have a look at the complete code at GitHub <a href="https://github.com/shostakovich/Decapsulator">https://github.com/shostakovich/Decapsulator</a> (Feel free to fork it and add to it if you want)</p>
<p>As always I would be interested in your feedback. Are there better ways to decapsulate objects?</p>
<p>Verwandte Artikel:<ol>
<li><a href='http://www.zipfelmaus.com/blog/php-snippet-nabaztag-per-api-textnachrichten-senden/' rel='bookmark' title='PHP-Snippet: Nabaztag per API Textnachrichten schicken'>PHP-Snippet: Nabaztag per API Textnachrichten schicken</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.zipfelmaus.com/blog/advanced-php-decapsulating-objects/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Notiz: Probleme nach Wechsel des Providers mit Mint beheben</title>
		<link>http://www.zipfelmaus.com/blog/notiz-probleme-nach-wechsel-des-providers-mit-mint-beheben/</link>
		<comments>http://www.zipfelmaus.com/blog/notiz-probleme-nach-wechsel-des-providers-mit-mint-beheben/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 16:42:17 +0000</pubDate>
		<dc:creator>Rocu</dc:creator>
				<category><![CDATA[Webkram]]></category>
		<category><![CDATA[CRC32]]></category>
		<category><![CDATA[Mint]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Problem]]></category>

		<guid isPermaLink="false">http://www.zipfelmaus.com/?p=1437</guid>
		<description><![CDATA[Zum zweiten mal hatte ich nun das Problem, dass nach dem Umzug von Zipfelmaus von einem Provider/Server zum nächsten die Statistiken komplett verdreht und offensichtlich falsch waren. Nachdem ich beim ersten mal ziemlich lange für den Grund gesucht hatte, wusste ich diesmal woran es liegt: Die CRC32 Prüfsummen die Mint für die URL&#8217;s errechnet unterscheiden [...]
Verwandte Artikel:<ol>
<li><a href='http://www.zipfelmaus.com/blog/eagle-probleme-mit-lib-beheben/' rel='bookmark' title='Eagle: Probleme mit Lib beheben'>Eagle: Probleme mit Lib beheben</a></li>
<li><a href='http://www.zipfelmaus.com/blog/arduino-ethernetshield-shaun-inmans-mint-lcd-display-zipfelmint/' rel='bookmark' title='Arduino + EthernetShield + Shaun Inman&#8217;s Mint + LCD-Display = ZipfelMint'>Arduino + EthernetShield + Shaun Inman&#8217;s Mint + LCD-Display = ZipfelMint</a></li>
<li><a href='http://www.zipfelmaus.com/blog/zahlendreher-und-ihre-folgen/' rel='bookmark' title='Zahlendreher und ihre Folgen und andere Probleme'>Zahlendreher und ihre Folgen und andere Probleme</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Zum zweiten mal hatte ich nun das Problem, dass nach dem Umzug von Zipfelmaus von einem Provider/Server zum nächsten die Statistiken komplett verdreht und offensichtlich falsch waren. Nachdem ich beim ersten mal ziemlich lange für den Grund gesucht hatte, wusste ich diesmal woran es liegt: Die CRC32 Prüfsummen die Mint für die URL&#8217;s errechnet unterscheiden sich zwischen 32 und 64-Bit Systemen.</p>
<p><img src="http://www.zipfelmaus.com/wp-content/uploads/2010/02/mint1.jpg" alt="" width="606" height="376" /></p>
<blockquote><p>This function returns an unsigned integer from a 64-bit Linux platform.  It does return the signed integer from other 32-bit platforms even a 64-bit Windows one.</p>
<p>The reason is because the two constants PHP_INT_SIZE and PHP_INT_MAX have different values on the 64-bit Linux platform.</p></blockquote>
<p>Letztendlich kann man also von keinem echten Problem mit Mint selber sprechen. Da Shaun Inman offensichtlich recht viele Leute um Hilfe gefragt haben hat <a href="http://haveamint.com/tmp/checksums.php.zip">er ein kleines Script</a> geschrieben, dass die Prüfsummen korrigiert. Danach arbeitet Mint wieder wie gewohnt <img src='http://www.zipfelmaus.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Verwandte Artikel:<ol>
<li><a href='http://www.zipfelmaus.com/blog/eagle-probleme-mit-lib-beheben/' rel='bookmark' title='Eagle: Probleme mit Lib beheben'>Eagle: Probleme mit Lib beheben</a></li>
<li><a href='http://www.zipfelmaus.com/blog/arduino-ethernetshield-shaun-inmans-mint-lcd-display-zipfelmint/' rel='bookmark' title='Arduino + EthernetShield + Shaun Inman&#8217;s Mint + LCD-Display = ZipfelMint'>Arduino + EthernetShield + Shaun Inman&#8217;s Mint + LCD-Display = ZipfelMint</a></li>
<li><a href='http://www.zipfelmaus.com/blog/zahlendreher-und-ihre-folgen/' rel='bookmark' title='Zahlendreher und ihre Folgen und andere Probleme'>Zahlendreher und ihre Folgen und andere Probleme</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.zipfelmaus.com/blog/notiz-probleme-nach-wechsel-des-providers-mit-mint-beheben/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fever° &#8211; Heisser RSS-Reader für den eigenen Web-Space.</title>
		<link>http://www.zipfelmaus.com/blog/fever%c2%b0-heisser-rss-reader-fur-den-eigenen-web-space/</link>
		<comments>http://www.zipfelmaus.com/blog/fever%c2%b0-heisser-rss-reader-fur-den-eigenen-web-space/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 19:03:32 +0000</pubDate>
		<dc:creator>Rocu</dc:creator>
				<category><![CDATA[Webkram]]></category>
		<category><![CDATA[Weiche Ware]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Feed]]></category>
		<category><![CDATA[Fever]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://www.zipfelmaus.com/?p=1248</guid>
		<description><![CDATA[Mit den RSS-Feeds ist es immer so eine Sache. Haben sich einmal mehrere hundert verschiedene RSS-Feeds angesammelt, ist es schwer noch Schritt zu halten. An vielenTagen fehlt mir einfach die Zeit alle davon zu lesen &#8211; ich möchte aber trotzdem nichts entscheidenes verpassen. Vor einiger Zeit habe ich von einem Freund Fever° empfohlen bekommen und [...]
Verwandte Artikel:<ol>
<li><a href='http://www.zipfelmaus.com/blog/yacy-eine-verteilte-suchmaschine/' rel='bookmark' title='Yacy &#8211; Eine verteilte Suchmaschine'>Yacy &#8211; Eine verteilte Suchmaschine</a></li>
<li><a href='http://www.zipfelmaus.com/bau-dir-deinen-eigenen-gartentisch/' rel='bookmark' title='Bau dir deinen eigenen Gartentisch'>Bau dir deinen eigenen Gartentisch</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Mit den RSS-Feeds ist es immer so eine Sache. Haben sich einmal mehrere hundert verschiedene RSS-Feeds angesammelt, ist es schwer noch Schritt zu halten. An vielenTagen fehlt mir einfach die Zeit alle davon zu lesen &#8211; ich möchte aber trotzdem nichts entscheidenes verpassen. Vor einiger Zeit habe ich von einem Freund Fever° empfohlen bekommen und möchte der werten Leserschaft nach einigen Wochen intensiven Einsatzes diese kleine Applikation einmal vorstellen.</p>
<p>Fever° ist ein RSS-Reader, den man auf dem eigenen Webspace installiert. Das Programm basiert auf PHP und MySQL, kostet 30$ und wird von Shaun Inman (der unter anderem auch durch <a href="http://www.haveamint.com/">Mint </a>bekannt ist) entwickelt.</p>
<p>Fever° bietet neben einer Ansicht, die Google sehr an Google Reader erinnert. Man scrollt durch eine lange Liste der Feedeinträge, die dann automatisch als gelesen markiert werden. Was Fever aber besonders macht, ist eine tolle Funktion mit der man relevante Einträge herausfiltern kann. Fever wertet hierzu die in den Feedeinträgen enthaltenen Links aus und zeigt die besten Stories in einer Übersicht an. Dabei ordnet Fever den &#8216;heißen&#8217; Links auch jeweils auch jeweils eine Temperatur in Grad Celcius/Fahrenheit zu. Wie das aussieht sieht man schön in folgendem Video:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="606" height="500" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.youtube.com/v/p3PcR7adhCU&amp;hl=de&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="606" height="500" src="http://www.youtube.com/v/p3PcR7adhCU&amp;hl=de&amp;fs=1&amp;" allowfullscreen="true"></embed></object></p>
<p>Die Feeds sind in Must-reads und &#8220;Sparks&#8221; eingeteilt. Sparks sind einfach Feeds, in denen täglich was los ist und die einen wirklich nicht immer interessieren. Desto mehr Sparks abonniert sind umso nützlicher ist Fever° und desto zuverlässiger kann Fever° wirklich interessante Stories in den Links der vielen Artikel finden.</p>
<p>Heraus kommt dann am Ende eine Liste mit dem besten Stories aus seinen Lieblingsblogs.</p>
<p>Am praktischsten finde ich persönlich aber, dass ich das Programm komplett mit der Tastatur bedienen kann und dabei sogar eigene Hotkeys belegen darf. So habe ich z.B. die Taste <strong>Y</strong> für YiGG reserviert und lande nach Tastendruck automatisch auf einem fast vollständig ausgefüllten Formular zum einstellen meiner Nachrichten. Auf die Taste &#8220;T habe ich mir Tweetie gelegt, was absolut ideal ist um interessante Links direkt zu Twittern.</p>
<p>Den größten Nachteil an Fever° sehe ich darin, dass man die Software nicht vor dem Kauf testen kann. Lediglich ein Script, dass die Kompatiblität des Webservers testet steht bereit. Trotzdem habe ich den Kauf in den letzten Monaten nicht bereut. Fever° ermöglicht mir mich vom Rauschen des Internets abzulösen, wann ich es will und daher auch meine Empfehlung sich das ganze mal näher anzusehen.</p>
<h3>Links zu diesem Eintrag</h3>
<ul>
<li><a href="http://www.feedafever.com/">Fever°</a></li>
</ul>
<p>Verwandte Artikel:<ol>
<li><a href='http://www.zipfelmaus.com/blog/yacy-eine-verteilte-suchmaschine/' rel='bookmark' title='Yacy &#8211; Eine verteilte Suchmaschine'>Yacy &#8211; Eine verteilte Suchmaschine</a></li>
<li><a href='http://www.zipfelmaus.com/bau-dir-deinen-eigenen-gartentisch/' rel='bookmark' title='Bau dir deinen eigenen Gartentisch'>Bau dir deinen eigenen Gartentisch</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.zipfelmaus.com/blog/fever%c2%b0-heisser-rss-reader-fur-den-eigenen-web-space/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>YaCyStats-Plugin für WordPress</title>
		<link>http://www.zipfelmaus.com/blog/yacystats-plugin-fur-wordpress/</link>
		<comments>http://www.zipfelmaus.com/blog/yacystats-plugin-fur-wordpress/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 17:21:21 +0000</pubDate>
		<dc:creator>Rocu</dc:creator>
				<category><![CDATA[PHP 5]]></category>
		<category><![CDATA[YaCy]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Statistiken]]></category>
		<category><![CDATA[Widget]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.zipfelmaus.com/?p=917</guid>
		<description><![CDATA[Seit dem ich das letzte mal über YaCy die verteilte Suchmaschine geblogt habe, hat sich einiges getan. Ich habe sehr viel Zeit mit der Pflege und Wartung meines Peers zugebracht und durfte mit ansehen, wie YaCy immer stabiler wurde. Inszwischen ist YaCy in der Version 0.91 und das spürt man. Die Performance hat sich nach [...]
Verwandte Artikel:<ol>
<li><a href='http://www.zipfelmaus.com/comment-to-nabaztag-wordpress-plugin/' rel='bookmark' title='Comment to Nabaztag WordPress Plugin'>Comment to Nabaztag WordPress Plugin</a></li>
<li><a href='http://www.zipfelmaus.com/blog/comments-to-nabaztag-version-01/' rel='bookmark' title='Comments to Nabaztag Version 0.1'>Comments to Nabaztag Version 0.1</a></li>
<li><a href='http://www.zipfelmaus.com/blog/tracking-in-yacy-einbauen/' rel='bookmark' title='Tracking in YaCy einbauen'>Tracking in YaCy einbauen</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Seit dem ich das letzte mal über <a href="http://www.yacy.net">YaCy die verteilte Suchmaschine</a> geblogt habe, hat sich einiges getan. Ich habe sehr viel Zeit mit der Pflege und Wartung meines Peers zugebracht und durfte mit ansehen, wie YaCy immer stabiler wurde.</p>
<p>Inszwischen ist YaCy in der Version 0.91 und das spürt man. Die Performance hat sich nach einer Umstellung auf die <a href="http://forum.yacy-websuche.de/viewtopic.php?f=5&amp;t=1940">neue IndexCell Datenstruktur</a> vervielfacht. Die Suche wurde optisch und Funktional wunderbar durch ein wenig Javascript aufgewertet. Man muss seinen Peer nicht mehr alle paar Stunden neustarten: Kurz es macht immer mehr Spaß YaCy zu benutzen.</p>
<p><img class="alignleft size-full wp-image-920" title="yacy_stats" src="http://www.zipfelmaus.com/wp-content/uploads/2009/07/yacy_stats.jpg" alt="yacy_stats" width="293" height="218" />Nun lenkt YaCy aber natürlich auch ein wenig vom Bloggen ab und daher habe ich mir mal ein paar  Stunden Zeit genommen und schnell ein kleines WordPress-Plugin zusammengestrickt. Es zeigt den Status eines YaCy Peers in einem WordPress-Widget an und kann in jedem Theme benutzt werden, dass Widgets unterstützt.</p>
<p>Die Daten bezieht das Plugin über die in YaCy integrierte API und benutzt SimpleXML um sie aus der Antwort zu picken.</p>
<p>Um den Peer nicht mit sinnlosen anfragen zu belasten und die Antwortzeiten des Blogs gering zu halten, werden die Statistiken für einen selbst einstellbaren Zeitraum in der Blogdatenbank zwischengespeichert.</p>
<p>Angezeigt werden der Name des Peers, PPM,Wörter und die Anzahl der indexierten URLs.</p>
<p>Das Plugin läuft bei mir stabil &#8211; wie immer übernehme ich aber keine Gewähr für perfektes funktionieren, helfe aber gerne bei Fehlern weiter und freue mich über eure Kommentare, Patches oder Anregungen.</p>
<p>Entgegen der sonst bei Zipfelmaus üblichen Lizenz steht das Plugin  unter <a href="http://www.gnu.de/documents/gpl.de.html">GNU General Public License (Version 3)</a> um später von WordPress.org gehostet werden zu dürfen.</p>
<h3>Version-History</h3>
<h4>Version 0.1.1 Alpha</h4>
<p>- Unterdrücke PHP-Warnung, wenn Peer nicht erreichbar<br />
- Bug beghoben, bei dem das Widget möglw. nicht ausgeblendet wird, wenn Peer nicht erreichbar</p>
<p><strong>Download:</strong> <a href='http://www.zipfelmaus.com/wp-content/uploads/2009/07/yacyPlugin_0.1.1.php.zip'> yacyPlugin_0.1.1.php</a></p>
<h4>Version 0.1 Alpha</h4>
<p>- Hinzufügen von Konfigurationsmöglichkeiten für die URL des Peers und die Zeit des vorhaltens der Ergebnisse im lokalen Cache<br />
<strong>Download:</strong> <a href="http://www.zipfelmaus.com/wp-content/uploads/2009/07/yacyPlugin_0.1.php.zip">yacyStatsPlugin_0.1</a></p>
<p>Verwandte Artikel:<ol>
<li><a href='http://www.zipfelmaus.com/comment-to-nabaztag-wordpress-plugin/' rel='bookmark' title='Comment to Nabaztag WordPress Plugin'>Comment to Nabaztag WordPress Plugin</a></li>
<li><a href='http://www.zipfelmaus.com/blog/comments-to-nabaztag-version-01/' rel='bookmark' title='Comments to Nabaztag Version 0.1'>Comments to Nabaztag Version 0.1</a></li>
<li><a href='http://www.zipfelmaus.com/blog/tracking-in-yacy-einbauen/' rel='bookmark' title='Tracking in YaCy einbauen'>Tracking in YaCy einbauen</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.zipfelmaus.com/blog/yacystats-plugin-fur-wordpress/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Neue &#8220;Community&#8221;: Damagedealer</title>
		<link>http://www.zipfelmaus.com/blog/neue-community-damagedealer/</link>
		<comments>http://www.zipfelmaus.com/blog/neue-community-damagedealer/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 21:00:15 +0000</pubDate>
		<dc:creator>Rocu</dc:creator>
				<category><![CDATA[Spielemaus]]></category>
		<category><![CDATA[Webkram]]></category>
		<category><![CDATA[Damagedealer]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.zipfelmaus.com/blog/neue-community-damagedealer/</guid>
		<description><![CDATA[Seit heute gibt es eine neue Stern am Himmel der MMORPG-Welt. Phantom hat während der letzten Wochen unermüdlich an der Webseite programmiert und auch wenn noch ein weiter Weg vor Damagedealer liegt, war ich trotzdem bereits nach dem ersten Mal, als er mir von dem Konzept erzählte, sicher, dass das ganze klappen könnte. Worum geht [...]
Verwandte Artikel:<ol>
<li><a href='http://www.zipfelmaus.com/blog/eine-neue-haut-fur-mein-netbook/' rel='bookmark' title='Eine neue Haut für mein Netbook'>Eine neue Haut für mein Netbook</a></li>
<li><a href='http://www.zipfelmaus.com/blog/neue-einsichten-dank-usb-mikroskop/' rel='bookmark' title='Neue Einsichten, dank USB-Mikroskop'>Neue Einsichten, dank USB-Mikroskop</a></li>
<li><a href='http://www.zipfelmaus.com/blog/2-neue-projekte/' rel='bookmark' title='2 neue Projekte'>2 neue Projekte</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Seit heute gibt es eine neue Stern am Himmel der MMORPG-Welt. Phantom hat während der letzten Wochen unermüdlich an der Webseite programmiert und auch wenn noch ein weiter Weg vor <a href="http://www.damagedealer.de/" target="_blank">Damagedealer</a> liegt, war ich trotzdem bereits nach dem ersten Mal, als er mir von dem Konzept erzählte, sicher, dass das ganze klappen könnte.</p>
<p>
<img src="http://www.zipfelmaus.com/wp-content/uploads/2009/04/damagedealer01.png" width="716" height="544" alt="damagedealer01.png" /></p>
<p>Worum geht es also bei Damagedealer.com? Einerseits ist die Seite eine Videoplattform, die Videos in einer wirklich exzellenten Qualität anbietet. Zur Zeit befinden sich eine ganze Stange von Eve-Online Videos auf Damagedealer, die von der Vorgängerseite EveTube-Online stammen. Auf der anderern Seite soll Damagedealer aber auch eine Art Facebook für Onlinerollenspieler sein.</p>
<p>Von seiner Grundidee ist das eine Anwendung, von der ich bisher nicht wusste, dass ich sie unbedingt haben will &#8211; aber das Problem &#8220;des sich über Spielegrenzen hinweg Wiederfindens&#8221; besteht ja definitiv. Beispielsweise würde ich gerne wissen, was meine alten Diablo II -Kollegen den so treiben und ob vielleicht einige von ihnen auch World of Warcraft spielen &#8211; allerdings hatte ich bisher natürlich keine Chance das rauszufinden. Mit Damagedealer soll sich das ändern. Nach der Anmeldung kann man die Daten aller Charaktere hinterlegen, die man bislang gespielt hat. Meldet sich dann ein ein Clanmember aus alten Zeiten an, führt Damagedealer virtuell die Familie wieder zusammen.</p>
<p>Das Ganze wird natürlich nur funktionieren, wenn Damagedealer eine gewisse kritische Masse an Usern überschritten hat &#8211; da wir so gut wie keine Informationen von euch für die Anmeldung verlangen (weil wir sie für unser Konzept ja auch gar nicht benötigen), könnt ihr euch einfach anmelden, eure alten/aktuellen Charaktere eintragen und abwarten was passiert &#8211; E-Mail Junk habt ihr nicht zu erwarten.</p>
<p><img src="http://www.zipfelmaus.com/wp-content/uploads/2009/04/damagedealer02.png" width="716" height="527" alt="damagedealer02.png" /></p>
<p>Neben Videos und den sozialen Funktionen haben wir noch Foren, einen Bilderservice, Spieleportale und einen Twitter-Abklatsch nahmens Smash The Bird eingebaut &#8211; wir hoffen es gefällt <img src='http://www.zipfelmaus.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Genauso wie bei unseren anderen Projekten sind wir für euch erreichbar und haben DamageDealer gebaut, weil wir die Funktionen vor allen Dingen für uns selber haben wollten. Ihr könnt uns unter den Namen rocu und phantom als Freunde hinzufügen.</p>
<p>Damagedealer befindet sich noch im Aufbau und wir hoffen auf konstruktives Feedback, Kritik und Ideen von eurer Seite um das Portal so nett wie möglich zu machen.</p>
<p><a href="http://www.damagedealer.de/" target="_blank">So aber jetzt nichts wie ab und anmelden liebe rollenspielende Zipfelleser!</a> Wie ihr in der Überschirft lest, steht das mit der Community in Gänsefüsschen &#8211; helft mit, dass wir sie eines Tages entfernen können <img src='http://www.zipfelmaus.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Verwandte Artikel:<ol>
<li><a href='http://www.zipfelmaus.com/blog/eine-neue-haut-fur-mein-netbook/' rel='bookmark' title='Eine neue Haut für mein Netbook'>Eine neue Haut für mein Netbook</a></li>
<li><a href='http://www.zipfelmaus.com/blog/neue-einsichten-dank-usb-mikroskop/' rel='bookmark' title='Neue Einsichten, dank USB-Mikroskop'>Neue Einsichten, dank USB-Mikroskop</a></li>
<li><a href='http://www.zipfelmaus.com/blog/2-neue-projekte/' rel='bookmark' title='2 neue Projekte'>2 neue Projekte</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.zipfelmaus.com/blog/neue-community-damagedealer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony &#8211; Whoops. Hashfunktionen sind langsam :)</title>
		<link>http://www.zipfelmaus.com/blog/symfony-whoops-hashfunktionen-sind-langsam/</link>
		<comments>http://www.zipfelmaus.com/blog/symfony-whoops-hashfunktionen-sind-langsam/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 08:44:12 +0000</pubDate>
		<dc:creator>Rocu</dc:creator>
				<category><![CDATA[PHP 5]]></category>
		<category><![CDATA[Webkram]]></category>
		<category><![CDATA[Weiche Ware]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.zipfelmaus.com/blog/symfony-whoops-hashfunktionen-sind-langsam/</guid>
		<description><![CDATA[Zitat aus dem Symfony-Blog: When the cache was switched on in settings.yml a partial&#8217;s variables were always passed through md5(serialize($vars)) Weiterhin schreibt Kris Wallsmith, das MD5 auf riesige Datenmengen anzuwenden doch recht langsam ist &#8211; wo ich nur zustimmen kann Vor 3 Tagen hat Kris das ganze gefixt (von md5() ) befreit und es scheint, [...]
Verwandte Artikel:<ol>
<li><a href='http://www.zipfelmaus.com/blog/nahomailplugin-fur-symfony/' rel='bookmark' title='nahoMailPlugin für Symfony'>nahoMailPlugin für Symfony</a></li>
<li><a href='http://www.zipfelmaus.com/blog/continous-integration-with-hudson-git-and-symfony/' rel='bookmark' title='Continous Integration with Hudson, GIT and Symfony'>Continous Integration with Hudson, GIT and Symfony</a></li>
<li><a href='http://www.zipfelmaus.com/blog/langsam-nahrt-sich-das-eichhornchen/' rel='bookmark' title='Langsam nährt sich das Eichhörnchen'>Langsam nährt sich das Eichhörnchen</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Zitat aus dem <a href="http://www.symfony-project.org/blog/2009/04/02/your-apps-are-faster">Symfony-Blog:</a></p>
<blockquote><p>
  When the cache was switched on in settings.yml a partial&#8217;s variables were <em>always</em> passed through <code style="font-family: 'Bitstream Vera Sans Mono', monospace;">md5(serialize($vars))</code>
</p></blockquote>
<p><a title="Cache from Bolt of Blue(Flickr)" href="http://www.flickr.com/photos/boltofblue/1261246167/"><img src="http://farm2.static.flickr.com/1303/1261246167_31dc1f9b03.jpg" alt="" /></a></p>
<p>Weiterhin schreibt Kris Wallsmith, das MD5 auf riesige Datenmengen anzuwenden doch recht langsam ist &#8211; wo ich nur zustimmen kann <img src='http://www.zipfelmaus.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Vor 3 Tagen hat Kris das ganze gefixt (von md5() ) befreit und es scheint, dass wir bei YiGG nun endlich noch mehr Zeug cachen werden können. Leider hatten wir bisher das Problem, dass besonders bei vielen gecachten Fragmenten die Performance anstelle sich zu verbessern in den Keller ging.</p>
<p>Vielen dank Kris! Manchmal stecken solche Fehler im Detail. Wen die ganze Story interessiert, der möge doch bitte einfach im <a href="http://www.symfony-project.org/blog/2009/04/02/your-apps-are-faster" title="Symfony Blog - Your Apps are Faster!" target="_blank">Symfony-Blog nachlesen</a>.</p>
<p>Verwandte Artikel:<ol>
<li><a href='http://www.zipfelmaus.com/blog/nahomailplugin-fur-symfony/' rel='bookmark' title='nahoMailPlugin für Symfony'>nahoMailPlugin für Symfony</a></li>
<li><a href='http://www.zipfelmaus.com/blog/continous-integration-with-hudson-git-and-symfony/' rel='bookmark' title='Continous Integration with Hudson, GIT and Symfony'>Continous Integration with Hudson, GIT and Symfony</a></li>
<li><a href='http://www.zipfelmaus.com/blog/langsam-nahrt-sich-das-eichhornchen/' rel='bookmark' title='Langsam nährt sich das Eichhörnchen'>Langsam nährt sich das Eichhörnchen</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.zipfelmaus.com/blog/symfony-whoops-hashfunktionen-sind-langsam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bessere Kommentare für eure PHP-Skripte</title>
		<link>http://www.zipfelmaus.com/blog/bessere-kommentar-fur-eure-php-skripte/</link>
		<comments>http://www.zipfelmaus.com/blog/bessere-kommentar-fur-eure-php-skripte/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 19:28:03 +0000</pubDate>
		<dc:creator>Rocu</dc:creator>
				<category><![CDATA[PHP 5]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[Kommentare]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[phpDocumentor]]></category>
		<category><![CDATA[Programmieren]]></category>

		<guid isPermaLink="false">http://web2.0du.de/?p=421</guid>
		<description><![CDATA[Als PHP-Programmier erlebe ich häufig eine Geringschätzung gegenüber PHP, die sich bei genauerer Betrachtung oftmals als Unwissen oder Unfähigkeit herausstellt. Möglicherweise ist der schlechte Ruf von PHP sicher darin verwurzelt, dass man sehr unsauber damit programmieren kann und oft kräuseln sich einem beim lesen von Codefragmenten die Zehennägel. In meiner neuen Kategorie PHP 5 möchte [...]
Verwandte Artikel:<ol>
<li><a href='http://www.zipfelmaus.com/blog/eee-box-eee-box-xandros-ubuntu-die-bessere-eee-box/' rel='bookmark' title='EEE Box: EEE-Box &#8211; Xandros + Ubuntu = die bessere EEE Box'>EEE Box: EEE-Box &#8211; Xandros + Ubuntu = die bessere EEE Box</a></li>
<li><a href='http://www.zipfelmaus.com/blog/comments-to-nabaztag-version-01/' rel='bookmark' title='Comments to Nabaztag Version 0.1'>Comments to Nabaztag Version 0.1</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Als PHP-Programmier erlebe ich häufig eine Geringschätzung gegenüber PHP, die sich bei genauerer Betrachtung oftmals als Unwissen oder Unfähigkeit herausstellt.</p>
<p>Möglicherweise ist der schlechte Ruf von PHP sicher darin verwurzelt, dass man <strong>sehr</strong> unsauber damit programmieren kann und oft kräuseln sich einem beim lesen von Codefragmenten die Zehennägel.</p>
<p>In meiner neuen Kategorie PHP 5 möchte ich euch ein paar Kniffe zeigen, mit denen man seinen eigenen Programmierstyl verbessern kann. Inwiefern diese Ratschläge nützlich sind, sei dem Leser überlassen.</p>
<p>Heute geht es um das leidige Thema Kommentare.</p>
<h2>Warum sind Kommentare wichtig?</h2>
<p>Bei YiGG haben wir im laufe der Zeit viele zehntausend Zeilen Quellcode erzeugt. Wir sind ein kleines Team und jeder von uns hat einen Großteil des Codes schon einmal gesehen. Würden wir nicht akribisch auf die Dokumentation des Codes achten, hätten wir schnell einen echtes Problem und würden Stunden damit verbringen herauszufinden, was Funktion xyz genau macht.</p>
<blockquote cite="http://manual.phpdoc.org/HTMLframesConverter/default/"><p>
Writing good documentation is essential to the success of any software project. The quality of documentation can be even more important than the quality of the code itself, as a good first impression will prompt developers to look further into your code. </p></blockquote>
<p>Um ein guter PHP-Entwickler zu werden, sollte man also gleich von Anfang an darauf achten, vernünftige Kommentare zu schreiben.</p>
<h2>Industriestandard phpDocumentor</h2>
<p>Es empfiehlt sich für seine Kommentare ein einheitliches Format zu verwenden, dass von jedem anderen professionellen PHP-Programmierer verstanden wird.</p>
<p>In der PHP-Welt hat sich in den letzten Jahren zusehends das phpDocumentor-Format durchgesetzt. Es hat den großen Vorteil,  dass die Dokumentation nicht nur gut für Menschen sondern auch gut durch Maschinen lesbar ist. Konkret bedeutet das: Wer seine Dokumentation mit phpDocumentor schreibt, wird auch in allen IDE&#8217;s später den Komfort der Autocompletion für seinen eigenen Code genießen können.</p>
<p>Ein weiterer Vorteil ist das man mit phpDocumentor auch eine komplette und klickbare Dokumentation all seiner Klassen und Funktionen erstellen lassen kann</p>
<p>Aber lassen wir kurz mal den Code sprechen, damit ihr am Beispiel einer Datei aus einem beliebigen großen PHP-Projekt mal sehen könnt wie so etwas aussieht.</p>
<pre name="code" class="php">
< ?php
/**
 * Piwik - Open source web analytics
 *
 * @link http://piwik.org
 * @license http://www.gnu.org/licenses/gpl-3.0.html Gpl v3 or later
 * @version $Id: Auth.php 581 2008-07-27 23:07:52Z matt $
 *
 * @package Piwik
 */

interface Piwik_Auth {
	/**
	 * @return Piwik_Auth_Result
	 */
	public function authenticate();
}

/**
 *
 * @package Piwik
 */
class Piwik_Auth_Result extends Zend_Auth_Result
</pre>
<p>Sowohl jede Datei, als auch jede Klasse und Funktion werden dokumentiert. Die Tags sind dabei genau festgelegt. Als Einstieg empfiehlt es sich folgendes <a href="http://2tbsp.com/system/files/phpdoc_cheatsheet.pdf">Cheatsheet</a> von <a href="http://2tbsp.com/">2tbsb.com</a> herunterzuladen. Es lohnt sich, das PDF auszudrucken und immer in Sichtweite zu haben, bis man die wichtigsten Tags verinnerlicht hat.</p>
<p>Nützlich können ausserdem IDE's sein, die die phpDocumentor-Tags automatisch ergänzen.</p>
<h2>Sonstige Konventionen</h2>
<p>Oft benutz und auch von vielen IDEs erkannt werden auch Kommentare wie:<br />
//@todo Eine bessere Lösung finden</p>
<h2>Man kann auch zu viel kommentieren!</h2>
<p>Leider sieht man manchmal auch Dateien mit zu vielen Kommentaren - Trivialitäten sollten nicht kommentiert werden. Auch wenn sich das einfach anhört, aber zumindest ich habe am Anfang zu viel kommentiert und auch das macht den Code unübersichtlich.</p>
<p>Die Oftmals bessere Lösung ist z.b. das vergeben besserer Variablennamen oder das extrahieren einer Methode, die einen logischen Namen hat.</p>
<p>Der Code sollte an sich kommunizieren, was er tut. Solltet ihr also innerhalb einer Funktion den Drang verspüren zu kommentieren, lohnt es sich eine Sekunde innezuhalten und zu überlegen - kann ich das eleganter lösen? Sollte ich ein refactoring anwenden? Ist die Funktion zu lang? Meistens lautet die Antwort, dass man lieber nachpolieren sollte.</p>
<p>Wie haltet ihr es mit Kommentaren?</p>
<p>Verwandte Artikel:<ol>
<li><a href='http://www.zipfelmaus.com/blog/eee-box-eee-box-xandros-ubuntu-die-bessere-eee-box/' rel='bookmark' title='EEE Box: EEE-Box &#8211; Xandros + Ubuntu = die bessere EEE Box'>EEE Box: EEE-Box &#8211; Xandros + Ubuntu = die bessere EEE Box</a></li>
<li><a href='http://www.zipfelmaus.com/blog/comments-to-nabaztag-version-01/' rel='bookmark' title='Comments to Nabaztag Version 0.1'>Comments to Nabaztag Version 0.1</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.zipfelmaus.com/blog/bessere-kommentar-fur-eure-php-skripte/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>PHP-Snippet: Nabaztag per API Textnachrichten schicken</title>
		<link>http://www.zipfelmaus.com/blog/php-snippet-nabaztag-per-api-textnachrichten-senden/</link>
		<comments>http://www.zipfelmaus.com/blog/php-snippet-nabaztag-per-api-textnachrichten-senden/#comments</comments>
		<pubDate>Thu, 26 Feb 2009 14:40:01 +0000</pubDate>
		<dc:creator>Rocu</dc:creator>
				<category><![CDATA[Webkram]]></category>
		<category><![CDATA[Weiche Ware]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Nabaztag]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmieren]]></category>

		<guid isPermaLink="false">http://web2.0du.de/?p=366</guid>
		<description><![CDATA[Ja meine Anwendungen sind jetzt dicke Freunde mit meinem Nabaztag. Ich muss sagen, der Hase eignet sich ganz hervorragend für Statusnachrichten jeglicher Art! Es war nicht weiter schwer ein kleines Script zu schreiben, dass dem Hasen Text To Speech Nachrichten schickt. Da ich euch gerne an meiner Arbeit teilhaben lassen will, hier der Quellcode. Benutz [...]
Verwandte Artikel:<ol>
<li><a href='http://www.zipfelmaus.com/blog/advanced-php-decapsulating-objects/' rel='bookmark' title='Advanced PHP: Decapsulating Objects'>Advanced PHP: Decapsulating Objects</a></li>
<li><a href='http://www.zipfelmaus.com/comment-to-nabaztag-wordpress-plugin/' rel='bookmark' title='Comment to Nabaztag WordPress Plugin'>Comment to Nabaztag WordPress Plugin</a></li>
<li><a href='http://www.zipfelmaus.com/blog/comments-to-nabaztag-version-01/' rel='bookmark' title='Comments to Nabaztag Version 0.1'>Comments to Nabaztag Version 0.1</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Ja meine Anwendungen sind jetzt dicke Freunde mit meinem Nabaztag. Ich muss sagen, der Hase eignet sich ganz hervorragend für Statusnachrichten jeglicher Art!</p>
<p>Es war nicht weiter schwer ein kleines Script zu schreiben, dass dem Hasen Text To Speech Nachrichten schickt.</p>
<p><img alt="" src="http://web2.0du.de/wp-content/uploads/2009/02/nabaztag.png" title="Nabaztag in Action" class="alignnone" width="606" /></p>
<p>Da ich euch gerne an meiner Arbeit teilhaben lassen will, hier der Quellcode.</p>
<pre class="brush: php; title: ; notranslate">class NabaztagAPI
&lt; ?php
{
  private $endpoint = &quot;http://api.nabaztag.com/vl/FR/api.jsp?&quot;;
  private $auth_params; // Associative array with Sn + Token
  private $call_params; // Associative array with the params for this API-Call
  private $settings;

  /**
   * Constructs the first part of the nabaztag url, including credentials
   * @param string Serialnumber of the nabaztag ($sn)
   * @param string Auth-Token of the nabaztag ($token)
   * @param array settings
   */
  function __construct($sn, $token, $settings = array())
  {
    $this-&gt;auth_params = array(&quot;sn&quot; =&gt; $sn, &quot;token&quot; =&gt; $token);
    $this-&gt;settings = $settings;
  }

  /**
   * Sends a TTS (text to speech) message to the nabaztag
   * @param string $message
   * @return string
   */

  public function sendTts($message)
  {
    $this-&gt;call_params = array(&quot;tts&quot; =&gt; $message);
    return $this-&gt;callNabaztag();
  }

  /**
   * Constructs url and fires the request returns answer
   */

  private function callNabaztag()
  {
    $params = array_merge($this-&gt;auth_params, $this-&gt;call_params);
    $url = &quot;&quot;;

    $param_url = &quot;&quot;;
    foreach($params as $key =&gt; $val){
      $param_url .= sprintf(&quot;&amp;%s=%s&quot;, $key, urlencode($val));
    }

    $url = $this-&gt;endpoint.substr($param_url, 1);
    return file_get_contents($url);
  }
}</pre>
<p>Benutz wird die Klasse einfach so:</p>
<pre class="brush: php; title: ; notranslate">
$api = new NabaztagApi($nab_id, $nab_token);
$api-&gt;sendTts($message);
&lt;/pre&gt;
</pre>
<p>Verwandte Artikel:<ol>
<li><a href='http://www.zipfelmaus.com/blog/advanced-php-decapsulating-objects/' rel='bookmark' title='Advanced PHP: Decapsulating Objects'>Advanced PHP: Decapsulating Objects</a></li>
<li><a href='http://www.zipfelmaus.com/comment-to-nabaztag-wordpress-plugin/' rel='bookmark' title='Comment to Nabaztag WordPress Plugin'>Comment to Nabaztag WordPress Plugin</a></li>
<li><a href='http://www.zipfelmaus.com/blog/comments-to-nabaztag-version-01/' rel='bookmark' title='Comments to Nabaztag Version 0.1'>Comments to Nabaztag Version 0.1</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.zipfelmaus.com/blog/php-snippet-nabaztag-per-api-textnachrichten-senden/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>nahoMailPlugin für Symfony</title>
		<link>http://www.zipfelmaus.com/blog/nahomailplugin-fur-symfony/</link>
		<comments>http://www.zipfelmaus.com/blog/nahomailplugin-fur-symfony/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 20:33:30 +0000</pubDate>
		<dc:creator>Rocu</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[E-Mail]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Swift]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://web2.0du.de/?p=317</guid>
		<description><![CDATA[Seit ein paar Tagen arbeite ich mit ein paar Freunden an einem privaten Projekt. Für mich als eingefleischten Symfony-Entwickler war natürlich klar, dass auch hierfür nichts anderes in Frage kommen würde. Ich muss sagen, dass sich in den letzten Monaten wirklich erfreulich viel am und um das Framework getan hat und ich war nicht nur [...]
Verwandte Artikel:<ol>
<li><a href='http://www.zipfelmaus.com/blog/symfony-whoops-hashfunktionen-sind-langsam/' rel='bookmark' title='Symfony &#8211; Whoops. Hashfunktionen sind langsam :)'>Symfony &#8211; Whoops. Hashfunktionen sind langsam :)</a></li>
<li><a href='http://www.zipfelmaus.com/blog/continous-integration-with-hudson-git-and-symfony/' rel='bookmark' title='Continous Integration with Hudson, GIT and Symfony'>Continous Integration with Hudson, GIT and Symfony</a></li>
<li><a href='http://www.zipfelmaus.com/blog/mailapp-ich-benutze-lieber-postbox/' rel='bookmark' title='Mail.app? Ich benutze lieber Postbox.'>Mail.app? Ich benutze lieber Postbox.</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Seit ein paar Tagen arbeite ich mit ein paar Freunden an einem privaten Projekt. Für mich als eingefleischten Symfony-Entwickler war natürlich klar, dass auch hierfür nichts anderes in Frage kommen würde.</p>
<p>Ich muss sagen, dass sich in den letzten Monaten wirklich erfreulich viel am und um das Framework getan hat und ich war nicht nur überrascht von den zahlreichen Verbesserungen in Symfony 1.2, sondern auch von der reichaltigen Auswahl an Plugins, die es inzwischen gibt.</p>
<p>So bin ich unter anderem auch über das Plugin nahoMail gestolpert, dass es einem ermöglicht elegant E-Mails über Swift zu versenden. Es ähnelt eigentlich sehr dem, was wir bei YiGG selber auf Basis von Swift gebaut haben und kann z.B. Partials sauber in eine E-Mail rendern. Ich glaube, dass es für jemanden der selber noch keinen Code in der Richtung hat eine sehr gute Basis ist.</p>
<p>Zum senden einer E-Mail sind so im Grunde nur 2 Zeilen nötig und man hat die Präsentation schön sauber getrennt von seinem Code.</p>
<p>Besonders gut gefallen mir die Einstellungen: Man kann in seiner app.yml einfach ein Namensformat für seine Mails angeben:<br />
[Mein Projekt] &#8211; %s</p>
<p>Beide Teile des Strings laufen dann sauber durch die Internationalisierungsfunktion von Symfony.</p>
<p>Links zum Thema:<br />
<a href="http://www.symfony-project.org/plugins/nahoMailPlugin">nahoMailPlugin auf www.symfony-project.org</a><br />
<a href="http://www.swiftmailer.org/">Swift Mailer</a></p>
<p>Verwandte Artikel:<ol>
<li><a href='http://www.zipfelmaus.com/blog/symfony-whoops-hashfunktionen-sind-langsam/' rel='bookmark' title='Symfony &#8211; Whoops. Hashfunktionen sind langsam :)'>Symfony &#8211; Whoops. Hashfunktionen sind langsam :)</a></li>
<li><a href='http://www.zipfelmaus.com/blog/continous-integration-with-hudson-git-and-symfony/' rel='bookmark' title='Continous Integration with Hudson, GIT and Symfony'>Continous Integration with Hudson, GIT and Symfony</a></li>
<li><a href='http://www.zipfelmaus.com/blog/mailapp-ich-benutze-lieber-postbox/' rel='bookmark' title='Mail.app? Ich benutze lieber Postbox.'>Mail.app? Ich benutze lieber Postbox.</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.zipfelmaus.com/blog/nahomailplugin-fur-symfony/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

