<?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>DSitC / Code</title>
	<atom:link href="http://code.dsitc.de/feed" rel="self" type="application/rss+xml" />
	<link>http://code.dsitc.de</link>
	<description>Programmierung, das Leben, und der ganze hässliche Rest...</description>
	<lastBuildDate>Fri, 17 Jun 2011 13:33:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Feinschliff, Demo &amp; Warten auf Blizzard</title>
		<link>http://code.dsitc.de/archives/105</link>
		<comments>http://code.dsitc.de/archives/105#comments</comments>
		<pubDate>Thu, 16 Jun 2011 20:37:32 +0000</pubDate>
		<dc:creator>dsitc</dc:creator>
				<category><![CDATA[Ohne Kategorie]]></category>

		<guid isPermaLink="false">http://code.dsitc.de/?p=105</guid>
		<description><![CDATA[Derzeit gibt es nicht viel spektakuläres zu berichten. Blizzard hat immer noch nichts weiterführendes veröffentlicht. Lediglich die Realm API ist derzeit öffentlich verfügbar. Allerdings gibt es inzwischen tatsächlich etwas zu sehen! Ich habe die Demo Seite für mein WowDataAccess Projekt online gestellt. Diese ist unter http://dev.dsitc.de/demos/wow-data-access/ zu finden. Zuletzt hier noch eine knappe Zusammenfassung der Änderungen [...]]]></description>
			<content:encoded><![CDATA[<p>Derzeit gibt es nicht viel spektakuläres zu berichten.</p>
<ol>
<li>Blizzard hat immer noch nichts weiterführendes veröffentlicht. Lediglich die Realm API ist derzeit öffentlich verfügbar.</li>
<li>Allerdings gibt es inzwischen tatsächlich etwas zu sehen! <img src='http://code.dsitc.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Ich habe die Demo Seite für mein WowDataAccess Projekt online gestellt. Diese ist unter <a href="http://dev.dsitc.de/demos/wow-data-access/" target="_blank">http://dev.dsitc.de/demos/wow-data-access/</a> zu finden.</li>
<li>Zuletzt hier noch eine knappe Zusammenfassung der Änderungen die ich in den letzten Wochen commited habe:
<ol>
<li>Ein neuer Datenkanal der das Dateisystem des Servers verwendet um Daten zu speichern. Damit kann man entweder ganz auf eine DB zum Cachen verzichten (vermutlich nicht schlau! ^^) oder nur bestimmte Datenklassen, wie z.B. Icons, auf dem Dateisystem ablegen. Dies kann durchaus Sinn machen wenn man diese aus anderen Anwendungen heraus verwenden will.</li>
<li>Das Ableiten neuer Datenkanäle aus dem abstrakten Basis Datenkanal wurde stark vereinfacht so dass nun wirklich nur noch der eigene Code eingefügt werden muss. So langsam fühlt sich das Erstellen neuer Datenkanäle solide an, damit werde ich mich dann wohl bald an den Wiki-Artikel setzen der dieses Vorgehen näher beschreiben soll.</li>
<li>Diverse Kleinigkeiten wurden geändert und konsistenter gestaltet.</li>
</ol>
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://code.dsitc.de/archives/105/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Status: On Hold</title>
		<link>http://code.dsitc.de/archives/103</link>
		<comments>http://code.dsitc.de/archives/103#comments</comments>
		<pubDate>Thu, 19 May 2011 05:27:40 +0000</pubDate>
		<dc:creator>dsitc</dc:creator>
				<category><![CDATA[Entwickler Tagebuch]]></category>
		<category><![CDATA[WoW Data Access]]></category>

		<guid isPermaLink="false">http://code.dsitc.de/archives/103</guid>
		<description><![CDATA[Im Augenblick ist nicht viel los hier. Ich habe alle Features soweit implementiert und warte nun auf weitere API-Veröffentlichungen von Seiten Blizzards. Lediglich das Wiki ist noch aufzuarbeiten und zu übersetzen.]]></description>
			<content:encoded><![CDATA[<p>Im Augenblick ist nicht viel los hier. Ich habe alle Features soweit implementiert und warte nun auf weitere API-Veröffentlichungen von Seiten Blizzards. <img src='http://code.dsitc.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Lediglich das Wiki ist noch aufzuarbeiten und zu übersetzen. <img src='http://code.dsitc.de/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://code.dsitc.de/archives/103/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Datenkanal Klassennamen als Arrayschlüssel = bad</title>
		<link>http://code.dsitc.de/archives/99</link>
		<comments>http://code.dsitc.de/archives/99#comments</comments>
		<pubDate>Mon, 09 May 2011 08:27:06 +0000</pubDate>
		<dc:creator>dsitc</dc:creator>
				<category><![CDATA[Entwickler Tagebuch]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WoW Data Access]]></category>

		<guid isPermaLink="false">http://code.dsitc.de/?p=99</guid>
		<description><![CDATA[Heute nur eine Kleinigkeit&#8230; Ich habe den Initialisierungsprozess des Moduls leicht angepasst. Die Klassennamen der Datenkanäle sind nun nicht mehr der Schlüssel des assoziativen Arrays der Datenkanäle. Somit können nun auch mehrere Datenkanäle der gleichen Klasse registriert werden. Ich frage mich inzwischen sowieso wie ich auf diese seltsame Idee gekommen bin.]]></description>
			<content:encoded><![CDATA[<p>Heute nur eine Kleinigkeit&#8230; <img src='http://code.dsitc.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Ich habe den Initialisierungsprozess des Moduls leicht angepasst. Die Klassennamen der Datenkanäle sind nun nicht mehr der Schlüssel des assoziativen Arrays der Datenkanäle. Somit können nun auch mehrere Datenkanäle der gleichen Klasse registriert werden.</p>
<p>Ich frage mich inzwischen sowieso wie ich auf diese seltsame Idee gekommen bin. <img src='http://code.dsitc.de/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://code.dsitc.de/archives/99/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mehrfachabfragen, Revisited</title>
		<link>http://code.dsitc.de/archives/97</link>
		<comments>http://code.dsitc.de/archives/97#comments</comments>
		<pubDate>Wed, 04 May 2011 10:57:11 +0000</pubDate>
		<dc:creator>dsitc</dc:creator>
				<category><![CDATA[Entwickler Tagebuch]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WoW Data Access]]></category>

		<guid isPermaLink="false">http://code.dsitc.de/?p=97</guid>
		<description><![CDATA[Der gestrige Abend war sehr produktiv. Ich habe das Konzept des Hashings wieder über den Haufen geworfen und bin einen Schritt zurück gegangen um die Konsistenz zu wahren. Dies resultierte in folgender erfolgreichen Herangehensweise: Da ich die Parameter-Tupel ja als indiziertes Array erwarte, sind die Tupel somit schon vom externen System aus eindeutig identifiziert, selbst [...]]]></description>
			<content:encoded><![CDATA[<p>Der gestrige Abend war sehr produktiv. Ich habe das Konzept des Hashings wieder über den Haufen geworfen und bin einen Schritt zurück gegangen um die Konsistenz zu wahren. Dies resultierte in folgender erfolgreichen Herangehensweise:</p>
<ol>
<li>Da ich die Parameter-Tupel ja als indiziertes Array erwarte, sind die Tupel somit schon vom externen System aus eindeutig identifiziert, selbst wenn dies nur implizit durch ein Weglassen der Schlüssel geschiet.</li>
<li>Somit wäre die Konsistenz und auch der Bedienkomfort am größten wenn diese Schlüssel bei der Rückgabe der Datenobjekte identisch mit denen der zugeordneten Parameter wären.</li>
<li>Um dies zu erreichen muss ich ein Ergebniss Objekt mit einem Parameter-Tupel vergleichen können, um zu ermitteln ob diese zusammen gehören:
<ol>
<li>Erweiterung der Metadaten einer Daten ID um ein optionales Feld &#8220;param&#8221;, welches angibt ob dieser Daten ID ein Eingabeparameter zugeordnet ist, und falls ja, welcher Eingabeparameter dies ist.</li>
<li>Eine öffentliche Methode &#8220;matchParams()&#8221; die zur WowData Klasse gehört. Diese erwartet ein Parameter-Tupel und prüft ob alle im Datenobjekt definierten Eingabeparameter auch im Tupel vorhanden sind und ob die Werte übereinstimmen.</li>
</ol>
</li>
<li>Nachdem diese Überprüfung nun stattfinden kann, habe ich eine Methode in &#8220;WowDataAccess&#8221; geschrieben welche ein Kanal-Ergebnis nimmt und mit einem Array von Parameter-Tupeln vergleicht und einen Ausschnitt aus diesem Array zurückliefert welches nur die Tupel enthält die auf kein Datenobjekt in der Ergebnismenge gepasst haben.</li>
<li>Diese Teilmenge der Parameter-Tupel wird nun an den nächsten Datenkanal weiter gereicht. Und gleichzeitig werden die Schlüssel dieser Tupel gespeichert, um beim Schreibdurchlauf später auch nur die Daten zurück zu schreiben die in diesem Kanal nicht präsent waren.</li>
</ol>
<p>Damit wären wir auch schon am Ziel angekommen. <img src='http://code.dsitc.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://code.dsitc.de/archives/97/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mehrfachabfragen, Lazy oder Greedy</title>
		<link>http://code.dsitc.de/archives/92</link>
		<comments>http://code.dsitc.de/archives/92#comments</comments>
		<pubDate>Tue, 03 May 2011 06:44:49 +0000</pubDate>
		<dc:creator>dsitc</dc:creator>
				<category><![CDATA[Entwickler Tagebuch]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WoW Data Access]]></category>

		<guid isPermaLink="false">http://code.dsitc.de/?p=92</guid>
		<description><![CDATA[Da ich mich in der letzten Woche mit Mehrfachabfragen beschäftigt habe, hier ein paar Eindrücke und Erkenntnisse zum Thema. Unter Mehrfachabfragen verstehe ich in diesem Zusammenhang ein Mitgeben von mehreren Parameter Tupeln, welche jeweils ein Datenobjekt eindeutig identifizieren. Diese werden dann an den Handler weitergegeben und dieser entscheidet dann ob er mit Mehrfachabfragen umgehen kann, [...]]]></description>
			<content:encoded><![CDATA[<p>Da ich mich in der letzten Woche mit Mehrfachabfragen beschäftigt habe, hier ein paar Eindrücke und Erkenntnisse zum Thema. <img src='http://code.dsitc.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Unter Mehrfachabfragen verstehe ich in diesem Zusammenhang ein Mitgeben von mehreren Parameter Tupeln, welche jeweils ein Datenobjekt eindeutig identifizieren. Diese werden dann an den Handler weitergegeben und dieser entscheidet dann ob er mit Mehrfachabfragen umgehen kann, oder nicht. Falls nicht, so wird die effektive Handler-Funktion durch den Wrapper pro Tupel einmal explizit aufgerufen, dies ist natürlich nicht performat, aber es simuliert ein identisches Verhalten für den Fall dass Mehrfachabfragen nicht supported werden.</p>
<p>Jetzt muss natürlich wieder auf den effektiven Wrapper der Handler geschaut werden. Denn sobald Mehrfachabfragen möglich sind muss man sich überlegen ob das Ganze &#8220;lazy&#8221; oder &#8220;greedy&#8221; ablaufen soll. <img src='http://code.dsitc.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>&#8220;Lazy&#8221; bedeutet in diesem Fall, dass eine Abfrage die mindestens ein Ergebnis findet einen Ausstieg aus der Kanaliteration gewirkt und nur die gefundenen Daten zurückgegebenen werden. Alle Daten die in diesem Kanal nicht vorhanden waren, werden nicht in tiefer liegenden Kanälen gesucht.</p>
<p>Wenn man jetzt &#8220;Greedy&#8221; Abfragen will, so muss man sich einigen Herausforderungen stellen:</p>
<ol>
<li>Identifizieren von Parameter Tupeln</li>
<li>Zuordnen von Query Ergebnissen zu den Parameter Tupeln</li>
<li>Zwischenspeichern von Ergebnissen bei der Kanaliteration damit das Modul weiß welche Datenobjekte in welchen Kanal gespeichert werden müssen</li>
</ol>
<p>Lösungen:</p>
<ol>
<li>Eine Tupel ID wird per md5() und implode() erzeugt:


<div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="re0">$id</span> <span class="sy0">=</span> <span class="kw3">md5</span><span class="br0">&#40;</span><span class="kw3">implode</span><span class="br0">&#40;</span><span class="re0">$params</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>


</li>
<li>Das hier ist sozusagen gerade &#8220;Work in progress&#8221;. <img src='http://code.dsitc.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Am direktesten wäre es wohl diese Verknüpfung im Datenkanal zu handhaben, allerdings wäre dass dann ein Entwicklungs-Overhead beim Schreiben von neuen Datenkanälen. Ich werde wohl versuchen die Zuordnung tiefer im System einzubauen um die zusätzliche Logik aus den Datenkanälen heraus zu halten.</li>
<li>Dies sollte sich nicht schwierig gestalten, man muss bei Writeback nur abfragen welche Datenobjekte relevant sind für den Kanal. Dies werde ich wohl über ein assoziatives Array abwickeln.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://code.dsitc.de/archives/92/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adieu Interface, Hallo Handler</title>
		<link>http://code.dsitc.de/archives/87</link>
		<comments>http://code.dsitc.de/archives/87#comments</comments>
		<pubDate>Wed, 20 Apr 2011 18:12:02 +0000</pubDate>
		<dc:creator>dsitc</dc:creator>
				<category><![CDATA[Entwickler Tagebuch]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WoW Data Access]]></category>

		<guid isPermaLink="false">http://code.dsitc.de/?p=87</guid>
		<description><![CDATA[Ich habe heute einen großen Block der bisher fest definierten Basisstruktur des Moduls ausgetauscht. Die Interfaces und Basisklassen der Datenkanäle, welche die einheitlichen Öffnen- und Schließen-Methoden definierten wurde entfernt und durch eine zentrale, vererbte, Methode in WowDataChannel mit dem verheißungsvollen Namen &#8220;handleWowData()&#8221; ersetzt. Durch das Entfernen der abstrakten Vordefinition entfallen 2 Interfaces (TemplateWowDataChannelRead &#38; TemplateWowDataChannelWrite) [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe heute einen großen Block der bisher fest definierten Basisstruktur des Moduls ausgetauscht. Die Interfaces und Basisklassen der Datenkanäle, welche die einheitlichen Öffnen- und Schließen-Methoden definierten wurde entfernt und durch eine zentrale, vererbte, Methode in WowDataChannel mit dem verheißungsvollen Namen &#8220;handleWowData()&#8221; ersetzt.</p>
<p>Durch das Entfernen der abstrakten Vordefinition entfallen 2 Interfaces (TemplateWowDataChannelRead &amp; TemplateWowDataChannelWrite) und 2 abstrakte Klassen (WowDataChannelRead &amp; WowDataChannelReadWrite). Zudem ist es nun nicht mehr nötig sich für einen Kanaltyp beim Schreiben der Klasse zu entscheiden (Read oder ReadWrite).</p>
<p>An der Stelle dieser starren Hierarchie tritt die Methode &#8220;handleWowData()&#8221;. Diese durchläuft alle im Kanal registrierten Handler für eine bestimmte WowData Subklasse und Zugriffsmodus (&#8220;read&#8221; oder &#8220;write&#8221;) und ruft diese Handler mit den Parametern auf die von WowDataAccess übergeben wurden. Somit ist es nun möglich mehr als einen Handler auf eine WowData Subklasse und Zugriffsart zu registrieren. Dies ermöglicht zB dem Datenkanal WowDataChannelMySQL bestimmte Daten in eine Backup-Tabelle zu schreiben, oder zB. eine Log-Tabelle mit Daten über die durchgeführten Lese- und Schreibvorgänge zu führen ohne umständliche Programmierarbeit.</p>
<p>Im alten Konstrukt war es nötig für jeden möglichen, im Interface definierten, Datentyp eine (oder zwei im Falle von ReadWrite Kanälen) Methode anzulegen. Wenn der Datentyp vom Kanal nicht unterstützt wurde, musste man eben Dummymethoden mit &#8220;return(false);&#8221; schreiben damit sich PHP nicht wegen abstrakten Methoden bei der Instanziierung in die Ecke stellte. <img src='http://code.dsitc.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Das neue Modell erlaubt es einem nur genau die Handler zu definieren die man auch wirklich braucht. Dies geschiet derzeit noch in der &#8220;init()&#8221; Methode des jeweiligen Datenkanals, aber ich denke ich werde das noch auslagern.</p>
<p>Hier ist der Ausschnitt aus der derzeitigen &#8220;init()&#8221; Methode des Battle.net Datenkanals:</p>


<div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="co4">/**
 * Registers the handlers for WowData subclasses
 */</span>
<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">registerWowDataHandler</span><span class="br0">&#40;</span>
	<span class="st_h">'WowDataRealm'</span><span class="sy0">,</span>
	<span class="st_h">'read'</span><span class="sy0">,</span>
	<span class="kw3">array</span><span class="br0">&#40;</span>
		<span class="st_h">'multiSupport'</span> <span class="sy0">=&gt;</span> <span class="kw4">false</span><span class="sy0">,</span>
		<span class="st_h">'handler'</span>      <span class="sy0">=&gt;</span> <span class="st_h">'openRealm'</span>
	<span class="br0">&#41;</span>
<span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">registerWowDataHandler</span><span class="br0">&#40;</span>
	<span class="st_h">'WowDataIcon'</span><span class="sy0">,</span>
	<span class="st_h">'read'</span><span class="sy0">,</span>
	<span class="kw3">array</span><span class="br0">&#40;</span>
		<span class="st_h">'multiSupport'</span> <span class="sy0">=&gt;</span> <span class="kw4">false</span><span class="sy0">,</span>
		<span class="st_h">'handler'</span>      <span class="sy0">=&gt;</span> <span class="st_h">'openIcon'</span>
	<span class="br0">&#41;</span>
<span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>


<p>Die beiden hier in &#8220;handler&#8221; referenzierten Methoden müssen natürlich im Datenkanal definiert worden sein. Hier ist die Parameter Signatur fest vorgegeben: Parameter 1 enthält den Klassennamen der WowData Subklasse und Parameter 2 die Eingabeparameter.</p>
]]></content:encoded>
			<wfw:commentRss>http://code.dsitc.de/archives/87/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>/hello</title>
		<link>http://code.dsitc.de/archives/1</link>
		<comments>http://code.dsitc.de/archives/1#comments</comments>
		<pubDate>Sun, 23 Jan 2011 21:29:58 +0000</pubDate>
		<dc:creator>dsitc</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://code.dsitc.de/?p=1</guid>
		<description><![CDATA[Willkommen im Entwicklerbereich meines kleinen Blogimperiums! Hier möchte ich über meine Erfahrungen (beruflich als auch privat) im Bereich der Software Entwicklung schreiben. Mit Software Entwicklung ist hier im Grunde auch Web Entwicklung gemeint, d.h. CSS, HTML und allem was dazu gehört&#8230;]]></description>
			<content:encoded><![CDATA[<p>Willkommen im Entwicklerbereich meines kleinen Blogimperiums! <img src='http://code.dsitc.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Hier möchte ich über meine Erfahrungen (beruflich als auch privat) im Bereich der Software Entwicklung schreiben. Mit Software Entwicklung ist hier im Grunde auch Web Entwicklung gemeint, d.h. CSS, HTML und allem was dazu gehört&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://code.dsitc.de/archives/1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
