<?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>UGamela Blog &#187; Allgemein</title>
	<atom:link href="http://ugamela-blog.pheelgood.net/category/allgemein/feed/" rel="self" type="application/rss+xml" />
	<link>http://ugamela-blog.pheelgood.net</link>
	<description>Entwicklung eines Browsergames</description>
	<lastBuildDate>Tue, 13 Jul 2010 19:44:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>JavaScript OOP: patterns</title>
		<link>http://ugamela-blog.pheelgood.net/2010/02/22/javascript-oop-patterns-muster/</link>
		<comments>http://ugamela-blog.pheelgood.net/2010/02/22/javascript-oop-patterns-muster/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 01:50:06 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=308</guid>
		<description><![CDATA[Patterns &#8211; Muster auf Deutsch. Informatiker fassen gerne Probleme in Muster um sie zu katalogisieren. Eine Problemlösung kann so öfter wieder verwendet werden, Fehler werden vermieden. Manchmal stellen sie auch einfach einen Weg dar etwas elegant zu lösen. Besonders in objektorientierter Programmierung sind solche Muster bekannt: Entwurfsmuster. Nachdem ich mich jetzt während des Sommers mit [...]]]></description>
			<content:encoded><![CDATA[<p>Patterns &#8211; Muster auf Deutsch. Informatiker fassen gerne Probleme in Muster um sie zu katalogisieren. Eine Problemlösung kann so öfter wieder verwendet werden, Fehler werden vermieden. Manchmal stellen sie auch einfach einen Weg dar etwas elegant zu lösen. Besonders in objektorientierter Programmierung sind solche Muster bekannt: Entwurfsmuster.</p>
<p>Nachdem ich mich jetzt während des Sommers mit Objektorientierung, Softwarearchitektur und Entwurfsmustern beschäftigt hatte, suchte ich auch in JavaScript nach Mustern und Best Practice, und  nun möchte ich diese Erfahrungen auf meinem Blog teilen.</p>
<p><span id="more-308"></span></p>
<p>Vorab sollte erwähnt werden, dass JavaScript in mehreren Aspekten eine besondere Sprache ist. Es wird nicht umsonst geschmäht aufgrund unerklärlichen Verhaltens. Man sehe sich nur mal <a href="http://wtfjs.com/" target="_blank">wtfjs</a> an! Dennoch ist JavaScript auch sehr mächtig als objektorientierte Sprache. Closures und Prototypen sind recht unbekannt in der sehr von Java geprägten objektorientierten Welt. Die Umgewöhnung kann schwer fallen, auch ich hatte da meine Probleme. Zum Glück gibt es zum Beispiel Videos von Douglas Crockford auf YUI Theater, die einem helfen einen Einstieg zu finden.</p>
<p>Ich möchte nun hier zwei Funktionen vorstellen, die es auch in die neue ECMAScript Spezifikation geschafft haben: Function.prototype.bind und Object.create. Beide lassen sich mit einigen Tricks auch auf dem momentan verbreiteten JavaScript verwenden, bei Frameworks gehören sie zum Grundrepertoire.</p>
<p>Viel kann ich noch nicht zu prototypenbasierter Programmierung sagen, da ich selbst noch nicht ganz auf den Trichter gekommen bin, trotzdem habe ich schon Anwendungen gefunden und ziehe Nutzen in meinem sonst noch recht klassenbasierten Stil.</p>
<h2>Object.create</h2>
<pre class="brush: jscript;">if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
    };
}</pre>
<p>Diese schöne Funktion erzeugt ein Objekt auf Basis eines anderen Objekts, welches zum Prototypen wird. Vorsichtig muss man sein, wenn man lokale/private Variablen im Prototypen verwendet, da sich die beiden Objekte diese teilen. Der Prototyp sollte also ein neues Objekt sein, dass sonst nicht genutzt wird, oder die vermeintlichen Methoden müssen neu initialisiert werden, wie ich es in vorigem Blogeintrag mit dem aufrufen eines Konstruktors mache.</p>
<p>Ich möchte das Beispiel auch nochmal aufgreifen, wobei ich mittlerweile nochmal refaktorisiert habe.</p>
<pre class="brush: jscript;">Resource.prototype.create = function(newAmount) {
    var newResource = Object.create(this);
    Resource.call(newResource, newAmount, this.getType());
    return newResource;
};</pre>
<p>Mit dieser Methode ist es möglich Objekte der selben Resource anhand einer vorliegenden zu erstellen. Theoretisch könnte ich diese Methode auch clone() nennen, da ich aber gleichzeitig das neue Objekt initialisiere, behalte ich den namen der Basisfunktion &#8211; create(). clone() lässt sich damit aber recht leicht verwirklichen, man muss nur die Eigenschaften vom alten Objekt übergeben.</p>
<pre class="brush: jscript;">Resource.prototype.clone = function() {
    return this.create(this.getAmount());
}</pre>
<p>Schön, jetzt habe ich ein paar tolle neue Möglichkeiten Objekte zu erzeugen, was soll das nun?<br />
Unter den Entwurfsmustern gibt es eine Untermenge: Creational Patterns, Muster zur Konstruktion. Einige Muster, die sich mit verschiedenen Möglichkeiten der Konstruktion von Objekten beschäftigen. Alle vermeiden die Konstruktion mittels &#8220;new &lt;Klassenname&gt;&#8221;, weil dies (unter anderem) zu statisch ist.<br />
Wenn ich ein Objekt mit einer create() Methode übergebe, dann übergebe ich gleichzeitig die Möglichkeit ein neues Objekt des selben Typs zu erstellen, ohne mich explizit an den Typ zu binden. Die Konstruktion ist dynamisch. Aus diesem Grund kann ich auch leicht Vererbung anwenden ohne danach meinen ganzen Code nach &#8220;new &lt;Elternklassenname&gt;&#8221; durchsuchen zu müssen.</p>
<h2>Function.prototype.bind</h2>
<pre class="brush: jscript;">if (typeof Function.prototype.bind !== &quot;function&quot;) {
    Function.prototype.bind = function(context) {
        if (arguments.length &lt; 2 &amp;&amp; typeof arguments[0] === &quot;undefined&quot;) {
            return this;
        }
        var method = this, args = Array.prototype.slice.call(arguments, 1);
        return function() {
            var a = merge(args, arguments);
            return method.apply(context, a);
        };
    };
}</pre>
<p>Den Code dieser Funktion habe ich mir aus dem Prototype Framework geholt und von Abhängigkeiten befreit. Jede Funktion und insbesondere Methode ist ab jetzt mit der Funktionalität ausgerüstet, unabhängig von ihrem Objekt gemacht zu werden.<br />
Schonmal das probiert?</p>
<pre class="brush: jscript; light: true;">var func = someObject.someMethod;
func();</pre>
<p>Das geht schwer in die Hose wenn someMethod &#8220;this&#8221; verwendet, &#8220;this&#8221; is dann nämlich &#8220;window&#8221; &#8211; eine der Freuden an JavaScript.<br />
Stattdessen verwendet man besser:</p>
<pre class="brush: jscript; light: true;">var func = someObject.someMethod.bind();</pre>
<p>Theoretisch kann man auch bereits Parameter mitgeben.<br />
Diese Funktion findet häufig Verwendung, wenn man bei AJAX oder Effekten Callbacks übergibt und spart jedes Mal manuelles Umwickeln mit einer anonymen Funktion.</p>
<p>Die Tiefe von Patterns habe ich mit diesem Artikel wohl nicht erreicht, aber ich hoffe er ist trotzdem einigen Leuten hilfreich. Die vorgestellten Funktionen würde man wohl als Sugar (&#8220;Zucker&#8221;) bezeichnen.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2010/02/22/javascript-oop-patterns-muster/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ein Neubeginn</title>
		<link>http://ugamela-blog.pheelgood.net/2010/01/22/ein-neubeginn/</link>
		<comments>http://ugamela-blog.pheelgood.net/2010/01/22/ein-neubeginn/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 15:43:20 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Entwicklung]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=283</guid>
		<description><![CDATA[Nun, über ein halbes Jahr habe ich mich jetzt mit Softwareentwicklung und Objektorientierung beschäftigt. Immer im Hinterkopf meine Browsergame Idee gehalten und festen Glauben in PHP in Verbindung mit viel JavaScript im Browser gehalten. In diesem Moment, da ich versuche mir alles schön herzurichten um wirklich loszulegen, springen mir die Schwierigkeiten mit PHP nur so [...]]]></description>
			<content:encoded><![CDATA[<p>Nun, über ein halbes Jahr habe ich mich jetzt mit Softwareentwicklung und Objektorientierung beschäftigt. Immer im Hinterkopf meine Browsergame Idee gehalten und festen Glauben in PHP in Verbindung mit viel JavaScript im Browser gehalten. In diesem Moment, da ich versuche mir alles schön herzurichten um wirklich loszulegen, springen mir die Schwierigkeiten mit PHP nur so entgegen.</p>
<p>Zuerst suche ich eine geeignetes Test-Framework, am besten BDD getrieben. Für JavaScript wimmelt es nur so von solchen Frameworks: Screw.Unit, jsspec, jspec, inspec etcetc. PHP bietet genau eines: PHPSpec, dessen Projekt vor über einem Jahr eingeschlafen ist. So bleibt nur noch PHPUnit, welches nicht wirklich BDD zulässt.</p>
<p>Okay, also mache ich mich daran meine IDE einzurichten und ein paar Klassen anzulegen. Netbeans stellt sich aber als sehr schwachbrüstig heraus, was Refaktorisieren in PHP angeht. Die Java Aufgaben für die Uni habe ich mit Eclipse gelöst, daher ist das mein nächster Anlaufpunkt. Naja, Eclipse ist auch nicht viel besser, aber moment, da gab es doch Zend Studio für Eclipse, das mich früher schon mehrfach enttäuscht hat, als es nach Version 5.5 mit Eclipse vereint wurde. Mittlerweile ist es allerdings in Version 7.1 und bittet seine Nutzer doch von 5.5 umzusteigen. Gut, denke ich mir, vielleicht ist es wirklich besser geworden.</p>
<p>Fehlanzeige, Zend geht seit Version 6.0 den Bach runter, die neue Version untstützt nichteinmal Drag and Drop von Text im Editor, ohne das kann ich einfach nicht arbeiten. Wieder runtergeschmissen (das dritte Mal, ich glaub nicht, dass ich das so schnell wieder versuche).</p>
<p>Nun steh ich da, mit dickem Hals auf PHP. Je mehr ich darüber nachdenke finde ich nur Nachteile, weil ich an PHP festhalten will, um irgendwann einmal eine Referenz zu haben und das Spiel auf jeden Webspace klatschen zu können. Nun, das muss nicht sein, wieso all diese Schwierigkeiten in Kauf nehmen, nur um dann einen Haufen Kinder am Hals zu haben die mit der Objektorientierung nicht klar kommen.</p>
<p>Wenn ich mich jetzt gegen PHP entscheide stehen mir plötzlich alle Möglichkeiten offen: Python, Java, &#8230; Aber ich weiß etwas besseres:</p>
<p>JavaScript serverseitig! Damit muss ich auch nicht mehr Code duplizieren wenn ich reiche Funktionalität im Browser haben will, weil ich die gleichen Scripte, die auf dem Server laufen, auch im Browser laufen lassen kann (gut, mit ein paar Feinheiten), trotzdem ist das viel besser, als den Code in PHP und JS duplizieren zu müssen.</p>
<p>Nun habe ich die Wahl, JavaScript serverseitig ist mittlerweile mit einigen verschiedenen Grundsystem möglich. Aptana Jaxer bietet sich an, da ich die IDE bereits für JavaScript nutze. CouchDB wäre mal ein interessanter Ansatz.</p>
<p>Insgesamt wird das ganze um einiges Noob-feindlicher, was aber sowieso schon zur Debatte stand.</p>
<p>Weitere Infos kommen, sobald ich mich entschieden habe.</p>
<p>Edit: Ich habe den Artikel eine Woche zurückgehalten, um nicht irgendwelche voreiligen Entscheidungen in den Raum zu stellen.</p>
<p>Seitdem wurde ich weiter enttäuscht: Mein Favorit Aptana Jaxer scheint nicht mehr wirklich gepflegt zu werden &#8211; in der IDE lässt es sicht nicht mehr installieren, auf der Aptana-Seite ist es verschwunden und auf jaxer.org sind bereits einige Links tot. Schade, das Projekt sah vielversprechend aus.</p>
<p>Alternativen gibt es zum Glück genug, bisher sieht Myna am vielversprechendsten aus. Ich habe die Entscheidung allerdings ein wenig verschoben und schreibe vorerst die Clientseite und verlagere danach Elemente nachträglich auf den Server.</p>
<p>Insgesamt beabsichtige ich einen sehr fließenden Ablauf im Browser zu erreichen. Die Ajaxabfragen werden dann im Hintergrund ausgeführt, nach Möglichkeit unabhängig von der momentanen Aktion des Users, damit es nicht zu Wartezeiten kommt.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2010/01/22/ein-neubeginn/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Zweiter Geburtstag</title>
		<link>http://ugamela-blog.pheelgood.net/2009/11/22/zweiter-geburtstag/</link>
		<comments>http://ugamela-blog.pheelgood.net/2009/11/22/zweiter-geburtstag/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 15:23:43 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[UGamela]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=280</guid>
		<description><![CDATA[Ich kann mir Geburtstage einfach nicht merken. Naja, bei diesem ist eh nicht klar, wann er genau war, jedenfalls im November vor zwei Jahren. (Hab grad nochmal nachgesehn) Interessant, mir kam es so vor, als würde ich schon seit drei Jahren an diesem Projekt arbeiten. Dennoch war dieses Jahr ganz anders wie das letzte. Lebt [...]]]></description>
			<content:encoded><![CDATA[<p>Ich kann mir Geburtstage einfach nicht merken. Naja, bei diesem ist eh nicht klar, wann er genau war, jedenfalls im November vor zwei Jahren. (Hab grad nochmal nachgesehn) Interessant, mir kam es so vor, als würde ich schon seit drei Jahren an diesem Projekt arbeiten. Dennoch war dieses Jahr ganz anders wie das letzte.</p>
<p>Lebt UGamela noch? Fragen sich viele. UGamela wird noch sehr lange leben, denn viel zu viele Browsergameprojekte haben den UGamela Source als Basis verwendet. Selbst OpenSource wird ein Zweig von UGamela weiterentwickelt: XNova. Gut, ob das wirklich Entwicklung ist, darüber könnte man sich jetzt streiten&#8230;</p>
<p>Für mich, und damit das ganze german UGamela Projekt, war das Jahr von meinem Abitur, Ferien und meinem Studienbeginn bestimmt. Code wurde nicht viel geschrieben, dafür habe ich mich auf professionelles Niveau, was Objektorientierung angeht,  gebildet und einen guten Stil in JavaScript gelernt. Mittlerweile kenne ich auch noch andere Sprachen und weiß Vorteile von PHP und JS zu schätzen. Ich habe auch einige Techniken gelernt was allgemein Softwareentwicklung angeht und hoffe, dass ich in der Lage sein werde ein Opensourceprojekt zu leiten.</p>
<p>Mit einem Release rechne ich trotzdem nicht vor einem Jahr.</p>
<p>Alles weitere weiterhin auf diesem Blog!</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2009/11/22/zweiter-geburtstag/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>News</title>
		<link>http://ugamela-blog.pheelgood.net/2009/10/31/news-2/</link>
		<comments>http://ugamela-blog.pheelgood.net/2009/10/31/news-2/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 23:49:16 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=276</guid>
		<description><![CDATA[In letzter Zeit ist so viel passiert, ich weiß gar nicht wo ich anfangen soll. Vielleicht damit, dass ich zwar wusste, dass mit einem Informatikstudium in Karlsruhe ein Haufen Mathe auf mich zukam und damit rechnete, dann aber doch irgendwie unvorbereitet damit konfrontiert wurde. Mathematik an der Universität lässt sich nicht mit Mathe in der [...]]]></description>
			<content:encoded><![CDATA[<p>In letzter Zeit ist so viel passiert, ich weiß gar nicht wo ich anfangen soll. Vielleicht damit, dass ich zwar wusste, dass mit einem Informatikstudium in Karlsruhe ein Haufen Mathe auf mich zukam und damit rechnete, dann aber doch irgendwie unvorbereitet damit konfrontiert wurde. Mathematik an der Universität lässt sich nicht mit Mathe in der Schule vergleichen. Ich belege Höhere Mathematik und Lineare Algebra mit jeweils zwei Vorlesungen in der Woche (=6h), dazu kommt noch jeweils ein Tutorium und die tollen Übungsblätter mit zugehöriger Vorlesung. Dazu noch eine Vorlesung Objektorientiertes Programmieren in Java und Grundbegriffe der Informatik und dann ist meine Woche auch schon gut gefüllt. Wenn man bedenkt, dass ich bereits programmieren kann und GBI eigentlich auch nur Mathe ist, bin ich also die ganze Woche mit Mathe beschäftigt, daran muss man sich erstmal gewöhnen. Keine anderen Fächer in denen man die verbleibenden Gehirnwindungen motivieren kann, kein Wunder, dass man abends relativ fertig nach Hause kommt weil man zwischen den Vorlesungen noch 4h für die wöchentlichen Übungsblätter gearbeitet hat. Die Dinger haben es wirklich in sich. Leider führt da kein Weg dran vorbei, ansonsten wird man nicht zur Prüfung zugelassen.</p>
<p>Soviel zu meinem Studium, freizeitlich beschäftige ich mich weiter mit UGamela bzw. der Phlame Engine. Nach &#8220;Entwurfsmuster&#8221; habe ich &#8220;Patterns of Enterprise Application Architecture&#8221; begonnen zu lesen und einige Muster wieder erkannt, auf die ich auch schon gekommen war. So handelt sich meine Idee um einen Mapper für DomainModels (das was ich ursprünglich Phlame genannt hatte, mangels eines beschreibenden Namens [siehe Entwurf Nr.3]), das ganze kann man dann auch &#8220;Unit of Work&#8221; nennen. Diagramme dazu kommen irgendwann demnächst, spätestens zum Release für die Dokumentation.</p>
<p>Dazwischen habe ich viel in einer <a href="http://www.c2.com/cgi/wiki?WelcomeVisitors">Wiki</a> gelesen und allgemein viel über Softwareentwicklung und Entwurfsmuster gelernt. Zudem habe ich ein wenig in der Abteilung in der Bibliothek gestöbert und einige Bücher überflogen. Nun lese ich gerade ein Buch über Testgetriebene Entwicklung und versuche mir diese Strategie anzueignen, wie auch schon im letzten Post beschrieben.</p>
<p>Wie geht es nun mit dem Code voran? Ich habe gerade Relationen zwischen DomainModels implementiert und werde nun einige Tests durchführen bevor ich mich weiter dem JavaScript-Front-Backend widmen kann um dann endlich Spielinhalt schreiben zu können.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2009/10/31/news-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Test Driven Design/Development (TDD)</title>
		<link>http://ugamela-blog.pheelgood.net/2009/09/19/test-driven-designdevelopment-tdd/</link>
		<comments>http://ugamela-blog.pheelgood.net/2009/09/19/test-driven-designdevelopment-tdd/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 13:07:53 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Entwicklung]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=271</guid>
		<description><![CDATA[Testgetriebene Entwicklung. Ich habe mich entschieden nach diesem bewährten Schema vorzugehen. Dabei arbeite ich mich gerade in das schreiben solcher Tests ein. Die Schwierigkeit besteht darin, die richtigen Tests zu schreiben. Diese Tests können dann während der Entwicklung immer wieder verwendet werden um den Code zu prüfen. Ich werde dafür Tests mit PHPUnit sowie JSUnit [...]]]></description>
			<content:encoded><![CDATA[<p>Testgetriebene Entwicklung.</p>
<p>Ich habe mich entschieden nach diesem bewährten Schema vorzugehen. Dabei arbeite ich mich gerade in das schreiben solcher Tests ein. Die Schwierigkeit besteht darin, die richtigen Tests zu schreiben. Diese Tests können dann während der Entwicklung immer wieder verwendet werden um den Code zu prüfen. Ich werde dafür Tests mit PHPUnit sowie JSUnit schreiben, denn mittlerweile bin ich mir sicher, dass beide Parts ähnlichgroße Komplexität erreichen werden.</p>
<p>Warum? Weil diese bewährte Strategie mir hilft Fehler früh zu erkennen und spätere Änderungen zu erleichtern. Sobald alle Tests erfolgreich durchlaufen bin ich fertig.</p>
<p>Leider fehlt mir noch die große Vorraussicht alle Tests von vornherein zu schreiben, ich werde Stück für Stück vorgehen müssen. Gleichzeitig überlege ich zuerst ein UML Diagramm anzulegen.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2009/09/19/test-driven-designdevelopment-tdd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Entwurfsmuster &#8211; Buch</title>
		<link>http://ugamela-blog.pheelgood.net/2009/09/11/entwurfsmuster-buch-gof/</link>
		<comments>http://ugamela-blog.pheelgood.net/2009/09/11/entwurfsmuster-buch-gof/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 17:34:30 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[Entwurfsmuster]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=268</guid>
		<description><![CDATA[Design Patterns &#8211; das Buch, das weit auch als &#8220;das GoF Buch&#8221; bekannt ist, gehört nicht zu den neuesten Büchern zum Thema, ist aber das Bekannteste und Altbewährte. Ich habe es die letzten Wochen das erste Mal gelesen bzw. bin es durchgegangen. Mein Fazit: Ein gutes Buch! Ich bereue keineswegs 50€ dafür ausgegeben zu haben. [...]]]></description>
			<content:encoded><![CDATA[<p>Design Patterns &#8211; das Buch, das weit auch als &#8220;das GoF Buch&#8221; bekannt ist, gehört nicht zu den neuesten Büchern zum Thema, ist aber das Bekannteste und Altbewährte. Ich habe es die letzten Wochen das erste Mal gelesen bzw. bin es durchgegangen. Mein Fazit:</p>
<p>Ein gutes Buch! Ich bereue keineswegs 50€ dafür ausgegeben zu haben. Werde es aber auch nochmal irgendwann auf englisch in die Hände bekommen müssen, wegen des Vokabulars.</p>
<p>Wie der Name schon sagt, handelt es von Entwurfsmustern. Diese Muster beschreiben wie man Objekte in Beziehung setzen kann, Arten von Beziehungen die gut funktionieren. Es hilft bei Problemlösungen und zeigt auf, wie eine Analyse auszusehen hat. Die Beschreibungen laufen über Vor- und Nachteil und detaillierte Beispiele.</p>
<p>Ich bin immer noch sehr dabei diese Art des Programmierens zu lernen, komme einem guten Niveau aber immer näher. Derweil versuche ich noch die Rolle von Prototypen in JavaScript zu verstehen um dann, selbst in JavaScript, Entwurfsmuster anzuwenden.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2009/09/11/entwurfsmuster-buch-gof/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>DotA &#8211; Defense of the Ancients</title>
		<link>http://ugamela-blog.pheelgood.net/2009/06/26/dota-defense-of-the-ancients-warcraft3/</link>
		<comments>http://ugamela-blog.pheelgood.net/2009/06/26/dota-defense-of-the-ancients-warcraft3/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 17:21:29 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=238</guid>
		<description><![CDATA[Es handelt sich um einen Artikel, der versucht DotA als Browsergame umzusetzen und dabei auf einige Aspekte des Spiels eingeht und sie mit einem Weltraumspiel vergleicht.]]></description>
			<content:encoded><![CDATA[<p>Ich spiele seit langer Zeit dieses Spiel, es hat mich dauerbegeistert. Mittlerweile dürften es fünf Jahre sein, seit ich es das erste Mal gespielt habe.</p>
<p>Blizzard stellt für WarCraft3 und andere Spiele ein herrliches Online-Netzwerk zum Spielen bereit, es nennt sich Battle.net. Gepaart mit einem sehr guten Mapeditor ergibt das eine Vielfalt von sogenannten Funmaps, die man online gegen andere menschliche! Spieler spielen kann. Als Browsergamespieler kennt ihr den Reiz gegen menschliche Spieler zu spielen; ich mag sehr gerne Strategie.</p>
<p>DotA ist eine dieser Funmaps, die permanent entwickelt wird. Ich wage zu schätzen, dass weltweit eine Millionen Spieler diese Karte für WarCraft3 TFT aktiv spielen oder bereits aktiv gespielt haben.</p>
<p>Anstatt weiter auf das Spiel selbst einzugehen, möchte ich ein wenig analysieren, was das Spiel so attraktiv macht. Wer sich interessiert sollte mal bei Freunden nach einem WarCraft3+Erweiterung Serial fragen oder sich das Spiel zulegen, zusammen kostet das immer noch 26€ glaube ich. Ein wenig mehr über das Spiel: <a href="http://de.wikipedia.org/wiki/DotA_Allstars">Wikipedia DotA Allstars</a>. Seit knapp zwei Wochen ist die Karte sogar auf Deutsch verfügbar, wenn auch ein wenig verbuggt. Es wird sich zudem darum bemüht, das Spiel einsteigerfreundlicher zu machen.</p>
<p>Ich sinne auch schon seit Jahren an einer Browsergame-Umsetzung von DotA, aber das ist wahrscheinlich unmöglich. Stattdessen könnte man versuchen sehr gute Aspekte des Spiels wiederzuverwenden. -Keine Angst, ich werde jetzt nicht die Entwicklung von UGamela abbrechen, aber wer weiß, was man alles in ein Weltraumspiel miteinfließen lassen kann, oder ob sich das Spiel nicht doch hervorragend modden lässt&#8230;-</p>
<p>Der attraktivste Punkt an DotA ist wohl die permanente Entwicklung und Erweiterung (bereits mind. 7 Jahre) und die einhergehende Vielfalt. Das Spiel umfasst mehr als 95 Helden und eine schiere Fülle von Gegenständen (&#8220;Items&#8221;). Das Balancing ist fast perfekt und wird immer wieder verbessert. Zum Gewinnen kommt es natürlich auf das persönliche Können jedes Spielers an, doch wichtiger ist noch das Zusammenspiel des Teams. Trotz einer Rollenverteilung ist DotA kein RPG.</p>
<p>Leider ist Teamplay nur sehr begrenzt im Browsergame umzusetzen, doch ständige Weiterentwicklung und Vielfalt sind auf alle Fälle möglich. Ich habe an einen unendlichen Technologiebaum gedacht. Aktive Fähigkeiten von Helden erfordern die Anwesenheit des Spielers und direkte Kommunikation mit dem Server. Bisher laufen Kämpfe im Galaxiebrowsergame eher sehr selbstständig ab, das würde ich gerne behalten, denn für etwas anderes ist das Browser-Server-System ungeeignet. Doch einige Helden und Items in DotA besitzen passive Fähigkeiten, die man in einem ähnlichen Stil übertragen könnte.</p>
<p>Beispiel: Lifeleech (Lebensraub) ist eine Fähigkeit, die einen Prozentsatz des verursachten Schadens als Leben zurückgewinnt. Natürlich müsste man für Raumschiffe einen anderen Namen und eine bessere Beschreibung für diese Fähigkeit finden, aber spannender würde es mit soetwas auf jeden Fall werden. Besonders, wenn sich diese Fähigkeiten auch noch ausbauen oder verschmelzen lassen.</p>
<p>Auch das ist ein wichtiger Aspekt bei DotA: ein Held hat eine begrenzte Anzahl Slots für die Items, kleinere Items lassen sich mit Rezepten zu größeren zusammenbauen. So könnte man die Anzahl der Schiffe im Kampf natürlich senken, indem sie sich effektiv ausbauen lassen. Das macht die Kampfberechnung zwar teils komplexer, aber auch einfacher, weil weniger Schiffe berechnet werden müssen.</p>
<p>Ich hoffe das klang nun alles nicht zu sehr weit hergeholt, aber ich versuche sowieso ein wenig Richtung Fantasy zu gehen. Zum Beispiel mit einer weiteren Rasse und einer anderen Energiesorte (Mana). Spannend wäre es beide Energiesorten gleichzeitig zu nutzen&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2009/06/26/dota-defense-of-the-ancients-warcraft3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript / AJAX: Callbacks umgehen, Verkettung von Befehlen</title>
		<link>http://ugamela-blog.pheelgood.net/2009/04/04/javascript-ajax-callbacks-umgehen-verkettung-von-befehlen-avoid-callbacks-chaining-oop/</link>
		<comments>http://ugamela-blog.pheelgood.net/2009/04/04/javascript-ajax-callbacks-umgehen-verkettung-von-befehlen-avoid-callbacks-chaining-oop/#comments</comments>
		<pubDate>Sat, 04 Apr 2009 13:12:59 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=221</guid>
		<description><![CDATA[Ich beschäftige mich zur Zeit intensiv mit JavaScript, da es mir clientseitig einige Arbeit abnehmen soll. Beispiel: JavaScript Templateparser Ich stehe immer noch zu OOP und auch JavaScript untersützt OOP hochgradig, allerdings in einer für PHPler ungewohnten Form: mit Prototypes, ohne Klassen. Überhaupt ist in JavaScript alles ein Objekt oder &#8211; noch besser &#8211; eine [...]]]></description>
			<content:encoded><![CDATA[<p>Ich beschäftige mich zur Zeit intensiv mit JavaScript, da es mir clientseitig einige Arbeit abnehmen soll.</p>
<p>Beispiel: <a href="http://ugamela-blog.pheelgood.net/2008/12/18/javascript-template-parser/">JavaScript Templateparser</a></p>
<p>Ich stehe immer noch zu OOP und auch JavaScript untersützt OOP hochgradig, allerdings in einer für PHPler ungewohnten Form: mit Prototypes, ohne Klassen. Überhaupt ist in JavaScript alles ein Objekt oder &#8211; noch besser &#8211; eine Funktion! Ich habe hier keine Zeit eine JavaScript Einführung zu geben, ich bitte daher um selbständige Fortbildung um diesen Artikel verstehen zu können.</p>
<p><span id="more-221"></span></p>
<p>AJAX Requests sind asynchron, laufen also immer mit Callbacks. Ich verwende <a href="http://jquery.com/" target="_blank">jQuery</a> als JS-Framework.</p>
<pre class="javascript">$.get(url, function(data) {
    // callback code
});</pre>
<p>Wenn ich nun mehrere Requests brauche, weil ich &#8211; im Falle des Templateparsers &#8211; Template, Sprache und Daten brauche, dann gibt das eine häßliche Verschachtelung:</p>
<pre class="javascript">$.get(tplurl, function(tpl) { // hole Template
    $.get(lngurl, function(lng) { // hole Sprache
        $.get(url, function(data) { // hole Daten
            $.bindTo(tpl, data, lng, '#content'); // parse das Template mit den Daten und der Sprache nach #content
        });
    });
});</pre>
<p>Und das ist noch vereinfacht&#8230; Dabei hätte ich viel lieber, wobei die Templates und die Sprache gecacht werden sollen:</p>
<pre class="javascript">$.get(url, function(data) {
    $tpl(tplID).bindTo(data, lngID, '#content');
});</pre>
<p>Nun.. wie bekommen wir das Callback weg?</p>
<p>Analyse des Problems:</p>
<p>Wir wollen anstatt eines Callbacks eine Verkettung per Punktschreibweise (Objektmethodenaufrufe), das bedeutet die Befehle die auf das Templateobjekt ausgeführt werden, werden höchstwahrscheinlich AJAX Requests beinhalten, auch wenn der Cache verwendet werden kann, müssen wir innerhalb mit Callbacks arbeiten, aber wir können sie nach außen hin verstecken, solange dem Coder gewahr ist, dass der bindTo-Aufruf auch asynchron ist. Für den Fall, dass man doch weiter abhängigen Code hat, führt kein Weg an weiteren Callbacks vorbei.</p>
<p>$tpl(tplID, callback).bindTo(data, params{lang,callback&#8230;})</p>
<p>Trotzdem wird das Aussehen komprimiert und etwas lese- und schreibfreundlicher.</p>
<p>Nun, wie ist das im Inneren gelöst?</p>
<p>Wir definieren zuerst eine Funktion get() (private), die das Template auftreibt, sei es aus dem Cache oder per Request. In beiden Fällen führt sie (oder der zugehörige Request) das interne Callback aus, sofern es gesetzt ist.</p>
<p>Das Objekt besitzt nun die public Methode bindTo, welche zuerst das interne Callback definiert (mit dem echten internen bindTo Code) und dann get() aufruft. Dazu kommen noch die beiden äußeren Callbacks von $tpl und bindTo, die wie das interne Callback am Ende von get() aufgerufen werden, sofern sie definiert sind.</p>
<p>Folge: Beim Aufruf von $tpl(tplID) passiert noch nichts besonderes, außer das ein Objekt zu Rückgabe gebildet wird. Der Aufruf von bindTo() auf dem Objekt stößt nun den Request an, welcher danach das echte bindTo ausführt!</p>
<p>So. Das wollte ich loswerden <img src='http://ugamela-blog.pheelgood.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> , vielleicht hilft es ja irgendwem oder animiert Leute JavaScript zu lernen&#8230;</p>
<p>Bei echtem Verwendungsinteresse des Codes einfach Mail an mich.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2009/04/04/javascript-ajax-callbacks-umgehen-verkettung-von-befehlen-avoid-callbacks-chaining-oop/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Design Patterns: Dekorierer (Decorator) [vs. Vererbung]</title>
		<link>http://ugamela-blog.pheelgood.net/2009/02/24/design-patterns-dekorierer-decorator-vs-vererbung-php/</link>
		<comments>http://ugamela-blog.pheelgood.net/2009/02/24/design-patterns-dekorierer-decorator-vs-vererbung-php/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 16:10:45 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[Entwurfsmuster]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=201</guid>
		<description><![CDATA[Hab ja schon lange nichts mehr geschrieben, greife nun den Gedanken etwas über Design Patterns zu schreiben wieder auf. Vorerst muss ich darauf hinweisen, dass ich kein Profi bin und hier meine subjektive Meinung vertrete. Dies wird also kein Eintrag wie aus dem Lehrbuch, ich versuche nur etwas auf meine Weise klar zu machen. Einleitung [...]]]></description>
			<content:encoded><![CDATA[<p>Hab ja schon lange nichts mehr geschrieben, greife nun den Gedanken etwas über Design Patterns zu schreiben wieder auf.</p>
<p>Vorerst muss ich darauf hinweisen, dass ich kein Profi bin und hier meine subjektive Meinung vertrete. Dies wird also kein Eintrag wie aus dem Lehrbuch, ich versuche nur etwas auf meine Weise klar zu machen.</p>
<blockquote><p>Einleitung der <a title="Viererbande" href="http://de.wikipedia.org/wiki/Viererbande_(Softwareentwicklung)" target="_blank">GoF</a>: <em>Favorisiere Zusammensetzung vor Vererbung (&#8220;Favor object composition over class inheritance&#8221;) </em></p></blockquote>
<p><em>Vererbung</em> sollte für jeden, der schon mal ein paar Klassen geschrieben hat, klar sein; Stichwort dazu ist (in PHP) &#8220;extends&#8221;. <em>Zusammensetzung</em> ist schon ein wenig schwieriger. Ich bin mir nicht mal sicher, ob das auch wirklich die perfekte Übersetzung für <em>Composition</em> ist. Die wichtigste Rolle spielt hier der <em>Dekorierer</em>.  <span id="more-201"></span></p>
<p>Hier nun ein bischen PHP-Code, hoffentlich schon selbsterklärend:</p>
<pre class="brush: php;">
interface Etwas
{
    public function tuWas();
}
class EtwasImplementation implements Etwas
{
    public function tuWas()
    {
        return 'Etwas tut was.';
    }
}
class AnderesEtwas implements Etwas
{
    public function tuWas()
    {
        return 'Dieses Etwas tut was Anderes, evtl. Ähnliches auf andere Weise.';
    }
}
class EtwasDekorierer implements Etwas
{
    protected $_Etwas;
    public function __construct(Etwas $Etwas)
    {
        $this-&gt;_Etwas = $Etwas;
    }
    public function tuWas()
    {
        return $this-&gt;_Etwas-&gt;tuWas().' Und der Dekorierer verarbeitet das noch weiter, kann jedes Etwas erweitern.';
    }
}</pre>
<p>Wie man sieht ist der EtwasDekorierer selbst ein Etwas, kann auch jeder Zeit die Stelle eines Etwas einnehmen, wie als würde er davon abstammen (Vererbung). Der klare Vorteil gegenüber der Vererbung ist nun, dass der EtwasDekorierer sowohl die EtwasImplementation als auch AnderesEtwas erweitern kann. Das, was erweitert wird, wird dadurch austauschbar. Mehrere Dekorierer lassen sich übrigens hervorragend verschachteln.</p>
<p>Hier noch ein kleines, etwas konkreteres Beispiel:</p>
<pre class="brush: php;">
class Logger # soll Methodenaufrufe des dekorierten Objekts loggen.
{
    protected $_Object;
    public function __construct($Object) #ggf prüfen ob es ein Objekt eines bestimmten Typs ist (per Typehint)
    {
        $this-&gt;_Object = $Object;
    }
    public function __call($method, $args);
    {
         printf('Methode %s eines Objekts der Klasse %s wurde aufgerufen \n', $method, get_class($this-&gt;_Object));
         # Hier kann man natürlich je nach Bedarf etwas Anderes einbauen... (e.g. In Datei schreiben etc.etc..)
         return call_user_func_array(array($this-&gt;_Object, $method), $args);
    }
}</pre>
<p>Der Nachteil am Dekorierer ist, dass man alles delegieren, also weiterleiten, muss. Besonders wenn der Dekorierer nur einen Teil der Methoden verändern soll ist das nervig alle Methoden an das dekorierte Objekt weiterzuleiten. PHP5s __call() kann da praktisch sein, obwohl dann zu überdenken ist, ob der Dekorierer nicht unnötig ist, gerade in PHP, wo OOP weniger performant ist.</p>
<p>Insgesamt wird mit dem Dekorierer eine weniger feste Bindung zwischen den Objekten gelegt, dadurch wird das Design flexibler.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2009/02/24/design-patterns-dekorierer-decorator-vs-vererbung-php/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Vergleich PHP vs. Python</title>
		<link>http://ugamela-blog.pheelgood.net/2009/01/25/vergleich-php-vs-python-browsergame/</link>
		<comments>http://ugamela-blog.pheelgood.net/2009/01/25/vergleich-php-vs-python-browsergame/#comments</comments>
		<pubDate>Sun, 25 Jan 2009 20:55:55 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=189</guid>
		<description><![CDATA[PHP muss nicht so schlecht sein, wie alle sagen. Mit PHP lassen sich auch größere Projekte verwirklichen, aber dafür gedacht ist es weniger. Für kleine Sites ohne größeren serverseitigen Rechenaufwand ist es gut geeignet und auch überschaubar. Mit PHPs OOP lässt sich etwas anfangen, aber die Vorzüge echter objekt orientierter Sprachen bietet es nicht. Am Ruf darf man sich dann nicht stören.

Python sollte verwendet werden wenn OOP von belang ist, damit hebt es sich am stärksten von PHP ab. Wenn auf eurem Webspace Python verfügbar ist, dann kann ich nur dazu animieren das einmal auszuprobieren!]]></description>
			<content:encoded><![CDATA[<p>PHP und Python unterscheiden sich stark, daher wird dieser Vergleich vor allem auf die Verwendbarkeit für ein Browsergame abzielen.</p>
<p><span id="more-189"></span></p>
<p>Python lässt sich, im Gegensatz zu PHP, welche eine pure Websprache ist, für jegliche Anwendung verwenden. PHP wird sehr gerne für Websiten verwendet, der Code ist schnell geschrieben, besondere Strukturen würden zwar nicht schaden, sind aber nicht von Nöten, weshalb kaum einer sich wirklich Mühe gibt. Dementsprechend ist auch der Ruf sehr schlecht. Es gibt viel zu viel Spaghetticode, allein UGamela war ein Beweis.</p>
<p>Ich persöhnlich habe mich sehr mit OOP und Designpatterns angefreundet und überzeugt ein gut strukturiertes stabiles Spielgerüst zu bauen. Es ist eindeutig ein Anreiz einmal OpenSource-Code mit Qualität aufzubauen, es wird viel zu viel geklagt wenn man sich mal umhört. Auch da geht der Abscheu zu PHP mit einher. Wenn man in höheren Kreisen erzählt man schreibe ein Browsergame in PHP wird man komisch angesehn. Zu Recht, denn PHP scheint denkbar ungeeignet:</p>
<p>Ein Browsergame ist mit nichts im Web wirklich vergleichbar und trotzdem versucht man es in einer Scriptsprache zu schreiben, die denkbar ungeeignet ist, schon allein aufgrund Performance. Um den Überblick im Spiel halten zu können (Wartbarkeit) und auch mal kurz neue Features einzufügen oder zu testen (Erweiterbarkeit &amp; Flexibilität) muss der Code gut strukturiert sein, sonst wird das nach kürzester Zeit chaotisch, wenn er es nicht sowieso schon war.</p>
<p>Noch ein paar weitere Dinge die ich für das Spiel brauche:</p>
<ol>
<li>Eine einfache Sprache, denn das Spiel soll möglichst von jedem erweitert werden können</li>
<li>Verfügbarkeit auf Webservern, evtl. Webspaces und wenig Installationsaufwand</li>
<li>Wahrscheinlich ein CMS oder Framework, das mir Funktionen zur Userverwaltung abnimmt</li>
</ol>
<p>1) Bieten PHP und Python beide, mir scheint Python sogar noch einfacher durch das Wegfallen der Klammern und die automatische Einrückung.</p>
<p>2) Hier schlägt PHP eindeutig Python, es ist quasi überall verfügbar, Standard.</p>
<p>3) In PHP sowie auch Python vorhanden, den PHP Frameworks wird aber allen keine besonders gute Performance zugesprochen.</p>
<p><em><strong><br />
</strong></em></p>
<p><em><strong>Allgemeines Fazit:</strong></em></p>
<p>PHP muss nicht so schlecht sein, wie alle sagen. Mit PHP lassen sich auch größere Projekte verwirklichen, aber dafür gedacht ist es weniger. Für kleine Sites ohne größeren serverseitigen Rechenaufwand ist es gut geeignet und auch überschaubar. Mit PHPs OOP lässt sich etwas anfangen, aber die Vorzüge echter objekt orientierter Sprachen bietet es nicht. Am Ruf darf man sich dann nicht stören.</p>
<p>Python sollte verwendet werden wenn OOP von belang ist, damit hebt es sich am stärksten von PHP ab. Wenn auf eurem Webspace Python verfügbar ist, dann kann ich nur dazu animieren das einmal auszuprobieren!</p>
<p><em><strong>Mein Fazit:</strong></em></p>
<p>Python ist denkbar besser geeignet, vor allem weil ich mir soviel Struktur wünsche. Ich freue micht jetzt schon auf den sauberen Code, habe die Semikolons und Klammern satt. Ein einfacher (billig) Webspace ist sowieso denkbar ungeeignet für ein Browsergame. PostgreSQL wird hervorragend passen, das unterstützt sogar innerhalb Python Aufrufe (Ersatz für die MySQL Procedures). In wieweit ich ein Framework wie Zope, Django oder Pylons zur Hand nehme steht noch nicht fest.</p>
<p>Ich möchte hiermit alle UGamela Interessierten dazu auffordern einmal in Python hineinzuschnuppern, der Aufwand könnte sich lohnen!</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2009/01/25/vergleich-php-vs-python-browsergame/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>
