<?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>GlobalIndustry-Project Blog</title>
	<atom:link href="http://blog.gi-project.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.gi-project.de</link>
	<description>web development, server administration, project managment &#38; more</description>
	<lastBuildDate>Sat, 06 Mar 2010 08:08:58 +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>Mehrere Versionen von jQuery parallel verwenden</title>
		<link>http://blog.gi-project.de/2010/03/mehrere-versionen-von-jquery-parallel-verwenden/</link>
		<comments>http://blog.gi-project.de/2010/03/mehrere-versionen-von-jquery-parallel-verwenden/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 08:08:58 +0000</pubDate>
		<dc:creator>Julian</dc:creator>
				<category><![CDATA[Allgemeines]]></category>

		<guid isPermaLink="false">http://blog.gi-project.de/?p=282</guid>
		<description><![CDATA[Um jQuery neben anderen Frameworks laufen zu lassen, gibt es die Möglichkeit einer noConflict-Methode. Beispielsweise ermöglicht Wordpress es damit, Prototype und jQuery zusammen einsetzen zu können, obwohl beide Frameworks by-default das Dollar-Zeichen $ als (verkürzten) Objektnamen verwenden.

&#60;script src='jquery-1.3.2.js'&#62;&#60;/script&#62;
&#60;script&#62;
  var jQuery132 = jQuery.noConflict&#40;&#41;;
&#60;/script&#62;
&#60;script src='jquery-1.4.2.js'&#62;&#60;/script&#62;
&#60;script&#62;
  var jQuery142 = jQuery.noConflict&#40;&#41;;
&#60;/script&#62;

Man muss allerdings darauf achten, dass die [...]]]></description>
			<content:encoded><![CDATA[<p>Um jQuery neben anderen Frameworks laufen zu lassen, gibt es die Möglichkeit einer noConflict-Methode. Beispielsweise ermöglicht Wordpress es damit, Prototype und jQuery zusammen einsetzen zu können, obwohl beide Frameworks by-default das Dollar-Zeichen $ als (verkürzten) Objektnamen verwenden.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script src<span style="color: #339933;">=</span><span style="color: #3366CC;">'jquery-1.3.2.js'</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span>
  <span style="color: #003366; font-weight: bold;">var</span> jQuery132 <span style="color: #339933;">=</span> jQuery.<span style="color: #660066;">noConflict</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>script src<span style="color: #339933;">=</span><span style="color: #3366CC;">'jquery-1.4.2.js'</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span>
  <span style="color: #003366; font-weight: bold;">var</span> jQuery142 <span style="color: #339933;">=</span> jQuery.<span style="color: #660066;">noConflict</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Man muss allerdings darauf achten, dass die jeweiligen Objekte direkt nach dem Einbinden der jeweiligen jQuery-Version erstellt werden, damit diese sich gegenseitig nicht überschreiben. So wird nämlich die Klasse jQuery mit Version 1.3.2 in Zeile 5 durch die neuere Version ersetzt. Das Objekt jQuery132 muss also bereits davor zugewiesen werden. Danach ist per Zugriff auf entweder jQuery132 oder jQuery142 die jeweilige jQuery-Version genau wie das &#8220;$&#8221; anzusprechen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gi-project.de/2010/03/mehrere-versionen-von-jquery-parallel-verwenden/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>postShare &#8211; Wordpress Plugin</title>
		<link>http://blog.gi-project.de/2010/03/postshare-wordpress-plugin/</link>
		<comments>http://blog.gi-project.de/2010/03/postshare-wordpress-plugin/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 08:31:37 +0000</pubDate>
		<dc:creator>Julian</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Mail]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[postShare]]></category>
		<category><![CDATA[pushWP]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://blog.gi-project.de/?p=266</guid>
		<description><![CDATA[
Download postShare 0.3
Seit Kurzem haben wir nun ja eine Mailingliste für interessierte Leser und Diskussionen rund um Webdevelopment, Serververwaltung, Netzwerke, Linux oder gar Elektrotechnik eingerichtet &#8211; alles was bei einer eierlegenden Wollmilchsau wie das GI Project eben so Gesprächsstoff bietet.
Es bot sich also an, aktuelle Artikel auf eben jener Mailingliste anzukündigen, beispielsweise als Alternative zu [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.gi-project.de/wp-content/uploads/2010/03/postShare.png" rel="lightbox[266]"><img src="http://blog.gi-project.de/wp-content/uploads/2010/03/postShare.png" alt="postShare Logo" title="postShare Logo" width="278" height="105" class="alignnone size-full wp-image-268" /></a><br />
<strong><a href='http://blog.gi-project.de/wp-content/uploads/2010/03/postShare-0.3.tar.gz'>Download postShare 0.3</a></strong></p>
<p>Seit Kurzem haben wir nun ja eine <a href="http://blog.gi-project.de/2010/02/mailingliste-informiert-uber-aktuelle-themen-rund-um-gi-project/">Mailingliste</a> für interessierte Leser und Diskussionen rund um Webdevelopment, Serververwaltung, Netzwerke, Linux oder gar Elektrotechnik eingerichtet &#8211; alles was bei einer eierlegenden Wollmilchsau wie das GI Project eben so Gesprächsstoff bietet.<br />
Es bot sich also an, aktuelle Artikel auf eben jener Mailingliste anzukündigen, beispielsweise als Alternative zu RSS. Zunächst entstand daraus eine kurz zusammengehackte Funktion, die bei jedem Veröffentlichen eines Blog-Artikels eine Mail versandt hat. Allerdings stolperte ich dann zufällig über Nils Langner <a href="http://www.phphatesme.com/blog/allgemein/pushwp-neues-wordpress-plugin/">pushWP-Plugin</a> und durchstöberte kurzerhand einmal dessen Vorgehensweise und Funktionalität. Von vielen Dingen habe ich mir dann einfach das Prinzip kopiert, jedoch bin ich schon bald auf einige Unstimmigheiten gestoßen, die mir so nicht gefielen.<br />
<span id="more-266"></span></p>
<p><em>Zitat von phphatesme.com:</em></p>
<blockquote><p>Das Teil kann bis jetzt eigentlich gar nichts, außer bei einem neuen Artikel einen Tweet abzusetzen.</p></blockquote>
<blockquote><p>Die Idee ist, dass ich alle Ideen, die ich so zum pushen des Blogs habe in dieses Plugin packe. Als nächstes wird wohl das “vor einem Jahr” Feature einfließen. Da werde ich euch aber natürlich noch informieren. Unsere Wordpress Erweiterung kann man also als Ergänzung zu den ganzen SEO Plugins sehen.</p></blockquote>
<p>Im Prinzip veröffentlicht das Plugin einen neuen Artikel einfach über Twitter. Meiner Meinung nach nicht sehr viel anders, als das was ich brauchte. Allerdings hätte ich das Ganze für eMails doch etwas umschreiben müssen und die Art und Weise, wie ein AddOn in pushWP hinzugefügt wurde, war mir nicht ganz ersichtlich. PushWP besteht aus einer Basis-Plugin-Datei, wie sie Wordpress vorschreibt (<em>wp-content/plugins/pushWP/pushWP.php</em>) und einigen zusätzlichen Dateien, wobei beispielsweise in <em>config_page.tpl.php</em> die HTML-Ausgabe des Plugins im AdminCenter steht und ein Unterordner <em>pushWP/AddOn</em> existiert. Das &#8220;twitter-AddOn&#8221; ist aber nicht vollständig in diesem Verzeichnis gekapselt, sondern besitzt seltsamerweise auch in der Basis-Plugin-Datei einige Zeilen Code. Das war mir dann doch zu verworren, um es anständig erweitern zu können.</p>
<p>Es entstand ein neues Plugin <em>postShare</em> mit folgenden Dateien:</p>
<ul>
<li>postShare.php &#8211; die Basis-Plugin-Datei</li>
<li>PostShare.php &#8211; enthält die Klasse PostShare</li>
<li>PostShareAddon.php &#8211; enthält die abstrakte Klasse PostShareAddon</li>
<li>config.tpl.php &#8211; enthält den HTML-Code zur Anzeige der Einstellungen im Admin-Panel</li>
<li>addons/ &#8211; enthält AddOns</li>
</ul>
<p>Die Basis-Datei initialisiert das PostShare-Objekt des momentanen Requests. Zudem werden hier Requests (POST) aus dem AdminCenter an das PostShare-Objekt deligiert, beispielsweise um Einstellungen zu ändern oder AddOns zu aktivieren / deaktivieren. Darüber hinaus wird die Wordpress-Funktion <em>transition_post_status</em> gehooked und dadurch eine Funktion aufgerufen, die dem PostShare-Objekt mitteilt, dass es einen neuen Artikel zum verteilen gibt.<br />
Das PostShare-Objekt verwaltet sozusagen all seine Plugins, bietet Möglichkeiten verschiedene Aktionen zu loggen und erstellt zu Beginn entsprechende benötigte Tabellen ö.ä. . Wie man sieht, ist das Plugin durch eigene Tabellen bereits wesentlich aufwändiger gestaltet als pushWP, allerdings entsprechend einfach zu erweitern.</p>
<p><strong>Wie sieht nun ein solches AddOn aus?</strong><br />
Ganz einfach! Ein AddOn ist eine Datei im Verzeichnis <em>postShare/addons/</em> und enthält eine gleichnamige Klasse, die von PostShareAddon vererbt wird. Dabei müssen lediglich noch drei Methoden vervollständigt werden: install(), share($data) und getName(). Wird das AddOn aktiviert, wird seine share-Methode immer bei einer Veröffentlichung eines neuen Artikels aufgerufen. Das Array $data enthält bereits fertig aus dem Post extrahierte Daten:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">	<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'title'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$title</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'content'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$content</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'content_parted'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$content_parted</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'link'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$link</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'author'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$author</span>
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Damit sollte der Großteil aller Informationen, die geshared werden sollen, abgedeckt sein. Das Post-Objekt habe ich bewusst nicht an die AddOns weitergereicht, damit man nicht jedes mal mühsam die einzelnen Informationen extrahieren muss (bis ich darauf kam, wie man $author extrahiert, hat es schon ganz schön gedauert!).<br />
Das PostShareEmail-AddOn sieht dann beispielsweise so aus:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
 * @package postShare
 * @author Julian Stier
 * @version 0.2
 */</span>
<span style="color: #000000; font-weight: bold;">class</span> PostShareEmail <span style="color: #000000; font-weight: bold;">extends</span> PostShareAddon <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> share<span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$from</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getOption</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'from'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$to</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getOption</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'to'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getOption</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$message</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getOption</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'message'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
		<span style="color: #000088;">$message</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'%title'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000088;">$message</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'%content'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'content'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000088;">$message</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'%less'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'content_parted'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000088;">$message</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'%link'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'link'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000088;">$message</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'%author'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'author'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
		<span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'%title'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$title</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'%content'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'content'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$title</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'%less'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'content_parted'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$title</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'%link'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'link'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$title</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'%author'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'author'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$title</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000088;">$header</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'From: '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$from</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\\</span>&quot;</span><span style="color: #339933;">;</span>
		wp_mail<span style="color: #009900;">&#40;</span><span style="color: #000088;">$to</span><span style="color: #339933;">,</span> <span style="color: #000088;">$title</span><span style="color: #339933;">,</span> <span style="color: #000088;">$message</span><span style="color: #339933;">,</span> <span style="color: #000088;">$header</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">log</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'EmailAddon shared '</span><span style="color: #339933;">.</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' to &quot;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$to</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;.'</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> install<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;">setOption</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'from'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setOption</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'title'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setOption</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'to'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setOption</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'message'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">log</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'EmailAddon options resetted (&lt;em&gt;from&lt;/em&gt;, &lt;em&gt;title&lt;/em&gt;, &lt;em&gt;to&lt;/em&gt;, &lt;em&gt;message&lt;/em&gt;).'</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> getName<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: #0000ff;">'PostShareEmail'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>An einigen Stellen mit Sicherheit noch verbesserungswürdig, aber im Großen und Ganzen eigentlich sehr übersichtlich. Man muss lediglich beachten, in der Methode install() alle später verwendeten Variablen (die konsistent bleiben sollen) zu initialisieren und möglichst Fehlermeldungen im Plugin selbst zu unterdrücken &#8211; über die Log-Methode kann man entsprechende Fehler sicher ins Admin-Interface reichen.</p>
<p><div id="attachment_272" class="wp-caption alignleft" style="width: 160px"><a href="http://blog.gi-project.de/wp-content/uploads/2010/03/postShare-settings.png" rel="lightbox[266]"><img src="http://blog.gi-project.de/wp-content/uploads/2010/03/postShare-settings-150x150.png" alt="postShare Einstellungen" title="postShare Einstellungen" width="150" height="150" class="size-thumbnail wp-image-272" /></a><p class="wp-caption-text">postShare Einstellungen im Admin-Center</p></div> postShare ermöglicht automatisch Einstellungen für alle in einem AddOn verwendeten Variablen. Hier würde es sich für spätere Versionen noch anbieten zwischen Einstellungs-Typen zu unterscheiden, um Passwörter in angemessenen Passwort-Feldern unterzubringen oder Beschreibungen dahinter zu verfassen. So muss man nun eben wissen, dass im eMail-AddOn beispielsweise Platzhalter wie %title, %author, %content, %less oder ähnliches zur Verfügung stehen. Ausbaumöglichkeiten sind also reichlich gegeben. postShare zeichnet sich aber durch einfache Erweiterbarkeit aus, auch wenn der Basis-Code an vielen Stellen doch sehr verworren ist &#8211; davon müssen die AddOns aber ja nichts wissen.<br />
Nun kann man viele weitere AddOns, wie zum Beispiel ein Twitter-AddOn schreiben. Es sind stets nur zwei bzw. drei Methoden zu implementieren und der eigentliche &#8220;Request&#8221; durchzuführen &#8211; schon verbreitet sich der Artikel per eMail, Twitter, Facebook, Jabber, .. &#8211; oder sogar über eine eigene Anwendung.</p>
<p><strong><a href='http://blog.gi-project.de/wp-content/uploads/2010/03/postShare-0.3.tar.gz'>Download postShare 0.3</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gi-project.de/2010/03/postshare-wordpress-plugin/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>AVR-Net-IO</title>
		<link>http://blog.gi-project.de/2010/03/avr-net-io/</link>
		<comments>http://blog.gi-project.de/2010/03/avr-net-io/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 09:26:05 +0000</pubDate>
		<dc:creator>krisi</dc:creator>
				<category><![CDATA[Elektronik]]></category>
		<category><![CDATA[Netzwerke / Server]]></category>
		<category><![CDATA[1-wire]]></category>
		<category><![CDATA[avr]]></category>
		<category><![CDATA[avr-net-io]]></category>
		<category><![CDATA[ds1820]]></category>
		<category><![CDATA[embedded networking]]></category>
		<category><![CDATA[mikrocontroller]]></category>

		<guid isPermaLink="false">http://blog.gi-project.de/?p=227</guid>
		<description><![CDATA[Ich habe mir mal wieder ein interessantes Spielzeug besorgt&#8230;

Schon vor ein paar Jahren war ich begeistert von dem AVR-basierten Webserver-Projekt von Ulrich Radig (http://www.ulrichradig.de/), bin jedoch mangels kompatibler Netzwerkkarte und Elektronikkenntinissen leider nie dazu gekommen, einen Nachbau zu wagen. Vor ein paar Wochen lief mir dann durch Zufall ein Bausatz von Pollin in den Browser.. [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe mir mal wieder ein interessantes Spielzeug besorgt&#8230;</p>
<p><a href="http://blog.gi-project.de/wp-content/uploads/2010/03/avr_netio_02.jpg" rel="lightbox[227]"><img class="alignright size-medium wp-image-253" title="AVR-NET-IO Board" src="http://blog.gi-project.de/wp-content/uploads/2010/03/avr_netio_02-300x201.jpg" alt="" width="300" height="201" /></a></p>
<p>Schon vor ein paar Jahren war ich begeistert von dem AVR-basierten Webserver-Projekt von Ulrich Radig (<a href="http://www.ulrichradig.de/">http://www.ulrichradig.de/</a>), bin jedoch mangels kompatibler Netzwerkkarte und Elektronikkenntinissen leider nie dazu gekommen, einen Nachbau zu wagen. Vor ein paar Wochen lief mir dann durch Zufall ein Bausatz von Pollin in den Browser.. Das AVR-Net-IO-Board, für 20€ als Bausatz verkauft, ist eine reltiv ausgereifte und günstige, einfach aufbaubare Version der in den letzten Jahren immer weiter entwickelten AVR-basierten Netzwerk-Projekte und dank aktiver Community eine perfekte Basis für eigene Gehversuche im Bereich embedded networking.</p>
<p><span id="more-227"></span></p>
<h2>Hardware</h2>
<p>Geliefert werden von Pollin eine Tüte &#8220;Vogelfutter&#8221;, drei ICs, eine professionell gefertigte zweiseitige Platine, sowie eine relativ ausführliche Aufbauanleitung. Wer ein bisschen Ahnung von Elektronik und schon ab und zu mal was gelötet hat, schlägt sich in dem mehrseitigen Dokument die Bestückungstabelle mit den Bauteilwerten auf und lötet das Board in nicht ganz 30min professionell zusammen. (Wer die Anleitung aufmerksam durchliest wird vielleicht nicht den selben Fehler machen wie ich und beachten, dass die Klemmleisten anreihbar sind! Meine wurden daher leider etwas scheps).<br />
Sehr schön ist die auf der Platine integrierte Spannungsversorgung. ein paar Dioden sorgen dafür, dass das Board sowohl mit Gleich- als auch Wechselspannung betriebn werden kann und bieten gleichzeitig einen Verpolschutz, ein LM7805 sowie ein weiterer Festspannungsregler machen aus Eingangsspannungen zwischen 9V und 24V immer saubere 5V und 3V für die Schaltung. Zum Betrieb solcher Schaltungen setze ich hauptsächlich ein lüfterloses, altes PC-Netzteil ein. Dieses liefert mir stabile 12V bzw 5V. Damit könnte man sich im Prinzip den LM7805 und die Gleichrichterschaltung auf dem Board sparen, da ich aber später im Produktivbetrieb mit dem Board evtl. auf ein billiges AC-Steckernetzteil umsteigen werde habe ich beschlossen an die 2pol-Kontaktleiste die 12V-Schiene des PC-Netzteils anzuklemmen. Dabei wird der 5V-Spannungswandler bedenklich warm. Ich hab&#8217; ihm kurzerhand einen kleinen Kühlkörper aus der Bastelkiste spendiert und ihn so auf moderate 50°C im Dauerbetrieb herunter bekommen.</p>
<p>Die eigentliche Arbeit auf dem Board leistet ein mit einem externen Quarz auf 16MHz getakteter ATMega32, auf den Pollin eine Demo-Firmware geflasht hat, die mit dem mitgelieferten Windows-Programm einfache Pinabfragen und Ausgangsschaltungen ermöglicht. Der ATMega wird dabei unterstützt von einem Microchip ENC28J60 Ethernet-Controller, der die Übertrager der Netzwerkbuchse speist. Der dritte IC auf dem Board ist ein MAX232-Nachbau, der die Pegelwandlung für die integrierte RS232-Schnittstelle erledigt.</p>
<p>Verbindung mit der Außenwelt bekommt das Board über Ethernet, RS232, einen Wannenstecker für einen ISP (Standardbelegung 10-pol) und einigen auf Klemmen, einen weiteren Wannenstecker und einen SUB-D 25 Male &#8211; Stecker, auf die die für eigene Schaltungen verfügbaren I/O-Pins des AVR zugänglich sind. Für den SUB-D Stecker hat Pollin übrigens auch eine &#8220;Adapterplatine&#8221; für wenig € im Programm, mit der sich die Pins eines SUB-D 25 Steckers auf Klemmleisten herausführen lassen. So kann man die Adapter in verschiedene Projekte integrieren und das AVR-NetIO flexibel für verschiedene Anwendungen einsetzen.</p>
<p>Der erste Eindruck der Hardware ist überraschend. Man hält eine kompakte Platine (ca. 7&#215;12 cm) in der Hand, die über zahlreiche Anschlussmöglichkeiten und Erweiterungspotential verfügt und zudem durch die Standardanschlüsse auch recht schnell von einem Projekt ins andere übernommen werden kann. Für den Preis keine schlechte Investition!</p>
<h2>Software</h2>
<p>Wie ich oben ja bereits erwähnt habe, hat Pollin im Auslieferungszustand auf dem ATMega eine eigene Firmware gespeichert, die über eine voreingestellte IP-Adresse verfügt und sich über den RS232-Port mittels weniger simpler Befehle mit einem PC und einem Terminalprogramm recht schnell konfigurieren lässt.<br />
Mit GETIP lässt man sich die aktuelle IP-Adresse anzeigen, SETIP  ändert diese. Um auszutesten, was mit dem Board so alles machbar sein könnte, empfiehlt es sich, einmal einen Blick in die mitgelieferte Software zu werfen. Leider läuft diese ausschließlich auf Windows (Mit dem .NET 2.0 &#8211; Framework). Also die virtuelle Maschine mit dem alten XP herausgekramt und die Software installiert (wozu braucht so ein simples Tool eine Installation mit setup.exe und Trallala?). Nach Eingabe der korrekten IP-Adresse des NetIO-Boards, kann man dann im Programmfenster die Zustände der I/O-Pins betrachten und setzen. Die Werte der 4 nach außengeführten ADC-Eingänge werden direkt in Volt (mit vielen Nachkommastellen) angezeigt, über eine (ausdrücklich als BETA gekennzeichnete) Teilfunktion des Programms kann man ein optional an das Board angeschlossenes Display mit Daten beschicken.<br />
Viele werden auf diese weise bereits eine Menge mit dem Board anfangen können. So könnte man z.B. verschiedene 230V-Verbraucher (Beispielsweise einen selten genutzten Fileserver im Keller oder die Weihnachtsbeleuchtung im Garten) über Relais an den Digitalausgängen des AVR via Netzwerk von jedem Windowsrechner aus schalten und sich aktuelle Temperaturwerte oder Versorgugsspannungen anzeigen lassen.</p>
<p>Doch der geübte Bastler will mehr ! <img src='http://blog.gi-project.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  &#8230; So ist es z.B. durchaus unbefriedigend, dass man das Net-IO-Board nicht ohne viel eigene Software zu entwickeln von Linuxrechnern und eigener Software aus ansteuern kann. auch eine Zugangsbeschränkung wäre sinnvoll, um z.B. die Rolläden im Wochenendhaus via Internet steuern zu können, ohne dass fremde dazwischenfunken.</p>
<p>Hier kommt die Software Ethersex (<a href="http://www.ethersex.de">http://www.ethersex.de</a>) ins Spiel. Die Weiterentwicklung von Etherrape (<a href="http://www.lochraster.org/etherrape/">http://www.lochraster.org/etherrape/</a>) ist eine Open-Source Firmware für den AVR-Mikrocontroller und bietet zahlreiche interessante Features für verschiedene AVR-basierte Webserverprojekte wie z.B. eben auch das AVR-NET-IO. Dazu gehören z.B. IPv6 Unterstützung, ein integrierter Webserver, Unterstützung des DALLAS 1-wire Busses, ein Eindrahtbus (Masse und Datenleitung), an den sich zahlreiche ICs wie Temperatursensoren, digitale I/O-Chips oder RTCs anschließen und über den Bus mit Energie versorgen lassen, außerdem SD-Card Unterstützung, das eigene ECMD &#8211; Protokoll, mit dem man via Netzwerk oder RS232 eine Art Terminal auf dem AVR nutzen kann, um u.a. Pinzustände abzufragen und zu setzen oder Sensordaten abzufragen und Implementierung einiger andere Netzwerkdienste.</p>
<p>Wer noch keine Erfahrung hat im Programmieren und Kompilieren von AVR-Software, für den empfiehlt sich der <a href="http://www.ethersex.de/firmware-builder/list.cgi">Firmware Builder</a>, mit dem man sich in wenigen, einfachen Schritten ein fertig konfiguriertes und kompiliertes Image für seine Hardwareplattform herunterladen kann.<br />
Wer an umfangreichern Funktionen und eigenen Softwareergänzungen interessiert ist, oder wer eine Hardware-Plattform besitzt, die der Firmware Builder nicht unterstützt, der besorgt sich den aktuellen <a href="http://github.com/ethersex/ethersex/tarball/master">Quelltext</a> und baut sich sein eigenes Image. Auf einem Linux-System (die wenigen Verirrten, die noch keines nutzen, besorgen sich eine Live-CD oder installieren auf ihrem Windows-System die cygwin-Umgebung mit den entsprechenden Programmen) benötigt man für die AVR-Entwicklung allgemein ein paar Pakete aus den Universe-Quellen und speziell für die Ethersex-Entwicklung noch ein paar kleine Zusätze. Mit der folgenden (Ubuntu-)Paketauswahl sollte man arbeiten können:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">krisi<span style="color: #000000; font-weight: bold;">@</span>asterix:~$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> gcc-avr avr-libc avrdude <span style="color: #c20cb9; font-weight: bold;">dialog</span> <span style="color: #c20cb9; font-weight: bold;">gawk</span> <span style="color: #c20cb9; font-weight: bold;">m4</span> libncurses5-dev</pre></div></div>

<p>Auf neueren Ubuntu-Systemen (ich verwenden momentan noch 8.10 Intrepid Ibex) oder auf anderen Linux-Distributionen können die Pakete evtl. anders benannt sein. Am besten schaut man sich dazu mal die <a href="http://www.ethersex.de/index.php/Voraussetzungen">Kompiliervoraussetzungen</a> im Ethersex-Wiki an.</p>
<p>In der bash wechselt man nun in das (entpackte!) Quelltext-Verzeichnis und startet mit</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">krisi<span style="color: #000000; font-weight: bold;">@</span>asterix:~$ <span style="color: #c20cb9; font-weight: bold;">make</span> menuconfig</pre></div></div>

<p>das (halb-grafische) Konfigurationsscript. Hier kann man dann relativ simpel seine Hardwareplattform einstellen (es gibt natürlich bereits vorgefertigte Einstellungssätze für AVR-NET-IO) und nach Herzenslust Funktionen auswählen. Wenn man den im AVR-NET-IO standardmäßig verbauten ATMega32 verwendet, kann es sein dass man irgendwann ein zu großes Hexfile erhält, das nicht mehr in den Flash des Controllers passt. In diesem Falle empfehle ich, den ATMega32 durch einen ATMega644 mit doppelt so viel Flash und gleicher Pinbelegung zu ersetzen.<br />
Nachdem man sich seine Konfiguration zusammengebastelt hat, kompiliert man Ethersex mit einem einfachen</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">krisi<span style="color: #000000; font-weight: bold;">@</span>asterix:~$ <span style="color: #c20cb9; font-weight: bold;">make</span></pre></div></div>

<p>im Quelltextordner. Nach kurzer Zeit dürfte das Flashimage fertig und als <em>ethersex.hex</em> im Quelltextverzeichns abgelegt sein.<br />
Mit dem Kommandozeilentool <em>avrdude</em> wird nun das Hexfile in den Controller geschrieben:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">krisi<span style="color: #000000; font-weight: bold;">@</span>asterix:~$ avrdude <span style="color: #660033;">-p</span> m32 <span style="color: #660033;">-c</span> stk200 <span style="color: #660033;">-U</span> flash:<span style="color: #c20cb9; font-weight: bold;">w</span>:ethersex.hex</pre></div></div>

<p>Wenn soweit alles funktioniert hat, ist der Ethersex-Server jetzt übers Netzwerk erreichbar. Je nach persönlicher Konfiguration kann man das Board nun im lokalen Netzwerk und mittels Port-Forwarding im heimischen Router auch darüber hinaus als energiesparende Schaltzentrale verwenden.</p>
<h2>1-wire Temperatursensoren</h2>
<p><a href="http://blog.gi-project.de/wp-content/uploads/2010/03/avr_netio_01.jpg" rel="lightbox[227]"><img class="alignright size-medium wp-image-251" title="AVR-NET-IO mit drei DS18S20 auf Breadboard" src="http://blog.gi-project.de/wp-content/uploads/2010/03/avr_netio_01-300x168.jpg" alt="" width="300" height="168" /></a><br />
Durch die Unterstützung der in Bastlerkreisen beliebten 1-wire Sensoren (z.B. DS18S20) kann das AVR-NET-IO beispielsweise auch zur Temperaturüberwachung eingesetzt werden. Die Sensoren kommen in einem TO-92 Gehäuse daher, sind als von außen nicht von üblichen Transistoren zu unterscheiden. Genial ist die Tatsache, dass sich große Mengen der Sensoren parallel an eine Zweidrahtleitung anschließen und dann über das 1-wire-Protokoll komplett softwaregesteuert digital auslesen lassen. Die ICs können sich aus der Datenleitung mit Energie versorgen (=Parasitäre Stromversorgung) und durch die Wandlung der Temperaturwerte in digitale Informationen direkt im Sensor und die digitale Datenübertragung fallen aufwändige analoge Schaltungen zum auswerten von Widerstandswerten (wie bei PT100-Sensoren) gänzlich weg. einziger Schaltungsaufwand auf der Controlelrseite: Ein 4.7k-Widerstand zwischen +5V und der Datenleitung, um die Energieversorgung über den Datenbus sicherzustellen. Über die ECMD-Schnittstelle des AVR-NET-IO kann man sich alle am Bus angeschlossenen Chips anzeigen lassen, einen Messvorgang einleiten und anschließend die Messwerte abfragen:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">krisi<span style="color: #000000; font-weight: bold;">@</span>asterix:~$ nc 192.168.3.128 <span style="color: #000000;">2701</span>
1w list
10adc6f90106006c
1054d1f9010600a5
&nbsp;
1w convert
Ok
&nbsp;
1w get 1054d1f9010600a5
<span style="color: #000000;">23.6</span>
&nbsp;
1w get 10adc6f90106006c
<span style="color: #000000;">21.9</span></pre></div></div>

<p>Wie man sieht liefern die Sensoren das Ergebnis direkt als Dezimalzahl mit einer Nachkommastelle in °C aus. Einfacher kann man&#8217;s eigentlich kaum machen.</p>
<p>Mit simpelster Software lässt sich der 1-wire Bus dann übers Netzwerk nutzen. Mit dem Netzwerktool netcat kann man sich auf den ECMD-Server des Boards auf Port 2701 verbinden und so mit dem Gerät kommunzieren.<br />
Das geht natürlich auch automatisiert! Zum Beispiel mit einem kleinen PHP-Sript, das einen TCP-Socket aufbaut, und darauf Befehle schreibt und die Antworten ließt und auswertet:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> request<span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$rs</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fsockopen</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'192.168.3.128'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2701</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$rs</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$response</span>  <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Kann Verbindung nicht aufbauen!&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">die</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: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$request</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;!&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$request</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">fputs</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$rs</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'auth '</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'root'</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' '</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'geheim'</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">fputs</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$rs</span><span style="color: #339933;">,</span> <span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">feof</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$rs</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$response</span> <span style="color: #339933;">.=</span> <span style="color: #990000;">fgets</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$rs</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">128</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$rs</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$response</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
request<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'1w convert'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;aktuelle Temperatur: &quot;</span><span style="color: #339933;">.</span>request<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'1w get 1054d1f9010600a5'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Um die Stabilität der Hard- und Software zu testen habe ich einen 24h-&#8221;Langzeittest&#8221; aufgebaut: Ein Cronjob auf dem gi-project.de &#8211; Server hat einmal in der Minute eine Messung auf dem AVR bei mir Zuhause ausgelöst und dabei die Temperaturwerte von drei DS18S20 (Raumtemperatur, Heizkörpertemperatur und Außentemperatur) in eine MySQL-Tabelle geschrieben. Das Experiment ist gelungen, das Board hat meinen &#8220;Langzeittest&#8221; voll und ganz bestanden. Zwar war die Geschwindigkeit, mit der die Messungen erfolgten und ausgewertet wurden mit Zeiten im zweistelligen Sekundenbereich alles andere als schnell, aber für einfache Mess- und Regelzwecke ist das durchaus ausreichend.</p>
<p>Denkbare Projekte für das NET-IO Board mit Ethersex-Software wären z.B.</p>
<ul>
<li>LAN-Steckdosenleiste</li>
<li>Heizungsüberwachung oder -steuerung (in Arbeit)</li>
<li>Hausautomation</li>
<li>Wetterstation</li>
<li>Roboter</li>
<li>Webserver für Homepage (in Verbindung mit SD-Karte)</li>
<li>Beleuchtungssteuerung</li>
<li>&#8230;</li>
</ul>
<p>Prinzipiell hängt das alles nur von der eigenen Phantasie ab!</p>
<p>Ich hoffe, ich konnte euch mit diesem Artikel ein bisschen für Das Thema Mikrocontroller und embedded systems interessieren und werde bei positiven Rückmeldungen ab und zu gerne weitere Artikel zu dem Gebiet und laufenden Projekten schreiben.</p>
<p>Herzlichen Dank an dieser Stelle auch an das Ethersex-Projekt und all seine Mitwirkenden!</p>
<p>Wer neu einsteigen möchte in das Thema Mikrocontroller und AVR, dem sei das <a href="http://www.mikrocontroller.net/articles/AVR-Tutorial">AVR-Tutorial</a> von <a href="http://www.mikrocontroller.net">www.mikrocontroller.net</a> wärmstens empfohlen!<br />
Immer wieder interessantes zum Thema Hardware- und Softwareentwicklung, auch für Einsteiger gut aufbereitet, bietet das <a href="http://www.rn-wissen.de/index.php/Hauptseite">Roboternetz-Wiki</a> von <a href="http://roboternetz.de">roboternetz.de</a>.</p>
<p><em>Kristian</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gi-project.de/2010/03/avr-net-io/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wammu &#8211; Alternative zu Sony Ericsson PC Suite</title>
		<link>http://blog.gi-project.de/2010/02/wammu-alternative-zu-sony-ericsson-pc-suite/</link>
		<comments>http://blog.gi-project.de/2010/02/wammu-alternative-zu-sony-ericsson-pc-suite/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 15:21:53 +0000</pubDate>
		<dc:creator>Julian</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ericsson]]></category>
		<category><![CDATA[Handy]]></category>
		<category><![CDATA[PC Suite]]></category>
		<category><![CDATA[Sony]]></category>
		<category><![CDATA[Wammu]]></category>

		<guid isPermaLink="false">http://blog.gi-project.de/?p=154</guid>
		<description><![CDATA[Es passt zwar nicht ganz in den Rahmen dieses Blogs, aber der ein oder andere &#8220;Linux / Ubuntu&#8221; &#8211; Artikel kann auch nicht schaden.
Unter Windows habe ich mein sehr geschätztes Handy hin und wieder über die mitgelieferte Software &#8220;SE PC Suite&#8221; synchronisiert. Eigentlich sehr praktisch, da man schnell Backups von Nachrichten, Kontakten uvm. machen kann, [...]]]></description>
			<content:encoded><![CDATA[<p>Es passt zwar nicht ganz in den Rahmen dieses Blogs, aber der ein oder andere &#8220;Linux / Ubuntu&#8221; &#8211; Artikel kann auch nicht schaden.<br />
Unter Windows habe ich mein sehr geschätztes Handy hin und wieder über die mitgelieferte Software &#8220;SE PC Suite&#8221; synchronisiert. Eigentlich sehr praktisch, da man schnell Backups von Nachrichten, Kontakten uvm. machen kann, ohne dass der Speicher des Handys völlig überlädt. Aber wie gesagt: nur hin und wieder. Deshalb bestand auch im letzten halben Jahr, nach der vollkommenen Umstellung auf Ubuntu 9.10, keine Notwendigkeit die PC Suite zu verwenden. So langsam neigt sich dank der 5MP Kamera aber der Speicher zu Ende, weshalb ich mich um das Problem kümmern musste.</p>
<p>Wohin mit den Bildern und wie lade ich sie am besten auf den Rechner, ohne gleich irgendwelche Handy-Dateien zu beschädigen (pures Ausschneiden der Bilder aus dem USB-Massenspeicher war mir doch zu simpel)? Software-CD gesucht und gleich geprüft, ob die PC Suite unter Linux läuft, aber wie befürchtet: sie tut es nicht. Gut, man kann Sony Ericsson kein Vorwurf machen, immerhin wäre es sehr aufwändig die gesamte Software nochmal Linux-kompatibel zu schreiben (sie ist ja so schon nicht mal mit allen Windows-Versionen kompatibel).</p>
<p>Also habe ich die Software doch tatsächlich erstmal mit Wine gestartet. Wie man es so kommen sieht, funktioniert das selbstverständlich auch nicht. Dafür ist die Anwendung zu speziell und benötigt vermutlich diverse Windows-Bibliotheken (v.a. grafische), die Wine völlig überladen würden. Ein Virtual OS möchte ich aber weiterhin vermeiden, also wurde erstmal Google zu Rate gezogen und siehe da: In einem englischsprachigen Forum bin ich auf <a href="http://wammu.eu">Wammu</a> gestoßen, einer Handy-Manager (Kontakte, Adressen, Termine, Nachrichten, ..).</p>
<p><span id="more-154"></span></p>
<p>Nach einigen Blicken in die Screenshot-Sektion, habe ich mir kurzerhand Wammu installiert: <em>sudo aptitude install wammu</em>. Den Ubuntu-Repositories sei dank &#8211; so einfach sind Installationen unter Windows bei Weitem nicht.</p>
<h2>Wammu</h2>
<p><a href="http://blog.gi-project.de/wp-content/uploads/2010/02/wammu01-small.png" rel="lightbox[154]"><img src="http://blog.gi-project.de/wp-content/uploads/2010/02/wammu01-small-150x150.png" alt="" title="Wammu: Start" width="150" height="150" class="alignleft size-thumbnail wp-image-155" /></a>Beim Start von Wammu (<em>user@PC:~$ wammu&#038;</em>), folgt schon die Konfigurationsaufforderung für&#8217;s Handy. Der Konfigurations-Manager führt einen bequem Schritt für Schritt durch die einzelnen Punkte. Eine automatische Erkennung ist möglich, aber mit Hilfe von genaueren Angaben kann man die Schritte besser nachvollziehen. Ich wähle also eine &#8220;Geführte Konfiguration&#8221; aus und gebe danach meinen Verbindungstyp &#8220;USB-Kabel&#8221; an.<div id="attachment_159" class="wp-caption alignright" style="width: 160px"><a href="http://blog.gi-project.de/wp-content/uploads/2010/02/wammu03-small.png" rel="lightbox[154]"><img src="http://blog.gi-project.de/wp-content/uploads/2010/02/wammu03-small-150x150.png" alt="Konfigurationsstil" title="Wammu: Wahl des Konfigurationsstils" width="150" height="150" class="size-thumbnail wp-image-159" /></a><p class="wp-caption-text">Auswahl des Konfigurationsstil.</p></div> <div id="attachment_160" class="wp-caption alignright" style="width: 160px"><a href="http://blog.gi-project.de/wp-content/uploads/2010/02/wammu04-small.png" rel="lightbox[154]"><img src="http://blog.gi-project.de/wp-content/uploads/2010/02/wammu04-small-150x150.png" alt="Auswahl des Verbindungstyps" title="Wammu: Verbindungstyp wählen" width="150" height="150" class="size-thumbnail wp-image-160" /></a><p class="wp-caption-text">Auswahl des Verbindungstyps</p></div>Danach folgt eine Eingrenzung des Handy-Typs, speziell des Handy-Betriebssystems. Da reicht bereits eine Einschränkung alá &#8220;Symbian-basiertes Handy&#8221;, oder gar die Zuordnung zu einem Hersteller. In meinem Fall wähle ich &#8220;Sony Ericsson&#8221; und Wammu weiß dadurch, dass mein Handy nicht auf Symbian baut, sondern auf ein Firmeneigenes. Schließlich folgt der Verbindungstyp (in meinem Fall AT-basiert) und der zugehörige Treiber, wobei ich stets die Standardauswahl gewählt habe.<br />
<div id="attachment_161" class="wp-caption alignleft" style="width: 160px"><a href="http://blog.gi-project.de/wp-content/uploads/2010/02/wammu05-small.png" rel="lightbox[154]"><img src="http://blog.gi-project.de/wp-content/uploads/2010/02/wammu05-small-150x150.png" alt="Auswahl des Handytyps" title="Wammu: Handytyp wählen" width="150" height="150" class="size-thumbnail wp-image-161" /></a><p class="wp-caption-text">Auswahl des Handytyps</p></div> <div id="attachment_164" class="wp-caption alignleft" style="width: 160px"><a href="http://blog.gi-project.de/wp-content/uploads/2010/02/wammu08-small.png" rel="lightbox[154]"><img src="http://blog.gi-project.de/wp-content/uploads/2010/02/wammu08-small-150x150.png" alt="Auswahl des Geräteports" title="Wammu: Auswahl des Geräteports" width="150" height="150" class="size-thumbnail wp-image-164" /></a><p class="wp-caption-text">Auswahl des Geräteports</p></div>Spätestens jetzt muss das Handy angeschlossen sein, denn im nachfolgenden Schritt ist der verfügbare Port zu wählen. Ich belasse die Standardauswahl &#8220;/dev/ttyACM0&#8243; und klicke auf &#8220;Next&#8221; zum Verbindungstest. Das kann nun einen kurzen Moment dauern, dann sollte Wammu das Gerät erkannt haben. Und tatsächlich: Wammu hat mein Sony Ericsson K850i entdeckt.<br />
<div id="attachment_167" class="wp-caption alignright" style="width: 160px"><a href="http://blog.gi-project.de/wp-content/uploads/2010/02/wammu11-small.png" rel="lightbox[154]"><img src="http://blog.gi-project.de/wp-content/uploads/2010/02/wammu11-small-150x150.png" alt="Verbindungsaufbau" title="Wammu: Verbindungsaufbau" width="150" height="150" class="size-thumbnail wp-image-167" /></a><p class="wp-caption-text">Verbindungsaufbau</p></div>Mit der Eingabe eines beliebigen Namen ist die Konfiguration abgeschlossen. Über &#8220;Handy > Verbinden&#8221; verbindet sich Wammu mit dem Gerät. Mein Sony Ericsson meldet auch schon, dass es angesprochen wurde.</p>
<p><div id="attachment_169" class="wp-caption alignright" style="width: 160px"><a href="http://blog.gi-project.de/wp-content/uploads/2010/02/wammu13-small.png" rel="lightbox[154]"><img src="http://blog.gi-project.de/wp-content/uploads/2010/02/wammu13-small-150x150.png" alt="Adressbuch" title="Wammu: Adressbuch" width="150" height="150" class="size-thumbnail wp-image-169" /></a><p class="wp-caption-text">Adressbuch</p></div>Über &#8220;Abrufen > Adressbuch (Alles)&#8221; lassen sich dann beispielsweise die Adressen aus dem Handy laden. Eigentlich alles ganz intuitiv. Über die GUI kann man nun schnell Adressen durchsuchen, neue Anlegen oder entfernen und stets mit dem Handy synchronisieren. Auch Nachrichten verfassen oder Anrufe und Termine verwalten sind damit kein Problem. &#8220;Sicherungen > Speichern&#8221; ermöglicht schließlich noch das Anlegen eines Backups, alles ganz simpel. Mein neuer Favorit also, wenn ich mein Handy mit dem Notebook synchronisieren möchte <img src='http://blog.gi-project.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gi-project.de/2010/02/wammu-alternative-zu-sony-ericsson-pc-suite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mailingliste informiert über aktuelle Themen rund um GI-project</title>
		<link>http://blog.gi-project.de/2010/02/mailingliste-informiert-uber-aktuelle-themen-rund-um-gi-project/</link>
		<comments>http://blog.gi-project.de/2010/02/mailingliste-informiert-uber-aktuelle-themen-rund-um-gi-project/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 15:58:38 +0000</pubDate>
		<dc:creator>krisi</dc:creator>
				<category><![CDATA[Allgemeines]]></category>

		<guid isPermaLink="false">http://blog.gi-project.de/?p=221</guid>
		<description><![CDATA[Soeben ging die GI-project.de News-Mailingliste an den Start!
Aktuelle Informationen rund um gi-project und Hinweise auf neue Blogeinträge könnt Ihr euch jetzt direkt per Mail zusenden lassen und Eure Neuigkeiten rund um das Projekt allen zur Verfügung stellen!
Die Anmeldung geht ganz einfach:
Schickt eine E-Mail an
 news-subscribe at gi-project.de
Der Rest erklärt sich von selbst.
Kristian
]]></description>
			<content:encoded><![CDATA[<p>Soeben ging die GI-project.de News-Mailingliste an den Start!<br />
Aktuelle Informationen rund um gi-project und Hinweise auf neue Blogeinträge könnt Ihr euch jetzt direkt per Mail zusenden lassen und Eure Neuigkeiten rund um das Projekt allen zur Verfügung stellen!</p>
<p>Die Anmeldung geht ganz einfach:<br />
Schickt eine E-Mail an</p>
<p><i> news-subscribe at gi-project.de</i></p>
<p>Der Rest erklärt sich von selbst.</p>
<p><i>Kristian</i></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gi-project.de/2010/02/mailingliste-informiert-uber-aktuelle-themen-rund-um-gi-project/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>gi-project.de läuft jetzt auf lenny</title>
		<link>http://blog.gi-project.de/2010/02/gi-project-de-lauft-jetzt-auf-lenny/</link>
		<comments>http://blog.gi-project.de/2010/02/gi-project-de-lauft-jetzt-auf-lenny/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 02:58:29 +0000</pubDate>
		<dc:creator>krisi</dc:creator>
				<category><![CDATA[Netzwerke / Server]]></category>

		<guid isPermaLink="false">http://blog.gi-project.de/?p=180</guid>
		<description><![CDATA[Das wäre geschafft!
Da Julian mich die letzten Wochen immer mehr damit genervt hat, dass er PHP5.3 auf dem Server haben wollte, das aber mit dem bisher hier verwendeten Debian Etch nicht ohne weiteres möglich war und zudem seit ein paar Tagen keine offiziellen Updates mehr für Etch verfügbar sind, haben wir uns heute Nacht mal [...]]]></description>
			<content:encoded><![CDATA[<p>Das wäre geschafft!</p>
<div id="attachment_187" class="wp-caption alignright" style="width: 310px"><a href="http://blog.gi-project.de/wp-content/uploads/2010/02/Bildschirmfoto.png" rel="lightbox[180]"><img class="size-full wp-image-187" title="Upgrade auf Lenny" src="http://blog.gi-project.de/wp-content/uploads/2010/02/Bildschirmfoto.png" alt="Bildschirmfoto" width="300" height="188" /></a><p class="wp-caption-text">Ich liebe solche Listen ^^</p></div>
<p>Da Julian mich die letzten Wochen immer mehr damit genervt hat, dass er PHP5.3 auf dem Server haben wollte, das aber mit dem bisher hier verwendeten Debian Etch nicht ohne weiteres möglich war und zudem seit ein paar Tagen keine offiziellen Updates mehr für Etch verfügbar sind, haben wir uns heute Nacht mal dran gemacht den vServer auf Debian Lenny umzusatteln. Leider sitzen wir auf einem shared-kernel System und müssen daher mit dem Vorlieb nehmen was uns unser Hoster zur Verfügung stellt.</p>
<p>Wir haben beschlossen den veralteten Kernel vorerst also zu ignorieren und uns an den Rest der Distribution zu wagen. Und ich muss sagen &#8212; Es ging erstaunlich reibungslos über die Bühne! Nachdem wir uns versichert hatten, dass die Backup-Strategie (nächtliche Kopien der wichtigen System- und Datenordner auf meinen Homeserver) in den letzten Tagen lückenlos abgelaufen war, konnte es losgehn:</p>
<p>Zunächst werden in der /etc/apt/sources.list alle &#8220;etch&#8221;s durch &#8220;lenny&#8221;s ersetzt &#8230; Dann geht der Spaß mit einem ganz normalen Update über die Bühne:</p>
<p><code>root@gi-project.de:~# apt-get update; apt-get upgrade; apt-get dist-upgrade</code></p>
<p>Nach gut 20 Minuten und ein paar zickenden und um Aufmerksamkeit ringenden Paketen kam dann das dabei raus:</p>
<p><code>root@gi-project.de:~# cat /etc/debian_version<br />
5.0.4</code></p>
<p>Da PHP5.3 leider noch nicht in den (allgemein nicht immer so aktuellen) Debian-Paketquellen steckt, haben wir uns das Paket von dotdeb.org besorgt und als Update eingespielt:</p>
<p><code>root@gi-project.de:~# echo "deb http://php53.dotdeb.org stable all" &gt;&gt; /etc/apt/sources.list<br />
root@gi-project.de:~# apt-get update; apt-get dist-upgrade</code></p>
<p>Noch schnell ein reboot, um auch wirklich ganz sicher zu gehen, dass unser kleines Upgrade-Abenteuer sich beim nächsten Server-Ausfall nicht rächt &#8230;. und tadaa .. unser frisch gebackenes Debian lenny mit uralt-kernel läuft wie geschmiert. Entgegen allen Erwartungen vertragen sich auch alle Foren, Blogs und Webseiten, die auf gi-project.de laufen prächtig mit PHP5.3 &#8230; bisher zumindest <img src='http://blog.gi-project.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Vielen Dank an all diejenigen, die Debian und das Paketsystem so einfach gemacht haben!</p>
<p>Grüße aus dem Admin-Keller<br />
Kristian</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gi-project.de/2010/02/gi-project-de-lauft-jetzt-auf-lenny/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Models: Sinnvolles Einsatzgebiet von Singletons entdeckt</title>
		<link>http://blog.gi-project.de/2010/02/models-sinnvolles-einsatzgebiet-von-singletons-entdeckt/</link>
		<comments>http://blog.gi-project.de/2010/02/models-sinnvolles-einsatzgebiet-von-singletons-entdeckt/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 08:07:51 +0000</pubDate>
		<dc:creator>Julian</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Model]]></category>
		<category><![CDATA[Pattern]]></category>
		<category><![CDATA[Repository]]></category>
		<category><![CDATA[Singleton]]></category>

		<guid isPermaLink="false">http://blog.gi-project.de/?p=146</guid>
		<description><![CDATA[Im Web findet man haufenweise Diskussionen um den Sinn von Singletons. Auf Wikipedia finden sich ausführliche Erklärungen zu Singletons. Dabei sind auch haufenweise Nachteile aufgelistet, beispielsweise der Hang zur Erschaffung von Äquivalenten zu globalen Variablen &#8211; eben Klassen, die überall zur Verfügung stehen.
Bisher hatte ich auch nur einige wenige sinnvolle Einsatzgebiete entdeckt. In einem ehemaligen [...]]]></description>
			<content:encoded><![CDATA[<p>Im Web findet man haufenweise Diskussionen um den Sinn von Singletons. Auf <a href="http://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)">Wikipedia</a> finden sich ausführliche Erklärungen zu Singletons. Dabei sind auch haufenweise Nachteile aufgelistet, beispielsweise der Hang zur Erschaffung von Äquivalenten zu globalen Variablen &#8211; eben Klassen, die überall zur Verfügung stehen.<br />
Bisher hatte ich auch nur einige wenige sinnvolle Einsatzgebiete entdeckt. In einem ehemaligen Blog habe ich das Singleton-Pattern an Hand einer Klasse beschrieben, die sich ähnlich wie Konstanten verhält, aber viel mehr Speichermöglichkeiten (Arrays, Objekte, ..) bietet. Dadurch ließen sich Konfigurationen ermöglichen, die von einzelnen Komponenten beispielsweise im Programmdurchlauf nicht manipuliert werden dürfen.<br />
Nun bin ich aber während Arbeiten an einigen Komponenten eines aktuellen Projektes auf ein neues Einsatzgebiet gestoßen, das sich sogar nur umständlich ohne Singletons umsetzen lässt: Repositories im Model-Aspekt des MVC-Patterns.<br />
<span id="more-146"></span></p>
<h2>Repositories</h2>
<p>Die Idee der Repositories habe ich mir grundsätzlich von <a href="http://flow3.typo3.org/documentation/tutorials/getting-started/gettingstarted.modeling/">flow3.typo3.org</a> abgeschaut. Im Punkt 5.3 werden Repositories erklärt. Dabei geht es um die Repräsentation einer Menge von Objekten bzw. nicht irgendeiner Menge, sondern eigentlich der gesamten Menge. Beispielsweise existiert eine Model-Klasse &#8220;User&#8221;, die einen Benutzer mit all seinen Eigenschaften repräsentiert. Nun möchte man aber auch neue Benutzer anlegen. Zwar kann man dazu einfach ein neues Objekt anlegen, aber dieses implementiert eigentlich keine Methode, um sich selbst zu speichern &#8211; im Falle einer Datenbank. Das ist die Aufgabe eines User-Repositories. Über das User-Repository erhält man eigentlich erst Zugriff auf bestehende User-Objekte. Über die User-Objekte kann man wiederum die Attribute ändern.</p>
<h2>Singleton-Einsatz</h2>
<p>In meiner Vorgehensweise stellt ein User-Objekt also genau einen User dar. Das ist ein Element einer Menge &#8211; mathematisch betrachtet. Darüber steht das User-Repository, das die Menge an sich repräsentiert. Legt man einen neuen Benutzer an, instanziert man ein neues User-Objekt und fügt es der Menge hinzu. Nun ist es aber so, dass ich keinerlei gleichartige Mengen mehr haben möchte in meiner Anwendung. Das heißt, es soll per Definition nur ein User-Repository geben, das im Falle einer Datenbank eben die gesamte Benutzer-Tabelle als Ganzes repräsentiert und Lösch- oder Erstell-Operationen durchführt. Das User-Objekt dagegen führt nur Update- oder Select-Operationen aus.<br />
Das Problem bei einem Repository als gewöhnliche Klasse ist, dass es mehrfach instanzierbar wäre. Daher habe ich zunächst statisch gearbeitet. Dann kam aber ein neues Problem hinzu: Ich möchte möglichst lazy-loading unterstützen, d.h. möglichst erst dann Daten aus der Datenbank lesen, wenn es wirklich nötig (also gefragt) ist. Daher speichere ich die Daten in akkurater Art und Weise in der Klasse, sobald ich sie einmal geladen habe und gebe diese beim nächsten Nachfragen wieder zurück. Dazu habe ich ein SplObjectStorage verwendet, um über User-Objekte iterieren zu können. Lustigerweise kann man dieses Attribut der Klasse aber nicht beim Deklarieren initialisieren. Demnach bräuchte ich einen Konstruktor. Im statischen Kontext kann man dies nur umgehen, indem man eine Initialisierung-Methode schreibt, die bei jedem statischen Methodenaufruf geprüft wird, ob sie schon einmal aufgerufen wurde.<br />
Beispiel:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> UserRepository <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$initialized</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$users</span><span style="color: #339933;">;</span>
&nbsp;
	static <span style="color: #000000; font-weight: bold;">public</span> initialize<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$initialized</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$users</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SplObjectStorage<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #666666; font-style: italic;">//do something</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	static <span style="color: #000000; font-weight: bold;">public</span> foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">initialize</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #666666; font-style: italic;">//do something</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Es muss also bei jeder beliebigen statischen Methode ein Aufruf von initialize() durchgeführt werden, um self::$users zu initialisieren. Ein heftiger Umstand, den ich so nicht hinnehmen wollte. Also fällt der statische Kontext weg, wenn ich schließlich einen Konstruktor haben möchte. Was tun? Einerseits soll das (Repository)Model von überall erreichbar und einmalig sein, andererseits möchte ich non-static context und einen Konstruktor.<br />
Eine minimalst abgeänderte Version eines Singletons macht es möglich:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
abstract <span style="color: #000000; font-weight: bold;">class</span> Singleton <span style="color: #009900;">&#123;</span>
	static <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$instance</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
	final <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
	final <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> __clone<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
&nbsp;
	final static <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getInstance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">null</span> <span style="color: #339933;">===</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$instance</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$instance</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$instance</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">initialize</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: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$instance</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> initialize<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Beim Vererben dieser abstrakten Klasse wird sichergestellt, dass die Child-class ein Singleton ist und über die Möglichkeit verfügt, eine initialisierende Methode zu besitzen (<em>initialize()</em>).<br />
Alle weiteren Methoden sind nun einfach ohne entsprechendes static-Schlüsselwort anzulegen und Zugriff auf die Klasse erhält man von überall mittels</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$userRepository</span> <span style="color: #339933;">=</span> UserRepository<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$userRepository</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">doSomething</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Wer andere (oder bessere!) Ideen hat, der ist eingeladen jederzeit einen Kommentar zu hinterlassen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gi-project.de/2010/02/models-sinnvolles-einsatzgebiet-von-singletons-entdeckt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPHatesMe.com &#8211; 500. Artikel</title>
		<link>http://blog.gi-project.de/2010/02/phphatesme-com-500-artikel/</link>
		<comments>http://blog.gi-project.de/2010/02/phphatesme-com-500-artikel/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 11:12:50 +0000</pubDate>
		<dc:creator>Julian</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.gi-project.de/?p=141</guid>
		<description><![CDATA[
Für all diejenigen, die keine eMail-Benachrichtigung erhalten haben: www.phphatesme.com hat gestern den 500. Blog-Artikel veröffentlicht und in diesem Zusammenhang das Blog-Layout erneuert.
Lustigerweise hat Nils nun zwar die 500 Artikel gebührend gefeiert, entsprechende technische Anpassungen immer noch nicht unternommen. So ist die Ideenschmiede immer noch sichtlich einfach manipulierbar. Darüber hinaus hat die Qualität des Blogs in [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.gi-project.de/wp-content/uploads/2010/02/screenshot.png" rel="lightbox[141]"><img src="http://blog.gi-project.de/wp-content/uploads/2010/02/screenshot-300x142.png" alt="PHPHatesMe.com Startseite" title="PHPHatesMe.com Startseite" width="300" height="142" class="alignleft size-medium wp-image-142" /></a><br />
Für all diejenigen, die keine eMail-Benachrichtigung erhalten haben: <a href="http://www.phphatesme.com/">www.phphatesme.com</a> hat gestern den 500. Blog-Artikel veröffentlicht und in diesem Zusammenhang das Blog-Layout erneuert.<br />
Lustigerweise hat Nils nun zwar die 500 Artikel gebührend gefeiert, entsprechende technische Anpassungen immer noch nicht unternommen. So ist die Ideenschmiede immer noch sichtlich einfach manipulierbar. Darüber hinaus hat die Qualität des Blogs in meinen Augen die letzten Monate ziemlich abgenommen. Während früher tatsächlich täglich interessante Beiträge rund um PHP (design patterns, performance tuning, bugs, frameworks, project management, ..) veröffentlicht wurden, sind mittlerweile viele Lücken zu entdecken. Die Beiträge erscheinen nicht mehr täglich (wofür sich der Blog ja einst rühmte) und viele sind lediglich kurze, etwas weniger themenbezogene Artikel. Die Linksammlung und Artikelreihe &#8220;Max&#8217; Lesestoff zum Wochenende&#8221; wirkt da ebenfalls wie ein Lückenstopfer, der die Leser hinhält.<br />
Jetzt, da PHPHatesMe.com eine sehr starke Popularität in der php-Community erhalten hat, frage ich mich doch, ob das Design und vielerlei Features wirklich einen guten Blog ausmachen, oder ob es nicht doch die qualitativ guten und ausgewählten Beiträge sind.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gi-project.de/2010/02/phphatesme-com-500-artikel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neues Design</title>
		<link>http://blog.gi-project.de/2010/02/neues-design/</link>
		<comments>http://blog.gi-project.de/2010/02/neues-design/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 10:05:50 +0000</pubDate>
		<dc:creator>Julian</dc:creator>
				<category><![CDATA[Allgemeines]]></category>

		<guid isPermaLink="false">http://blog.gi-project.de/?p=137</guid>
		<description><![CDATA[Nicht gerade unauffällig, aber dennoch erwähnenswert: Seit letzten Sonntag erscheint der GI Project Blog nun in neuem Gewand, dank der künstlerischen Vorarbeit durch Thorwald Hoffmann von geschossen.com. Nach einigen Feinkorrekturen durch Kris ist das Design nun einsatzbereit und hoffentlich angenehmer als das Vorherige &#8211; immerhin haben wir uns nun von grausamen Formatierungen durch JavaScript verabschiedet.
]]></description>
			<content:encoded><![CDATA[<p>Nicht gerade unauffällig, aber dennoch erwähnenswert: Seit letzten Sonntag erscheint der GI Project Blog nun in neuem Gewand, dank der künstlerischen Vorarbeit durch Thorwald Hoffmann von <a href="http://geschossen.com">geschossen.com</a>. Nach einigen Feinkorrekturen durch Kris ist das Design nun einsatzbereit und hoffentlich angenehmer als das Vorherige &#8211; immerhin haben wir uns nun von grausamen Formatierungen durch JavaScript verabschiedet.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gi-project.de/2010/02/neues-design/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony support in NetBeans 7.0</title>
		<link>http://blog.gi-project.de/2010/02/symfony-support-in-netbeans-7-0/</link>
		<comments>http://blog.gi-project.de/2010/02/symfony-support-in-netbeans-7-0/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 19:10:53 +0000</pubDate>
		<dc:creator>Julian</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.gi-project.de/2010/02/symfony-support-in-netbeans-7-0/</guid>
		<description><![CDATA[Über Symfonynerds.com habe ich erfahren, dass Sun nun offiziell angekündigt hat, Symfony in NetBeans 7.0 zu integrieren. Damit lassen sich sehr viele kleine Tätigkeiten von der IDE automatisch erledigen, was Symfony zu meinen favorisierten Frameworks macht.
Symfony wird momentan übrigens ebenso energisch wie Flow3 vorangetrieben und ist für zukünftige Anwendungen in größerem Stil sehr zu empfehlen. [...]]]></description>
			<content:encoded><![CDATA[<p>Über Symfonynerds.com habe ich erfahren, dass Sun nun offiziell angekündigt hat, Symfony in <a href="http://symfonynerds.com/blog/?p=176">NetBeans 7.0 zu integrieren</a>. Damit lassen sich sehr viele kleine Tätigkeiten von der IDE automatisch erledigen, was Symfony zu meinen favorisierten Frameworks macht.<br />
Symfony wird momentan übrigens ebenso energisch wie Flow3 vorangetrieben und ist für zukünftige Anwendungen in größerem Stil sehr zu empfehlen. Hoffen wir, dass sich PHP 5.3 und entsprechende Frameworks schnell durchsetzen, um die elenden Zend-Klassenbenennungen endlich loszuwerden.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gi-project.de/2010/02/symfony-support-in-netbeans-7-0/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
