<?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>boxedfolder.com - Flex, Flash &#38; Web &#187; web</title>
	<atom:link href="http://www.boxedfolder.com/blog/category/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.boxedfolder.com</link>
	<description></description>
	<lastBuildDate>Wed, 03 Feb 2010 18:21:10 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Milky: Remember the Milk AS3 API Kit</title>
		<link>http://www.boxedfolder.com/blog/2010/02/03/milky-remember-the-milk-as3-api-kit/</link>
		<comments>http://www.boxedfolder.com/blog/2010/02/03/milky-remember-the-milk-as3-api-kit/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 18:21:10 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[flash & flex]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[github]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=618</guid>
		<description><![CDATA[Ich möchte in einem kurzen Blogeintrag auf ein Remember the Milk AS3 API Kit hinweisen, welches ich vor ein paar Tagen auf Github geladen habe. ]]></description>
			<content:encoded><![CDATA[<p>Ich möchte in einem kurzen Blogeintrag auf ein <strong>Remember the Milk AS3 API Kit </strong>hinweisen, welches ich vor ein paar Tagen auf <strong>Github</strong> geladen habe. Mit <strong>Milky</strong> lässt sich auf die gesamte verfügbare API von <a class="blank" title="Remember the Milk" href="http://www.rememberthemilk.com">rememberthemilk.com</a> zugreifen. Daten werden wahlweise per <strong>VO</strong> oder <strong>XML</strong> verarbeitet. Ich habe das Ganze aktuell noch relativ undokumentiert bereitgestellt, bin aber der Meinung dass man mit Hilfe der <strong>asdocs</strong> relativ schnell an die passende Schnittstelle kommt und damit produktiv arbeiten kann. Ich denke für Leute die eine AIR-Anwendung oder ein RTM Flash-Widget planen ist das sicher eine Erleichterung.</p>
<p>Die Autorisierung innerhalb der RTM-API ist anfänglich etwas verwirrend. Ähnlich wie es bei <a class="blank" title="Flickr" href="http://www.flickr.com">Flickr</a> gehandhabt wird, ist auch RTM abhängig von einem Token. Eventuell werde ich im nächsten Artikel etwas genauer auf das Login bzw. die Autorisierung eingehen. Weitere Informationen dazu gibt es allerdings auch auf der offiziellen API Dokumentation.</p>
<p>Link zu <a class="blank" title="Milky" href="http://github.com/bfolder/Milky">Milky</a>.<br />
Link zur <a class="blank" title="Remember the Mik API" href="http://www.rememberthemilk.com/services/api/">Remember the Milk API</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2010/02/03/milky-remember-the-milk-as3-api-kit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Die Flash-Plattform &amp; das iPhone</title>
		<link>http://www.boxedfolder.com/blog/2010/01/06/die-flash-plattform-das-iphone/</link>
		<comments>http://www.boxedfolder.com/blog/2010/01/06/die-flash-plattform-das-iphone/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 16:22:19 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[flash & flex]]></category>
		<category><![CDATA[iPhone & mobile]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[objective-c]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=597</guid>
		<description><![CDATA[Ich wollte das neue Jahr gleich mal dazu nutzen einen kleinen Beitrag über das iPhone, Flash und meine Einschätzung zur ganzen Sache zu schreiben. ]]></description>
			<content:encoded><![CDATA[<p>Ich wollte das neue Jahr gleich mal dazu nutzen einen kleinen Beitrag über das iPhone, Flash und meine Einschätzung zur ganzen Sache zu schreiben. Wie wir alle wissen sollte es Ende des Jahres eine (public) Beta von Flash CS5 geben, welche den Export-To-iPhone erlaubt. Diese Beta ist nun abgeblasen worden. Das ganze hat für vielerlei Aufregung gesorgt, weil natürlich ein Haufen Leute unheimlich gierig sind in den Mobilen-Markt (das iPhone in diesem Fall) zu drängen.</p>
<p>Ich schätze die gesamte Lage etwas verhaltener ein. Zum einen erkenne  ich noch nicht wie sich <strong>Flash CS5</strong> dazu eignet wirkliche Anwendungen mit mobilem Interface zu dispatchen. Hier fehlt es schlichtweg an passenden (nativen) Komponenten. Zum anderen bin ich mir unsicher ob Performance und Qualität solcher Anwendungen für den erwarteten Erfolg ausreichen. Bisher hörte ich nur, dass aus CS5 veröffentlichte iPhone Apps verhältnismäßig größer sind als die native Konkurrenz.</p>
<p>Persönlich bin ich vielmehr gespannt auf das mobile <strong>Flex-Framework</strong> mit dem <strong>Codenamen  &#8220;Slider&#8221;</strong>. Dieses soll das dispatchen einer Anwendung auf die gängigen mobilen Plattformen erlauben. Es bietet neben einer leichtgewichtigen Struktur auch UI-Komponenten die für die mobile Plattform entwickelt werden. Das ganze soll, so wird gemunkelt, im Laufe des Jahres benutzbar sein.</p>
<p>Ich möchte an dieser Stelle auch noch auf einen <a class="blank" title="Video-Flash" href="http://www.video-flash.de/index/iphone-frameworks-sdk-web-entwickler/">Artikel</a> von Florian Plag aufmerksam machen. Dieser listet die teilweise bereits erhältlichen Flash und nicht-Flash Alternativen zur iPhone-Entwicklung auf. Ich würde allerdings jedem ans Herz legen sich eventuell ein gutes <strong>Objective-C</strong> Buch zu schnappen, bevor man sich auf Scriptsprachen wie z.B. <strong>Lua</strong> fixiert. Was ich bisher gesehen habe, kann Objektive-C in vielen Bereichen eine durchaus elegante Sprache sein.</p>
<p>Link zu <a class="blank" title="Flex Slider" href="http://labs.adobe.com/technologies/flex/mobile/">Flex-&#8221;Slider&#8221;</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2010/01/06/die-flash-plattform-das-iphone/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>navigateToUrl und Popup-Blocker</title>
		<link>http://www.boxedfolder.com/blog/2009/12/14/navigatetourl-und-popup-blocker/</link>
		<comments>http://www.boxedfolder.com/blog/2009/12/14/navigatetourl-und-popup-blocker/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 11:21:00 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[flash & flex]]></category>
		<category><![CDATA[jquery & javascript]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flash player]]></category>
		<category><![CDATA[navigatetourl]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=589</guid>
		<description><![CDATA[Einige mehr oder weniger moderne Browser, wie der Internet Explorer 8, meinen einfach alles blockieren zu müssen was nicht im Fenster "_self" aufgerufen wird.]]></description>
			<content:encoded><![CDATA[<p>Vielleicht wird der Eine oder Andere das leidige Thema <em>navigateToUrl</em> und Popup-Blocker schmerzlich selber erlebt haben. Denn einige mehr oder weniger moderne Browser, wie der Internet Explorer 8, meinen einfach alles blockieren zu müssen was nicht im Fenster &#8220;_self&#8221; aufgerufen wird. Das gilt auch wenn kein weiteres Argument angegeben wird, also z.B. auch <em>navigateToURL(&#8220;http://www.google.de&#8221;)</em>.</p>
<p>Eine gute Methode um dieses Verhalten auszuhebeln, ist es, die Javascript Schnittstelle des Browsers anzusprechen und dementsprechend ein neues Fenster zu generieren. In diesem Zusammenhang kann ich auf eine tolle und kompakte Klasse verweisen, die genau das tut:</p>
<p><span id="more-589"></span></p>
<p><a class="blank" href="http://www.zorked.com/wp-content/uploads/2008/08/URLNavigator.as" title="URLNavigator Klasse">URLNavigator.as</a>:</p>
<pre>
<code>package com.zorked {
	import flash.external.ExternalInterface;
	import flash.net.*;

	public class URLNavigator {

		/**
		 * Utility function to wrap up changing pages. Avoids over-aggressive popup blockers.
		 * @param url		The URL to change to. Either a String or a URLRequest
		 * @param window	The target browser window/tab, generally _self, _top, or _blank
		 * @usage URLNavigator.ChangePage("http://www.google.com", "_blank");
		 */
		public static function ChangePage(url:*, window:String = "_self"):void {
			var req:URLRequest = url is String ? new URLRequest(url) : url;
			if (!ExternalInterface.available) {
				navigateToURL(req, window);
			} else {
				var strUserAgent:String = String(ExternalInterface.call("function() {return navigator.userAgent;}")).toLowerCase();
				if (strUserAgent.indexOf("firefox") != -1 || (strUserAgent.indexOf("msie") != -1 &amp;&amp; uint(strUserAgent.substr(strUserAgent.indexOf("msie") + 5, 3)) &gt;= 7)) {
					ExternalInterface.call("window.open", req.url, window);
				} else {
					navigateToURL(req, window);
				}
			}
		}

	}
}</code>
</pre>
<p>Was wird hier gemacht? Nun im Prinzip macht die Klasse einen Check ob es sich um gewisse Browser-Versionen handelt und führt dementsprechend einen normalen navigateToURL-Request aus, oder er ruft die Javascript Methode <i>window.open()</i> auf. Man ist im Grunde auf der sicheren Seite und gegen die Popup-Blocker Schikane einiger Browser gut gerüstet.</p>
<p>Link zum <a class="blank" href="http://www.zorked.com/flash/flash-and-navigatetourl-popup-blocking/" title="Artikel">Artikel</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2009/12/14/navigatetourl-und-popup-blocker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Composite &amp; Command: Undo-Funktion noch flexibler</title>
		<link>http://www.boxedfolder.com/blog/2009/11/30/composite-command-undo-funktion-noch-flexibler/</link>
		<comments>http://www.boxedfolder.com/blog/2009/11/30/composite-command-undo-funktion-noch-flexibler/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 11:01:49 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[design patterns]]></category>
		<category><![CDATA[flash & flex]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[command]]></category>
		<category><![CDATA[composite]]></category>
		<category><![CDATA[designpattern]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=542</guid>
		<description><![CDATA[In dem vorherigen Artikel über das Command Pattern, hab ich eine kleine Beispielanwendung vorgestellt. Diese demonstriert wie man mit Hilfe des Command-Entwurfmusters ganz leicht eine Undo-Funktion entwerfen kann.]]></description>
			<content:encoded><![CDATA[<p>In dem <a title="AS3: Undo-Funktion mit dem Command Pattern" href="http://www.boxedfolder.com/blog/2009/10/15/as3-undo-funktion-mit-dem-command-pattern/">vorherigen</a> Artikel über das <strong>Command-Pattern</strong>, hab ich eine kleine Beispielanwendung vorgestellt. Diese demonstriert wie man mit Hilfe des <strong>Command-Entwurfmusters</strong> ganz leicht eine Undo-Funktion entwerfen kann. Wie bereits angekündigt, möchte ich in diesem Eintrag noch einmal kurz in die besprochene Anwendung schauen und das ganze mit dem Composite-Pattern strukturell etwas erweitern um sie noch einmal in ihrer Flexibilität aufzubessern.</p>
<p>In der überarbeiteten Version unserer Anwendung geht es nun darum, dass es die Möglichkeit gibt den Kreis nicht nur in x- und y-Richtung zu bewegen, sondern auch dessen Alpha-Wert anzupassen.<br />
<span id="more-542"></span></p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_UndoExample2_1927604941"
			class="flashmovie"
			width="500"
			height="550">
	<param name="movie" value="http://www.boxedfolder.com/wp-content/uploads/2009/11/UndoExample2/UndoExample2.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.boxedfolder.com/wp-content/uploads/2009/11/UndoExample2/UndoExample2.swf"
			name="fm_UndoExample2_1927604941"
			width="500"
			height="550">
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>(Rechtsklick-View Source um Quellcode einzusehen)</p>
<p>In diesem Beispiel brauchen wir also neben dem <em>MoveCommand <span style="font-style: normal;">noch einen zweiten Befehlstypen, welcher in der Lage ist den Alpha-Wert eines entsprechenden Sprites zu verändern und wieder rückgängig zu machen. Er muss also das </span>ICommand<span style="font-style: normal;">-Interface implementieren.</span></em></p>
<p><em><span style="font-style: normal;">AlphaCommand.as:</span></em></p>
<pre><code>package com.boxedfolder.examples.undo
{
	import flash.display.Sprite;

	public class AlphaCommand implements ICommand
	{
		private var _sprite:Sprite;

		private var _alpha:Number;

		private var _targetAlpha:Number;

		public function AlphaCommand(sprite:Sprite, targetAlpha:Number)
		{
			_targetAlpha = targetAlpha;
			_alpha = sprite.alpha;
			_sprite = sprite;
		}

		public function execute():void
		{
			_sprite.alpha = _targetAlpha;
		}

		public function undo():void
		{
			_sprite.alpha = _alpha;
		}
	}
}</code></pre>
<p>Um eine Struktur zu erhalten, die es uns ermöglicht viele kleinere Commands sequentiell abzuarbeiten, bedienen wir uns des <strong>Composite-Patterns</strong>. Wir erstellen uns dazu einen <em>MacroCommand, </em>welcher potentiell beliebig viele Unterbefehle einschließen kann.</p>
<p>MacroCommand.as:</p>
<pre><code>package com.boxedfolder.examples.undo
{
	public class MacroCommand implements ICommand
	{
		private var commandStack:Array = [];

		public function execute():void
		{
			var command:ICommand;

			for(var i:int = 0; i &lt; commandStack.length; ++i)
			{
				command = commandStack[i] as ICommand;
				command.execute();
			}
		}

		public function undo():void
		{
			var command:ICommand;

			while(commandStack.length &gt; 0)
			{
				command = commandStack.pop() as ICommand;
				command.undo();
			}
		}

		public function addSubCommand(command:ICommand):void
		{
			commandStack.push(command);
		}
	}
}</code></pre>
<p>Da die Klasse <em>MacroCommand</em> das Interface <em>ICommand</em> implementiert ist eine Instanz in der Lage wie ein regulärer Befehl aufgerufen zu werden. Anstatt allerdings selber Funktionalität zu implementieren, wird durch die Unterbefehle iteriert und deren <em>execute()</em>- bzw. <em>undo()</em>-Methode ausgeführt. Zusätzliche Subcommands lassen sich via der Methode <em>addSubCommand()</em> hinzufügen.</p>
<p>Um jetzt diese Befehlskette in unsere Anwendung zu integrieren, müssen wir den <em>MacroCommand</em> instantiieren, Subcommands hinzufügen und dessen <em>execute()</em>-Methode aufrufen.</p>
<p>UndoExample.as:</p>
<pre><code>package
{
	import com.boxedfolder.examples.undo.AlphaCommand;
	import com.boxedfolder.examples.undo.ICommand;
	import com.boxedfolder.examples.undo.MacroCommand;
	import com.boxedfolder.examples.undo.MoveCommand;

	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.text.TextField;
	import flash.text.TextFieldType;

	[SWF(height="550", width="550", backgroundColor="#ffffff", frameRate="50")]

	public class UndoExample extends Sprite
	{
		//... verkürzt

		private var commandStack:Array = [];

		public function UndoExample()
		{
			setupVisuals();
		}

		private function setupVisuals():void
		{
		     //....verkürzt
		}

		private function buttonHandler(e:MouseEvent):void
		{
			if(e.target == goButton)
				changeObject();

			if(e.target == undoButton)
				undo();
		}

		private function changeObject():void
		{
<strong style="border:none;">
			var command:MacroCommand;
			var yv:Number = Number(yTextField.text);
			var xv:Number = Number(xTextField.text);
			var av:Number = Number(aTextField.text);

			if(!isNaN(yv) &amp;&amp; !isNaN(xv) &amp;&amp; !isNaN(av))
			{
				command = new MacroCommand();
				command.addSubCommand(new MoveCommand(circle, xv, yv));
				command.addSubCommand(new AlphaCommand(circle, av));

				commandStack.push(command);
				command.execute();
			}</strong>
		}

		private function undo():void
		{
			var command:ICommand;

			if(commandStack.length &gt; 0)
			{
				command = commandStack.pop() as ICommand;
				command.undo();
			}
		}
	}
}</code></pre>
<p>Der Vorteil dieser Struktur liegt in der Flexibilität. Wir verwenden einfach mehreren <em>MacroCommands</em> um so Funktionalität zu bündeln und den kompletten Befehlsverbund leicht Rückgängig zu machen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2009/11/30/composite-command-undo-funktion-noch-flexibler/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Actionscript 3 und MVC: Artikelserie</title>
		<link>http://www.boxedfolder.com/blog/2009/11/02/actionscript-3-und-mvc-artikelserie/</link>
		<comments>http://www.boxedfolder.com/blog/2009/11/02/actionscript-3-und-mvc-artikelserie/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 19:26:54 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[design patterns]]></category>
		<category><![CDATA[flash & flex]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[actionscript3]]></category>
		<category><![CDATA[designpattern]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[mvc]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=534</guid>
		<description><![CDATA[Hiermit möchte ich auf eine interessante Artikel Serie aufmerksam machen, die sich mit MVC Strukturen innerhalb von Actionscript 3 und Flash-Anwendungen beschäftigt. ]]></description>
			<content:encoded><![CDATA[<p>Hiermit möchte ich auf eine interessante Artikelserie aufmerksam machen, welche sich mit MVC-Strukturen innerhalb von Actionscript 3 und Flash-Anwendungen beschäftigt. Die Serie besteht aus insgesamt vier Artikeln. Die Strukturen werden anhand einer Beispielanwendung hinreichend praktisch erläutert.</p>
<p>Ich kann jedem empfehlen, dort mal einen Blick reinzuwerfen. Alternativ ist natürlich immer ein MVC-Framework eine gute Wahl. Für Flash/Flex gibt es eine recht große Auswahl. Ich benutze aktuell <a class="blank" title="PureMVC" href="http://www.puremvc.org">PureMVC</a> für diverse Projekte, weitere sind z.B. <a class="blank" title="Mate" href="http://mate.asfusion.com/">Mate</a>, <a class="blank" title="Swiz" href="http://code.google.com/p/swizframework/">Swiz</a>, <a class="blank" title="Cairngorm" href="http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm">Cairngorm</a> oder <a class="blank" title="Parsley MVC Framework" href="http://www.spicefactory.org/parsley/">Parsley</a>. Die einzelnen Frameworks unterscheiden sich häufig in Art und Anzahl der benutzten Patterns.</p>
<p>Zum Thema Flex-Frameworks hat auch David Tucker kürzlich einen interessanten Blogeintrag geschrieben. Dieser behandelt einige Probleme diverser Frameworks und zeigt Alternativen auf.</p>
<p>Link zum <a class="blank" title="David Tuckers Blog" href="http://www.davidtucker.net/2009/10/13/the-current-state-of-flex-frameworks/">Artikel von David Tucker</a>.<br />
Link zum  Artikel <a class="blank" title="AS3 MVC Part1" href="http://www.as3dp.com/2009/09/21/truckin-through-actionscript-30-mvc-part-i—structures-and-materials/">Truckin´ Through ActionScript 3.0 MVC: Part 2</a><br />
Link zum  Artikel <a class="blank" title="AS3 MVC Part1" href="http://www.as3dp.com/2009/10/04/truckin-through-actionscript-30-mvc-part-ii—reality-sui-generis-or-collection-of-spare-parts/">Truckin´ Through ActionScript 3.0 MVC: Part 2<br />
</a>Link zum  Artikel <a class="blank" title="AS3 MVC Part3" href="http://www.as3dp.com/2009/10/31/truckin-through-actionscript-30-mvc-part-iii—an-analog-compass/">Truckin´ Through ActionScript 3.0 MVC: Part 3<br />
</a>Link zum  Artikel <a class="blank" title="AS3 MVC Part4" href="http://www.as3dp.com/2009/11/01/truckin’-through-actionscript-30-mvc-part-iv—making-changes/">Truckin´ Through ActionScript 3.0 MVC: Part 4</a></p>
<p>UPDATE:<br />
Link zum  Artikel <a title="AS3 MVC Part5" href="http://www.as3dp.com/2009/11/03/truckin’-through-actionscript-30-mvc-part-v—purpose-and-use/">Truckin´ Through ActionScript 3.0 MVC: Part 5</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2009/11/02/actionscript-3-und-mvc-artikelserie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AS3: Undo-Funktion mit dem Command Pattern</title>
		<link>http://www.boxedfolder.com/blog/2009/10/15/as3-undo-funktion-mit-dem-command-pattern/</link>
		<comments>http://www.boxedfolder.com/blog/2009/10/15/as3-undo-funktion-mit-dem-command-pattern/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 09:14:46 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[design patterns]]></category>
		<category><![CDATA[flash & flex]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[actionscript3]]></category>
		<category><![CDATA[command]]></category>
		<category><![CDATA[designpattern]]></category>
		<category><![CDATA[flash]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=496</guid>
		<description><![CDATA[Wenn man eine Flash Anwendung entwickelt, in welcher der Benutzer vieles falsch machen kann, ist es oft ratsam eine Funktion bereitzustellen die es ihm ermöglichst verschiedene Arbeitsschritte rückgängig zu machen.]]></description>
			<content:encoded><![CDATA[<p>Wenn man eine Flash Anwendung entwickelt, in welcher der Benutzer vieles falsch machen kann, ist es oft ratsam eine Funktion bereitzustellen die es ihm ermöglichst verschiedene Arbeitsschritte rückgängig zu machen. Doch wie implementiert man so eine <strong>Undo-Funktion</strong> genau? In diesem Artikel möchte ich mit einem kleinen Beispiel zeigen wie sich ein solches Problem unter Einsatz des <strong>Command Patterns</strong> sauber lösen lässt.<br />
<span id="more-496"></span></p>
<p>Nachfolgend habe ich rudimentär zwei Buttons und zwei Eingabefelder zusammen mit einem Kreis auf einer Bühne platziert. Man kann mit Hilfe der Eingabefelder offensichtlich die x- und y-Positionen des Kreises verändern. Der Clou daran ist, dass man auch einen Undo-Befehl ausführen kann, welcher jeweils die letzte Aktion rückgängig macht.</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_UndoExample_222477359"
			class="flashmovie"
			width="500"
			height="500">
	<param name="movie" value="http://www.boxedfolder.com/wp-content/uploads/2009/10/UndoExample/UndoExample.swf" />
	<param name="quality" value="best" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.boxedfolder.com/wp-content/uploads/2009/10/UndoExample/UndoExample.swf"
			name="fm_UndoExample_222477359"
			width="500"
			height="500">
		<param name="quality" value="best" />
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>Als erstes bin ich hergegangen und habe ein <strong>Command-Interface</strong> mit dem Namen <em>ICommand</em> definiert. Dieses Interface beschreibt die beiden Methoden die ich benötige. Zum einen natürlich die <em>execute()</em>-Methode, welche die eigentliche Funktionalität beinhaltet und zum anderen die <em>undo()</em>-Methode:</p>
<pre><code>package com.boxedfolder.examples.undo
{
	public interface ICommand
	{
		function execute():void;
		function undo():void;
	}
}</code></pre>
<p>Die Klasse <i>MoveCommand</i>, welche konkret für die Bewegung meines Objekts zuständig ist sieht nun folgendermaßen aus:</p>
<pre><code>package com.boxedfolder.examples.undo
{
	import flash.display.Sprite;

	public class MoveCommand implements ICommand
	{
		private var _addedY:int;

		private var _addedX:int;

		private var _sprite:Sprite

		public function MoveCommand(sprite:Sprite, addedX:int, addedY:int)
		{
			_addedX = addedX;
			_addedY = addedY;
			_sprite = sprite;
		}

		public function execute():void
		{
			_sprite.x += _addedX;
			_sprite.y += _addedY;
		}
		public function undo():void
		{
			_sprite.x -= _addedX;
			_sprite.y -= _addedY;
		}
	}
}</code></pre>
<p>Mit unserer konkreten MoveCommand-Klasse, haben wir nun das Werkzeug, mit Hilfe der Methode <em>execute()</em> eine Bewegung in x- und y-Richtung an einem Sprite durchzuführen. Des weiteren speichert eine Move-Command Instanz, die hinzugefügten Werte und merkt sich also indirekt die alte Position des Sprites. Die Methode <em>undo()</em> nimmt die gespeicherten Werte und zieht sie vom referenzierten Sprite wieder ab. Sie macht also den gesamten Vorgang rückgängig.</p>
<p>Die Dokumenten-Klasse <em>UndoExample</em> sieht wie folgt aus:</p>
<pre>
<code>package
{
	import com.boxedfolder.examples.undo.ICommand;
	import com.boxedfolder.examples.undo.MoveCommand;

	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.text.TextField;
	import flash.text.TextFieldType;

	[SWF(height="550", width="550", backgroundColor="#ffffff", frameRate="50")]

	public class UndoExample extends Sprite
	{
		//... verkürzt

		private var commandStack:Array = [];

		public function UndoExample()
		{
			setupVisuals();
		}

		private function setupVisuals():void
		{
		     //....verkürzt
		}

		private function buttonHandler(e:MouseEvent):void
		{
			if(e.target == goButton)
				changeObject();

			if(e.target == undoButton)
				undo();
		}

		private function changeObject():void
		{
			var command:ICommand;
			var yv:Number = Number(yTextField.text);
			var xv:Number = Number(xTextField.text);

			if(!isNaN(yv) &amp;&amp; !isNaN(xv))
			{
				command = new MoveCommand(circle, xv, yv);
				commandStack.push(command);
				command.execute();
			}
		}

		private function undo():void
		{
			var command:ICommand;

			if(commandStack.length &gt; 0)
			{
				command = commandStack.pop() as ICommand;
				command.undo();
			}
		}
	}
}</code>
</pre>
<p>Wir legen jeden Command, welchen wir instantiieren und ausführen, am Ende eines Arrays ab. Dies bietet uns sozusagen ein<strong> Command-Stapel</strong>. Wenn der Benutzer den Undo-Button betätigt, wird die Methode <em>undo()</em> des Commands aufgerufen, welcher sich am ende des Arrays befindet. Gleichzeitig wird besagter Command aus dem Array entfernt.</p>
<p>In diesem simplen Beispiel sieht man wie man mit einfachen Mitteln eine Struktur aufbaut, in der ein Benutzer beliebig viele Schritte einzeln zurückgehen kann. In einem weiteren Artikel möchte ich das Beispiel noch etwas komplexer machen und die Struktur unter Anderem mit Hilfe des <strong>Composite Patterns</strong> verfeinern. Der komplette Source Code des oberen Beispiels lässt sich mit Rechtsklick und der Option &#8220;View Source&#8221; einsehen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2009/10/15/as3-undo-funktion-mit-dem-command-pattern/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Late Static Binding in PHP 5.3</title>
		<link>http://www.boxedfolder.com/blog/2009/09/15/late-static-binding-in-php-5-3/</link>
		<comments>http://www.boxedfolder.com/blog/2009/09/15/late-static-binding-in-php-5-3/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 13:33:51 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=452</guid>
		<description><![CDATA[Etliche neue Features sind in PHP 5.3 hinzugekommen. Late static Binding ist eins davon.]]></description>
			<content:encoded><![CDATA[<p>Etliche neue Features sind in PHP 5.3 hinzugekommen. Jedem wird wahrscheinlich dieses ominöse <strong>&#8220;Late Static Binding&#8221;</strong> sofort ins Auge gesprungen sein. Natürlich fragt man sich was es damit auf sich hat bzw. wo man die Funktionalität potentiell integrieren kann. Ein Beispiel hierfür, ist das abstrakte Singleton. Warum? Gehen wir mal davon aus wir haben ein klassisches Singleton:<br />
<span id="more-452"></span></p>
<pre><code>class Singleton
{
   	private static $instance = null;

	public static function getInstance()
	{
		if (self::$instance === null)
		{
			self::$instance = new self;
        	}

    	        return self::$instance;
	}

	private function __construct()
	{}

	private function __clone()
	{}
}</code></pre>
<p>Was passiert wenn dieses <strong>Singleton</strong> eine Subklasse besitzt und diese instantiiert wird, sehen wir hier:</p>
<pre><code>class SingletonSubclass extends Singleton{}

$singleton = SingletonSubclass::getInstance();
print get_class($singleton);

/* Ausgabe ist "Singleton" */</code></pre>
<p>Wie kann das sein? Wir instantiieren mit der Method <em>getInstance()</em> doch ein Objekt der Klasse <em>SingletonSubclass</em> und nicht der Superklasse <em>Singleton</em>?<br />
Auf den ersten Blick mag das vielleicht so erscheinen, aber durch frühe Bindung machen wir genau das besagte: Wir instantiieren die Superklasse und nicht die Subklasse. Der Knackpunkt liegt hier in dem Schnipsel: <em>self::$instance = new self</em>. Denn dadurch dass das Schlüsselwort <em>self</em>, statisch an die Superklasse gebunden ist, führt das an dieser Stelle zu exakt dem ungewollten Verhalten.</p>
<p>In <strong>PHP 5.3</strong> gibt es nun zusätzlich das Schlüsselwort <em>static</em>. Dieser tut im Endeffekt das was wir brauchen, es bindet eine statische Instanz erst spät. Um das ganze mal an einem konkreten Beispiel zu verdeutlichen, gehen wir nachfolgend mal davon aus, dass wir eine Anwendung haben die über ein Singleton verfügt, welches die Verbindung zu einer Datenbank herstellt.</p>
<p>Unsere Klasse mit dem Namen <em>DatabaseConnector</em> muss natürlich eine abstrakte Klasse sein, denn eine konkrete Verbindungsklasse sollte im optimalen Fall auf einen Datenbank-Typ maßgeschneidert sein, z.B. <em>MySQLConnector</em> oder <em>PostgreSQLConnector</em>. Ein Interface wäre zwecks der benötigten Singleton Funktionalität hier unangebracht.</p>
<p>DatabaseConnector.php könnte z.B. so aussehen:</p>
<pre><code>abstract class DatabaseConnector
{
	protected static $instance = null;

        public static function getInstance()
	{
		if (static::$instance === null)
		{
			static::$instance = new static;
      	        }

    	        return static::$instance;
	}

	protected function __construct(){}

	protected function __clone(){}

	abstract public function connect();
}</code></pre>
<p>Darauf folgt die Klasse <em>MySQLConnector</em>:</p>
<pre><code>require_once('DatabaseConnector.php');

class MySQLConnector extends DatabaseConnector
{
	public function connect()
	{
		print "Verbunden mit MySQL Datenbank...";
	}
}</code></pre>
<p>Um das ganze auszuführen, benutzen wir folgenden Code:</p>
<pre><code>require_once('MySQLConnector.php');

$connector = MySQLConnector::getInstance();
$connector-&gt;connect();

/* Ausgabe ist "Verbunden mit MySQL Datenbank..." */</code></pre>
<p>Wir sehen, dass wir durch das neue Schlüsselwort <em>static</em>, Möglichkeiten haben sauberer mit <strong>Vererbungen</strong> und statischem Zugriff umzugehen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2009/09/15/late-static-binding-in-php-5-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facade &amp; Composite Pattern bei PHP hates me</title>
		<link>http://www.boxedfolder.com/blog/2009/09/04/facade-composite-pattern-bei-php-hates-me/</link>
		<comments>http://www.boxedfolder.com/blog/2009/09/04/facade-composite-pattern-bei-php-hates-me/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 23:30:01 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[design patterns]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[designpattern]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=476</guid>
		<description><![CDATA[In letzter Zeit versuch ich vermehrt auf Entwurfsmuster einzugehen, da ich das ganze sowohl in PHP als auch in Actionscript 3 für sehr spannend und nützlich halte.]]></description>
			<content:encoded><![CDATA[<p>In letzter Zeit versuch ich vermehrt auf <strong>Entwurfsmuster</strong> einzugehen, da ich das ganze sowohl in PHP als auch in Actionscript 3 für sehr spannend und nützlich halte. Ich besuche daher etliche Blogs und Magazine um neue Infos über Muster und deren Implementierungen aufzusaugen. <a class="blank" title="PHP hates me" href="http://www.phphatesme.com/">PHP hates me</a> ist so ein Blog. Dort gibts immer eine Vielzahl von neuen Ideen und Patterns rund um PHP. Deshalb möchte ich hiermit auf zwei aktuelle Artikel hinweisen. Zum einen, der Artikel über <strong>Facades</strong>. Hier wird ganz rudimentär demonstriert wie man das Facade einsetzen kann um Zugriffe zu delegieren und Funktionalitäten zu kapseln.</p>
<p>Ein weiter schöner Artikel ist über das <strong>Composite </strong>Pattern veröffentlicht worden. Dort lohnt sich vorallem das konkrete Beispiel. Beim Composite Pattern fallen mir sonst immer nur Tree-Strukturen ein.</p>
<p>PHP hates me  bringt die Dinge immer schön auf den Punkt, die praktischen Beispiele kommen gelegentlich mal zu kurz.</p>
<p>Link zum Artikel über das <a class="blank" title="Composite Pattern" href="http://www.phphatesme.com/blog/softwaretechnik/php-entwurfsmuster-composite/">Composite-Pattern</a>.<br />
Link zum Artikel über das <a class="blank" title="Facade Pattern" href="http://www.phphatesme.com/blog/softwaretechnik/entwurfsmuster-fassade-facade/">Facade-Pattern</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2009/09/04/facade-composite-pattern-bei-php-hates-me/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Das Template Method Pattern in PHP</title>
		<link>http://www.boxedfolder.com/blog/2009/08/08/das-template-method-pattern-in-php/</link>
		<comments>http://www.boxedfolder.com/blog/2009/08/08/das-template-method-pattern-in-php/#comments</comments>
		<pubDate>Sat, 08 Aug 2009 18:15:11 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[design patterns]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[actionscript3]]></category>
		<category><![CDATA[designpattern]]></category>
		<category><![CDATA[muster]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=426</guid>
		<description><![CDATA[Das Template Method Pattern, welches ich des öfteren auch mal in Actionscript 3 zum Einsatz bringe, ist ein nützliches kleines Muster um bestimmte Algorithmen (in Subklassen) zu forcieren. ]]></description>
			<content:encoded><![CDATA[<p>In diesem Blog Eintrag möchte ich auf ein kleines Pattern eingehen, welches ich in letzter Zeit gerne benutzte. Das <strong>Template Method Pattern</strong>, das ich des öfteren auch mal in <strong>Actionscript</strong> zum Einsatz bringe, ist ein nützliches kleines Muster um bestimmte Algorithmen (in Subklassen) zu forcieren. Im Folgenden zeige ich ein minimales Beispiel für den Einsatz eines solchen Musters innerhalb von <strong>PHP</strong>.</p>
<p><span id="more-426"></span></p>
<p>Gehen wir mal davon aus, wir möchten mehrere Anwendungen schreiben, welche alle nach dem gleichen Muster initialisiert und gerendert werden sollen. Wir schreiben uns also eine abstrakte Klasse namens <em>ApplicationTemplate</em>. In dessen Konsktruktor legen wir fest, dass beim Instanzieren der Klasse (bzw. der Subklassen, es handelt sich ja um eine abstrakte Klasse), mehrere Methoden aufgerufen werden. Im speziellen sind das die Methoden <em>setup</em>, <em>buildApplication</em> und <em>renderTemplate</em>. Dazwischen rufen wir zusätzlich noch eine optionale Methode namens <em>hook</em> auf, welche wir später für eventuelles eingreifen in die Initialisierung benutzen können.</p>
<p>Die Datei <em>ApplicationTemplate.php </em>würde nun also folgendermaßen aussehen (ohne PHP spezifische Deklaration):</p>
<pre><code>abstract class ApplicationTemplate
{
    final public function __construct()
    {
    	$this-&gt;setup();
	$this-&gt;hook();
	$this-&gt;buildApplication();
	$this-&gt;renderTemplate();
    }

    abstract protected function setup();

    abstract protected function buildApplication();

    abstract protected function renderTemplate();

    protected function hook(){}
}</code></pre>
<p>Die Krux bei dieser Implementation liegt in der Verteilung der Schlüsselwörter <em>final</em>, <em>abstract</em> und <em>protected</em>. Unsere ganze Klasse ist abstrakt, das heisst sie schließt mindestens eine <strong>abstrakte Methode</strong> ein. Dies ist deshalb der Fall, um einer direkte Implementierung unseres Templates vorzubeugen. Die drei abstrakten Methoden können also nicht anders und müssen von eventuellen Subklassen zwangsweise implementiert werden. Die weitere Methode, namens <em>hook</em> stellt hier eine Ausnahme dar. Der <strong>Hook</strong> ist optional und kann, falls benötigt, von Subklassen überschrieben werden.</p>
<p>Im Konstruktor unserer Klasse wird der eigentliche Ablauf des gewollten <strong>Algorithmus</strong> festgelegt. Mit dem Schlüsselwort <em>final</em> wird diese abgeschlossen und vor weiterem Überschreiben gesichert. Es ist also völlig egal was wir in unseren Subklassen anstellen, es ist immer sichergestellt dass der Konstruktor aus der <strong>Superklasse</strong> bestehen bleibt und gleichzeitig alle abstrakten Methoden konkret implementiert werden. Der Konstruktor dient uns in diesem Beispiel also als eigentliche Template Methode.</p>
<p>Unsere <em>ConreteApplication.php</em> könnte z.B. so aussehen:</p>
<pre><code>require_once ('./ApplicationTemplate.php');

class ConcreteApplication extends ApplicationTemplate
{
    protected function setup()
    {
    	print 'Anwendung initialisiert...';
	print '';
    }

    protected function buildApplication()
    {
    	print 'Anwendung ausgefuehrt...';
	print '';
    }

    protected function renderTemplate()
    {
    	print 'Template ausgegeben...';
	print '';
    }

    protected function hook()
    {
	print 'Hook initialisiert...';
	print '';
    }
}</code></pre>
<p>Bei einer Instanzierung der <em>ConcreteApplication</em> Klasse, z.B. in einer Index-Datei würde man folgende Ausgabe erhalten:</p>
<pre><code>// z.B. in einer Index.php
$app = new ConcreteApplication();

// Resultierende Ausgabe wäre:
/*
      Anwendung initialisiert...
      Hook initialisiert...
      Anwendung erfolgreich ausgefuehrt...
      Template erfolgreich ausgegeben...
*/</code></pre>
<p>Wie bereits aufgefallen sein sollte, lebt dieses Pattern von <strong>Inheritance</strong>. Das sollte aber kein Grund sein auf die hilfreiche Einsatzmöglichkeit zu verzichten.</p>
<p>Der obere Code ist natürlich nur ein kleines rudimentäres Beispiel um zu verstehen worum es überhaupt geht. Sicher gibt es eine Reihe mehr und sinnvollerer Einsatzmöglichkeiten des Musters.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2009/08/08/das-template-method-pattern-in-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flash als CMS?</title>
		<link>http://www.boxedfolder.com/blog/2009/07/25/flash-als-cms/</link>
		<comments>http://www.boxedfolder.com/blog/2009/07/25/flash-als-cms/#comments</comments>
		<pubDate>Sat, 25 Jul 2009 02:40:14 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[flash & flex]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[amf]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[webservice]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=417</guid>
		<description><![CDATA[Mich haben in letzter Zeit öfter mal Leute angesprochen und gefragt wie es denn funktioniert eine komplette Flash Website an ihr CMS zu koppeln. Natürlich...]]></description>
			<content:encoded><![CDATA[<p>Mich haben in letzter Zeit öfter mal Leute angesprochen und gefragt wie es denn funktioniert eine komplette Flash Website an ihr <strong>CMS</strong> zu koppeln. Natürlich gibt es da für einige Front-End Lösungen von namhaften Systemen wie z.B. <strong>Drupal</strong> oder <strong>Wordpress</strong> (in manchen Fällen sogar per <strong>Webservice</strong>/<strong>AMF</strong>). Allerdings bin ich vor einiger Zeit auf ein Round-Up gestoßen dass spezielle Content Management Systeme vorstellt, die extra als &#8220;Flash CMS&#8221; betitelt sind. Dementsprechend verfügen diese in vielen Fällen über ein Front- und Backend mit Flash Oberfläche.  Der Artikel bei <a class="blank" title="flashEnabledBlog" href="http://flashenabledblog.com/">FlashEnabledBlog</a> ist zwar schon knapp ein Jahr alt, ich hab ihn trotzdem aus aktuellem Anlass noch einmal herausgekramt weil ich meine dass solche Lösungen für den ein oder anderen interessant sein könnten.</p>
<p>Im Detail zeigt der Artikel mehrere kommerzielle und nicht kommerzielle Lösungen zum darstellen von Multimedia Content auf der Flash Plattform, listet Vor- und Nachteile auf und gibt Auskunft über den eventuellen Preis. Ich muss allerdings gestehen dass ich keins davon bisher getestet habe. Wenn Interesse da ist, einfach mal selber testen und schauen ob es den Anforderungen entspricht.</p>
<p>Link zum <a class="blank" title="CMS Round Up bei FlashEnabledBlog" href="http://flashenabledblog.com/2008/09/16/flash-cms/">Artikel</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2009/07/25/flash-als-cms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
