<?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>kurt sparber's weblog</title>
	<atom:link href="http://kurtsparber.de/wordpress/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://kurtsparber.de/wordpress</link>
	<description>Softwareentwicklung und Architekturen</description>
	<lastBuildDate>Tue, 03 Aug 2010 18:45:26 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>MMO mit Java &#8211; Charakter Auswahl</title>
		<link>http://kurtsparber.de/wordpress/?p=159</link>
		<comments>http://kurtsparber.de/wordpress/?p=159#comments</comments>
		<pubDate>Tue, 03 Aug 2010 18:20:35 +0000</pubDate>
		<dc:creator>sparber</dc:creator>
				<category><![CDATA[3D Java]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[MMO]]></category>

		<guid isPermaLink="false">http://kurtsparber.de/wordpress/?p=159</guid>
		<description><![CDATA[Nachdem die Schwierigkeiten mit FengGui ausgestanden sind, lief die Erstellung des Charakter Auswahlbildschirms deutlich schneller. Einzig die Liste zur Auswahl der einzelnen Charaktere verursachte zunächst einige Schwierigkeiten. Wird bei FengGui nicht explizit ein Theme ausgewählt, so bleiben Schriftarten und Hintergründe schwarz.
Das Setzen der Farbe und Hover-Farbe erfolgt folgendermaßen:

DecoratorLayer underlay = new DecoratorLayer();
PlainBackground plainBackground = new [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem die Schwierigkeiten mit FengGui ausgestanden sind, lief die Erstellung des Charakter Auswahlbildschirms deutlich schneller. Einzig die Liste zur Auswahl der einzelnen Charaktere verursachte zunächst einige Schwierigkeiten. Wird bei FengGui nicht explizit ein Theme ausgewählt, so bleiben Schriftarten und Hintergründe schwarz.</p>
<p>Das Setzen der Farbe und Hover-Farbe erfolgt folgendermaßen:</p>
<p><code><br />
DecoratorLayer underlay = new DecoratorLayer();<br />
PlainBackground plainBackground = new PlainBackground(new Color(0.97f, 0.89f, 0.52f, 0.5f));<br />
RoundedBorder roundedBorder = new RoundedBorder(new Color(0.97f, 0.89f, 0.52f, 0.5f), 3, 3);<br />
underlay.add(plainBackground, roundedBorder);<br />
list.getAppearance().setHoverUnderlay(underlay);<br />
list.getAppearance().setSelectionUnderlay(underlay);<br />
</code></p>
<p>Die erste Version des Auswahlbildschirms verfügt nur über ein statisches Hintergrundbild. Professionelle MMO&#8217;s verwenden hier entweder eine reine 3D Landschaft, eine 3D Landschaft kombiniert mit einer Skybox (z.B. GuildWars) oder ein Hintergrundbild, dessen Himmel animiert ist. Die einzelnen Gui&#8217;s sind mittels GameStates separiert, wichtig ist, dass aus den States sämtliche Widgets entfernt werden, damit diese nicht die nächste Maske beeinflussen. Hier nun das Ergebnis:</p>
<div id="attachment_163" class="wp-caption aligncenter" style="width: 310px"><a href="http://kurtsparber.de/wordpress/wp-content/uploads/2010/08/auswahl.jpg"><img src="http://kurtsparber.de/wordpress/wp-content/uploads/2010/08/auswahl-300x225.jpg" alt="" title="auswahl" width="300" height="225" class="size-medium wp-image-163" /></a><p class="wp-caption-text">Charakter-Auswahlbildschirm</p></div>
<p>Eine erfreuliche Erkenntnis ergab sich noch: Der Text der GameButtons kann programmatisch eingefügt werden, damit erübrigen sich spezifische Bilder für jeden einzelnen Buttons und reduzieren die Malarbeit.</p>
]]></content:encoded>
			<wfw:commentRss>http://kurtsparber.de/wordpress/?feed=rss2&amp;p=159</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MMO mit Java &#8211; Login Client mit FengGui</title>
		<link>http://kurtsparber.de/wordpress/?p=152</link>
		<comments>http://kurtsparber.de/wordpress/?p=152#comments</comments>
		<pubDate>Sat, 24 Jul 2010 20:10:06 +0000</pubDate>
		<dc:creator>sparber</dc:creator>
				<category><![CDATA[3D Java]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[MMO]]></category>

		<guid isPermaLink="false">http://kurtsparber.de/wordpress/?p=152</guid>
		<description><![CDATA[Nach dem ich jede Menge Inkompatibilitäten zwischen der JMonkeyEngine und FengGui beseitigt hatte und ich zweitweise dachte es funktioniert doch nicht ist die erste Version des Login Clients jetzt fertig. Schlussendlich ist es aber doch geschafft und alle Bibliotheken sind kompatibel im Maven Repository verstaut. 

Nach einem Login mit den richtigen Daten werden die Account [...]]]></description>
			<content:encoded><![CDATA[<p>Nach dem ich jede Menge Inkompatibilitäten zwischen der JMonkeyEngine und FengGui beseitigt hatte und ich zweitweise dachte es funktioniert doch nicht ist die erste Version des Login Clients jetzt fertig. Schlussendlich ist es aber doch geschafft und alle Bibliotheken sind kompatibel im Maven Repository verstaut. </p>
<p><a href="http://kurtsparber.de/wordpress/wp-content/uploads/2010/07/login.jpg"><img src="http://kurtsparber.de/wordpress/wp-content/uploads/2010/07/login-300x224.jpg" alt="" title="login" width="300" height="224" class="aligncenter size-medium wp-image-153" /></a></p>
<p>Nach einem Login mit den richtigen Daten werden die Account Informationen vom Server abgeholt. Fehlt also noch die Oberfläche zur Auswahl und Erstellung der Charaktere.</p>
]]></content:encoded>
			<wfw:commentRss>http://kurtsparber.de/wordpress/?feed=rss2&amp;p=152</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MMO mit Java &#8211; JMonkeyEngine Client</title>
		<link>http://kurtsparber.de/wordpress/?p=142</link>
		<comments>http://kurtsparber.de/wordpress/?p=142#comments</comments>
		<pubDate>Sun, 28 Mar 2010 20:55:10 +0000</pubDate>
		<dc:creator>sparber</dc:creator>
				<category><![CDATA[3D Java]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[MMO]]></category>

		<guid isPermaLink="false">http://kurtsparber.de/wordpress/?p=142</guid>
		<description><![CDATA[Nachdem die Performance mit Java2D auf hohen Auflösungen zu wünschen übrig lies, ging ich über, den Client mit Java3D neu zu erstellen. Die Bücher Killer Game Programming in Java und Pro Java 6 3D Game Development sehr hilfreich.
Da Java3D aber nicht mehr weiterentwickelt wird, bzw. nur mehr im Rahmen für JavaFX war es sinnvoller auf [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem die Performance mit Java2D auf hohen Auflösungen zu wünschen übrig lies, ging ich über, den Client mit Java3D neu zu erstellen. Die Bücher <em>Killer Game Programming in Java</em> und <em>Pro Java 6 3D Game Development</em> sehr hilfreich.<br />
Da Java3D aber nicht mehr weiterentwickelt wird, bzw. nur mehr im Rahmen für JavaFX war es sinnvoller auf eine für Spieleentwicklung spezialisierte Szene Graph API einzusetzen. Hier bot sich die JME &#8211; JmonkeyEngine 2 an. Die Ergebnisse können sich sehen lassen und die Einarbeitung fällt dank des umfangreichen Tutorials und der regen Forumaktivität &#8211; ganz im Gegensatz zu Java3D &#8211; ziemlich einfach aus.</p>
<p>Hier der erste Prototyp des Clients, der Avatar ist übrigens aus Neverwinter Nights, das Modell mit Hilfe eines eigenen Parsers,erzeugt mit antlr, eingelesen.</p>
<div id="attachment_144" class="wp-caption aligncenter" style="width: 310px"><a href="http://kurtsparber.de/wordpress/wp-content/uploads/2010/03/mmojava_jme_1s.jpg"><img src="http://kurtsparber.de/wordpress/wp-content/uploads/2010/03/mmojava_jme_1s.jpg" alt="" title="mmojava_jme_1s" width="300" height="219" class="size-full wp-image-144" /></a><p class="wp-caption-text">Impressionen einer virtuellen Welt</p></div>
<p>Hier ein weiteres Bild:</p>
<div id="attachment_144" class="wp-caption aligncenter" style="width: 310px"><a href="http://kurtsparber.de/wordpress/wp-content/uploads/2010/03/mmojava_jme_2s.jpg"><img src="http://kurtsparber.de/wordpress/wp-content/uploads/2010/03/mmojava_jme_2s.jpg" alt="" title="mmojava_jme_2s" width="300" height="219" class="alignnone size-full wp-image-145" /></a><p class="wp-caption-text">Impressionen einer virtuellen Welt</p></div>
<p>Auch wenn optisch schon ein ansprechendes Ergebnis da ist, so ist noch einiges zu tun, gerade hinsichtlich der Animationen, animiert Laufen kann der Avatar, aber es gibt noch einige Schwierigkeiten bei Sitzen und Aufstehen. Derzeit ist aber die Anbindung an den Application Server mit JMS interessanter.</p>
]]></content:encoded>
			<wfw:commentRss>http://kurtsparber.de/wordpress/?feed=rss2&amp;p=142</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Transformation RSA Private Keys von PKCS#1 nach PKCS#8</title>
		<link>http://kurtsparber.de/wordpress/?p=124</link>
		<comments>http://kurtsparber.de/wordpress/?p=124#comments</comments>
		<pubDate>Tue, 13 Oct 2009 22:11:46 +0000</pubDate>
		<dc:creator>sparber</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://kurtsparber.de/wordpress/?p=124</guid>
		<description><![CDATA[Wird ein RSA Private Key mit openssl erzeugt, so wird der Key im PKCS#1 Format abgelegt:
Erzeugung:
openssl genrsa -outform PEM -out key.pem -des3
erzeugt einen 512 Bit langen Key, der anschließend folgendes Format aufweist:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,DF4786233111EACD

eRCD1pon6bRDOeDFgHhtdcTtlWzSM1KI78UG/OARE5b1xKM+BOxby1gp0yIqxQIw
Ai7360VvaRruFY/yUVf58JqwCL7pR6q9oiJZGW8PIFv3ATqcbrVGRrM9CuW6hDtL
NiC/Nfrj7ZWv5kMig+N8gTqt87MDefwRQG+F7SZMOJIBGdCI4kkcHtRm53gAan/u
nJKmDgeI5XZpFxG+n/6J30oSxS2NXT/TjGtLuBGIt+JF+YoK01v9USmjbyFVjxjG
fZLPN66iQdOxP/O2F+01rzoRfeDiZ5NM/q8AIdfcr9CVfnH/wV/xg/dL+44xhiuS
nmGz359MOw4Fng6reEoxilRCWB5ryyklxZvmD6zrZb5EBs58NFNRQJvGl/PDn7x3
A7kSInNYGDhcJdrPGekXtEulkaMrnvSpwMCH/jG1DQQ=
-----END RSA PRIVATE KEY-----
openssl bietet nun die Möglichkeit mit dem Parameter pkcs8 den Key umzuformen:
openssl pkcs8 -topk8 -in key.pem [...]]]></description>
			<content:encoded><![CDATA[<p>Wird ein RSA Private Key mit openssl erzeugt, so wird der Key im <strong>PKCS#1</strong> Format abgelegt:</p>
<p>Erzeugung:</p>
<pre><code>openssl genrsa -outform PEM -out key.pem -des3</code></pre>
<p>erzeugt einen 512 Bit langen Key, der anschließend folgendes Format aufweist:</p>
<pre><code>-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,DF4786233111EACD

eRCD1pon6bRDOeDFgHhtdcTtlWzSM1KI78UG/OARE5b1xKM+BOxby1gp0yIqxQIw
Ai7360VvaRruFY/yUVf58JqwCL7pR6q9oiJZGW8PIFv3ATqcbrVGRrM9CuW6hDtL
NiC/Nfrj7ZWv5kMig+N8gTqt87MDefwRQG+F7SZMOJIBGdCI4kkcHtRm53gAan/u
nJKmDgeI5XZpFxG+n/6J30oSxS2NXT/TjGtLuBGIt+JF+YoK01v9USmjbyFVjxjG
fZLPN66iQdOxP/O2F+01rzoRfeDiZ5NM/q8AIdfcr9CVfnH/wV/xg/dL+44xhiuS
nmGz359MOw4Fng6reEoxilRCWB5ryyklxZvmD6zrZb5EBs58NFNRQJvGl/PDn7x3
A7kSInNYGDhcJdrPGekXtEulkaMrnvSpwMCH/jG1DQQ=
-----END RSA PRIVATE KEY-----</code></pre>
<p><strong>openssl </strong>bietet nun die Möglichkeit mit dem Parameter pkcs8 den Key umzuformen:</p>
<pre>openssl pkcs8 -topk8 -in key.pem -out p8key.pem</pre>
<p>Dies ergibt folgende Ausgabe:</p>
<pre><code>-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIBgTAbBgkqhkiG9w0BBQMwDgQIhDFA40XfSycCAggABIIBYPjZuIFw8GxlCs9y
PEYRJPFNvLNlGglDWuY85deuxi+k/jTinjMyxRGmtnWlmly6xfjoptJDH+jmENxr
BwMEua4tthwUaJZOSU2UuN3q95kcE5YHyg9tLBvYMs3Jd/L6vOA73uiIflFgJ0yz
M3nEXqwNUKDlffVflhroRYAyWtQe9tLVaWnUZGFQeYoK7cjpnuzOPAa9QmeX3Ltf
4tkfzF8tfGM8+aoBGcO4eGmp32O0WVUE3HlcVY5Yv8XUzg7E/epB93c4bZDDGfkS
3fgr6rGb0ucL66jFqaSkJ6KVLoG1ui8ymXSmhZuzfgSWvtOnv2mM2FcpNA+dIwYp
k6cDkRWuKlZfN58axQVZ6wTWNgX/ts3aH3NmlTc50HOOGrvtqJ1jOJxzFgHmNWWS
nKCdcWAgaC43ivrbWxvgGarQuXe9lNWZt2fk4Lgukjix1Bqhakh9F5EfaiK1bXYq
ZQZotCg=
-----END ENCRYPTED PRIVATE KEY-----</code></pre>
<p>Oberflächlich betrachtet ähnelt sich die Darstellung, jedoch handelt es sich bei der ASN.1 Repräsentation von <strong>PKCS#1</strong> um eine Darstellung des Keys mittels dem CRT:</p>
<pre><code>RSAPrivateKey ::= SEQUENCE {
  version Version,
  modulus INTEGER, -- n
  publicExponent INTEGER, -- e
  privateExponent INTEGER, -- d
  prime1 INTEGER, -- p
  prime2 INTEGER, -- q
  exponent1 INTEGER, -- d mod (p-1)
  exponent2 INTEGER, -- d mod (q-1)
  coefficient INTEGER -- (inverse of q) mod p
}</code></pre>
<p>im <strong>PKCS#8</strong> Format hingegen wird der Key in der Struktur <strong>PrivateKeyInfo </strong>dargestellt:</p>
<pre><code>PrivateKeyInfo ::= SEQUENCE {
  version Version,
  privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,
  privateKey PrivateKey,
  attributes [0] IMPLICIT Attributes OPTIONAL
}

Version ::= INTEGER
PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier
PrivateKey ::= OCTET STRING
Attributes ::= SET OF Attribute</code></pre>
<p>Viele Applikationen oder Frameworks sind nicht in der Lage Schlüssel in der Form <strong>RSAPrivateKey </strong>zu verarbeiten, deshalb ist es ratsam, den Key in der Struktur <strong>PrivateKeyInfo </strong>abzuspeichern.</p>
]]></content:encoded>
			<wfw:commentRss>http://kurtsparber.de/wordpress/?feed=rss2&amp;p=124</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MMO mit Java/J2EE? (Teil 3) &#8211; Action Kommunikation</title>
		<link>http://kurtsparber.de/wordpress/?p=115</link>
		<comments>http://kurtsparber.de/wordpress/?p=115#comments</comments>
		<pubDate>Tue, 07 Jul 2009 19:31:01 +0000</pubDate>
		<dc:creator>gargantua</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[MMO]]></category>

		<guid isPermaLink="false">http://kurtsparber.de/wordpress/?p=115</guid>
		<description><![CDATA[Nachdem es notwendig war, die gesamte Clientdarstellung zu überarbeiten, um auf veschiedenen Rechnertypen akzeptable und gleichmäßig performante Darstellung zu erreichen bin ich nun endlich dazu gekommen, mir Gedanken über die Action-Kommunikation zu machen. Doch zunächst zur Begriffserklärung. In einem MMO Game wie es hier entwickelt wird folgendes unter Aktionen verstanden:
Flüchtige Aktionen: Sind Aktionen die eine [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem es notwendig war, die gesamte Clientdarstellung zu überarbeiten, um auf veschiedenen Rechnertypen akzeptable und gleichmäßig performante Darstellung zu erreichen bin ich nun endlich dazu gekommen, mir Gedanken über die Action-Kommunikation zu machen. Doch zunächst zur Begriffserklärung. In einem MMO Game wie es hier entwickelt wird folgendes unter Aktionen verstanden:</p>
<li><strong>Flüchtige Aktionen</strong>: Sind Aktionen die eine Übertragung von sich schnell ändernden Statusinformationen zwischen Client und Server auslösen und keine oder nur eine periodische Persistierung benötigen. Zu derartigen Aktionen gehören z.B. die Bewegungen von Spielfiguren, die schnell und kontinuierlich zwischen Clients im Anzeige, bzw. Aktionsradius synchronisiert werden müssen. Der Verlust eines gewissen Prozentsatzes der Informationen kann bei dieser Informationsübertragung in Kauf genommen werden.</li>
<li><strong>Transaktionsichere Aktionen</strong>: Sind Aktionen, die eine Übertragung von Statusinformationen zwischen Client und Server auslösen und dabei eine sichere Persistierung verlangen. Zu solchen Aktionen gehören z.B. Handelssitzungen zwischen Spielfiguren oder das Aufnehmen von Gegenständen in das Inventar der Spielfigur.</li>
<div id="attachment_117" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-117" title="Action Kommunikation" src="http://kurtsparber.de/wordpress/wp-content/uploads/2009/07/action_architecture_s.png" alt="Action Kommunikation" width="500" height="133" /><p class="wp-caption-text">Action Kommunikation</p></div>
<p>Der erste Ansatz einer solchen Informationsübertragung wird mit einem QueueRequestor durchgeführt, welcher einen <em>request/reply</em> Mechanismus via JMS zur Verfügung stellt. Das Senden einer Message erfolgt dabei über eine definierte Queue, während die Rückantwort über eine temporäre Queue verschickt wird. Ob sich dieser Ansatz als praktikabel und performant erweist, muss noch erprobt werden. Um die Datenbank nicht mit flüchtigen Statusinformationen zuzumüllen werden diese zunächst in einen Informationscache gespeichert und so für einen schnellen Zugriff vorgehalten. Die Überführung der Informationen in einen persistenten Zustand kann dann periodisch oder anhand einer geeigneten Eviction Policy erfolgen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kurtsparber.de/wordpress/?feed=rss2&amp;p=115</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MMO mit Java/J2EE? (Teil 2)</title>
		<link>http://kurtsparber.de/wordpress/?p=106</link>
		<comments>http://kurtsparber.de/wordpress/?p=106#comments</comments>
		<pubDate>Tue, 31 Mar 2009 21:34:18 +0000</pubDate>
		<dc:creator>sparber</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[MMO]]></category>

		<guid isPermaLink="false">http://sparber.wordpress.com/?p=106</guid>
		<description><![CDATA[Aktives Rendern zur Darstellung von Animationen
Zur Darstellung der Clientgrafiken und Animationen für den MMO Prototyp verwende ich ein eigenes Canvas, welches mit einem Thread die Grafiken in kurzen Zeitabständen zyklisch neuzeichnet, dadurch lassen sich durch den Austausch der Grafiken animationen erzielen. Der Austausch kann an die Eingabe des Clients, oder an die Aktualisierung der Spieldaten [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Aktives Rendern zur Darstellung von Animationen</strong></p>
<p>Zur Darstellung der Clientgrafiken und Animationen für den MMO Prototyp verwende ich ein eigenes Canvas, welches mit einem Thread die Grafiken in kurzen Zeitabständen zyklisch neuzeichnet, dadurch lassen sich durch den Austausch der Grafiken animationen erzielen. Der Austausch kann an die Eingabe des Clients, oder an die Aktualisierung der Spieldaten des Servers für NSP&#8217;s (Nicht-Spieler Charaktere) gekoppelt sein.</p>
<div id="attachment_107" class="wp-caption aligncenter" style="width: 229px"><img src="http://sparber.files.wordpress.com/2009/03/animation.jpg" alt="Exemplarische (nicht vollständige) Animationssequenz" title="animation" width="219" height="161" class="size-full wp-image-107" /><p class="wp-caption-text">Exemplarische (nicht vollständige) Animationssequenz</p></div>
<p>Mein bisheriges Canvas rief in <em>run()</em>-Methode des Threads periodisch <em>repaint()</em> auf. Da repaint() aber keinesfalls garantiert von der JVM aufgerufen wird, sondern in eine Queue eingestellt wird, ist eine reibungslose Animationsdarstellung nicht gewährleistet. Hier ergibt sich eine Verbesserung durch den Einsatz des sog. Active Rendering, die (vereinfachte) Implementierung dazu sieht folgendermaßen aus:</p>
<div align="left" class="java" style="line-height:1em;font-size:1.1em;">
    <code><br />
<font color="#808080">1</font>&nbsp;<font color="#7f0055"><b>private&nbsp;</b></font><font color="#7f0055"><b>void&nbsp;</b></font><font color="#000000">activeRendering</font><font color="#000000">()&nbsp;{</font><br />
<font color="#808080">2</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">Graphics&nbsp;g&nbsp;=&nbsp;</font><font color="#7f0055"><b>this</b></font><font color="#000000">.getGraphics</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#808080">3</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>if&nbsp;</b></font><font color="#000000">(</font><font color="#000000">g&nbsp;!=&nbsp;</font><font color="#7f0055"><b>null</b></font><font color="#000000">)&nbsp;{</font><br />
<font color="#808080">4</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">g.drawImage</font><font color="#000000">(</font><font color="#000000">offscreenImage,&nbsp;</font><font color="#990000">0</font><font color="#000000">,&nbsp;</font><font color="#990000">0</font><font color="#000000">,&nbsp;</font><font color="#7f0055"><b>null</b></font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#808080">5</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">Toolkit.getDefaultToolkit</font><font color="#000000">()</font><font color="#000000">.sync</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#808080">6</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">g.dispose</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#808080">7</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#808080">8</font>&nbsp;<font color="#000000">}</font></p>
<p></code></div>
<p><em>Toolkit.getDefaultToolkit().sync();</em> Stellt die Aktualisierung des Displays unter Linux sicher. (Quelle: Killer Game Programming, Andrew Davidson)</p>
]]></content:encoded>
			<wfw:commentRss>http://kurtsparber.de/wordpress/?feed=rss2&amp;p=106</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle XE: Ora-12638</title>
		<link>http://kurtsparber.de/wordpress/?p=99</link>
		<comments>http://kurtsparber.de/wordpress/?p=99#comments</comments>
		<pubDate>Tue, 17 Mar 2009 09:59:11 +0000</pubDate>
		<dc:creator>sparber</dc:creator>
				<category><![CDATA[Datenbanken]]></category>

		<guid isPermaLink="false">http://sparber.wordpress.com/?p=99</guid>
		<description><![CDATA[Gelegentlich kann es bei einer Oracle XE unter Windows zu folgendem Fehler kommen:

    
UDI-00008: Vorgang hat ORACLE-Fehler generiert 12638
ORA-12638: Abrufen der ID-Daten nicht erfolgreich



In diesem Fall trat der Fehler im Zusammenhang mit einem Datenimport auf. Erfahrungsgemäß und durch Berichte anderer User kann das Problem mit einem Neustart des Datenbankservices behoben werden. Sollte [...]]]></description>
			<content:encoded><![CDATA[<p>Gelegentlich kann es bei einer Oracle XE unter Windows zu folgendem Fehler kommen:</p>
<div align="left" class="sql" style="line-height:1em;font-size:1.1em;">
    <code><br />
UDI-00008: Vorgang hat ORACLE-Fehler generiert 12638<br />
ORA-12638: Abrufen der ID-Daten nicht erfolgreich<br />
</code>
</div>
<p></br><br />
In diesem Fall trat der Fehler im Zusammenhang mit einem Datenimport auf. Erfahrungsgemäß und durch Berichte anderer User kann das Problem mit einem Neustart des Datenbankservices behoben werden. Sollte dies jedoch nicht der Fall sein, so kann das Ändern der Einstellung <strong>SQLNET.AUTHENTICATION_SERVICES= (NTS)</strong> auf <strong>SQLNET.AUTHENTICATION_SERVICES= (NONE)</strong> in der Datei <em>sqlnet.ora</em> das Problem beseitigen. Die Änderung bewirkt, dass nicht mehr die native Windows Security beim Login verwendet wird, sondern nur mehr User und Passwort.</p>
]]></content:encoded>
			<wfw:commentRss>http://kurtsparber.de/wordpress/?feed=rss2&amp;p=99</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MMO mit Java/J2EE? (Teil 1)</title>
		<link>http://kurtsparber.de/wordpress/?p=72</link>
		<comments>http://kurtsparber.de/wordpress/?p=72#comments</comments>
		<pubDate>Wed, 11 Mar 2009 20:19:07 +0000</pubDate>
		<dc:creator>sparber</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[MMO]]></category>

		<guid isPermaLink="false">http://sparber.wordpress.com/?p=72</guid>
		<description><![CDATA[MMO, oder Massively Multiplayer Online Games auf Basis von Java und J2EE? Die Antwort auf diese Frage werde ich in einer Reihe von Artikeln versuchen zu beantworten. Ziel ist eine Machbarkeitsstudie auf Basis eines Prototypen zu entwickeln.

1.1 Einführung
Ein Massively Multiplayer Online Game ist ein Computerspiel, welches ausschließlich über das Internet gespielt werden kann und bei [...]]]></description>
			<content:encoded><![CDATA[<p>MMO, oder Massively Multiplayer Online Games auf Basis von Java und J2EE? Die Antwort auf diese Frage werde ich in einer Reihe von Artikeln versuchen zu beantworten. Ziel ist eine Machbarkeitsstudie auf Basis eines Prototypen zu entwickeln.<br />
</p>
<h3>1.1 Einführung</h3>
<p>Ein Massively Multiplayer Online Game ist ein Computerspiel, welches ausschließlich über das Internet gespielt werden kann und bei dem gleichzeitig mehrere hundert oder tausend Spieler sich in einer persistenten Spielumgebung treffen und interagieren können. Vertreter bekannter Spiele sind z.B. <em>World of Warcraft</em>, <em>Guildwars</em> oder <em>Warhammer Online</em>.<br />
</p>
<h3>1.2. Architektur, Komponenten</h3>
<p>Ein MMO Game besteht grob aus den Schichten Präsentation (Client), Geschäftslogik (Server) und Datenhaltung (Server), also der klassischen Architektur die mit J2EE realisierbar ist. Folgende Grafik beschreibt die Architektur eines MMO Games:</p>
<div id="attachment_96" class="wp-caption aligncenter" style="width: 549px"><img src="http://sparber.files.wordpress.com/2009/03/mmo_architecture_s.jpg" alt="MMO Architektur" title="mmo_architecture_s" width="539" height="218" class="size-full wp-image-96" /><p class="wp-caption-text">MMO Architektur</p></div>
<p><strong>Clientseite</strong><br />
Die Präsentationsschicht wird durch den Gameclient repräsentiert. Der Gameclient beinhaltet grob folgende Funktionen:</p>
<ul>
<li>Login Funktionalität, zum Einloggen in die Spielwelt</li>
<li>Patch Funktionalität, zum automatischen Bezug und Installation von Softwareupdates</li>
<li>Darstellung der Spielwelt und der Interaktionen</li>
</ul>
<p><strong>Serverseite</strong><br />
Die Serverseite umfasst eine Reihe von Servern mit unterschiedlichen Aufgaben. Die folgende Trennung ist aufgrund der Lastverteilung üblich und wird bei den bekannten MMO&#8217;s so praktiziert:</p>
<ul>
<li><strong>Accountserver</strong>: Üblicherweise mit Web-basierter Oberfläche zur Verwaltung der Accountdaten, abgelegt in der Accountdatenbank</li>
<li><strong>Loginserver</strong>: Server zum Überprüfen der Accountdaten und des Patchstandes</li>
<li><strong>Sessionserver</strong>: Server zum Überprüfen der Gültigkeit der aktiven Session und zur Weiterleitung der Anfragen an den Patch- und Gameserver</li>
<li><strong>Patchserver</strong>: Server zur Verteilung von Softwareupdates, hier sind mehrere Möglichkeiten denkbar, der Download von Patches über http oder ftp. Auch verteilte Ansätze sind denkbar, so benutzt <em>World of Warcraft</em> Bittorrent als Verteilungssystem.</li>
<li><strong>Gameserver</strong>: Der eigentliche Spielserver, der die Spielewelt hostet und die Interaktionen der Spieler verwaltet und die Spielzustände in der Game-DB festhält.</li>
</ul>
<p></p>
<h3>1.3. Ausblick</h3>
<p>Vorweg würde ich behaupten, dass sich J2EE für die Umsetzung eines MMO&#8217;s prinzipiell eignet, die entscheidende Frage stellt sich meines Erachtens, ob eine akzeptable Performance des Gameservers erreicht werden kann oder nicht. Von dieser Fragestellung ist die Anzahl der gleichzeitig bedienbaren Clients pro Server abhängig und damit beantwortet sich die Frage, ob ein MMO realisiert werden kann.</p>
]]></content:encoded>
			<wfw:commentRss>http://kurtsparber.de/wordpress/?feed=rss2&amp;p=72</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jClaim &#8211; ICQ mit Java</title>
		<link>http://kurtsparber.de/wordpress/?p=68</link>
		<comments>http://kurtsparber.de/wordpress/?p=68#comments</comments>
		<pubDate>Mon, 09 Mar 2009 20:06:32 +0000</pubDate>
		<dc:creator>sparber</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://sparber.wordpress.com/?p=68</guid>
		<description><![CDATA[Freie ICQ Implementierungen gibt es mittlerweile einige, jedoch kaum welche in Java. Ein Vertreter ist jClaim, neben einer Bibliothek zum Erstellen einer eigenen Anwendung bietet jClaim auch einen fertigen Client, der direkt über Webstart gestartet werden kann. Ein simpler Client ist schnell realisiert:

    
01&#160;package&#160;messaging;
02&#160;
03&#160;import&#160;com.itbs.aimcer.commune.joscar.ICQConnection;
04&#160;import&#160;com.itbs.util.GeneralUtils;
05&#160;import&#160;controller.MessengerGroupFactory;
06&#160;import&#160;controller.MessengerContactFactory;
07&#160;import&#160;controller.LogEventHandler;
08&#160;
09&#160;public&#160;class&#160;JavaICQ&#160;{
10&#160;
11&#160;&#160;&#160;public&#160;static&#160;void&#160;main(String[]&#160;args)&#160;throws&#160;Exception&#160;{
12&#160;&#160;&#160;&#160;&#160;try&#160;{
13&#160;&#160;&#160;&#160;&#160;&#160;&#160;ICQConnection&#160;conn&#160;=&#160;new&#160;ICQConnection();
14&#160;&#160;&#160;&#160;&#160;&#160;&#160;conn.assignGroupFactory(new&#160;MessengerGroupFactory());
15&#160;&#160;&#160;&#160;&#160;&#160;&#160;conn.assignContactFactory(new&#160;MessengerContactFactory());
16&#160;&#160;&#160;&#160;&#160;&#160;&#160;conn.setUserName(&#34;icqnumber&#34;);
17&#160;&#160;&#160;&#160;&#160;&#160;&#160;conn.setPassword(&#34;icqpass&#34;);
18&#160;&#160;&#160;&#160;&#160;&#160;&#160;conn.addEventListener(new&#160;LogEventHandler());
19&#160;&#160;&#160;&#160;&#160;&#160;&#160;conn.connect();
20&#160;&#160;&#160;&#160;&#160;&#160;&#160;while&#160;(true)&#160;{
21&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;GeneralUtils.sleep(60&#160;*&#160;60&#160;*&#160;1000);
22&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
23&#160;&#160;&#160;&#160;&#160;}&#160;catch&#160;(Exception&#160;e)&#160;{
24&#160;&#160;&#160;&#160;&#160;&#160;&#160;throw&#160;new&#160;RuntimeException(e);
25&#160;&#160;&#160;&#160;&#160;}
26&#160;&#160;&#160;}
27&#160;
28&#160;}
Statt des LogEventHandlers kann auch der BotEventHandler, der standardmäßig [...]]]></description>
			<content:encoded><![CDATA[<p>Freie ICQ Implementierungen gibt es mittlerweile einige, jedoch kaum welche in Java. Ein Vertreter ist jClaim, neben einer Bibliothek zum Erstellen einer eigenen Anwendung bietet jClaim auch einen fertigen Client, der direkt über Webstart gestartet werden kann. Ein simpler Client ist schnell realisiert:</p>
<div align="left" class="java" style="line-height:1em;font-size:1.1em;">
<p>    <code><br />
<font color="#808080">01</font>&nbsp;<font color="#7f0055"><b>package&nbsp;</b></font><font color="#000000">messaging;</font><br />
<font color="#808080">02</font>&nbsp;<font color="#ffffff"></font><br />
<font color="#808080">03</font>&nbsp;<font color="#7f0055"><b>import&nbsp;</b></font><font color="#000000">com.itbs.aimcer.commune.joscar.ICQConnection;</font><br />
<font color="#808080">04</font>&nbsp;<font color="#7f0055"><b>import&nbsp;</b></font><font color="#000000">com.itbs.util.GeneralUtils;</font><br />
<font color="#808080">05</font>&nbsp;<font color="#7f0055"><b>import&nbsp;</b></font><font color="#000000">controller.MessengerGroupFactory;</font><br />
<font color="#808080">06</font>&nbsp;<font color="#7f0055"><b>import&nbsp;</b></font><font color="#000000">controller.MessengerContactFactory;</font><br />
<font color="#808080">07</font>&nbsp;<font color="#7f0055"><b>import&nbsp;</b></font><font color="#000000">controller.LogEventHandler;</font><br />
<font color="#808080">08</font>&nbsp;<font color="#ffffff"></font><br />
<font color="#808080">09</font>&nbsp;<font color="#7f0055"><b>public&nbsp;class&nbsp;</b></font><font color="#000000">JavaICQ&nbsp;</font><font color="#000000">{</font><br />
<font color="#808080">10</font>&nbsp;<font color="#ffffff"></font><br />
<font color="#808080">11</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;static&nbsp;</b></font><font color="#7f0055"><b>void&nbsp;</b></font><font color="#000000">main</font><font color="#000000">(</font><font color="#000000">String</font><font color="#000000">[]&nbsp;</font><font color="#000000">args</font><font color="#000000">)&nbsp;</font><font color="#7f0055"><b>throws&nbsp;</b></font><font color="#000000">Exception&nbsp;</font><font color="#000000">{</font><br />
<font color="#808080">12</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>try&nbsp;</b></font><font color="#000000">{</font><br />
<font color="#808080">13</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">ICQConnection&nbsp;conn&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">ICQConnection</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#808080">14</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">conn.assignGroupFactory</font><font color="#000000">(</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">MessengerGroupFactory</font><font color="#000000">())</font><font color="#000000">;</font><br />
<font color="#808080">15</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">conn.assignContactFactory</font><font color="#000000">(</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">MessengerContactFactory</font><font color="#000000">())</font><font color="#000000">;</font><br />
<font color="#808080">16</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">conn.setUserName</font><font color="#000000">(</font><font color="#2a00ff">&#34;icqnumber&#34;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#808080">17</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">conn.setPassword</font><font color="#000000">(</font><font color="#2a00ff">&#34;icqpass&#34;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#808080">18</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">conn.addEventListener</font><font color="#000000">(</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">LogEventHandler</font><font color="#000000">())</font><font color="#000000">;</font><br />
<font color="#808080">19</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">conn.connect</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#808080">20</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>while&nbsp;</b></font><font color="#000000">(</font><font color="#7f0055"><b>true</b></font><font color="#000000">)&nbsp;{</font><br />
<font color="#808080">21</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">GeneralUtils.sleep</font><font color="#000000">(</font><font color="#990000">60&nbsp;</font><font color="#000000">*&nbsp;</font><font color="#990000">60&nbsp;</font><font color="#000000">*&nbsp;</font><font color="#990000">1000</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#808080">22</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#808080">23</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><b>catch&nbsp;</b></font><font color="#000000">(</font><font color="#000000">Exception&nbsp;e</font><font color="#000000">)&nbsp;{</font><br />
<font color="#808080">24</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>throw&nbsp;new&nbsp;</b></font><font color="#000000">RuntimeException</font><font color="#000000">(</font><font color="#000000">e</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#808080">25</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#808080">26</font>&nbsp;<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#808080">27</font>&nbsp;<font color="#ffffff"></font><br />
<font color="#808080">28</font>&nbsp;<font color="#000000">}</font></code></div>
<p>Statt des LogEventHandlers kann auch der BotEventHandler, der standardmäßig in der Bilbliothek enthalten ist, verwendet werden.<br />
Bei der Einfachheit dieser Implementierung bleibt es aber auch, so ist es z.B. mit der Bibliothek derzeit nur möglich vom Online Status auf den Away Status zu schalten. Die umfangreichen Funktionen, die der offizielle ICQ Client bietet, sind mit jClaim leider nicht zugänglich.</p>
]]></content:encoded>
			<wfw:commentRss>http://kurtsparber.de/wordpress/?feed=rss2&amp;p=68</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle XE: ORA-12519</title>
		<link>http://kurtsparber.de/wordpress/?p=47</link>
		<comments>http://kurtsparber.de/wordpress/?p=47#comments</comments>
		<pubDate>Fri, 06 Feb 2009 20:00:29 +0000</pubDate>
		<dc:creator>sparber</dc:creator>
				<category><![CDATA[Datenbanken]]></category>

		<guid isPermaLink="false">http://sparber.wordpress.com/?p=47</guid>
		<description><![CDATA[Gelegentlich kommt es beim Einsatz eines Oracle XE Datenbanksystems zu dem Fehler ORA-12519, dies kann sich mit Java folgendermaßen äußern:

    
java.sql.SQLException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found
&#160;&#160;at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
&#160;&#160;at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:131)
&#160;&#160;at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:197)
&#160;&#160;at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:525)
&#160;&#160;at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:413)



Dies kann an der geringen Voreinstellung von üblicherweise 20 für die Anzahl an Sessions [...]]]></description>
			<content:encoded><![CDATA[<p>Gelegentlich kommt es beim Einsatz eines Oracle XE Datenbanksystems zu dem Fehler ORA-12519, dies kann sich mit Java folgendermaßen äußern:</p>
<div align="left" class="sql" style="line-height:1em;font-size:1.1em;">
    <code><br />
java.sql.SQLException: Listener refused the connection with the following error:<br />
ORA-12519, TNS:no appropriate service handler found<br />
&nbsp;&nbsp;at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)<br />
&nbsp;&nbsp;at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:131)<br />
&nbsp;&nbsp;at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:197)<br />
&nbsp;&nbsp;at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:525)<br />
&nbsp;&nbsp;at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:413)<br />
</code>
</div>
<p></br><br />
Dies kann an der geringen Voreinstellung von üblicherweise 20 für die Anzahl an Sessions liegen. Das Problem kann dadurch gelöst werden, indem die Parameter sessions und processes erhöht werden. Um dies zu erreichen sind folgende Kommandos zu tätigen:</p>
<div align="left" class="sql" style="line-height:1em;font-size:1.1em;">
<code><br />
<font color="#202090">alter</font> system <font color="#202090">set</font> processes=100 scope=spfile;<br />
<font color="#202090">alter</font> system <font color="#202090">reset</font> sessions scope=spfile sid='*';<br />
</code><br />

</div>
<p>
Die Kommandos können im Webinterface der Administrationsoberfläche unter dem User System ausgeführt werden. Nach einem Neustart der Datenbank sollte das Problem behoben sein. Trotz dieser Möglichkeit den Fehler zu umgehen sollte ein Blick in die Applikation geworfen werden, um die Ursache für den Sessionverbrauch festzustellen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kurtsparber.de/wordpress/?feed=rss2&amp;p=47</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
