<?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>redhotmagma - blog</title>
	<atom:link href="http://www.mmmmojo.de/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.mmmmojo.de</link>
	<description>flash - flex - interaction</description>
	<lastBuildDate>Thu, 19 Aug 2010 10:25:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>redhotmagma goes mobile &#8211; Rose Bike Bell im iTunes Store</title>
		<link>http://www.mmmmojo.de/?p=526</link>
		<comments>http://www.mmmmojo.de/?p=526#comments</comments>
		<pubDate>Thu, 19 Aug 2010 09:57:21 +0000</pubDate>
		<dc:creator>fred</dc:creator>
				<category><![CDATA[redhotmagma GmbH]]></category>

		<guid isPermaLink="false">http://www.mmmmojo.de/?p=526</guid>
		<description><![CDATA[*RING RING* &#8211; *WEG DA!* &#8211; Wer genug von solchen und anderen Ausrufen hat, um störende Mitmenschen aus dem Weg zu jagen, dem kann jetzt geholfen werden: Die erste iPhone/iPod Touch App, die redhotmagma für den Rose Bikeversand realisiert hat, ist nun im iTunes Store verfügbar. 


Entwickelt wurde sie mit dem Corona SDK von Ansca [...]]]></description>
			<content:encoded><![CDATA[<p>*RING RING* &#8211; *WEG DA!* &#8211; Wer genug von solchen und anderen Ausrufen hat, um störende Mitmenschen aus dem Weg zu jagen, dem kann jetzt geholfen werden: Die erste iPhone/iPod Touch App, die redhotmagma für den Rose Bikeversand realisiert hat, ist nun im iTunes Store verfügbar. </p>
<p style="text-align: center"><img class="aligncenter" src="http://www.mmmmojo.de/wp-content/uploads/mzl.jcvhbmxx.320x480-75.jpg" alt="Rose Bike Bell" width="320" height="480" /></p>
<p><span id="more-526"></span></p>
<p>Entwickelt wurde sie mit dem Corona SDK von Ansca Mobile, das es ermöglicht, native Apps in der Skriptsprache LUA zu programmieren. Dadurch kann man Animationen und grafische Effekte ressourcenschonend umzusetzen, ohne sich mit Objective-C und Speichermanagment herumzuplagen. Wer bereits Erfahrungen in ActionScript gesammelt hat, wird sich hier recht schnell zurechtfinden &#8211; das Corona Team arbeitete früher für Adobe an deren Flash Lite.</p>
<p>Wer selbst etwas in Corona realisieren möchte, dem sei noch Eclipse mit dem Plugin LUA-Eclipse als Editor ans Herz gelegt. Zwar muss man trotzdem ohne Code-Completion auskommen, hat aber zumindest Syntaxüberprüfung und kann, so man vom Mac OS nicht angetan ist, auch unter seinem gewohnten Betriebssystem entwickeln. Ein Mac zum Kompilieren wird allerdings trotzdem benötigt.</p>
<p>Die App is kostenlos im iTunes Store verfügbar:</p>
<p style="text-align: center"><a href="http://itunes.apple.com/us/app/rose-bike-bell/id386317417?mt=8">Rose Bike Bell</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mmmmojo.de/?feed=rss2&amp;p=526</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Virtual Box Netzwerk Probleme</title>
		<link>http://www.mmmmojo.de/?p=522</link>
		<comments>http://www.mmmmojo.de/?p=522#comments</comments>
		<pubDate>Fri, 06 Aug 2010 07:47:31 +0000</pubDate>
		<dc:creator>Steffen Abel</dc:creator>
				<category><![CDATA[Sonstige Webtechnologien]]></category>
		<category><![CDATA[bridge]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[netzwerk]]></category>
		<category><![CDATA[virtualbox]]></category>
		<category><![CDATA[virtuell]]></category>

		<guid isPermaLink="false">http://www.mmmmojo.de/?p=522</guid>
		<description><![CDATA[Vielleicht hilft der Tipp dem einen oder anderen weiter, ich habe danach sehr lange gesucht und keine Lösung gefunden.
Das Problem: Wir haben im Netzwerk mehrere Virtual-Boxen mit Bridged-Networks zu den Host-Rechnern im Einsatz. Je mehr Boxen aktiv waren, desto häufiger kam es zum Problem, dass die Systeme kurze oder auch lange Netzwerk-Unterbrechnungen hatten. Waren nur [...]]]></description>
			<content:encoded><![CDATA[<p>Vielleicht hilft der Tipp dem einen oder anderen weiter, ich habe danach sehr lange gesucht und keine Lösung gefunden.</p>
<p><strong>Das Problem:</strong> Wir haben im Netzwerk mehrere <a href="http://www.virtualbox.org/" target="_blank">Virtual-Boxen</a> mit Bridged-Networks zu den Host-Rechnern im Einsatz. Je mehr Boxen aktiv waren, desto häufiger kam es zum Problem, dass die Systeme kurze oder auch lange Netzwerk-Unterbrechnungen hatten. Waren nur wenige Boxen (2) aktiv, waren kaum Aussetzer bemerkbar.</p>
<p><strong>Die Lösung:</strong> Ursache des Problems war, dass alle Boxen von einer Master-Box kopiert wurden und daher die MAC-Adressen der virtuellen Netzwerkadapter gleich waren. Das hat scheinbar zu Konflikten über die einzelnen Systeme hinaus geführt. Nach Neugenerierung der MAC-Adressen läuft nun alles glatt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mmmmojo.de/?feed=rss2&amp;p=522</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Smoothing bei Images in Actionscript</title>
		<link>http://www.mmmmojo.de/?p=515</link>
		<comments>http://www.mmmmojo.de/?p=515#comments</comments>
		<pubDate>Tue, 20 Jul 2010 08:51:42 +0000</pubDate>
		<dc:creator>David Garus</dc:creator>
				<category><![CDATA[RIA / Actionscript 3 / Flex]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[actionscript 3]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[Schnelltipp]]></category>

		<guid isPermaLink="false">http://www.mmmmojo.de/?p=515</guid>
		<description><![CDATA[Wer nach einer Methode sucht um ein Bild in AIR weichgezeichnet zu bekommen der findet im Internet allerhand Methoden und Vorschläge präsentiert.
Von eigenen Klassen wie diese hier bis hin zu einfachen Einzeilern wie

Bitmap( image.content ).smoothing = true;

Auch ich habe viele diese Methoden probiert doch keine hat zum gewünschten Ergebnis geführt. Wer also in AIR entwickelt [...]]]></description>
			<content:encoded><![CDATA[<p>Wer nach einer Methode sucht um ein Bild in AIR weichgezeichnet zu bekommen der findet im Internet allerhand Methoden und Vorschläge präsentiert.<br />
Von eigenen Klassen wie <a href="http://cookbooks.adobe.com/index.cfm?event=showdetails&amp;postId=4001" title="Adobe Cookbook: Smooth Image">diese hier</a> bis hin zu einfachen Einzeilern wie</p>
<pre>
Bitmap( image.content ).smoothing = true;
</pre>
<p>Auch ich habe viele diese Methoden probiert doch keine hat zum gewünschten Ergebnis geführt. Wer also in AIR entwickelt und bei dem diese Methoden auch nicht funktionieren, dem empfehle ich eine einzelne Zeile Code:</p>
<pre>
this.stage.quality = StageQuality.BEST;
</pre>
<p>Da AIR auf dem Desktop läuft ist dies mit gutem Gewissen im Performancebereich möglich.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mmmmojo.de/?feed=rss2&amp;p=515</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eine Homepage aus Holz &#8211; Making-Of</title>
		<link>http://www.mmmmojo.de/?p=414</link>
		<comments>http://www.mmmmojo.de/?p=414#comments</comments>
		<pubDate>Mon, 19 Jul 2010 15:25:00 +0000</pubDate>
		<dc:creator>Steffen Abel</dc:creator>
				<category><![CDATA[Design & Inspiration]]></category>
		<category><![CDATA[RIA / Actionscript 3 / Flex]]></category>
		<category><![CDATA[redhotmagma GmbH]]></category>

		<guid isPermaLink="false">http://www.mmmmojo.de/?p=414</guid>
		<description><![CDATA[Zu Beginn von www.redhotmagma.de/experience stand der Gedanke, das typische Muster, wie Websites entstehen, aufzubrechen; einen neuen Ansatz zu fahren. web experience design nennen wir das, was wir hier tun; ein  spielerischer Zugang zum Web, eine Schicht über der Darstellung reiner  Information.
Dass web experience design dabei ganz anders aussehen kann, als die  typische [...]]]></description>
			<content:encoded><![CDATA[<p>Zu Beginn von <a href="http://www.redhotmagma.de/experience" target="_blank">www.redhotmagma.de/experience</a> stand der Gedanke, das typische Muster, wie Websites entstehen, aufzubrechen; einen neuen Ansatz zu fahren. web experience design nennen wir das, was wir hier tun; ein  spielerischer Zugang zum Web, eine Schicht über der Darstellung reiner  Information.<br />
Dass web experience design dabei ganz anders aussehen kann, als die  typische Art, wie man sich das Erstellen von Webseiten in der Regel  vorstellt, zeigt <a href="http://www.redhotmagma.de/experience">www.redhotmagma.de/experience</a>.</p>
<p><img class="aligncenter size-full wp-image-494" title="hp_4" src="http://www.mmmmojo.de/wp-content/uploads/hp_4.jpg" alt="bauteile" width="550" height="367" /></p>
<p>In dieser Seite steckt sehr viel Handarbeit im traditionellen Sinn. Gut 9 Monate wurden Schweiß, Blut und vor allem Sägespäne vergossen, das Ergebnis ist nun hier zu betrachten&#8230;</p>
<p><span id="more-414"></span>Inspiriert von unseren <a href="http://www.hdm-stuttgart.de/view_news?ident=news20071029152038" target="_blank">Arbeiten im Stop-Motion-Bereich</a> und Filmen wie Wes Andersons <a href="http://www.imdb.com/title/tt0362270/" target="_blank">Tiefseetaucher</a> entstand eine kleine Welt voller brodelnder Vulkane, geheimnisvollen Schätzen, furchterrgenden Ungeheuern, einem U-Boot im Steam-Punk-Style und einer liebenswerten Krake.</p>
<p>Die kleine Welt entstand auf Scheiben, die sich, je nachdem wo man sich befindet, zueinander verschieben und immer wieder neue Teilwelten offenbaren. Die Himmelsscheibe dreht dabei abhängig der Tageszeit ein, so dass der Nutzer, betrachtet er die Seite Nachts, auch auf der redhotmagma Insel in Zwielicht agiert.</p>
<p><img class="aligncenter size-full wp-image-502" title="hp_12" src="http://www.mmmmojo.de/wp-content/uploads/hp_12.jpg" alt="" width="550" height="109" /></p>
<p><img class="aligncenter size-full wp-image-500" title="hp_10" src="http://www.mmmmojo.de/wp-content/uploads/hp_10.jpg" alt="" width="550" height="349" /></p>
<p>Der besondere Look der Seite wurde durch ein außergewöhnliches Vorgehen erreicht: Alle grafischen Elemente wurden zunächst auf Sperrholz aufgezeichnet, koloriert, fein säuberlich ausgesägt und schließlich in unserem Studio fotografiert. Lediglich das finale Farb-Grading wurde nachfolgend in Photoshop erreicht.</p>
<p><img class="aligncenter size-full wp-image-508" title="hp_look" src="http://www.mmmmojo.de/wp-content/uploads/hp_look.jpg" alt="" width="550" height="521" /></p>
<p>Das &#8220;Zusammenbauen&#8221; der Seite erfolgte dann traditionell in Flash und Actionscript 3. Das Deeplinking wird durch swfobject und eine flexible XML-basierte Engine erreicht, die pro Einstieg beliebeige Animationen und Zustände abhandelt.</p>
<p>Wir wollen mit der Seite zeigen, dass Kreativität online und Kreativität offline sich nicht ausschließen, dass traditionelle Muster der Darstellung durchbrochen und mit beliebigen medialen Einflüssen ohne weiteres vermengt werden können.</p>
<p>Ein besonderer Dank gilt dem leitenden Programmierer, Matthias Palme, und unserem Art Director Adrian Marhoffer, die große Teile des Projekts schulterten.</p>
<p><img class="aligncenter size-full wp-image-506" title="hp_13" src="http://www.mmmmojo.de/wp-content/uploads/hp_13.jpg" alt="" width="550" height="367" /></p>
<p style="text-align: left;">Wir wünschen viel Spaß mit unserer neuen Website</p>
<p style="text-align: left;"><strong><a href="http://www.redhotmagma.de/experience" target="_blank">www.redhotmagma.de/experience</a></strong></p>
<p>Es wird empfohlen, die wunderliche Unter- und Überwasserwelt spielerisch und explorativ zu erforschen &#8211; wer Angst hat, nicht alles zu entdecken, darf natürlich auch die herkömmliche Navigation zur Hilfe nehmen.</p>
<p><img class="aligncenter size-full wp-image-491" title="hp_1" src="http://www.mmmmojo.de/wp-content/uploads/hp_1.jpg" alt="" width="550" height="367" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mmmmojo.de/?feed=rss2&amp;p=414</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>youtube erklärt warum das HTML5 video-Tag Flash in absehbarer Zeit nicht ablösen kann</title>
		<link>http://www.mmmmojo.de/?p=406</link>
		<comments>http://www.mmmmojo.de/?p=406#comments</comments>
		<pubDate>Thu, 01 Jul 2010 11:11:47 +0000</pubDate>
		<dc:creator>Christian Schilling</dc:creator>
				<category><![CDATA[RIA / Actionscript 3 / Flex]]></category>
		<category><![CDATA[Sonstige Webtechnologien]]></category>
		<category><![CDATA[Video]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://www.mmmmojo.de/?p=406</guid>
		<description><![CDATA[Der fiktive Kampf Flash vs. HTML5 wird von Apple zur Zeit ja stark medial propagiert. Meine Meinung &#8211; offene Standards: toll, Ausgereiftheit HTML5 im Vergleich zu Flash für diverse Anwendungsfälle: (noch) nicht vergleichbar &#8211; wird nun von youtube gestützt. Als Entwickler eines komplexen Flash-Videoplayers (mit Regional Content, Tageszeit- und Datum-abhängiger Auslieferung etc.) für einen großen [...]]]></description>
			<content:encoded><![CDATA[<p>Der fiktive Kampf Flash vs. HTML5 wird von Apple zur Zeit ja stark medial propagiert. Meine Meinung &#8211; offene Standards: toll, Ausgereiftheit HTML5 im Vergleich zu Flash für diverse Anwendungsfälle: (noch) nicht vergleichbar &#8211; wird nun von youtube gestützt. Als Entwickler eines komplexen Flash-Videoplayers (mit Regional Content, Tageszeit- und Datum-abhängiger Auslieferung etc.) für einen großen Fernsehsender bestätigen wir die interessanten Aussagen, die youtube hier bloggt:</p>
<p><span id="more-406"></span></p>
<p><a href="http://apiblog.youtube.com/2010/06/flash-and-html5-tag.html" target="_blank">http://apiblog.youtube.com/2010/06/flash-and-html5-tag.html</a></p>
<p>Fernab von Apples fast schon propagandistischer Interpretation der Dinge rate ich aber, wie viele echte und vor allem unabhängige Stimmen, davon ab, schwarzweiß zu malen. Das video-Tag ansich bietet in der einfachen Einbindung von Videos viele Vorteile. Und HTML5 und CSS3 wird, wenn die Standardisierung besser klappt als bei allen HTML/CSS-Versionen zuvor (was es abzuwarten gilt) kann durchaus mächtig sein. Der Weg dorthin ist jedoch noch lange.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mmmmojo.de/?feed=rss2&amp;p=406</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery serialize und PHP parse_str</title>
		<link>http://www.mmmmojo.de/?p=402</link>
		<comments>http://www.mmmmojo.de/?p=402#comments</comments>
		<pubDate>Thu, 24 Jun 2010 09:06:37 +0000</pubDate>
		<dc:creator>Christian Schilling</dc:creator>
				<category><![CDATA[Sonstige Webtechnologien]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.mmmmojo.de/?p=402</guid>
		<description><![CDATA[Ein sehr nützliches Vorgehen um Formulare per Ajax-Aufruf zu speichern ist das Zusammenspiel von jQuery serialize() und PHP parse_str.
serialize verwandelt die Felder eines beliebigen Formulars in eine Paramterstring, etwa:

var data = $('#my-form').serialize();
$.ajax({
type: &#8216;POST&#8217;,
url: &#8216;/my-script.php&#8217;,
data: {&#8216;data&#8217; : data}
});
Die PHP Seite macht dann mit parse_str ein Array mit den Werten. So können die Feldnamen z.B. auch unbekannt [...]]]></description>
			<content:encoded><![CDATA[<p>Ein sehr nützliches Vorgehen um Formulare per Ajax-Aufruf zu speichern ist das Zusammenspiel von<a href="http://api.jquery.com/serialize/" target="_blank"> jQuery serialize()</a> und <a href="http://de3.php.net/parse_str" target="_blank">PHP parse_str</a>.</p>
<p><span id="more-402"></span>serialize verwandelt die Felder eines beliebigen Formulars in eine Paramterstring, etwa:<br />
<code><br />
var data = $('#my-form').serialize();</code></p>
<p>$.ajax({<br />
type: &#8216;POST&#8217;,<br />
url: &#8216;/my-script.php&#8217;,<br />
data: {&#8216;data&#8217; : data}<br />
});</p>
<p>Die PHP Seite macht dann mit parse_str ein Array mit den Werten. So können die Feldnamen z.B. auch unbekannt sein:</p>
<p><code>$data =$_REQUEST['data'];</code></p>
<p>// Params Array zu lokaler Variable wandeln<br />
parse_str($data, $output);<br />
var_dump($output);</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mmmmojo.de/?feed=rss2&amp;p=402</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>redhotmagma entwickelt Facebook apps</title>
		<link>http://www.mmmmojo.de/?p=398</link>
		<comments>http://www.mmmmojo.de/?p=398#comments</comments>
		<pubDate>Thu, 17 Jun 2010 12:19:17 +0000</pubDate>
		<dc:creator>Christian Schilling</dc:creator>
				<category><![CDATA[RIA / Actionscript 3 / Flex]]></category>
		<category><![CDATA[redhotmagma GmbH]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.mmmmojo.de/?p=398</guid>
		<description><![CDATA[Die redhotmagma GmbH erweitert ihr Portfolio. Wir entwickeln nun auch Apps für das weltweit größte Social Network Facebook.
Mehr Infos unter: http://www.redhotmagma.de/business/facebook_apps.php
]]></description>
			<content:encoded><![CDATA[<p>Die redhotmagma GmbH erweitert ihr Portfolio. <a href="http://www.redhotmagma.de" target="_blank">Wir</a> entwickeln nun auch Apps für das weltweit größte Social Network Facebook.</p>
<p>Mehr Infos unter: <a href="http://www.redhotmagma.de/business/facebook_apps.php">http://www.redhotmagma.de/business/facebook_apps.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mmmmojo.de/?feed=rss2&amp;p=398</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Elferchallenge technisch PHP</title>
		<link>http://www.mmmmojo.de/?p=313</link>
		<comments>http://www.mmmmojo.de/?p=313#comments</comments>
		<pubDate>Thu, 17 Jun 2010 10:45:19 +0000</pubDate>
		<dc:creator>Robin Keller</dc:creator>
				<category><![CDATA[RIA / Actionscript 3 / Flex]]></category>
		<category><![CDATA[Sonstige Webtechnologien]]></category>
		<category><![CDATA[actionscript 3]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.mmmmojo.de/?p=313</guid>
		<description><![CDATA[Das Multiplayer-Game, Elferchallenge, für das Social-Network Facebook wurde in Flash und PHP entwickelt. Die Hauptlogik des Spiels ist in PHP ausgelagert, sodass in Flash keine Spiellogik mehr stattfinden muss. Somit kann sich Flash ganz auf die grafische Darstellung der Daten konzentrieren. Im Folgenden werde ich einen Einblick geben, wie die Verbindung zwischen Facebook, PHP und [...]]]></description>
			<content:encoded><![CDATA[<p>Das Multiplayer-Game, <a title="Elferchallenge on Facebook" href="http://apps.facebook.com/elferchallenge/" target="_blank">Elferchallenge</a>, für das <a title="Facebook.com" href="http://facebook.com" target="_blank">Social-Network Facebook</a> wurde in Flash und PHP entwickelt. Die Hauptlogik des Spiels ist in PHP ausgelagert, sodass in Flash keine Spiellogik mehr stattfinden muss. Somit kann sich Flash ganz auf die grafische Darstellung der Daten konzentrieren. Im Folgenden werde ich einen Einblick geben, wie die Verbindung zwischen Facebook, PHP und Flash besteht.<span id="more-313"></span></p>
<p>Als erstes sollte bei dem Anlegen von der Facebook-Anwendung darauf geachtet werden, dass als Rendermethode das Iframe verwendet wird.</p>
<div id="attachment_316" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.mmmmojo.de/wp-content/uploads/fb_application_settings_canvas.jpg"><img class="size-medium wp-image-316 " src="http://www.mmmmojo.de/wp-content/uploads/fb_application_settings_canvas-300x172.jpg" alt="Facebook Application Settings Canvas" width="300" height="172" /></a><p class="wp-caption-text">Facebook Application Settings</p></div>
<p>Die URL, der Seite, die in das Iframe geladen werden soll, muss unter &#8220;Canvas Callback URL&#8221; eingetragen werden. In diesem Fall liegen die Dateien von Elferchallenge auf <a title="Elferchallenge" href="http://elferchallenge.de" target="_blank">elferchallenge.de</a>.</p>
<p>Zur weiteren Vorbereitung sollte das <a title="PHP-SDK für die Facebook-API" href="http://github.com/facebook/php-sdk/" target="_blank">PHP-SDK für die Facebook-API</a> heruntergeladen werden. Das Software Development Kit basiert auf Curl und einer Session, die mithilfe eines Cookies gespeichert wird. Da kommen schon die ersten kleinen Probleme auf: Cookies in Iframes? Die meisten Browser akzeptieren keine Third Party Cookies von Haus aus, sodass ein anderer Weg zur Sessionübergabe verwendet werden sollte. Dazu später mehr.</p>
<p>Damit sich zuerst einmal die Anwendung auf Facebook authentifizieren kann, können bei dem Konstruktoraufruf des API-SDKs von Facebook Parameter zur Authentifizierung mitgegeben werden.</p>
<pre>$this-&gt;facebook = new Facebook(
    array(
        'appId'  =&gt; '66947884760',
        'secret' =&gt; 'your secret key'
    )
);
</pre>
<p>Damit sich nun auch noch der Benutzer mit der Anwendung authentifizieren kann, muss überprüft werden, ob eine gültige Facebook-Session vorhanden ist. Wenn der Benutzer authentifiziert ist, wird die aktuelle Facebook-Session in der lokalen Session abgespeichert, ansonsten muss sich der Benutzer mit der Anwendung (neu) authentifizieren.</p>
<p>Mit der Funktion checkLogin() erfolgt diese Überprüfung. Der Parameter $boolIsApiCall wird verwendet um zwischen API-Aufrufen vom Actionscript und Seitenaufrufe von Benutzern zu unterscheiden. Wenn der Benutzer die Seite aufruft und noch nicht authentifiziert ist, wird er direkt zur Authentifizierung weitergeleitet. Bei den API-Aufrufen wird der Text &#8216;reload&#8217; ausgegeben, welcher im Actionscript als Neuladen der Seite interpretiert wird.</p>
<pre>private function checkLogin( $boolIsApiCall = true ) {
    if ( $this-&gt;logged_in() ) {
        $facebookSession = $this-&gt;facebook-&gt;getSession();
        $_SESSION['fb'] = serialize( $this-&gt;facebook-&gt;getSession() );
    }
    else {
        $this-&gt;login( $boolIsApiCall );
    }
}

private function logged_in() {
    $session = $this-&gt;facebook-&gt;getSession();

    if ( isset($session) &amp;&amp; (($session['expires']) &gt; time()) ) {
        return true;
    }
    return false;
}

private function login( $boolIsApiCall ) {
    $nextUrl = 'http://apps.facebook.com/elferchallenge/';

    // Facebook Iframe Bug in Opera -&gt; iframe too small
    // if browser is opera overwrite $nextUrl
    if ( strstr($_SERVER["HTTP_USER_AGENT"], 'Opera')) {
        $nextUrl = 'http://elferchallenge.de/';
    }

    if ( $boolIsApiCall == true ) {
        echo 'reload';
    }
    else {
        // build login url
        $url = $this-&gt;facebook-&gt;getLoginUrl(
            array(
                'req_perms' =&gt; 'publish_stream,read_friendlists',
                'fbconnect' =&gt; '0',
                'api_key'   =&gt; 'f99b1c470160abdf236e8fbbecf2194b',
                'next'      =&gt; $nextUrl
            )
        );
        // redirect to page
        echo 'top.location.href = "' . $url . '";';

    }

    // stop other output
    die();
}
</pre>
<p>Nachdem der Benutzer sich mit der Anwendung authentifiziert hat, gibt Facebook seine Session als JSON-Parameter mit. Diese Facebook-Session wird, wie oben beschrieben, lokal abgespeichert.<br />
Bei der Elferchallenge wird die lokale Session, genauer die lokale Session-ID, über die URL mitgegeben. Beim Aufruf von der Anwendung wird die lokale Session-ID einmalig an das Flash übergeben und von dort an bei jedem API-Aufruf an PHP mit übergeben.</p>
<p>Hier sind zwei Beispiele wie mit dem PHP SDK an die GRAPH-API von Facebook Anfragen gesendet werden.</p>
<pre>$params = array(
    'fields' =&gt; 'id, name, picture'
);
$friendInformation = $this-&gt;facebook-&gt;api(
        '/me/friends',
        'GET', $param
    );
</pre>
<p>In diesem Beispiel werden von allen Freunden jeweils Facebook-ID, Namen und Profilbild-URL abgerufen.</p>
<pre>private function writeToWall( $message, $picture = '', $link = '',
                              $caption = '', $name = '',
                              $description = '', $facebookId = 'me'
                             ) {

    $params = array(
        'message'      =&gt; $message,
        'picture'      =&gt; $picture,
        'link'         =&gt; $link,
        'name'         =&gt; $name,
        'caption'      =&gt; $caption,
        'description'  =&gt; $description
    );

    $result =  $this-&gt;facebook-&gt;api(
                                     '/' . $facebookId . '/feed',
                                     'post',
                                     $params
                                   );

    if ( empty($result) ) {
        return false;
    }

    return true;
}
</pre>
<p>Die Funktion writeToWall() macht es möglich, an die eigene oder an die Wand von einem anderen Facebook-Benutzer zu schreiben.</p>
<p>Der Grundstein ist gelegt!</p>
<p>Flash bzw. das Actionscript sendet nun Http-Requests an die PHP-Datei und bekommt die aufbereiteten Daten zurück, welche im Flash dargestellt werden. Von der PHP Seite aus, wird dann zum Einen mit Facebook und zum Anderen mit der Datenbank kommuniziert.<br />
Bei der Freundesrangliste wird das sehr deutlich. Es werden zwei Datenquellen benötigt. Die Eine ist Facebook und die Andere die lokale Datenbank. Diese Daten werden verbunden und es wird die Rangliste der Freunde erstellt. Bei einem API-Aufruf vom Flash wird aus der Rangliste ein JSON-String erstellt, welcher an das Flash zurück gesendet wird.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mmmmojo.de/?feed=rss2&amp;p=313</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Elferchallenge technisch Flash</title>
		<link>http://www.mmmmojo.de/?p=318</link>
		<comments>http://www.mmmmojo.de/?p=318#comments</comments>
		<pubDate>Thu, 17 Jun 2010 09:24:47 +0000</pubDate>
		<dc:creator>David Garus</dc:creator>
				<category><![CDATA[RIA / Actionscript 3 / Flex]]></category>
		<category><![CDATA[actionscript 3]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[RIA]]></category>

		<guid isPermaLink="false">http://www.mmmmojo.de/?p=318</guid>
		<description><![CDATA[Nach langer Pause wurde die Elferchallenge wieder ins Leben geholt. Ursprünglich in Flash geschrieben, entwickelt und designed musste das ganze Projekt erst einmal in ein reines Actionscript 3 Projekt mit PHP Anbindung umgewandelt werden. Die Hauptlogik stecke diesmal in den PHP Funktionen und Flash wertete die Ergebnisse aus. Die größte Hürde hierbei war wohl das [...]]]></description>
			<content:encoded><![CDATA[<p>Nach langer Pause wurde die Elferchallenge wieder ins Leben geholt. Ursprünglich in Flash geschrieben, entwickelt und designed musste das ganze Projekt erst einmal in ein reines Actionscript 3 Projekt mit PHP Anbindung umgewandelt werden. Die Hauptlogik stecke diesmal in den PHP Funktionen und Flash wertete die Ergebnisse aus. Die größte Hürde hierbei war wohl das Speichern der Session das in PHP ein gewisses Problem darstellte, da das Speichern in Cookies innerhalb eines iFrames nicht möglich ist. Flashseitig bestand das größte Problem wohl darin, dass man die PHP Aufrufe in der richtigen Reihenfolge rufen musste und dies teilweise auch wiederholt tun musste. Grundsätzlich wurde in Flex 3.5, also mit Flash 9.0, entwickelt um Benutzern mit einer älteren Flash Version ebenfalls das Spielen zu ermöglichen. Das ganze Spiel besteht aus 6 Grundphasen, zu allererst einmal die Anmeldung bei der sich der Spieler ein Land auswählen durfte, anschließen ein Hauptbereich der bei jedem öffnen des Spiels angezeigt wird und die Möglichkeit bietet auch im nachhinein die gesprochene Sprache zu ändern.</p>
<p><span id="more-318"></span>In der 3ten Phase erhällt der Benutzer Informationen über Herausforderungen anderer Spieler, fertig gespielte Spiele und eine Rangliste die in eine Länder-, Einzel- und Freundeswertung unterteilt ist, auf die ich später noch einmal eingehen werde, desweiteren wird unter der Rangliste noch ein Spieler aus der vorher ausgewählten Nation mitsamt den gesamt gespielten Spielen, den gewonnen Spielen, verlorenen Spielen, unentschieden ausgegangenen Spielen, die Punkte und die Platzierung angezeigt.<br />
Zusätzlich besteht die Möglichkeit alle Listen zu aktualisieren, eine Hilfestellung einzusehen oder bereits hier die Geräusche abzustellen. Diese Einstellung wird in einem Flashcookie also einem <a title="Dokumentation zu SharedObject" href="http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/net/SharedObject.html">SharedObject</a> ( Actionscript 3 ) gespeichert.</p>
<pre>protected var muteCookie:SharedObject =
SharedObject.getLocal("Elferchallenge_Cookie");
...
muteCookie.data.soundONOFF = muteClicked;
muteCookie.flush();
</pre>
<p>Der Vorteil eines Flashcookies im Vergleich zu einem normalen Cookie besteht darin, dass ein Flashcookie direkt in das Dateisystem gespeichert wird und nicht vom jeweiligen Browser verarbeitet wird. Um einen Spieler innerhalb seiner Facebookfreunde herauszufordern muss man nur auf den Button &#8220;Challenge!!!&#8221; klicken, hierbei werden alle Freunde eines Spielers aus dem Ergebnis eines vorher abgesetzten PHP Aufrufs angezeigt. Nun kommt man in die 4te Phase in welcher man die 5 Schuss und 5 Haltepositionen wählt. Jeder vorher auf der Stage platzierte Ball, und auch Handschuh, besteht aus einem Objekt in dem der Movieclip und eine Zählvariable angegeben sind, dies war notwendig um auf die Position die der Benutzer wählt, die in beliebiger Reihenfolge stattfinden kann, zuzugreifen.</p>
<pre>for( var i:int = 0; i &lt; 5; i++ ) {
    ballArray[i] =  {image:AssetManager.getAsset( "ball" )
                        as MovieClip, id:i };
    handsArray[i] = { image:AssetManager.getAsset( "handschuhe" )
                        as MovieClip, id:i };
    numberArray[i] = i;
}
</pre>
<p>Nun kann der Benutzer entscheiden, ob er den Spieler wirklich Herausfordern möchte oder ob er dies doch nicht mehr möchte, auf jeden Fall wird nun ein dispatchEvent geworfen anhand dem dann ein PHP Aufruf mit einer Objektklasse gesendet wird und der Screen gelöscht werden kann. Die Objektklasse hat lediglich die Aufgabe die übergebenen Parameter, wie Spieler-ID und die Postionen, in ein MatchObject zu speichern, welches dann innerhalb von PHP verarbeitet werden kann.</p>
<pre>matchObject.mID = mID;
matchObject.cName = cName;
matchObject.cID = cID;
matchObject.cShots = cShots;
matchObject.cBlocks = cBlocks;
matchObject.cNation = cNation;
matchObject.oName = oName;
matchObject.oID = oID;
matchObject.oShots = oShots;
matchObject.oBlocks = oBlocks;
matchObject.oNation = oNation;
matchObject.maxPage = maxPage;
</pre>
<p>Die 5te Phase besteht darin sich ein Spiel an zugucken um es Schlussendlich zu beenden und die Punkte, egal ob Sieg, Niederlage oder Unentschieden, zu vergeben. Bevor die Animation jedoch abgespielt werden kann, wird anhand der vorher gewählten und in einer Datenbank via PHP abgespeicherten Nation die entsprechende Spieler SWF-Datei geladen. Danach werden die gesamten Animationen von einer Funktion überwacht womit gewährleistet ist, dass die Animationen gleichmäßig abgespielt werden. Wenn alle Animationen abgespielt sind, kann nun wieder ein dispatchEvent geworfen, anhand dem dann die 6te Phase gelangt und eine neue Klasse gerufen wird welche den Endstand des Spieles anzeigt und ein weiterer PHP Aufruf der das Ergebnis in die Datenbank speichert und es dann aus der Liste der gespielten Spiele gelöscht wird. Hier besteht dann noch die Möglichkeit den Spieler erneut zu fordern.</p>
<p>Im Informationsbereich wieder angelangt werden die Listen automatisch aktualisiert. Nun möchte ich auf die Highscoreliste etwas näher angehen. Die Highscoreliste besteht aus mehreren Bereichen, zuerst ein mal der Navigationsbereich oben rechts in dem man sich die verschiedenen Listen angucken kann, dann der Bereich direkt darunter in dem der Inhalt der jeweiligen Liste angezeigt wird, danach folgt eine kleine Navigationsleiste auf der die Seitenanzahl und Navigationspfeile angezeigt werden und ganz unten ist der Bereich in dem die aktuelle Position des Spielers zwischen den anderen Spielern der jeweiligen Liste angezeigt wird. Alle Listen werden per PHP Aufruf empfangen und verarbeitet. Dabei besteht jede Liste aus 2 Objekten, zum einen die eigentliche Liste und zum anderen die jeweilige Platzierung. In der Länderrangliste gibt es zu dem eine Besonderheit zu lösen. Das Objekt welches die Informationen besitzt gibt nur die Länderkürzel mit, also musste zuerst das gesamte Array durchsucht und die Länderkürzel durch die ganzen Ländernamen ersetzt werden.</p>
<pre>for each( var element:Object in arr ) {
    if( ( element != null ) &amp;&amp; ( element != "null" ) ) {
        if( translator.iso == "de" ) {
            fullName.push( {place:element.pos,
            cName:ElferchallengeConfig.fullCountryNameDE[
                ElferchallengeConfig.countryArray.indexOf(
                element.iso,0 ) ],
	    country:element.iso,
	    games:element.total_played,
	    wins:element.wins,
	    losses:element.losses,
	    draws:element.draws,
	    punkte:element.points} );
	}
	else {
	    fullName.push( {place:element.pos,
	    cName:ElferchallengeConfig.fullCountryNameEN[
               ElferchallengeConfig.countryArray.indexOf(
               element.iso,0 ) ],
	    country:element.iso,
	    games:element.total_played,
	    wins:element.wins,
	    losses:element.losses,
	    draws:element.draws,
	    punkte:element.points} );
	}
    }
}
</pre>
<p>Das gleiche muss, durch die Möglichkeit zwischen Deutsch und Englisch hin und her zu schalten, auch für die Englische Sprache verarbeitet werden.</p>
<p>Das war also ein kleiner Einblick in den technischen Flash Teil von Elferchallenge, man liest sich.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mmmmojo.de/?feed=rss2&amp;p=318</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Schnelltipp MySQL: Insert/Update kombinieren</title>
		<link>http://www.mmmmojo.de/?p=308</link>
		<comments>http://www.mmmmojo.de/?p=308#comments</comments>
		<pubDate>Wed, 16 Jun 2010 16:24:32 +0000</pubDate>
		<dc:creator>Steffen Abel</dc:creator>
				<category><![CDATA[Sonstige Webtechnologien]]></category>

		<guid isPermaLink="false">http://www.mmmmojo.de/?p=308</guid>
		<description><![CDATA[Für alle, die per MySQL Datensätze je nach Kontext entweder Inserten oder Updaten müssen, zum Beispiel bei Importen, dürfte die folgende Syntax sehr hilfreich sein:
INSERT INTO &#8230; ON DUPLICATE KEY UPDATE &#8230;
http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
]]></description>
			<content:encoded><![CDATA[<p>Für alle, die per MySQL Datensätze je nach Kontext entweder Inserten oder Updaten müssen, zum Beispiel bei Importen, dürfte die folgende Syntax sehr hilfreich sein:</p>
<p>INSERT INTO &#8230; ON DUPLICATE KEY UPDATE &#8230;</p>
<p><a href="http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html" target="_blank">http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mmmmojo.de/?feed=rss2&amp;p=308</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
