<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>boxedfolder.com - Flex, Flash, PHP, Cocoa Touch &amp; Web</title>
	
	<link>http://www.boxedfolder.com</link>
	<description />
	<lastBuildDate>Tue, 03 Aug 2010 14:16:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/boxedfolder" /><feedburner:info uri="boxedfolder" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Deep-Copy mit NSKeyedArchiver</title>
		<link>http://feedproxy.google.com/~r/boxedfolder/~3/qf25hsT6DVw/</link>
		<comments>http://www.boxedfolder.com/blog/2010/08/03/deep-copy-mit-nskeyedarchiver/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 14:13:22 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[cocoa touch]]></category>
		<category><![CDATA[iPhone & mobile]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[copying]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[nskeyedarchiver]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=685</guid>
		<description><![CDATA[Eine flache Kopie eines Objekts (Shallow-Copy) in Cocoa herzustellen ist im Prinzip ganz einfach. Eine tiefe Kopie (Deep-Copy) erfordert etwas mehr Beachtung.]]></description>
			<content:encoded><![CDATA[<p>Eine flache Kopie eines Objekts (Shallow-Copy) in <strong>Cocoa</strong> herzustellen ist im Prinzip ganz einfach. Man implementiert das <em>NSCopying</em>-Protokoll welches die Methode -<em>copyWithZone: </em>erfordert. In der Implementierung von <em>copyWithZone:</em> kann man ganz einfach die Referenzen innerhalb des Objekts passend der neuen Instanz zuordnen und <strong>C-Types</strong> eventuell kopieren. Die Methode -<em>copy, </em>welche <em>NSObject</em> implementiert führt nun einen Aufruf von -<em>copyWithZone: </em>durch (mit <em>nil</em> als Argument).</p>
<p><span id="more-685"></span></p>
<p>Tiefe Kopien (Deep-Copies) erfordern hingegen etwas mehr als das Zuordnen einzelner Referenzen. Prinzipiell muss durch alle Properties der Instanz traversiert werden und jedes Unterobjekt und dessen Unterobjekte dementsprechend auch kopiert werden. Eine einfache Methode dieses zu erreichen kann in Cocoa über den Weg der <strong>Archivierung</strong> mit Hilfe des <em>NSKeyedArchiver </em>gehen<em> </em>(siehe auch meinen vorherigen <a title="Artikel über NSKeyedArchiver" href="http://www.boxedfolder.com/blog/2010/07/26/daten-permanent-abspeichern-mit-nskeyedarchiver/">Artikel</a>). Eine konkrete Implementierung innerhalb einer Klasse könnte so aussehen:</p>
<pre><code>@interface Entry : NSObject &lt;NSCoding&gt;
{
        NSString *text;
	NSString *headline;
}

@property (nonatomic, retain)NSString *text;
@property (nonatomic, retain)NSString *headline;

<strong style="border:none;">-(id)deepCopy;</strong>

@end

///////////////////////////////////////////////////////////////////////////////////////////////////

@implementation Entry

@synthesize text, headline;

-(id)initWithCoder: (NSCoder *)coder
{
	if(self = [super init])
	{
		self.text = [coder decodeObjectForKey: @"text"];
		self.headline = [coder decodeObjectForKey: @"headline"];
	}

	return self;
}

-(void)encodeWithCoder: (NSCoder *)encoder
{
    [encoder encodeObject: self.text forKey: @"text"];
    [encoder encodeObject: self.headline forKey: @"headline"];
}

<strong style="border:none;">-(id)deepCopy
{
    return [NSKeyedUnarchiver unarchiveObjectWithData: [NSKeyedArchiver archivedDataWithRootObject: self]];
}</strong>

-(void)dealloc
{
    [text release];
    [headline release];
    [super dealloc];
}

@end</code></pre>
<p>Zu beachten ist natürlich dass jedes Objekt und alle Unterobjekte dem <em>NSCoding-</em>Protokoll folgen müssen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2010/08/03/deep-copy-mit-nskeyedarchiver/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.boxedfolder.com/blog/2010/08/03/deep-copy-mit-nskeyedarchiver/</feedburner:origLink></item>
		<item>
		<title>Daten permanent abspeichern mit NSKeyedArchiver</title>
		<link>http://feedproxy.google.com/~r/boxedfolder/~3/p1vGIdHRdC8/</link>
		<comments>http://www.boxedfolder.com/blog/2010/07/26/daten-permanent-abspeichern-mit-nskeyedarchiver/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 17:08:57 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[cocoa touch]]></category>
		<category><![CDATA[iPhone & mobile]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[nskeyedarchiver]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=667</guid>
		<description><![CDATA[Falls man auf die Skalierbarkeit und Flexibilität einer SQLite-Datenbank verzichten kann, gibt es eine schnelle und coole Methode Object-Trees permanent in den Speicher zu schreiben .]]></description>
			<content:encoded><![CDATA[<p>Falls man auf die Skalierbarkeit und Flexibilität einer <strong>SQLite-</strong>Datenbank verzichten kann, gibt es eine schnelle und coole Methode Object-Trees permanent in den Speicher zu schreiben bzw. wieder zu laden. Mit Hilfe des <em>NSCoding</em>-Protokolls und der Klasse <em>NSKeyedArchiver</em> und <em>NSKeyedUnarchiver</em> lassen sich Daten schnell und sauber abspeichern. Objekte werden hierbei zuerst in ein Binärformat kodiert und dann in eine Datei geschrieben. Jedes zu archivierende Objekt muss zwangsläufig das <em>NSCoding</em>-Protokoll einhalten und somit die beiden Methoden<em> initWithCoder: </em>und<em> encodeWithCoder: </em>implementieren. Nachfolgend habe ich ein kleines Beispiel erstellt wie einfach dieser Prozess ist. Eine Beispielklasse <em>Entry</em> könnte so aussehen:</p>
<p><span id="more-667"></span></p>
<pre><code>@interface Entry : NSObject &lt;NSCoding&gt;
{
        NSString *text;
	NSString *headline;
}

@property (nonatomic, retain)NSString *text;
@property (nonatomic, retain)NSString *headline;

@end

///////////////////////////////////////////////////////////////////////////////////////////////////

@implementation Entry

@synthesize text, headline;

-(id)initWithCoder: (NSCoder *)coder
{
	if(self = [super init])
	{
		self.text = [coder decodeObjectForKey: @"text"];
		self.headline = [coder decodeObjectForKey: @"headline"];
	}

	return self;
}

-(void)encodeWithCoder: (NSCoder *)encoder
{
    [encoder encodeObject: self.text forKey: @"text"];
    [encoder encodeObject: self.headline forKey: @"headline"];
}

-(void)dealloc
{
    [text release];
    [headline release];
    [super dealloc];
}

@end
</code></pre>
<p>Eine Klasse die nun mehrere Entries <strong>archivieren</strong> und wieder <strong>extrahieren</strong> möchte, könnte das mit folgenden Methoden tun:</p>
<pre><code>[...]
-(void)archiveEntries: (NSArray *)entries withPath: (NSString *)path
{
        NSMutableDictionary *rootObject = [NSDictionary dictionaryWithObject: entries forKey: @"entries"];
	[NSKeyedArchiver archiveRootObject: rootObject toFile: path];
}

-(NSArray *)unarchiveEntriesOnPath: (NSString *)path
{
        NSDictionary *rootObject = [NSKeyedUnarchiver unarchiveObjectWithFile: path];
        return [rootObject valueForKey: @"entries"];
}
[...]</code></pre>
<p>Die Daten werden in unserem Beispiel in eine plist-Datei gespeichert, dessen Pfad natürlich frei gewählt werden kann. Natürlich hat man die Möglichkeit die Daten auch mit <em>NSData</em> zu schreiben. Ich empfehle einfach mal die Apple Dokumentation zum Thema <em>NSKeyedArchiver</em> durchzugehen.</p>
<p>Link zur <a class="blank" title="NSKeyedArchiver" href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSKeyedArchiver_Class/Reference/Reference.html">Apple Dokumentation</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2010/07/26/daten-permanent-abspeichern-mit-nskeyedarchiver/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.boxedfolder.com/blog/2010/07/26/daten-permanent-abspeichern-mit-nskeyedarchiver/</feedburner:origLink></item>
		<item>
		<title>tinyBlog: Mini PHP Blog auf github</title>
		<link>http://feedproxy.google.com/~r/boxedfolder/~3/gdsnVi-mClQ/</link>
		<comments>http://www.boxedfolder.com/blog/2010/07/18/tinyblog-mini-php-blog-auf-github/#comments</comments>
		<pubDate>Sun, 18 Jul 2010 15:52:18 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[applications]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=658</guid>
		<description><![CDATA[Vor kurzem bin ich angefangen einen mini Blog auf PHP Basis zu schreiben. Das Ergebniss hab ich nun unter MIT-Lizenz als Github Repository hochgeladen. ]]></description>
			<content:encoded><![CDATA[<p>Vor Kurzem habe ich angefangen einen mini Blog auf <strong>PHP</strong> Basis zu schreiben. Das Ergebnis hab ich nun unter <strong>MIT-Lizenz</strong> als github Repository zur Verfügung gestellt.</p>
<p>Der Fokus des tinyBlogs liegt vorallem im Arbeiten mit ActionController Instanzen, welche gute Erweiterungsmöglichkeiten bieten. Die Datenbank-Schnittstelle wird aktuell in <strong>MySQL</strong> bereitgestellt, kann aber leicht erweitert werden indem man einen eigenen konkreten <em>DatabaseConnector</em> schreibt.</p>
<p>Link zum <a class="blank" title="tinyBlog" href="http://github.com/bfolder/tinyBlog">tinyBlog</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2010/07/18/tinyblog-mini-php-blog-auf-github/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.boxedfolder.com/blog/2010/07/18/tinyblog-mini-php-blog-auf-github/</feedburner:origLink></item>
		<item>
		<title>UIModalPresentationStyle und UIModalTransitionStyle</title>
		<link>http://feedproxy.google.com/~r/boxedfolder/~3/BIZQIFfqUZU/</link>
		<comments>http://www.boxedfolder.com/blog/2010/05/13/uimodalpresentationstyle-und-uimodaltransitionstyle/#comments</comments>
		<pubDate>Thu, 13 May 2010 18:30:53 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[applications]]></category>
		<category><![CDATA[cocoa touch]]></category>
		<category><![CDATA[iPhone & mobile]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[modal]]></category>
		<category><![CDATA[sdk 3.2]]></category>
		<category><![CDATA[transitions]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=640</guid>
		<description><![CDATA[Seit einiger Zeit ist das SDK 3.2 für iPad schon verfügbar und alle Welt Entwickelt bereits fleißig auf der neuen Plattform.]]></description>
			<content:encoded><![CDATA[<p>Seit einiger Zeit ist das <strong>SDK 3.2</strong> für iPad schon verfügbar und alle Welt entwickelt bereits fleißig auf der neuen Plattform. Ich persönlich schreibe gerade ein Update für <a href="http://listiee.boxedfolder.com">listiee</a> welches in Form einer Universal Binary  kommt und ein speziell an das <strong>iPad</strong> angepasstes UI mitbringen wird. Das neue SDK bringt ein paar coole neue Features mit, von denen mich der neue &#8220;Presentation Style&#8221; der modalen Ansichten besonders begeistert. Apple hat hier eine gute Arbeit geleistet und erkannt dass die Art modale Informationen abzufragen auf dem iPad wesentlich eleganter lösbar ist. Mit den beiden Properties <em>modalPresentationStyle</em> und <em>modalTransitionStyle</em> im <em>UIViewController</em> ermöglicht das SDK 3.2 das festlegen der Übergänge und Größen der neuen modalen Ansichten.</p>
<p><span id="more-640"></span></p>
<p>Die Property <em>modalPresentationStyle</em> legt fest in welcher Größe der neue ViewController seine Ansicht darstellt. Die Enum <em>UIModalPresentationStyle</em> hat vier unterschiedliche Werte:</p>
<ul>
<li><code>UIModalPresentationFullScreen</code> &#8211; Es wird in einer Vollbildansicht präsentiert.</li>
<li><code>UIModalPresentationPageSheet</code> &#8211; Legt die Größe auf die der Portraitansicht fest.</li>
<li><code>UIModalPresentationFormSheet</code> &#8211; Die neue Ansicht wird in einem Fenster angezeigt.</li>
<li><code>UIModalPresentationCurrentContext</code> &#8211; Nutzt den Style des Parents.</li>
</ul>
<p>Man ist somit nicht immer auf die Vollbildansicht angewiesen. Das ist recht praktisch wenn man mal eben ein modales Fenster einblenden will um z.B. einen neuen Datensatz mit wenigen Feldern zu erstellen.</p>
<p>Darüber hinaus kann man die modalen Ansichten neuerdings auch mit Hilfe verschiedener Animationen einblenden. Bekannt ist der Weg die Ansicht von unten nach oben einfahren zu lassen. Das Ganze ist mit dem <em>UIModalTransitionStyleCoverVertical</em> der standard Übergang. Dazu hat Apple den horizontalen Flip (<em>UIModalTransitionStyleFlipHorizontal</em>), den Crossfade (<em>UIModalTransitionStyleCrossDissolve</em>) und den sogennanten &#8220;Partial Curl&#8221; (<em>UIModalTransitionStylePartialCurl</em>), sprich das Umblättern, ins Framework übernommen.</p>
<p>Beide Neuerungen sind in einem ViewController gewohnt leicht einzubinden:</p>
<pre><code>MyViewController *viewController = [[MyViewController alloc] init];
viewController.modalPresentationStyle = UIModalPresentationFormSheet;
viewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController: viewController animated: YES];</code></pre>
<p>Link zu dem <a class="blank" href="http://developer.apple.com/iphone/library/releasenotes/General/WhatsNewIniPhoneOS/Articles/iPhoneOS3_2.html#//apple_ref/doc/uid/TP40009337-SW1">offiziellen SDK 3.2 Changelog</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2010/05/13/uimodalpresentationstyle-und-uimodaltransitionstyle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.boxedfolder.com/blog/2010/05/13/uimodalpresentationstyle-und-uimodaltransitionstyle/</feedburner:origLink></item>
		<item>
		<title>AIR und die Klasse EncryptedLocalStore</title>
		<link>http://feedproxy.google.com/~r/boxedfolder/~3/OHKiqrABQ2Y/</link>
		<comments>http://www.boxedfolder.com/blog/2010/03/15/air-und-die-klasse-encryptedlocalstore/#comments</comments>
		<pubDate>Mon, 15 Mar 2010 15:18:31 +0000</pubDate>
		<dc:creator>Heiko</dc:creator>
				<category><![CDATA[air]]></category>
		<category><![CDATA[flash & flex]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[encryption]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[sqllite]]></category>
		<category><![CDATA[storage]]></category>

		<guid isPermaLink="false">http://www.boxedfolder.com/?p=625</guid>
		<description><![CDATA[Neben SQLite-Datenbanken lässt AIR es jederzeit zu (mit Einschränkungen) auf das lokale Dateisystem bzw. auf den Anwendungsordner zuzugreifen und dort neue Dateien zu schreiben.]]></description>
			<content:encoded><![CDATA[<p>Im Prinzip gibt es mehrere Wege in einer <strong>AIR</strong>-Anwendung Daten permanent zu speichern. Neben <strong>SQLite</strong>-Datenbanken lässt AIR es jederzeit zu (mit Einschränkungen) auf das lokale Dateisystem bzw. auf den Anwendungsordner zuzugreifen und dort neue Dateien zu schreiben. Dies ist eine schöne Methode um eine große Anzahl von Nutzdaten zu speichern und weiterzuverarbeiten. Möchte man innerhalb seiner Anwendung allerdings mit sensiblen Daten wie Passwörter oder Benutzernamen arbeiten, trifft man schnell auf das Problem der Verschlüsselung.</p>
<p>Adobe hat für diesen Fall vorgesorgt und stellt dem Entwickler die Klasse <strong>EncryptedLocalStore</strong> zur Verfügung. Hiermit kann man jederzeit auf einen der Anwendung eindeutig zugeordneten verschlüsselten Speicher zugreifen. AIR verwendet in diesem Fall <strong>DPAPI</strong> respektive den <strong>Keychain</strong> auf dem Mac und speichert Daten mit <strong>AES-CBC-128Bit</strong> Verschlüsselung.</p>
<p>Das schöne an dieser Speicherart ist aber, dass man &#8220;schnell mal eben&#8221; Zugriff auf Daten bekommt und genauso schnell neue Daten schreiben kann.<br />
Folgendes Beispiel schreibt einen String &#8220;value&#8221; mit dem Namen &#8220;key&#8221; in den Speicher:</p>
<pre><code>var stringByteArray:ByteArray = new ByteArray();
stringByteArray.writeUTFBytes("value");
EncryptedLocalStore.setItem("key", stringByteArray);</code></pre>
<p>Die zu schreibenden Daten sind vom Typ <code>ByteArray</code>, sprich man kann im Prinzip jede Art von Daten dort Speichern. Wichtig ist hier dass der Speicher im besten Fall 10MB nicht übersteigt.</p>
<p>EncryptedLocalStore muss also weder initialisiert noch eingestellt werden. Jede AIR-Anwendung verfügt automatisch über eine solche Speichermöglichkeit.<br />
Um die Daten z.B. in der nächsten Sitzung wiederherzustellen bedienen wir uns einfach der statischen Methode <code>getItem(name:String)</code>:</p>
<pre><code>var stringByteArray:ByteArray = EncryptedLocalStore.getItem("key");
var value:String = stringByteArray.readUTFBytes(stringByteArray.length);</code></pre>
<p>Link zu <a class="blank" title="EncryptedLocalStore" href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/data/EncryptedLocalStore.html">EncryptedLocalStore</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.boxedfolder.com/blog/2010/03/15/air-und-die-klasse-encryptedlocalstore/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.boxedfolder.com/blog/2010/03/15/air-und-die-klasse-encryptedlocalstore/</feedburner:origLink></item>
		<item>
		<title>Milky: Remember the Milk AS3 API Kit</title>
		<link>http://feedproxy.google.com/~r/boxedfolder/~3/dML4kpixQYo/</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>
		<feedburner:origLink>http://www.boxedfolder.com/blog/2010/02/03/milky-remember-the-milk-as3-api-kit/</feedburner:origLink></item>
		<item>
		<title>Die Flash-Plattform &amp; das iPhone</title>
		<link>http://feedproxy.google.com/~r/boxedfolder/~3/UpulX7Ex-V0/</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>3</slash:comments>
		<feedburner:origLink>http://www.boxedfolder.com/blog/2010/01/06/die-flash-plattform-das-iphone/</feedburner:origLink></item>
		<item>
		<title>navigateToUrl und Popup-Blocker</title>
		<link>http://feedproxy.google.com/~r/boxedfolder/~3/mRe2DgTDgcM/</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>
		<feedburner:origLink>http://www.boxedfolder.com/blog/2009/12/14/navigatetourl-und-popup-blocker/</feedburner:origLink></item>
		<item>
		<title>Composite &amp; Command: Undo-Funktion noch flexibler</title>
		<link>http://feedproxy.google.com/~r/boxedfolder/~3/mslt7CfIWUk/</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_1202639115"
			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_1202639115"
			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>
		<feedburner:origLink>http://www.boxedfolder.com/blog/2009/11/30/composite-command-undo-funktion-noch-flexibler/</feedburner:origLink></item>
		<item>
		<title>Actionscript 3 und MVC: Artikelserie</title>
		<link>http://feedproxy.google.com/~r/boxedfolder/~3/YnBAAg1iNlQ/</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>
		<feedburner:origLink>http://www.boxedfolder.com/blog/2009/11/02/actionscript-3-und-mvc-artikelserie/</feedburner:origLink></item>
	</channel>
</rss>
