<?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; JavaScript</title>
	<atom:link href="http://ugamela-blog.pheelgood.net/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://ugamela-blog.pheelgood.net</link>
	<description>Entwicklung eines Browsergames</description>
	<lastBuildDate>Mon, 12 Dec 2011 18:28:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Erste Implementierungen mit NodeJS</title>
		<link>http://ugamela-blog.pheelgood.net/2011/12/12/erste-implementierungen-mit-nodejs/</link>
		<comments>http://ugamela-blog.pheelgood.net/2011/12/12/erste-implementierungen-mit-nodejs/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 16:51:12 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[Programmiersprachen]]></category>
		<category><![CDATA[Ressourcenberechnung]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=380</guid>
		<description><![CDATA[NodeJS lässt sich mittlerweile sehr einfach unter Windows installieren. Das ist ein guter Fortschritt. Ich habe auch feststellen können Aptana Studio macht was ich will, kann aber auch sein, dass ich mich einfach mittlerweile dran gewöhnt habe. Letzte Woche habe ich mal grundsätzlich ein Markup auf gesetzt, bisher sind die Widgets (Menü, Planet, Resourcen, Gebäudeliste) [...]]]></description>
			<content:encoded><![CDATA[<p><a title="NodejS Download" href="http://nodejs.org/#download">NodeJS</a> lässt sich mittlerweile sehr einfach unter Windows installieren. Das ist ein guter Fortschritt. Ich habe auch feststellen können Aptana Studio macht was ich will, kann aber auch sein, dass ich mich einfach mittlerweile dran gewöhnt habe.</p>
<p>Letzte Woche habe ich mal grundsätzlich ein Markup auf gesetzt, bisher sind die Widgets (Menü, Planet, Resourcen, Gebäudeliste) aber noch statisch. Ich brauche dann auch bald einen Designer, damit ich mich nicht ewig mit dem CSS rumschlagen muss. Ich möchte auch ein Touch-Interface für Smartphones, damit man das Spiel gut unterwegs spielen kann.</p>
<p>Als nächstes möchte ich das Interface ein bischen dynamischer gestalten. Die Ressourcenverwaltung habe ich schonmal früher geschrieben, da waren jetzt aber noch eine Änderungen notwendig. An der Ressourcenberechnung habe ich schon lange gearbeitet (Implementierungen in PHP, MySQL und JavaScript).</p>
<p>Über die Gebäudeliste soll man dann als nächstes bauen können.</p>
<p>Ich habe mir mit der <a href="https://github.com/caolan/async">async</a> Bibliothek einen eigenen Build Prozess gebaut, der meinen Code zusammenfasst und kompressieren kann und mich ein an die asyncrone I/O und den Callback-Stil gewöhnt. Nebenbei lerne ich an der Uni in Programmierparadigmen Haskell, die funktionale Sprache überhaupt. JavaScript mischt objektorientiert und funktional. Funktionale Programmierung hat durchaus gute Seiten, obwohl der Einstieg oder Umstieg von zB. Java schwierig sein kann. Besonders in Haskell ist Code deutlich kürzer, viele Dinge lassen sich mit einem Einzeiler erledigen. Sehr gut, dass in JavaScript Funktionen erster Klasse (first-class) sind.</p>
<p>Ich beobachte einige NodeJS Projekte über die Mailingliste und github, und habe begonnen einige auszuprobieren. Leider nicht immer mit Erfolg. Man merkt doch noch sehr, dass NodeJS noch sehr jung ist.</p>
<p>Erfolgreich habe ich <a href="http://livejs.com">live.js</a> und <a href="http://documentcloud.github.com/underscore/">underscore</a> eingebunden. Mein Buildprozess ist in der Lage Dateien zu beobachten und live.js aktualisiert ständig HTML, CSS und JavaScript, so kann man Codeänderungen direkt im Browser beobachten.</p>
<p>So wirklich funktioniert <a href="https://github.com/substack/node-browserify">browserify</a> für mich nicht, ich werde wohl bei meinem eigenen Buildprozess bleiben und Dateien manuell hinzufügen. Ich brauche aber definitv eine Implementierung für require() im Browser, da werde ich evtl. ein wenig Code übernehmen.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2011/12/12/erste-implementierungen-mit-nodejs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript (NodeJS) vs. PHP vs. Python</title>
		<link>http://ugamela-blog.pheelgood.net/2011/05/31/javascript-nodejs-vs-php-vs-python/</link>
		<comments>http://ugamela-blog.pheelgood.net/2011/05/31/javascript-nodejs-vs-php-vs-python/#comments</comments>
		<pubDate>Tue, 31 May 2011 18:12:30 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmiersprachen]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Vergleich]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=359</guid>
		<description><![CDATA[Ein Vergleich zur Wahl der richtigen Programmiersprache hinsichtlich einer speziellen Browsergame Architektur. Themen sind Entstehung, Stil, Verbreitung, Platform und Frameworks.]]></description>
			<content:encoded><![CDATA[<p>Ich habe schonmal einen ähnlichen Artikel geschrieben, der allerdings mittlerweile veraltet ist und die meisten Seitenaufrufe meines Blogs produziert. <a href="http://ugamela-blog.pheelgood.net/2009/01/25/vergleich-php-vs-python-browsergame">http://ugamela-blog.pheelgood.net/2009/01/25/vergleich-php-vs-python-browsergame</a></p>
<p>Im letzten Artikel habe ich bereits über erste Erfahrungen mit NodeJS gesprochen: <a href="http://ugamela-blog.pheelgood.net/2011/04/29/nodejs/">http://ugamela-blog.pheelgood.net/2011/04/29/nodejs/</a></p>
<p>Hier soll nun, ähnlich wie letztes Mal, ein Vergleich von Programmiersprachen stattfinden, wieder hinsichtlich der Entstehung eines Browsergames. Dies ist kein allgemeiner Vergleich und teils eine subjektive Meinung.</p>
<p>Des weiteren geht es um die Erschaffung eines OpenSource-Browsergames. Mit der Architektur stellt sich auch die Frage der richtigen Programmiersprache, die für diesen Fall am besten geeignet ist.</p>
<p>Die Platform ist für den Client &#8211; den Spieler &#8211; sein Browser, somit eine Website oder gar WebApplication. Hier steht nur eine Sprache zur Wahl: JavaScript. (Ich hasse Flash).</p>
<p>JavaScript wird mittlerweile von entwickelten Engines optimiert und sogar teils compiliert, auch größere Konstrukte sind im Browser möglich, es kann Rechenlast (Server-&gt;Client) ausgelagert werden.</p>
<p>Serverseitig ist die Auswahl größer. Letztlich lässt sich in fast jeder Sprache ein Server schreiben. Die meistverwendetsten sind wohl PHP, Java, Ruby, Python und Perl.</p>
<p>Java bleibt hier außen vor, und über Ruby (zu langsam) und Perl (zu häßlich) möchte ich nicht schreiben.</p>
<h3>Entstehung:</h3>
<p>JavaScript, PHP und Python hatten verschiedene Entstehungsbedingungen und Intentionen, sind daher auch für verschiedene Aufgaben geeigneter.</p>
<ul>
<li>PHP: Hypertext-Preprocessor. Als Templatesprache gedacht und dann für Webprogrammierung ausgeweitet.</li>
<li>Python: Für besonders gute Lesbarkeit entwickelt. Allzwecksprache.</li>
<li>JavaScript: Mehr Möglichkeiten zur Benutzerinteraktion auf Websites, HTML und CSS sind nicht turingvollständig. Komplizierte Entwicklung.</li>
</ul>
<p>Zuletzt ist JavaScript stark beeinflusst durch den Browserkrieg. PHP ist etabliert, Python ist einfach schön.</p>
<h3>Stil:</h3>
<p>Prozedural, funktional, objektorientiert &#8211; das können alle drei, wobei prozedurale Programmierung in Python wohl Missbrauch wäre und PHP objektorientierte und funktionale Aspekte vor nicht allzu langer Zeit gelernt hat. JavaScript kommt mit einem minimalen Wortschatz aus und ist zudem klassenlos, kann aber Klassen ohne viel Aufwand nachbilden. Für mich ist ordentliche Objektorientierung wichtig. Der Prototypenbasierte Ansatz bei JavaScript gefällt mir.</p>
<h3>Bedingungen:</h3>
<p>Bei einem Browsergame ist eine Menge Kommunikation von Programmen erfordlich (Client-Server), besonders wenn es ein verteiltes System werden soll. Wobei jeder Server zumindest 100-1000 Spieler gleichzeitig aushalten sollte.</p>
<h3>Platform:</h3>
<p>PHP wird meist über (FastCGI) an einen Apachen oder anderen Webserver angebunden, der für jede Anfrage einen neuen Thread aufgemacht, der die Anfrage dann verarbeitet. Ein Thread hat jeweils einen eigenen Adressraum, teil sich keinen Arbeitsspeicher mit den anderen Threads. Für 100-1000 simultane Spieler braucht man dann halt einen leistungsstärkeren und teureren Server. Gleichzeitig konkurieren die Threads die ganze Zeit um die Datenbank.</p>
<p>NodeJS unterscheidet sich deutlich in der Architektur, welche aus dem Browser abstammt. Es gibt zwar die Möglichkeit Arbeit in Threads auszulagern, die sollte aber normalerweise nicht notwendig sein. Die Verarbeitung von Requests erfolgt ereignisgesteuert, Timeouts und Events werden von einer Schleife ausgeführt, die die ganze Zeit läuft (ein einziger Prozess). Abfragen mit verknüpfter Wartezeit (Datenbank, Dateisystem) werden asynchron ausgeführt. Während gewartet wird, widmet sich der Prozess eventuell bereits der nächsten HTTP-Anfrage.</p>
<p>Auch kommt hier eine Möglichkeit hinzu, die mir bei PHP gar nicht in den Sinn kam: Alle Requests teilen sich einen Adressraum und können auf den selben Arbeitsspeicher bzw. die selben Objekte im Code zugreifen. Deadlocks sind relativ unproblematisch, weil eh nur eine Anfrage zur Zeit verarbeitet wird. Natürlich gibt es Bibliotheken die auch für PHP Objekte im RAM cachen können, doch insgesamt gestaltet es sich deutlich einfacher in NodeJS. Das Array einfach eine Scope-Ebene drüber deklariert, und schon können alle darauf zugreifen. Ich plane die Datenbank komplett im RAM zu halten und alle paar Sekunden eine Schreiboperation an eine simple Datenbank zu schicken, die die Objekte versioniert (so kann dann im Falle eines Absturzes das Spiel wiederhergestellt werden).</p>
<p>Python ist auch in der Lage Objekte über den Applicationscope zu teilen.</p>
<h3>Verbreitung:</h3>
<p>Deutlich für PHP und Python spricht ihr Alter und ihre Verbreitung. Doch NodeJS ist gut dabei bald in die selbe Liga aufzusteigen. Gerade auch mit dem Cloud-Hype wird NodeJS immer beliebter. Ein kleiner Server mit NodeJS ist in der Amazon Cloud schnell installiert, aufrüsten gestaltet sich deutlich einfacher als auf einem normalen Server.</p>
<h3>Frameworks:</h3>
<p>Frameworks bilden sich für NodeJS erst langsam, da ist bei PHP und Python schon deutlich mehr Auswahl und Umfang enthalten. Mit Frameworks lässt sich natürlich Arbeit sparen, andererseits bläht es das System aber auch unnötig auf. Wieso ein großes Framework verwenden, wenn man denn doch nur einen kleinen Teil der Funktionalität braucht.</p>
<h3><span style="text-decoration: underline;">Fazit: </span></h3>
<p>Es gibt keinen eindeutigen Sieger. Für mich selbst hat PHP allgemein verloren, weil ich an seine Grenzen gestoßen bin. Mit Python lässt sich in diesem Fall auch arbeiten, aber dann müssen Server- und Clientseite separat implementiert werden. NodeJS unterscheidet sich vor allem in der Herangehensweise und grundsätzlich in der asynchronen Architektur, da ist erstmal umdenken angesagt, wenn man vorher nur synchron programmiert hat.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2011/05/31/javascript-nodejs-vs-php-vs-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Struktur UGamela 0.6</title>
		<link>http://ugamela-blog.pheelgood.net/2010/04/24/struktur-ugamela-0-6/</link>
		<comments>http://ugamela-blog.pheelgood.net/2010/04/24/struktur-ugamela-0-6/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 23:20:10 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Struktur]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=317</guid>
		<description><![CDATA[Das kommende UGamela wird komplett in JavaScript geschrieben, kein PHP und auch kein Python wie ich überlegt hatte. Ein Argument ist einfach durchschlagend: Da man die kommende Version als RIA (Rich Internet Application) bezeichnen kann, ist die ganze Oberfläche in JavaScript gebaut. Um das MVC-Pattern anwenden zu können, werden auch auf Clientseite alle Models implementiert. [...]]]></description>
			<content:encoded><![CDATA[<p>Das kommende UGamela wird komplett in JavaScript geschrieben, kein PHP und auch kein Python wie ich überlegt hatte. Ein Argument ist einfach durchschlagend: Da man die kommende Version als RIA (Rich Internet Application) bezeichnen kann, ist die ganze Oberfläche in JavaScript gebaut. Um das MVC-Pattern anwenden zu können, werden auch auf Clientseite alle Models implementiert. Anstatt sich nun doppelte Arbeit zu machen und das Spiel doppelt zu implementieren (in JavaScript auf Clientseite und in einer anderen Sprache auf Serverseite), schreibe ich den Code nur einmal und verwende ihn auf beiden Seiten. Natürlich gibt es auch Code, der nur auf einer Seite verwendet wird: clientseitig Views oder serverseitig OR-Mapping (sofern ich mich nicht doch noch zu CouchDB durchringen kann).</p>
<p><span id="more-317"></span></p>
<p>Nach guten JavaScript-Prinzipien arbeitend, möchte ich natürlich nicht den globalen Namespace verschmutzen. Ich führe nur zwei Globals ein: Game und Phlame. Phlame ist das Framework, das ich baue. Grundlegende Abstraktionen werden dorthin ausgelagert. Bisher ist es nur eine Vorgabe für das MVC-Pattern, welche Klassen in Zukunft dorthin ausgelagert werden, habe ich noch nicht festgelegt. Wahrscheinlich wird dort auch die grundlegende Kommunikation mit dem/n Server/n abgelegt.</p>
<p>Ordnerstruktur:</p>
<pre>/cfg Konfigurationsordner, ermöglich einfache Modifikationen am Spiel
/lib Library
    /Phlame Dateien des Phlame-Frameworks
    jquery.js
    ...
/style Aussehen des Spiels: Bilder, Cascading-Style-Sheets
/lang Sprachdateien
    /de
/src Source des Spiels
    /clientside
        /views
        ...
    /serverside
        ...
    ...
/spec jspec Tests
index.html Startseite
game.html Spielintern
admin.html Adminintern (externer Login)</pre>
<p>Dateistruktur (Beispiel einer View):</p>
<pre class="brush: jscript; title: ; notranslate">(function() { // module pattern

//import
var $ = jQuery;
var View = Phlame.views.View;

//class or object declaration
function SolarsystemView(args) {
    View.apply(this); // inheritance
    var privateVar;

    this.priviledgedMethod = function() {
         // do something with privateVar
    };
}
//prototype inheritance
SolarsystemView.prototype = new View();
SolarsystemView.prototype.commonMethod = function() {
    // &quot;this&quot; available, but no privateVar(s)
};

//export
Game.views.Solarsystem = SolarsystemView;

})(); // end closure (module pattern)</pre>
<p>Wie zusehen, verwende ich keinen Sugar für Klassendeklaration und Vererbung, weil ich finde, dassdiese Schreibweise nicht viel umständlicher ist und man so näher an der Natur von JavaScript arbeitet. Den einzigen Sugar, den ich mir leiste sind ECMA-262-3 Funktionen Object.prototype.create() und Function.prototype.bind().</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2010/04/24/struktur-ugamela-0-6/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<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; title: ; notranslate">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; title: ; notranslate">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; title: ; notranslate">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; title: ; notranslate">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; title: ; notranslate">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; title: ; notranslate">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>Class Resource</title>
		<link>http://ugamela-blog.pheelgood.net/2010/02/17/class-resource-javascript-valueobject-prototype-pattern-2/</link>
		<comments>http://ugamela-blog.pheelgood.net/2010/02/17/class-resource-javascript-valueobject-prototype-pattern-2/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 22:40:16 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=300</guid>
		<description><![CDATA[Ich kam noch nie dazu hier einen Codefetzen vorzustellen (außer des Beitrags zum Dekorierer). Nun nutze ich diese Gelegenheit eine meiner ersten JavaScript Klassen zu besprechen. Gleichzeitig handelt es sich um das Muster Wertobjekt (ValueObject), welches unveränderlich ist. Vorweg muss noch gesagt werden, dass alle Attribute als Konvention protected gelten, public wird nicht benötigt und [...]]]></description>
			<content:encoded><![CDATA[<p>Ich kam noch nie dazu hier einen Codefetzen vorzustellen (außer des  Beitrags zum Dekorierer). Nun nutze ich diese Gelegenheit eine meiner  ersten JavaScript Klassen zu besprechen.</p>
<p>Gleichzeitig handelt es sich um das Muster Wertobjekt (ValueObject),  welches unveränderlich ist.</p>
<p>Vorweg muss noch gesagt werden, dass alle Attribute als Konvention  protected gelten, public wird nicht benötigt und private lässt sich über  Closures realisieren. Einfache Attribute tragen zudem den  Anfangsbuchstaben ihres Typs (z.B. s für String).</p>
<p>Objekte der Klasse stellen eine Menge eines Rohstoffs dar.</p>
<pre class="brush: jscript; title: ; notranslate">/**
 * Represents an amount of a resource
 * @param {number} amount
 * @param {string} type
 */
function Resource(amount, type) {
    var nAmount = amount;
    var sType = type;

    if (amount &lt; 0) {
        throw new IllegalArgumentException(&quot;amount has to be positive&quot;);
    }

    /**
     * @method Resource
     * @return {number} amount of the resource
     */
    this.getAmount = function() {
        return nAmount;
    };

    /**
     * @method Resource
     * @return {string} resource type
     */
    this.getType = function() {
        return sType;
    };
}

/**
 * Addition of two resources produces a new resource with the sum amount
 * the new object uses the old one as prototype
 * @param {Resource} resource
 * @return {Resource} new Resource object
 */
Resource.prototype.plus = function(resource) {
    if (!(resource instanceof Resource &amp;&amp; this.getType() == resource.getType())) {
        throw new IllegalArgumentException(&quot;resources don't match.&quot;);
    }
    var newRes = Object.create(this); // create a new object based on the current one
    // execute the Resource constructor on it
    Resource.call(newRes, this.getAmount() + resource.getAmount(), this.getType());
    return newRes;
};

/**
 * Subtraction of two resources produces a new resource with a smaller amount
 * @param {Resource} resource
 * @return {Resource} new Resource object
 */
Resource.prototype.minus = function(resource) {
    if (!(resource instanceof Resource &amp;&amp; this.getType() == resource.getType())) {
        throw new IllegalArgumentException(&quot;resources don't match.&quot;);
    }
    if (this.getAmount() &lt; resource.getAmount()) {
        throw new IllegalArgumentException(&quot;can't substract a higher amount&quot;);
    }
    var newRes = Object.create(this);
    Resource.call(newRes, this.getAmount() - resource.getAmount(), this.getType());
    return newRes;
};</pre>
<p>Interessant ist vor allem die Stelle, an der dynamisch neue Objekte der selben Klasse zurückgegeben werden (plus() und minus()), ich möchte Resource noch erweitern können und evtl. für die verschiedenen Rohstoffsorten eigene Klassen ableiten, daher sollten diese Methoden dann nicht nach einer mathematischen Operation auf die Klasse Resource zurückschrumpfen. In PHP kann man &#8220;new&#8221; einfach einen String übergeben, in Java muss man einen Umweg über eine Factory oder Reflection machen.</p>
<p>In JavaScript bietet es sich an, das momentane Objekt als Prototyp für das neue zu verwenden und dieses durch den Resource Konstruktor zu initialisieren.</p>
<p>Ich weiß noch nicht, ob mir dieses Pattern noch öfter begegnen wird, aber vor allem bei Wertobjekten (ValueObject), die mit Vererbung erweiterbar bleiben sollen ist dies praktisch. Allgemein wenn man ein neues Objekt des selben Typs wie das momentane zurückgeben möchte.</p>
<p>Jetzt kann ich eine Kindklasse ResourceContainer schreiben, die noch Funktionalität für Gewicht und Volumen des Rohstoffs bereitstellt (z.B zum Beladen von Schiffen):</p>
<pre class="brush: jscript; title: ; notranslate">/**
 * stores resources, adds weight and volume to a resource object
 * @inherits Resource
 * @param {Object} amount
 * @param {Object} type
 */
function ResourceContainer(amount, type) {
    Resource.call(this, amount, type); // inherit priviledged Resource methods
}
ResourceContainer.prototype = Object.create(Resource.prototype); // inherit nonpriviledged Resource methods

Resource.DESITY.metal = 7.85;
Resource.WEIGHT.metal = 1000;

/**
 * @return {number} weight of the resoure amount
 */
ResourceContainer.prototype.getWeight = function() {
    return this.getAmount() * Resource.WEIGHT[this.getType()];
};

/**
 * @return {number} volume of the resource amount
 */
ResourceContainer.prototype.getVolume = function() {
    return this.getAmount() * Resource.DENSITY[this.getType()];
};</pre>
</pre>
<p>Ich beginne langsam die Prototypennatur von JavaScript zu verwenden, bin aber immer noch sehr von Klassen von PHP und Java geprägt.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2010/02/17/class-resource-javascript-valueobject-prototype-pattern-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Statusbericht</title>
		<link>http://ugamela-blog.pheelgood.net/2009/08/21/statusbericht/</link>
		<comments>http://ugamela-blog.pheelgood.net/2009/08/21/statusbericht/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 16:15:52 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=259</guid>
		<description><![CDATA[Ich dachte es wird Zeit für einen Statusbericht, ich bin gerade wieder dabei intensiv zu programmieren und zu lernen. Leider muss ich zugeben, dass ich in den letzten Wochen nicht wirklich vorwärts gekommen war. Fehlende Motviation und Wissen waren wohl die Gründe. Momentan begreife ich die Objekt-Orientierung in JavaScript, die doch relativ schwierig zu entdecken [...]]]></description>
			<content:encoded><![CDATA[<p>Ich dachte es wird Zeit für einen Statusbericht, ich bin gerade wieder dabei intensiv zu programmieren und zu lernen.</p>
<p>Leider muss ich zugeben, dass ich in den letzten Wochen nicht wirklich vorwärts gekommen war. Fehlende Motviation und Wissen waren wohl die Gründe. Momentan begreife ich die Objekt-Orientierung in JavaScript, die doch relativ schwierig zu entdecken ist, zumindest war sie das für mich. Wohl einfach aufgrund der größtenteils funktionalen Verwendung von JS. JS OOP programmiert sich zudem ganz anders wie PHP OOP, weil JavaScript vorallem auf Prototypen setzt.</p>
<p><span id="more-259"></span></p>
<p>Bei einer Website können mittlerweile client- und serverseitig Skripte aufgerufen werden, der Trend tendiert zur Zeit vor allem zur Clientseite, wobei es immer noch der Server ist, der die wirkliche Validation übernehmen muss. Der Client bleibt manipulierbar und somit unsicher. Auch ich habe mich dem Trend angeschlossen. Dabei setze ich vor allem auf OOP in JS und verlagere so viel wie möglich in den Browser. So wird die Seite bei mir von JavaScript generiert und läd nicht neu. Alles läuft über XHR (XMLHttpRequests &#8211; AJAX) und JavaScript. JS bestimmt wie die Seite aussieht, der Server gibt nur noch den Rahmen vor, erlaubt bestimmte Dinge (Zugriffe auf Daten), die Aufbereitung übernimmt der Browser.</p>
<p>Im MVC Modell gesehen verwaltet JavaScript hier die Views und bekommt dafür auch Models zur Verfügung gestellt, wenn auch eingeschränkter als auf PHP-Seite. Die Models stehen trotzdem in einer gewissen Verbindung, auch wenn diese nicht stetig ist, weil ich nicht andauernd unnötige Requests abschicken will, das würde nur zu einer Serverüberlastung führen. Gleichzeitig erzeugt dies einen sehr praktischen clientseitigen Cache, den ich vielleicht von Google Gears unterstützen werde.</p>
<p>Momentan schreibe ich an der Verbindung zwischen Client und Server, die möglichst abstrahiert werden soll (zusammengefasst und einfach verfügbar gemacht) &#8211; auch für weitere Entwicklungen.</p>
<p>Für zukünftige Entwickler wird somit auf jeden Fall PHP sowie JS Erfahrung vorrausgesetzt werden. Das schöne an einem Framework ist allerdings, dass man es nicht verstehen muss um es zu benutzen, wenn es gut geschrieben ist und auf kritische Stellen hingewiesen wird. Dafür gibt es zum Glück dann eine Community und Tutorials, die geschrieben werden [uA von mir]. Daher keine Angst, wenn das jetzt alles wie spanisch klang, es wird viele Erklärungen geben.</p>
<p>Ich freue mich schon auf das Verbesserungspotential, das eine Community bietet, wenn man als OpenSource veröffentlicht. Diese Idee treibt mich auch weiterhin an, ich habe aber noch einige schwierige Dinge zu schreiben bevor ich mich überhaupt endlich dem Spielinhalt widmen kann, denn zur Zeit schreibe ich immer noch am Grundgerüst des Spiels, das möglichst variabel und erweiterbar sein soll.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2009/08/21/statusbericht/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Fortschritt, PHP und JavaScript, OOP</title>
		<link>http://ugamela-blog.pheelgood.net/2009/06/23/fortschritt-php-und-javascript-oop/</link>
		<comments>http://ugamela-blog.pheelgood.net/2009/06/23/fortschritt-php-und-javascript-oop/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 09:12:58 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=234</guid>
		<description><![CDATA[Die Entwicklung des (PHP-)Codes schleicht eher voran, als dass es wirklich vorwärts geht. Dafür formt sich eine Idee, die mehr und mehr auf die browserseitige Scriptsprache JavaScript setzt. Ich habe bereits geschrieben, dass ich Templates mit JavaScript parse, nun sollen ganze Inhalte nur mit JavaScript generiert werden. Views des MVC werden in dieser Sprache geschrieben. [...]]]></description>
			<content:encoded><![CDATA[<p>Die Entwicklung des (PHP-)Codes schleicht eher voran, als dass es wirklich vorwärts geht. Dafür formt sich eine Idee, die mehr und mehr auf die browserseitige Scriptsprache JavaScript setzt. Ich habe bereits geschrieben, dass ich Templates mit JavaScript parse, nun sollen ganze Inhalte nur mit JavaScript generiert werden. Views des MVC werden in dieser Sprache geschrieben. Dabei muss man aber extrem auf die Sicherheit aufpassen. Clientseitig darf man nur mit Daten arbeiten, die sowieso öffentlich sind. Ein gewisser Arbeitsaufwand bleibt deshalb immer auf der Serverseite hängen, die bei diesem Projekt mit PHP gebaut ist.</p>
<p>Nun verwende ich zu großen Anteilen die zwei verbreitetsten Websprachen, die beide von vielen Leuten verachtet werden, weil sie vor allem von Amateuren verwendet werden.</p>
<p>Besonders JavaScript scheint eine interessante Vorgeschichte zu haben. Vor einigen Monaten, als ich anfing JS zu lernen, kam ich auf D. Crockford und habe mir seine Videovorträge angesehn. Ich habe JS somit direkt OOP gelernt, wie es sich eigentlich gehört. JS ist sehr objekt-orientiert, Crockford nennt sie &#8220;ausdrucksstark&#8221;. Die genau Übersetzung ist mir unklar, ist aber auch egal, denke ich.</p>
<p>Ich kann diesen <a href="http://javascript.crockford.com/javascript.html">Artikel</a> nur empfehlen, notfalls auch <a href="http://www.pseliger.de/translations/Douglas-Crockford/missunderstood-JavaScript.html">übersetzt</a>, für diejenigen die weniger gut Englisch können. Um Englisch kommt man aber beim Programmieren kaum herum und Crockford schreibt und redet eigentlich ein sehr gut verständliches und deutliches Englisch. Auch seine <a href="http://developer.yahoo.com/yui/theater/">Videos</a> kann ich nur weiterempfehlen, es lohnt sich!</p>
<p>Ich entwerfe also ein kleines Grundgerüst in JavaScript, das mit dem serverseitigen Teil, den ich in PHP geschrieben habe, zusammenarbeitet. Dabei ist vor allem der ganze AJAX-Kram sehr nervig. Da alles asyncron ist, muss man ständig mit Callbacks arbeiten (Man übergibt die Funktion, die ausgeführt wird, sobald der Request abgeschlossen ist und die Daten zur Verfügung stehen), was ständig zu Verschachtelungen führt, die ich eigentlich umgehen möchte.</p>
<p>Derweil feiere ich mein Abi und mache ein wenig Urlaub mit Freunden. Ich werde also nicht permanent hieran arbeiten, aber hoffentlich dennoch vorwärts kommen.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2009/06/23/fortschritt-php-und-javascript-oop/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>JavaScript Template Parser</title>
		<link>http://ugamela-blog.pheelgood.net/2008/12/18/javascript-template-parser/</link>
		<comments>http://ugamela-blog.pheelgood.net/2008/12/18/javascript-template-parser/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 13:11:59 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Template]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=172</guid>
		<description><![CDATA[Bin eigentlich zur Zeit weniger mit dem Template beschäftigt und dachte, dass ich mir bereits sicher sei, wie ich es lösen würde, doch mir kommt nun eine neue Idee: Ich werde das Parsen der Templates auf den Client verlegen. Neuladen soll die Seite sowieso nicht mehr, Ajax wird eine große Rolle spielen. Der Client läd [...]]]></description>
			<content:encoded><![CDATA[<p>Bin eigentlich zur Zeit weniger mit dem Template beschäftigt und dachte, dass ich mir bereits sicher sei, wie ich es lösen würde, doch mir kommt nun eine neue Idee:</p>
<p>Ich werde das Parsen der Templates auf den Client verlegen. Neuladen soll die Seite sowieso nicht mehr, Ajax wird eine große Rolle spielen.</p>
<p>Der Client läd zweierlei Dinge wenn er eine Seite anzeigen soll:</p>
<ul>
<li>Das Template, HTML Code mit Platzhaltern</li>
<li>Die Daten als JSON oder XML</li>
</ul>
<p>Der Browser füllt dann die Daten in das Template. Dabei kann man auch Schleifen für Listen verwenden.</p>
<p>Dabei wird praktischerweise der Server entlastet. Weniger Traffic und schnelleres Seitenladen sind weitere Folgen. Für Widgets, die sowieso oft aktualisiert werden müssen, wird nicht immer wieder das Template neu geladen, sondern immer nur neue Daten eingefüllt.</p>
<p>Dennoch werden einige Dinge nicht einfach zu implementieren. Erstens möchte ich mir nicht alles verbauen, das Spiel, wenn auch minimal ohne JavaScript laufen zu lassen, zumal es immer noch einige Browser gibt, die das nicht können (Handys). Des weiteren muss eine Art zurück/vorwärts-Funktion erstellt werden, da ja das Neuladen der Seite wegfällt.</p>
<p>Ich muss Wege finden, vereinzelte kleine Abfragen schnell durch den Komplex des Spiels zu schicken oder diesen zu umgehen um Zeit und Rechenleistung zu sparen. Dabei dürfen keine Sicherheitslücken entstehen.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2008/12/18/javascript-template-parser/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

