<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Killerspaz&#039;s Blog</title>
	<atom:link href="http://killerspaz.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://killerspaz.wordpress.com</link>
	<description>A collection of my findings about ... life!</description>
	<lastBuildDate>Mon, 23 Jan 2012 16:41:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='killerspaz.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Killerspaz&#039;s Blog</title>
		<link>http://killerspaz.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://killerspaz.wordpress.com/osd.xml" title="Killerspaz&#039;s Blog" />
	<atom:link rel='hub' href='http://killerspaz.wordpress.com/?pushpress=hub'/>
		<item>
		<title>AIR Mobile TextInput/TextArea Key Events</title>
		<link>http://killerspaz.wordpress.com/2012/01/14/air-mobile-textinputtextarea-key-events/</link>
		<comments>http://killerspaz.wordpress.com/2012/01/14/air-mobile-textinputtextarea-key-events/#comments</comments>
		<pubDate>Sun, 15 Jan 2012 01:15:42 +0000</pubDate>
		<dc:creator>killerspaz</dc:creator>
				<category><![CDATA[AIR Mobile]]></category>
		<category><![CDATA[Flash Player]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[Input method]]></category>
		<category><![CDATA[keyboard support]]></category>
		<category><![CDATA[particle engine]]></category>
		<category><![CDATA[StageText]]></category>

		<guid isPermaLink="false">http://killerspaz.wordpress.com/?p=413</guid>
		<description><![CDATA[Another quick one comin at ya! When working on porting over my very first foray into Flex, my Flex particle engine, to the more current Flex4.6 for mobile purposes, I realized I wasn&#8217;t getting key events or change events from a debug Spark TextInput! Simple As? Tell your TextInput classes to use the standard TextInputSkin. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=killerspaz.wordpress.com&amp;blog=16977534&amp;post=413&amp;subd=killerspaz&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Another quick one comin at ya!</p>
<p>When working on porting over my very first foray into Flex, my Flex particle engine, to the more current Flex4.6 for mobile purposes, I realized I wasn&#8217;t getting key events or change events from a debug Spark TextInput!</p>
<p><span id="more-413"></span></p>
<h1>Simple As?</h1>
<p><pre class="brush: css;">
  &lt;fx:Style&gt;
    @namespace s &quot;library://ns.adobe.com/flex/spark&quot;;

    s|TextInput {
      skinClass: ClassReference(&quot;spark.skins.mobile.TextInputSkin&quot;);
    }
  &lt;/fx:Style&gt;
</pre></p>
<p>Tell your TextInput classes to use the standard TextInputSkin. The same applies for TextAreaSkin.<br />
If we look in our defaults.css for the mobiletheme, we&#8217;ll see that it&#8217;s normally set to: <strong>spark.skins.mobile.StageTextInputSkin</strong>.</p>
<h1>Why?</h1>
<p>StageText allows some nice features, such as dictionary completion from the OS and better keyboard support for alternative keyboards, to advanced features like quick zoom and fancy selection support that each OS provides. But it ruins the Events that one would expect that it dispatches.</p>
<p>I don&#8217;t know if this is true for ALL events, but certainly it is true for KeyboardEvent.KEY_UP, KeyboardEvent.KEY_DOWN, and Event.CHANGE. Bummer!</p>
<p>In my case, the loss of the native features isn&#8217;t that big of a deal right now&#8230; Right now.<br />
Eventually we&#8217;ll need a formal solution for this if we&#8217;re going to rely on StageText at any point.</p>
<h2>Oh, and by the way&#8230;</h2>
<p>My Flex particle engine is working rather well so far on my tablets and phones, even with it&#8217;s nasty memory leak!</p>
<p>Once I clean it up, I&#8217;ll release a public APK for everyone to test on Android!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/killerspaz.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/killerspaz.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/killerspaz.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/killerspaz.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/killerspaz.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/killerspaz.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/killerspaz.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/killerspaz.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/killerspaz.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/killerspaz.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/killerspaz.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/killerspaz.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/killerspaz.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/killerspaz.wordpress.com/413/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=killerspaz.wordpress.com&amp;blog=16977534&amp;post=413&amp;subd=killerspaz&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://killerspaz.wordpress.com/2012/01/14/air-mobile-textinputtextarea-key-events/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2be5ab58c033a7f5489a6b8034ae55d7?s=96&#38;d=identicon&#38;r=X" medium="image">
			<media:title type="html">killerspaz</media:title>
		</media:content>
	</item>
		<item>
		<title>Flex Mobile Application Background</title>
		<link>http://killerspaz.wordpress.com/2011/11/02/flex-mobile-app-background/</link>
		<comments>http://killerspaz.wordpress.com/2011/11/02/flex-mobile-app-background/#comments</comments>
		<pubDate>Wed, 02 Nov 2011 19:05:34 +0000</pubDate>
		<dc:creator>killerspaz</dc:creator>
				<category><![CDATA[AIR Mobile]]></category>
		<category><![CDATA[Flash Player]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Cascading Style Sheets]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Flex 4]]></category>
		<category><![CDATA[Mobile App]]></category>
		<category><![CDATA[skin]]></category>
		<category><![CDATA[Style Sheet]]></category>

		<guid isPermaLink="false">http://killerspaz.wordpress.com/?p=392</guid>
		<description><![CDATA[This is a short post, in which I show how to set a common background for your Flex Mobile Application. In Flex 3, there was a backgroundImage style property, but in Flex 4 things have drastically changed. Often times, this means you need to re-skin things in order to achieve your goals. Overview The gist [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=killerspaz.wordpress.com&amp;blog=16977534&amp;post=392&amp;subd=killerspaz&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This is a short post, in which I show how to set a common background for your Flex Mobile Application.</p>
<p>In Flex 3, there was a backgroundImage style property, but in Flex 4 things have drastically changed. Often times, this means you need to re-skin things in order to achieve your goals.</p>
<p><span id="more-392"></span></p>
<h1>Overview</h1>
<p>The gist is we&#8217;ll be extending the default application skin, and adding an image to it. For the sake of render-time, I also include a background color. Without the color, the background is white until your image/app loads, which may not be your desired effect.</p>
<h1>The Setup</h1>
<p>The class is simple&#8230; As an enhancement, feel free to include a <em>this.getStyle()</em> for <em>backgroundColorAlpha</em> (or whatever you want to call it). I didn&#8217;t find it necessary, so I default the alpha to 1.</p>
<p><pre class="brush: as3;">
package skins.common
{
  import mx.core.FlexSprite;

  import spark.skins.mobile.ViewNavigatorApplicationSkin;

  public class BGApplicationSkin extends ViewNavigatorApplicationSkin
  {
    protected var _background:DisplayObject;

    override protected function drawBackground(w:Number, h:Number):void
    {
      var bgClass:Class       = this.getStyle('backgroundImage') as Class;
      var bgColor:uint        = this.getStyle('backgroundColor') as uint;
            
      this._background        = new bgClass() as DisplayObject;
      
      this.graphics.beginFill(bgColor, 1);
      this.graphics.drawRect(0, 0, w, h);
      this.graphics.endFill();
      
      this._background.width  = w;
      this._background.height = h;
      
      //Add the background at the lowest display hierarchy.
      this.addChildAt(this._background, 0);
    }
  }
}
</pre></p>
<p>The CSS is also rather simple&#8230; Simply put, we define the <em>skinClass</em> for the Application type we&#8217;re using (in this case, ViewNavigatorApplication). We also supply the styles for the <em>backgroundImage</em>, and <em>backgroundColor</em>. In this example, I&#8217;m using a symbol from a SWF file to define a class. You can also use images, but the <em>skinClass</em> I&#8217;ve supplied does not support URLs (you can add error/type checking all you want).</p>
<p>The other key is to set backgroundAlpha for Spark View classes. Without this, you won&#8217;t see the background as a View will be painted white by default. Setting the alpha to 0 allows a common background to be visible at all times.</p>
<p><pre class="brush: css;">s|ViewNavigatorApplication {
  skinClass:              ClassReference(&quot;skins.common.BGApplicationSkin&quot;);
  backgroundImage:        Embed('/skins/skinFiles/commonComponents.swf#BackGround');
  backgroundColor:        #000000;
}

s|View {
  backgroundAlpha:        0;
}
</pre></p>
<h1>Troubleshooting</h1>
<p>Since we&#8217;re cheating and not actually extending ViewNavigatorApplication, but rather ViewNavigatorApplicationSkin, the styles won&#8217;t auto-complete correctly in your CSS file. A skin is always passed the hostComponent as the styleName (which is actually an object, not a string as you would expect), so assigning the CSS properties to ViewNavigatorApplication still works.</p>
<p>If you get Null Pointer Exceptions (NPE) about <em>this._background</em>, be sure you&#8217;re defining your CSS correctly, and ensure that the <em>this.getStyle(&#8216;backgroundImage&#8217;)</em> line is assigning properly. If not, you either have a typo in your CSS declaration, or you&#8217;re not supplying the right data-type.</p>
<p>To understand more about how Embeds work, as well as how to debug retrievals of Embeds via getStyle, see my other blog post: <a title="Mixing Flash and Flex" href="http://killerspaz.wordpress.com/2011/04/22/mixing-flash-and-flex/" target="_blank">Mixing Flash and Flex</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/killerspaz.wordpress.com/392/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/killerspaz.wordpress.com/392/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/killerspaz.wordpress.com/392/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/killerspaz.wordpress.com/392/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/killerspaz.wordpress.com/392/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/killerspaz.wordpress.com/392/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/killerspaz.wordpress.com/392/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/killerspaz.wordpress.com/392/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/killerspaz.wordpress.com/392/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/killerspaz.wordpress.com/392/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/killerspaz.wordpress.com/392/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/killerspaz.wordpress.com/392/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/killerspaz.wordpress.com/392/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/killerspaz.wordpress.com/392/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=killerspaz.wordpress.com&amp;blog=16977534&amp;post=392&amp;subd=killerspaz&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://killerspaz.wordpress.com/2011/11/02/flex-mobile-app-background/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2be5ab58c033a7f5489a6b8034ae55d7?s=96&#38;d=identicon&#38;r=X" medium="image">
			<media:title type="html">killerspaz</media:title>
		</media:content>
	</item>
		<item>
		<title>Using MX Components on Flex/AIR Mobile</title>
		<link>http://killerspaz.wordpress.com/2011/10/12/using-mx-components-on-flexair-mobile/</link>
		<comments>http://killerspaz.wordpress.com/2011/10/12/using-mx-components-on-flexair-mobile/#comments</comments>
		<pubDate>Thu, 13 Oct 2011 03:09:53 +0000</pubDate>
		<dc:creator>killerspaz</dc:creator>
				<category><![CDATA[AIR Mobile]]></category>
		<category><![CDATA[Flash Player]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Adobe Flex]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[Flex 3]]></category>
		<category><![CDATA[Flex 3 conversion]]></category>
		<category><![CDATA[Flex 4]]></category>
		<category><![CDATA[mobile devices]]></category>
		<category><![CDATA[MX Components]]></category>

		<guid isPermaLink="false">http://killerspaz.wordpress.com/?p=348</guid>
		<description><![CDATA[I recently was tasked to get part of an older Flex 3 application onto an iPad. Why not, right? I mean, FlashBuilder 4.5.1 and AIR 3.0 are awesome&#8230; This should be cake, right? There&#8217;s a lil gotcha &#8211; Flex 3, or MX components, ooorrr Halo components, are not exactly welcomed on Mobile. Fret not! I&#8217;ve [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=killerspaz.wordpress.com&amp;blog=16977534&amp;post=348&amp;subd=killerspaz&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I recently was tasked to get part of an older Flex 3 application onto an iPad. Why not, right? I mean, FlashBuilder 4.5.1 and AIR 3.0 are awesome&#8230; This should be cake, right?</p>
<p>There&#8217;s a lil gotcha &#8211; Flex 3, or MX components, ooorrr Halo components, are not exactly welcomed on Mobile.</p>
<p>Fret not! I&#8217;ve figured out the task, and it&#8217;s rather simple.</p>
<h1><span id="more-348"></span>Why and how are they removed?</h1>
<p>Well the why of it is simple. Performance and interaction. Granted, we now had Flex 4 which also allowed for virtualization for most complex components, it didn&#8217;t have what we needed: speed and interchangeability between desktop and mobile. A 1-stop shop, if you will. Flex 3 was stuck in the days without touch; thus the lists would all be scrollbars, and no dragging. Not to mention how scrolling used to be handled (yuck!).</p>
<p>As for how&#8230; It&#8217;s a combination of the mobile theme, and the lack of including it. LOL!  You can compare yourself the build configs for Flex (flex-config.xml) and AIR Mobile (airmobile-config.xml) and see how one includes the mx.swc, while the other doesn&#8217;t.</p>
<p>Flex 4 completely reintroduced skinning by separating behavioral and display logic. This is a good thing, especially for mobile where devices have many variant display types. All you need to do is change skins for a different platform/device, and you&#8217;re golden. But sometimes we have components that are completely custom, but utilize mostly-light components (i.e., Button, ProgressBar, Container, etc. Basically, not a lot of lists, charts, data rendering, etc. Really custom UIs). Certainly it can&#8217;t be THAT bad, right? As it turns out, not for me, no. If you keep it simple and lightweight (i.e., no extra containers, and as close to a flat Display List as possible), it should be OK. That&#8217;s my official blessing &#8211; if it doesn&#8217;t work for you, I blame you! <img src='http://s2.wp.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  No really though, it&#8217;s not supported by Adobe.</p>
<h1>So tell me how to fix it already!</h1>
<p>OK, it&#8217;s actually very easy. I&#8217;ll be using the default paths for Windows users, but this should all translate easily for everyone.</p>
<h3>Missing Components</h3>
<p>First thing is to include the MX components swc:</p>
<ul>
<li>Right-click your project &gt; <em>Properties</em>.</li>
<li>Click Flex Build Path &gt; Library Path tab.</li>
<li>Click Add SWC button, and point it to: C:\Program Files\Adobe\Adobe Flash Builder 4.5\sdks\4.5.1\frameworks\libs\mx\mx.swc</li>
</ul>
<div>Failure to do this step, and probably what brought you to this post in the first place, results in something like the following run-time error:</div>
<div>
<blockquote><p>VerifyError: Error #1014: Class mx.skins.halo::ButtonSkin could not be found.<br />
at flash.display::MovieClip/nextFrame()<br />
at mx.managers::SystemManager/deferredNextFrame()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\managers\SystemManager.as:284]<br />
at mx.managers::SystemManager/preloader_preloaderDocFrameReadyHandler()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\managers\SystemManager.as:2633]<br />
at flash.events::EventDispatcher/dispatchEventFunction()<br />
at flash.events::EventDispatcher/dispatchEvent()<br />
at mx.preloaders::Preloader/timerHandler()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\preloaders\Preloader.as:515]<br />
at flash.utils::Timer/_timerDispatch()<br />
at flash.utils::Timer/tick()</p></blockquote>
</div>
<h3>Missing Skins</h3>
<div>Next is to source the path to the skins for the defaults.css included in the SWC:</div>
<div>
<ul>
<li>Open properties tab if you closed it&#8230; Duh.</li>
<li>Click <em>Flex Build Path</em> &gt; <em>Source Path</em> tab.</li>
<li>Click <em>Add Folder</em> button, and point it to: C:\Program Files\Adobe\Adobe Flash Builder 4.5\sdks\4.5.1\frameworks\projects\mx\src</li>
</ul>
<div>And failing to do this step yields roughly 26 errors (at least for me) indicating the following:</div>
<div>
<ul>
<li>1120: Access of undefined property BorderSkin.</li>
<li>1172: Definition mx.skins.spark:BorderSkin could not be found.</li>
</ul>
</div>
<h1>Anything Else?</h1>
<p>You don&#8217;t actually need to include the SWC. The source alone will cut it. But I came across the solution in this way, and it shows how the SWC alone doesn&#8217;t cut it, but the source does.</p>
<div>Other than that, that&#8217;s it! If you run into other components needing included, do essentially the same thing for the proper SWC. If you don&#8217;t know which one, feel free to ask!</div>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/killerspaz.wordpress.com/348/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/killerspaz.wordpress.com/348/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/killerspaz.wordpress.com/348/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/killerspaz.wordpress.com/348/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/killerspaz.wordpress.com/348/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/killerspaz.wordpress.com/348/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/killerspaz.wordpress.com/348/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/killerspaz.wordpress.com/348/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/killerspaz.wordpress.com/348/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/killerspaz.wordpress.com/348/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/killerspaz.wordpress.com/348/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/killerspaz.wordpress.com/348/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/killerspaz.wordpress.com/348/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/killerspaz.wordpress.com/348/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=killerspaz.wordpress.com&amp;blog=16977534&amp;post=348&amp;subd=killerspaz&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://killerspaz.wordpress.com/2011/10/12/using-mx-components-on-flexair-mobile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2be5ab58c033a7f5489a6b8034ae55d7?s=96&#38;d=identicon&#38;r=X" medium="image">
			<media:title type="html">killerspaz</media:title>
		</media:content>
	</item>
		<item>
		<title>Handling Form Fields in Flex 4.5 / AIR Mobile</title>
		<link>http://killerspaz.wordpress.com/2011/05/07/handling-form-fields-in-flex-4-5-air-mobile/</link>
		<comments>http://killerspaz.wordpress.com/2011/05/07/handling-form-fields-in-flex-4-5-air-mobile/#comments</comments>
		<pubDate>Sat, 07 May 2011 06:45:45 +0000</pubDate>
		<dc:creator>killerspaz</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Adobe AIR]]></category>
		<category><![CDATA[AIR for Android]]></category>
		<category><![CDATA[BlackBerry Playbook]]></category>
		<category><![CDATA[flash events]]></category>
		<category><![CDATA[Flex 4]]></category>
		<category><![CDATA[Flex 4.5]]></category>
		<category><![CDATA[Flex Hero]]></category>
		<category><![CDATA[FlexGlobals]]></category>
		<category><![CDATA[focus]]></category>
		<category><![CDATA[FocusManager]]></category>
		<category><![CDATA[mobile devices]]></category>
		<category><![CDATA[QNX]]></category>
		<category><![CDATA[setFocus]]></category>
		<category><![CDATA[TextInput]]></category>
		<category><![CDATA[topLevelApplication]]></category>

		<guid isPermaLink="false">http://killerspaz.wordpress.com/?p=328</guid>
		<description><![CDATA[While doing mobile development, one of the most frustrating things has been form input. If you&#8217;ve looked at any Playbook development, you&#8217;ll see QNX has something called ReturnKeyType specifically for this reason. Being as stubborn as I am, I wanted a plain Flex approach at accomplishing what I wanted, and not to use the QNX [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=killerspaz.wordpress.com&amp;blog=16977534&amp;post=328&amp;subd=killerspaz&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>While doing mobile development, one of the most frustrating things has been form input.<br />
If you&#8217;ve looked at any Playbook development, you&#8217;ll see QNX has something called ReturnKeyType specifically for this reason.<br />
Being as stubborn as I am, I wanted a plain Flex approach at accomplishing what I wanted, and not to use the QNX library.</p>
<p><span id="more-328"></span></p>
<h2>The Problem</h2>
<p>When a series of form inputs are displayed on a mobile device, consideration for the on screen keyboard must be taken. In <em>most</em> scenarios, the operating system will shift your application up for you, but getting to the next field below it can be troublesome.</p>
<p>Take a look at this example in my current mobile app, Crash:</p>
<table>
<tbody>
<tr>
<th>Inputs Covered</th>
<th>Inputs Uncovered</th>
</tr>
<tr>
<td><a href="http://killerspaz.files.wordpress.com/2011/05/img_00000024.jpg" target="_new"><img class="size-medium wp-image-329" title="Inputs Covered" src="http://killerspaz.files.wordpress.com/2011/05/img_00000024.jpg?w=300&#038;h=175" alt="Inputs Covered" width="300" height="175" /></a></td>
<td><a href="http://killerspaz.files.wordpress.com/2011/05/img_00000025.jpg" target="_new"><img class="size-medium wp-image-334" title="Inputs Uncovered" src="http://killerspaz.files.wordpress.com/2011/05/img_00000025.jpg?w=300&#038;h=175" alt="Inputs Uncovered" width="300" height="175" /></a></td>
</tr>
</tbody>
</table>
<p>As you can see, when the user has the keyboard in position, the next TextInput is barely in view, and extremely difficult to tap. What&#8217;s more, is if you ARE able to tap it, it seemingly lines it up perfect so you can&#8217;t tap the one just below it.</p>
<p>I set out to find a solution that was easy to understand, and really easy to implement.</p>
<h2>The Solution</h2>
<p>It turns out, in Flex 4.5, the <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/components/TextInput.html" target="_blank">TextInput</a> class now dispatches FlexEvent.ENTER when the enter key is pressed. From the ASDocs directly, the statement appears:</p>
<blockquote><p>This control dispatches a <code>FlexEvent.ENTER</code> event when the user pressed the Enter key rather than inserting a line break, because this control does not support entering multiple lines of text.</p></blockquote>
<p>AHA! It&#8217;s obvious now! I just listen for this event&#8230; and&#8230; then&#8230; do&#8230; something?</p>
<p>Yep! That&#8217;s exactly right! I&#8217;ll skip the banter and get right to the code:</p>
<p><pre class="brush: as3;">
override protected function partAdded(partName:String, instance:Object):void
{
    switch (instance) {
        case this.txtInpName:
        case this.txtInpPhone:
        case this.txtInpAddress1:
        case this.txtInpAddress2:
        case this.txtInpLicense:
            TextInput(instance).addEventListener(FlexEvent.ENTER, this._onPressEnter, false, 0, true);
        break;
    }
}
</pre></p>
<p>Simply put, whenever a part from the skin is added, and I can identify it as one of my TextInputs, I simply listen for the FlexEvent.ENTER event, and handle it as such:</p>
<p><pre class="brush: as3;">
private function _onPressEnter(event:FlexEvent):void
{
    var nextFocusObj:IFocusManagerComponent = null;

    var focusMap:Dictionary                 = new Dictionary(true);

    focusMap[this.txtInpName]               = this.txtInpPhone;
    focusMap[this.txtInpPhone]              = this.txtInpAddress1;
    focusMap[this.txtInpAddress1]           = this.txtInpAddress2;
    focusMap[this.txtInpAddress2]           = this.txtInpLicense;
    focusMap[this.txtInpLicense]            = null;

    nextFocusObj = focusMap[event.target];

    if (null !== nextFocusObj) {
        this.focusManager.setFocus(nextFocusObj);
    } else {
        FlexGlobals.topLevelApplication.setFocus();
    }
}
</pre></p>
<p>Here I&#8217;ve simply created a mapping from one input to the next. this.txtInpName will map to this.txtInpPhone as it&#8217;s the next in order, this.txtInpPhone to this.txtInpAddress1 and so on.<br />
The special case is the last TextInput item, and I&#8217;m assigning null to the mapping. Furthermore, when the nextFocusObj is null, it merely calls setFocus() on the Application itself.</p>
<p>This isn&#8217;t the CLEANEST approach in my mind, because there is some setup you have to do first, but it <em>does</em> work.</p>
<p>For those that are going to say, &#8220;Why not just use FocusManager::getNextFocusManagerComponent() method to get the next item.&#8221; Well, honestly, it wasn&#8217;t working as I expected. It was selecting some arbitrary button on the screen; certainly not what I had hoped/expected to see. Thus, I have to be a bit more explicit.</p>
<p>I&#8217;ve tested this on the Playbook, and it works great! When the last text input is reached and the user hits Enter/Return, the Application gets focus and the keyboard automatically hides.<br />
Win!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/killerspaz.wordpress.com/328/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/killerspaz.wordpress.com/328/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/killerspaz.wordpress.com/328/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/killerspaz.wordpress.com/328/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/killerspaz.wordpress.com/328/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/killerspaz.wordpress.com/328/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/killerspaz.wordpress.com/328/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/killerspaz.wordpress.com/328/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/killerspaz.wordpress.com/328/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/killerspaz.wordpress.com/328/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/killerspaz.wordpress.com/328/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/killerspaz.wordpress.com/328/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/killerspaz.wordpress.com/328/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/killerspaz.wordpress.com/328/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=killerspaz.wordpress.com&amp;blog=16977534&amp;post=328&amp;subd=killerspaz&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://killerspaz.wordpress.com/2011/05/07/handling-form-fields-in-flex-4-5-air-mobile/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2be5ab58c033a7f5489a6b8034ae55d7?s=96&#38;d=identicon&#38;r=X" medium="image">
			<media:title type="html">killerspaz</media:title>
		</media:content>

		<media:content url="http://killerspaz.files.wordpress.com/2011/05/img_00000024.jpg?w=300" medium="image">
			<media:title type="html">Inputs Covered</media:title>
		</media:content>

		<media:content url="http://killerspaz.files.wordpress.com/2011/05/img_00000025.jpg?w=300" medium="image">
			<media:title type="html">Inputs Uncovered</media:title>
		</media:content>
	</item>
		<item>
		<title>Flash Builder Max Preview migration guide to Flash Builder 4.5</title>
		<link>http://killerspaz.wordpress.com/2011/05/06/flash-builder-max-preview-migration-guide-to-flash-builder-4-5/</link>
		<comments>http://killerspaz.wordpress.com/2011/05/06/flash-builder-max-preview-migration-guide-to-flash-builder-4-5/#comments</comments>
		<pubDate>Sat, 07 May 2011 03:23:17 +0000</pubDate>
		<dc:creator>killerspaz</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Adobe AIR]]></category>
		<category><![CDATA[BlackBerry Playbook]]></category>
		<category><![CDATA[component]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Flex 4.5]]></category>
		<category><![CDATA[Flex Hero]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[mobile devices]]></category>
		<category><![CDATA[Playbook]]></category>
		<category><![CDATA[Research In Motion]]></category>

		<guid isPermaLink="false">http://killerspaz.wordpress.com/?p=311</guid>
		<description><![CDATA[Most of this actually is related to Mobile development with AIR, considering there isn&#8217;t a bunch of desktop development focus in the SDK. Adobe released an early version of Flex 4.5 (Flex Her0) just before Adobe MAX last year, and tons of people grabbed it and started writing mobile apps with it. Since then, quite [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=killerspaz.wordpress.com&amp;blog=16977534&amp;post=311&amp;subd=killerspaz&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Most of this actually is related to Mobile development with AIR, considering there isn&#8217;t a bunch of desktop development focus in the SDK.</p>
<p>Adobe released an early version of Flex 4.5 (Flex Her0) just before Adobe MAX last year, and tons of people grabbed it and started writing mobile apps with it.<br />
Since then, quite a bit has changed both in common functionality, and under-the-hood things like List scrolling.</p>
<p>I couldn&#8217;t find any clear documentation about migrating your applications, so I figured I&#8217;d try to throw together as much information as I could think of.</p>
<p><strong>I will be updating this frequently as I find more changes or caveats while converting my apps, or from what I hear from others.</strong><br />
<span id="more-311"></span></p>
<h2>Quick Map</h2>
<p>So before I start, I&#8217;m going to try and attempt doing a quick mapping of some classes you might have used in 4.5 MAX Preview, and what their current counterparts are:</p>
<table align="center">
<tbody>
<tr>
<th>Preview</th>
<th>Current</th>
</tr>
<tr>
<td>MobileApplication</td>
<td>ViewNavigatorApplication</td>
</tr>
<tr>
<td>TabbedMobileApplication</td>
<td>TabbedViewNavigatorApplication</td>
</tr>
<tr>
<td>MobileItemRenderer</td>
<td>LabelItemRenderer</td>
</tr>
<tr>
<td>MobileIconItemRenderer</td>
<td>IconItemRenderer</td>
</tr>
<tr>
<td>Label (non HTML)</td>
<td>StyleableTextField</td>
</tr>
<tr>
<td>RichText (needing HTML)</td>
<td>StyleableTextField</td>
</tr>
</tbody>
</table>
<h2>Some Different Approaches</h2>
<p>There&#8217;s also a few different approaches we must take when developing for 4.5 final, which I&#8217;ll try to cover as much as I know.<br />
<strong></strong></p>
<p><strong>CSS:</strong><br />
Back in the 3.x and 4.0 days, we&#8217;d typically do camel case definitions of styles in metadata, and when accessing via setStyle() or getStyle(). However, in a stylesheet, we&#8217;d define the properties as hyphenated values, and not camel case. For me personally, this was irritating, frustrating, and downright weird. Worry no more! This has been changed! In CSS in Flex 4.5 we now should <em>ALWAYS</em> use camel case, all around.</p>
<p><strong>View:<br />
</strong>The View class is what we use for components handled by ViewNavigator. Before, these extended Group, but now they extend SkinnableComponent.<br />
This means a few things:</p>
<ul>
<li>You can easily skin Views, just as you would a custom component.</li>
<li>There isn&#8217;t a layout by default since it&#8217;s expected to be skinned (this is typical of SkinnableComponent implementations).</li>
<li>In the 4.5 final, the defaults.css for the Mobile Theme applies a white background.</li>
</ul>
<p><strong>MobileSkin:<br />
</strong>This part is a tad fuzzy for me, as I didn&#8217;t get into skinning a whole bunch early on. The gist is there&#8217;s a few methods added to the component lifecycle that abstract implementation a tad bit further, in order to make compounded components (ones that build on another) simpler to implement.<br />
Quickly referencing, there&#8217;s only a select few to worry about:</p>
<ul>
<li>layoutContents(unscaledWidth, unscaledHeight) &#8211; An isolated method to merely layout the contents of your component. Simple enough!</li>
<li>drawBackground(unscaledWidth, unscaledHeight) &#8211; Again, a basic method merely targeted at drawing the background. No default implementation!</li>
<li>setElementPosition(element, x, y) &#8211; In the early days it was positionPart(); clearly a more common naming convention with setElement*. This handles ILayoutElement, IFlexDisplayObject, and lazy DisplayObject implementations.</li>
<li>setElementSize(element, w, h) &#8211; Should be self explanatory now, former method was resizePart().</li>
<li>commitCurrentState() &#8211; When a skin&#8217;s state is updated, it will immediately call this method; apply any visual changes in this method based on the state.</li>
</ul>
<p>Some interesting methods to take a look at:</p>
<ul>
<li>applyColorTransform(displayObject, originalColor, tintColor) &#8211; In order to quickly &#8220;theme&#8221; your components, you can utilize this method to do a color transform for you. This is akin to the themeColor or chromColor styles.</li>
<li>hasState(stateName) &#8211; By default, MobileSkin always returns true, as there isn&#8217;t a state listing like in SparkSkins. If you want to throw an error to a developer, override and return false for states you know you don&#8217;t implement. Typically this is only useful for when you extend a skin and want to avoid handling a state.</li>
</ul>
<p>I&#8217;m hoping it has been beaten into your skull already, but you should be writing your skins in PURE AS3&#8230; I&#8217;ll be honest, I break this rule too, but haven&#8217;t compared with a pure AS3 implementation to know if the performance is really as much as they say it is. Maybe that&#8217;ll be my next experiment <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Backwards compatibility:</strong></p>
<ul>
<li>http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7ede.html</li>
<li>http://opensource.adobe.com/wiki/display/flexsdk/Flex+4+Backwards+Compatability</li>
</ul>
<h2>Some Tricks</h2>
<p>Here&#8217;s a few tricks I&#8217;ve found while trying to migrate my application:</p>
<ul>
<li>There is no quick way to fix the CSS to go from hyphenated to camel case. I&#8217;m considering writing a quick javascript or Flex app to handle this for me. I just spent like 30 minutes going through ALL my CSS, and it wasn&#8217;t fun!</li>
<ul>
<li>Use REGEX search to help identify items needing change quicker: \-.?</li>
<li>Be sure to limit searches to &#8220;Enclosing Projects,&#8221; and limit file types to *.css for faster and more accurate searching!</li>
</ul>
<li>Views now  have a backgroundColor of #FFFFFF applied to them. I was expecting to see my application background, so I had to set backgroundAlpha to 0.</li>
<li>ActionBar components are given an ID. Because of this, CSS must be applied slightly different than desired/expected:</li>
<ul>
<li>ActionBar #titleDisplay &#8211; set fontSize for header here. Setting on ActionBar is futile!</li>
<li>ActionBar Group#navigationGroup Button</li>
<ul>
<li>ActionBar Group#navigationGroup Button.myStyle &#8211; for a unique style for a button</li>
</ul>
<li>ActionBar Group#actionGroup Button</li>
</ul>
</ul>
<h3>External Links:</h3>
<ul>
<li><a href="http://blogs.adobe.com/jasonsj/2011/05/flex45_air25_playbook.html" target="_blank">How to use Flex 4.5, and target AIR 2.5</a> &#8211; Jason San Jose &#8211; Mostly useful for Playbook development</li>
<li><a href="http://www.adobe.com/devnet/flex/articles/mobile-skinning-part1.html" target="_blank">Flex Mobile Skins</a> &#8211; Jason San Jose &#8211; Part 1, Optimized skinning basics</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/killerspaz.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/killerspaz.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/killerspaz.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/killerspaz.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/killerspaz.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/killerspaz.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/killerspaz.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/killerspaz.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/killerspaz.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/killerspaz.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/killerspaz.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/killerspaz.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/killerspaz.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/killerspaz.wordpress.com/311/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=killerspaz.wordpress.com&amp;blog=16977534&amp;post=311&amp;subd=killerspaz&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://killerspaz.wordpress.com/2011/05/06/flash-builder-max-preview-migration-guide-to-flash-builder-4-5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2be5ab58c033a7f5489a6b8034ae55d7?s=96&#38;d=identicon&#38;r=X" medium="image">
			<media:title type="html">killerspaz</media:title>
		</media:content>
	</item>
		<item>
		<title>The Playbook, by RIM</title>
		<link>http://killerspaz.wordpress.com/2011/04/27/the-playbook-by-rim/</link>
		<comments>http://killerspaz.wordpress.com/2011/04/27/the-playbook-by-rim/#comments</comments>
		<pubDate>Thu, 28 Apr 2011 04:54:36 +0000</pubDate>
		<dc:creator>killerspaz</dc:creator>
				<category><![CDATA[Rants]]></category>
		<category><![CDATA[Adobe AIR]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[BlackBerry]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[IOS (Apple)]]></category>
		<category><![CDATA[mobile devices]]></category>
		<category><![CDATA[Playbook]]></category>
		<category><![CDATA[QNX]]></category>
		<category><![CDATA[Research In Motion]]></category>
		<category><![CDATA[RIM]]></category>

		<guid isPermaLink="false">http://killerspaz.wordpress.com/?p=292</guid>
		<description><![CDATA[So, I partook in the free Playbook offer sponsored by RIM, and developed a few applications for it. This post is NOT about my apps, but rather touches on the process, as well as what I think about the Playbook as a device, and platform. The Beginning Woah&#8230; RIM is waiving the $200 developer license [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=killerspaz.wordpress.com&amp;blog=16977534&amp;post=292&amp;subd=killerspaz&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>So, I partook in the free Playbook offer sponsored by RIM, and developed a few applications for it.</p>
<p>This post is NOT about my apps, but rather touches on the process, as well as what I think about the Playbook as a device, and platform.<br />
<span id="more-292"></span></p>
<h2>The Beginning</h2>
<p>Woah&#8230; RIM is waiving the $200 developer license fee?!? WOAH, IT&#8217;S $200!?!?!?! Holy cow! But hell, it&#8217;s waived, what do I care, right? Kiiiinda.</p>
<p>In reality, I&#8217;m not affected by this directly, but what does this mean indirectly? Well, it could mean one of two things (in my mind/opinion):</p>
<ol>
<li>Only the elite apply. After being active on the forums, and seeing the types of apps approved (both before launch, and to-date), I&#8217;m totally OK with this. See my <a href="/2011/02/26/a-plea-to-developers-and-markets/" target="_blank">previous rant </a>about what I think about the current and future state of affairs on mobile (and really any) markets.</li>
<li>NO ONE applies. This, of course, is NOT good. The high price might scare away all the garage-developers, and not enough serious developers apply.</li>
</ol>
<p>I&#8217;m uncertain of the outcome of either result. Honestly, neither sound all that appealing&#8230; Only serious devs mean we have a stifled app store, not enough creativity and variety of useful apps. And too few devs.. well.. same thing really.<br />
Think about it &#8211; if you sell an app for $0.99, and you only make 70% of that means you have to sell 142 &#8230; hell, what do we call them? Licenses? Sure, let&#8217;s go with that. Now, that may not be far fetched for a free version, but for an app people are uncertain about, that might be a little difficult. Oh, and I don&#8217;t believe that AppWorld has a way to refund apps quite yet, but I might be wrong &#8211; I&#8217;ve only released FREE apps so far.</p>
<h2>The Dev Process</h2>
<h3>Becoming a Vendor</h3>
<p>This really didn&#8217;t bother me, but it DID seem to bother everyone else &#8211; so I&#8217;ll inform you of the history surrounding it.</p>
<p>At first, RIM required a form to be filled and notarized, then faxed or scanned/emailed into them. Then you wait ~72 hours to be told yay or nay. I had a few notaries in the office at work, so it was easy peasy for me. Some complained it cost them money to go and find someone to stamp a paper, and time, blah blah blah&#8230; Sorry, I guess that kinda sucks.</p>
<p>The over all complaint was that no other market required that. Everyone else just freely took your money, and let you distribute applications.<br />
Currently they only require a scan/copy of your legal ID (driver&#8217;s license, passport, etc). The point of all this is to prove &#8220;you are who you say you are.&#8221;</p>
<p>The other complaint (while not so important at the time) was the cost: Apple &#8211; $99, Android &#8211; $25, RIM &#8211; $200! Good thing it was waived for us early adopters!</p>
<h3>Signing</h3>
<p>Not fun&#8230; at all. When I first started, I set out for the goal of being platform agnostic, and wanted to rely only on the AIR SDK. I was, after all, pretty darn familiar with it being a Flex/AS3 dev for the last 2.5 years, and love the idea of the cross-platformability of it. Yeah I made up that word, get over it.<br />
Except, I found out that it wasn&#8217;t all that feasible.</p>
<p>First, there&#8217;s an ordering of the authoritative registration files. This required you to submit your personal information ALL over again, and this time supply a credit card to validate against. Those without credit cards (there were interestingly quite a few &lt;18 yr olds applying as vendors as I found on the forum, and others from foreign countries without credit) were screwed, and still are for that matter. Once you applied, it took up to 72 hours (and in many cases more than that) for the &#8220;automated system&#8221; to respond back with your files to register with.</p>
<p>Next it turns out that:</p>
<ul>
<li>you can only register those files once with a computer &#8211; moving computers or reinstalling your OS meant you had to re-request the registration files, and wait another 72 hours.</li>
<li>you can only register ONE set of files per user. This makes doing client work a huge pain. There are ways around this, but not as convenient as they could be. Essentially you have to create a user on the OS for every person that is to sign. On Linux/Mac, it&#8217;s not all that difficult to do. On Windows, it isn&#8217;t hard either, but switching users just to sign is a PITA.</li>
</ul>
<p>Then of course, there was an issue with signing &#8211; the absolute lack of specifications on the certificate you use to sign just irritated the living bejesus out of me. I was trying to use the same certificate I used for signing AIR, Native AIR (exe, app, dmg), AIR for Android (apk) and eventually iOS (app again?). This certificate was also equivalent to the specs that you would see in a backed certificate from an authority such as Thawte. Oh, and not to mention ADT was explicit in the requirements needed to sign any of these formats, even specifically indicating the version of PKCS12 certification (x.509 v3 for those that care) criteria needed to accomplish said signing. But no, not RIM&#8230; they only gave information on how to create a self-signed cert, and how to sign with it. For <em>MOST</em>, this is ok. For <em>MOST</em>, this is tolerable. For a stickler for cross-platform, re-usability, and requirements &#8211; this was absurd and ludicrous. It literally took me TELLING RIM what their self-generated cert output was for them to come back and say &#8220;So our certs are &lt;x, y, z&gt;. Enjoy.&#8221; No shit, Sherlock &#8211; I told <em>you</em> that, now tell me <strong>WHY</strong>!</p>
<p>Early on, the errors from the signing tools were vague, and really ambiguous. After about 4 iterations of the SDK, the documentation became a tad bit more informative as to possible problems, and possible solutions. This didn&#8217;t seem to solve everyone&#8217;s issues, but did help out after time.</p>
<p>What probably annoyed me the most was when re-signing the app I <em>had</em> to increment the version number, or it would fail when authenticating with the server. PITA I tell ya!</p>
<p>Against my desires, I gave up the fight and moved on.</p>
<h3>The Tools</h3>
<p>Then came the IDE. First, let me say, I know &#8211; this was all pre-release, and in beta. I get that, really I do. What I don&#8217;t get is how you expect everyone to be able to utilize it in a work flow and produce something that is accepted.<br />
It also didn&#8217;t help that Flex Hero / Flex 4.5 was also beta, and in pre-release. Again &#8211; I get this. But really, if this is all the case then the key to success is communication. I&#8217;ll get to that in a bit.. First let me bitch a bit about the tools.</p>
<p>So right out of the gates, I had issues with the IDE not even functioning. This forced me to learn ANT, and write a bunch of tasks to compile everything manually. I actually really enjoyed that, and it allowed me to build a formal build process instead of working strictly like a garage-developer and relying on the IDE to do every last thing for me. Maybe if I get serious enough, I could automate builds and do some CI&#8230; Hah, riiiiight.<br />
But boy did I see so many issues on the forums, Twitter, etc. It seemed like a nightmare. People declared it not worth their time, and it&#8217;d be cheaper to buy the device outright upon launch. I&#8217;m too frugal to do that, so I went with learning a build tool I&#8217;ve been meaning to for years. In the end, this was a good thing. I now know everything there is to know (ok, maybe not <em>EVERYTHING</em>) about ADT, and compiling/signing for AIR.<br />
But think of all those garage-developers eating dirt and feeling lost. Certainly not a way to pick up momentum, especially if they re-instate the $200 dev fees!<br />
I&#8217;m sure in time it will get better, but RIM is seemingly banking on the idea that a certain thousand number of apps will be available at launch. I&#8217;ll get to this in a bit as well.</p>
<p>Even after launch, I have issues with the SDK integration in FlashBuilder, and still have to rely on my ANT scripts to get anything done. Not to mention they now require debug tokens to develop locally if you don&#8217;t want to sign your app.</p>
<p>Another issue I ran into was that the blackberry-packager tool didn&#8217;t seem to fully conform to the AIR manifest. There was an explicit blackberry-tablet.xml manifest file to describe the application. What&#8217;s worse, is that somehow information in your AIR manifest was still used! For example, your version of app came from the AIR manifest &#8211; but the packager name came from the BB manifest. Permissions for Android are in the AIR manifest, QNX permissions were later added to the BB manifest.<br />
The differences and oddities can go on, but the biggest complaint I have are the icons. The AIR manifest has a section for icons, ranging from sizes of 16&#215;16 to 128&#215;128. Blackberry required an interesting icon size of 86&#215;86. What made it painful was two-fold. Firstly, you couldn&#8217;t define an 86&#215;86 icon in the AIR manifest file. ADT would fail on parsing it saying it was an unexpected node &#8211; makes sense really. The second pain-point was the fact that if you supplied ANYTHING in the AIR manifest, the first node in that section would be used, and the icon definition in the BB manifest was <em>COMPLETELY IGNORED</em>! So to avoid getting a 16&#215;16 icon showing in the simulator, I put the 128&#215;128 node up top. Worked great in the simulator &#8211; but I found out just before launch it didn&#8217;t work so swell on the hardware itself and was rejected as a product.<br />
The solution? Don&#8217;t supply anything in the AIR manifest. &#8220;Not a big deal,&#8221; you say? I&#8217;d agree if I was only developing for Playbook, but the reality was I wanted to stay platform agnostic. This meant that in order to get an icon for Desktop, Android, and iOS I&#8217;d have to have either some hackery to remove it specifically for the Playbook packaging, or have a separate process altogether. Either way was a piss in my Cheerios.</p>
<p>The other big kick in the nuts was the simulator itself. Can you say &#8220;BUUUUUUUUGGY?&#8221; Oh  man, I had never seen such a failure of an emulated run-time environment since&#8230;. well.. pretty much never. The install process was finicky, sometimes not working at all for some, while working perfectly for others. PC/Linux users were capable of using VMWare Player, a freeware application to set up a basic VM. MAC users were required to use VMWare Fusion &#8211; a <em>NON</em>-freeware, with 30 day trial; and boy did I hear some complaints around that! But what made it the absolute worst was the fact that it would freeze if you blinked at it wrong &#8211; or apps would randomly close. Every new release of the simulator and SDK fixed a plethora of bugs &#8211; but it also introduced new ones. The latest 1.0.1 release was a day and night change &#8211; it&#8217;s much more stable, but also didn&#8217;t quite reflect the previous versions we became used to. There wasn&#8217;t <em>that</em> much of a change, but it was enough that you had to actually stop and consult the documentation to get into it. They wised up and included the pre-setup VM with the SDK so as to avoid others incorrectly creating it.</p>
<h2>Post-Launch</h2>
<p>Here we are, now 8 days after the launch, and people have gone out to stores and bought the devices. Reports are out there that first day sales have well exceeded expectations, and even outsold the Xoom and Galaxy Tab. Somewhere around 50k units sold on the first day. I&#8217;m too lazy to find actual reports and numbers, so either take my word for it, or go Google the hell out of it.<br />
Either way you look at it, it did impressive sales that not really many expected. Afterall, a 10&#8243; Android tablet had come out, there was already a 7&#8243; Android tablet out, and of course the iPhad.. err iPad had been released a little over 5 weeks before.</p>
<h3>My Thoughts</h3>
<p>That&#8217;s why you&#8217;re here, right? To hear my thoughts? If not, GTFO! HAH!<br />
But really, I do have  opinions on it. As everyone expected/feared, it wasn&#8217;t ready &#8211; and the more I use it I find more ways it&#8217;s &#8220;not ready.&#8221;</p>
<h4>AppWorld &#8211; the Marketplace</h4>
<p>Right off the bat, I can tell you the free Playbook offer didn&#8217;t do crap for app availability. I know first hand that not all apps that were even approved are available. Hell, none of my apps are in approved state, and we&#8217;re over a week into the launch. I can only imagine how many thousands are still in a pending review state, or were completely given up on because of the frustration or the fact they were informed of their rewarded Playbook. Either way, having spent hours in the AppWorld market, I can say the selection is lackluster, and I&#8217;ve only managed to install about 5 apps &#8211; 4 of them are really just junky toys to show off to others that &#8220;hey it works and it can do multitasking.&#8221; I&#8217;ll probably delete them in a few days once I&#8217;m done showing it off.<br />
Honestly, I expected this, and it doesn&#8217;t exactly bother me. It <em>does</em>, but it doesn&#8217;t. I does because I really would have liked to see more people (read: ACTUAL DEVELOPERS) spend time making quality apps that would make the platform appear to be the &#8220;business-grade&#8221; as advertised. I lied when I said it doesn&#8217;t. It actually bothers me on all levels&#8230; Again, <a href="/2011/02/26/a-plea-to-developers-and-markets/" target="_blank">read my rant</a>.</p>
<p>A big, big, BIG miss is the lack of the following:</p>
<ul>
<li>Native email client (granted there is one if you bridge with a Blackberry phone, but that&#8217;s not useful to us non-bb users)</li>
<li>Instant messenger client &#8211; there&#8217;s a BBM client coming, but I want a gtalk, AIM, YIM, and MSN all-in-one client.</li>
<li>Social networking &#8211; out of the box there&#8217;s a bookmark shortcut icon to Facebook and Twitter &#8211; but let&#8217;s face it, the web interfaces of those just don&#8217;t cut it. I really just want Tweetdeck <img src='http://s2.wp.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </li>
</ul>
<p>I am disappointed these aren&#8217;t available on the market if not installed out of the box, but they&#8217;re getting the device out &#8211; I&#8217;m 100% certain that will change over time.</p>
<h4>Hardware Interfacing</h4>
<p>First, the bad. The power button is incredibly small, and flush with the body making it difficult to find without looking, and equally as difficult to push.</p>
<p>The volume buttons don&#8217;t have a &#8220;click&#8221; to them when you push them, or at least not as much as I&#8217;d like. You know like on a stereo in your car, you push a button, and feel a bit of a click to let you know &#8220;ok, you pushed me, now let off&#8221;&#8230; Yeah, that doesn&#8217;t happen on this thing. Took a bit of getting used to. The other thing is, an undocumented feature (at least I couldn&#8217;t find it documented, and rather found it in a youtube demo) is if you hold one of the volume buttons down it will skip to the next song or video. Problem is, it functions like this even when audio/video is not currently playing. What I mean by this is that if you expect to quickly turn volume up or down by holding the button down &#8211; think again.<br />
What&#8217;s strange is that the play/pause button DOES have the click tactile feature I wish the volume buttons had. Also interesting is holding it down un/mutes volume. A nice feature, but nothing to write home about or accept as revolutionary.</p>
<p>Now the bezel &#8211; what really makes the Playbook, the Playbook (in my opinion). It&#8217;s gesture capable and how you navigate the operating system. It took a little bit to get used to, coming from Android devices with dedicated buttons, and early on I found myself fumbling and quickly swiping from all over not thinking about what I was really doing. It wasn&#8217;t frustrating, just &#8211; different.<br />
Now that I&#8217;m used to it, I <em><strong>LOVE</strong></em> this feature. Dare I call it innovative and revolutionary.<br />
I used to badmouth Apple&#8217;s 1-button approach, saying that only one button limits your input &#8211; but RIM went with (virtually, ignore the volume buttons) NO buttons! But you totally have great UX with this. On Apple, pressing the one button always takes you home&#8230; Sure it&#8217;s consistent, but not very friendly if you ask me (which you didn&#8217;t, but who cares).<br />
On Android, we have a menu button, home button, back button, and a search button. I almost never use the search button, use the menu and back buttons on the regular (saving real estate for useful info on screen instead of silly perma-menus/buttons), and home button is great for more than just going home (holding it down shows recent apps).<br />
You still get the maneuverability of android, but no precision required on exactly where the buttons are (this is more important as more and more manufacturers are using <em>capacitance</em> buttons instead of physical buttons anymore).</p>
<p>I was impressed to find that there are stereo microphones on it as well &#8211; while not all that important it does seem to be impressive to most I showcase it to.<br />
The speakers are so-so, not bad in a pinch. They&#8217;re stereo as well, and front-facing which is nice. But nothing will beat headphones on devices like these.</p>
<h4>Hardware Functionality</h4>
<p>Another thing that bothers me is 2 things I really wanted this device for: <a href="http://en.wikipedia.org/wiki/Bluetooth_profile#Advanced_Audio_Distribution_Profile_.28A2DP.29" target="_blank">A2DP</a>, and <a href="http://en.wikipedia.org/wiki/Wireless_ad_hoc_network" target="_blank">Ad-Hoc networking</a>.</p>
<p>A2DP, in layman&#8217;s terms, is stereo bluetooth. I have a (ironically) Blackberry Stereo Audio Gateway hooked up to my surround sound receiver, which allows me to send audio directly into it and listen to it in awesome stereo quality. I do this from my phone currently utilizing GrooveShark or WinAmp on Android. And really it works great. But it&#8217;d be nice to have a larger interface to navigate with. Unfortunately, the current OS release does not support ANY bluetooth features except tethering, and ONLY with BlackBerry devices (keep in mind, we&#8217;re talking bluetooth&#8230; but see my next point for more info on tethering). You can&#8217;t share files over bluetooth either except with the included Blackberry Device Manager, and I&#8217;m not even sure that works as I&#8217;ve not messed with it. Essentially, no bluetooth services work properly per specs.</p>
<p>The ad-hoc networking is one that&#8217;s probably not utilized by many, but is very useful for us advanced Android root users. You see, with the help of an <a href="http://code.google.com/p/android-wifi-tether/" target="_blank">Android WiFi Tether</a> app, we can create a simple ad-hoc network to connect to and utilize as our gateway to the internet. Again, in layman&#8217;s terms, this just means we can tether and access the internet through our phone. This currently isn&#8217;t possible on the Playbook, and requires me to fake out the cell network into utilizing Android&#8217;s built-in (yet carrier favored) tethering functionality. I mentioned carrier favored, because it requires the user to authenticate with the cell network, effectively allowing the carrier to charge for tethering access. A gyp if you ask me, but alas, there *is* a way around it for the time being. I&#8217;m sure, however, it&#8217;s only a matter of time before my carrier catches on and fixes it.</p>
<h2>Expectations</h2>
<p>Hopefully at this point it&#8217;s obvious&#8230; I have a love/hate relationship with the Playbook right now. As a developer, I&#8217;m irritated&#8230; As a user&#8230; I&#8217;m irritated &#8211; but optimistic.</p>
<p>Honestly, and being humble, I couldn&#8217;t even begin to guess where this device is going. One thing I do like with the launch is they&#8217;ve released a WiFi version first. Most other devices have required a data package up-front, which can be hectic and stressful. A Sprint version will come out shortly, which will satisfy (hopefully) those that want data only on their tablet device.</p>
<p>As I&#8217;ve stated, more is to come from RIM directly. My hope is that more carefully thought software is brought out for it. I know in my personal development endeavors, I plan on making a few more tablet form-factor applications, and the Playbook is one of my desired platforms. But given the issues I&#8217;ve had, it&#8217;ll certainly take a back seat to other platforms (but not quite as far back as iOS <img src='http://s2.wp.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ).</p>
<p>I&#8217;d really like to see a <em>nice</em> RDP client, and some kind of keyboard/mouse replacement app for it like we see on Android and iOS (RemoteDroid, and Mobile Mouse respectively). But that just goes to speak as to how at the current time the Playbook is a toy for me&#8230; I don&#8217;t find much in the way of productivity, or really that much entertainment. But again, that&#8217;s me. I&#8217;m a power user &#8211; I have a PC in every room of the house, and 4 just in the office. Most are at least dual core, and the desktops are quad cores&#8230; I don&#8217;t NEED an internet browser at my fingertips in most cases because I&#8217;m in front of a computer ~85% of my waking life. Geez&#8230;. I need to get off the computer more often. How about I start &#8212;- NOW!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/killerspaz.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/killerspaz.wordpress.com/292/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/killerspaz.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/killerspaz.wordpress.com/292/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/killerspaz.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/killerspaz.wordpress.com/292/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/killerspaz.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/killerspaz.wordpress.com/292/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/killerspaz.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/killerspaz.wordpress.com/292/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/killerspaz.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/killerspaz.wordpress.com/292/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/killerspaz.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/killerspaz.wordpress.com/292/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=killerspaz.wordpress.com&amp;blog=16977534&amp;post=292&amp;subd=killerspaz&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://killerspaz.wordpress.com/2011/04/27/the-playbook-by-rim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2be5ab58c033a7f5489a6b8034ae55d7?s=96&#38;d=identicon&#38;r=X" medium="image">
			<media:title type="html">killerspaz</media:title>
		</media:content>
	</item>
		<item>
		<title>Mixing Flash and Flex</title>
		<link>http://killerspaz.wordpress.com/2011/04/22/mixing-flash-and-flex/</link>
		<comments>http://killerspaz.wordpress.com/2011/04/22/mixing-flash-and-flex/#comments</comments>
		<pubDate>Fri, 22 Apr 2011 18:16:08 +0000</pubDate>
		<dc:creator>killerspaz</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://killerspaz.wordpress.com/?p=286</guid>
		<description><![CDATA[I was recently asked to give a presentation at our local Flash user group, Flash Dallas. I didn&#8217;t have as much time as I would have liked to prepare, but I felt it came out pretty decent. This is a quick post to throw up the slides, and a link to the presentation. Instructional Here&#8217;s [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=killerspaz.wordpress.com&amp;blog=16977534&amp;post=286&amp;subd=killerspaz&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I was recently asked to give a presentation at our local Flash user group, <a href="http://www.flashdallas.org" target="_blank">Flash Dallas</a>.<br />
I didn&#8217;t have as much time as I would have liked to prepare, but I felt it came out pretty decent.</p>
<p>This is a quick post to throw up the slides, and a link to the presentation.<br />
<span id="more-286"></span></p>
<h2>Instructional</h2>
<p><a href="http://experts.adobeconnect.com/p5y4vj0cdce/" target="_blank">Here&#8217;s the recording</a> from the user group (laugh if you want <img src='http://s2.wp.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ) and <a href="http://app.sliderocket.com:80/app/fullplayer.aspx?id=7C92BC6A-F461-8E15-B378-265A48B471B9" target="_blank">here are the slides</a>.<br />
I&#8217;ll have the links in the slides updated at a later point in time.</p>
<h2>The Goods</h2>
<ul>
<li><a href="http://dl.dropbox.com/u/1143608/flex%20examples/blog/FlashAndFlex/demo/example1.swf" target="_blank">Example 1</a></li>
<li><a href="http://dl.dropbox.com/u/1143608/flex%20examples/blog/FlashAndFlex/demo/example2.swf" target="_blank">Example 2</a></li>
<li><a href="http://dl.dropbox.com/u/1143608/flex%20examples/blog/FlashAndFlex/demo/example3.swf" target="_blank">Example 3</a></li>
<li><a href="http://dl.dropbox.com/u/1143608/flex%20examples/blog/FlashAndFlex/demo/example4.swf" target="_blank">Example 4</a></li>
<li><a href="http://dl.dropbox.com/u/1143608/flex%20examples/blog/FlashAndFlex/FlashAndFlex.zip" target="_blank">Source</a></li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/killerspaz.wordpress.com/286/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/killerspaz.wordpress.com/286/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/killerspaz.wordpress.com/286/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/killerspaz.wordpress.com/286/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/killerspaz.wordpress.com/286/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/killerspaz.wordpress.com/286/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/killerspaz.wordpress.com/286/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/killerspaz.wordpress.com/286/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/killerspaz.wordpress.com/286/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/killerspaz.wordpress.com/286/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/killerspaz.wordpress.com/286/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/killerspaz.wordpress.com/286/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/killerspaz.wordpress.com/286/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/killerspaz.wordpress.com/286/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=killerspaz.wordpress.com&amp;blog=16977534&amp;post=286&amp;subd=killerspaz&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://killerspaz.wordpress.com/2011/04/22/mixing-flash-and-flex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2be5ab58c033a7f5489a6b8034ae55d7?s=96&#38;d=identicon&#38;r=X" medium="image">
			<media:title type="html">killerspaz</media:title>
		</media:content>
	</item>
		<item>
		<title>A Plea to Developers and Markets</title>
		<link>http://killerspaz.wordpress.com/2011/02/26/a-plea-to-developers-and-markets/</link>
		<comments>http://killerspaz.wordpress.com/2011/02/26/a-plea-to-developers-and-markets/#comments</comments>
		<pubDate>Sat, 26 Feb 2011 21:09:52 +0000</pubDate>
		<dc:creator>killerspaz</dc:creator>
				<category><![CDATA[Rants]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[BlackBerry Playbook]]></category>
		<category><![CDATA[developers]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[IOS (Apple)]]></category>
		<category><![CDATA[markets]]></category>
		<category><![CDATA[Research In Motion]]></category>

		<guid isPermaLink="false">http://killerspaz.wordpress.com/?p=233</guid>
		<description><![CDATA[-or- How not to cruddy up our Markets&#8230; Yeah&#8230; This is a rant guys&#8230; If you don&#8217;t agree, tell me &#8211; but take rude comments elsewhere. Comments will be open for as long as I can tolerate it (assuming anyone comments at all). Get ready for a long read &#8211; and a lot of personal [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=killerspaz.wordpress.com&amp;blog=16977534&amp;post=233&amp;subd=killerspaz&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>-or- How not to cruddy up our Markets&#8230;</p>
<p>Yeah&#8230; This is a rant guys&#8230; If you don&#8217;t agree, tell me &#8211; but take rude comments elsewhere. Comments will be open for as long as I can tolerate it (assuming anyone comments at all).</p>
<p>Get ready for a long read &#8211; and a lot of personal frustration; this won&#8217;t be pretty&#8230; <br />
<span id="more-233"></span></p>
<h2>Who are you?</h2>
<p>Honestly&#8230; I&#8217;m just a guy. I&#8217;m a guy that happens to be a USER and a DEVELOPER. That&#8217;s right, I play on both teams.<br />
I&#8217;m anti-Apple, pro-Android, and heavily interested in the mobile platforms, both current and upcoming. Even with my angst against Apple, it&#8217;s important for me as a developer to understand it, and cope with it.</p>
<p>What&#8217;s <em>MORE </em>important is that I try to make products that are intuitive, clean in appearance, and generally enhance someone&#8217;s life. Having said that, there is a place for the &#8220;fart&#8221; apps and the sound boards. In a particular way, they enhance lives just as much as an advanced Augmented Reality camera app that will find the closest pub to get smashed at. As silly as it seems, stress relief is a very important factor to our markets.</p>
<h2>Come at me, bro!</h2>
<p>Ok, I&#8217;m just going to get right to it&#8230;</p>
<p>If you make any of the following arguments, you&#8217;re trash in my book:</p>
<ul>
<li>&#8220;I&#8217;m just a developer, I don&#8217;t make things pretty&#8221;</li>
<li>&#8220;&#8230; I know more than my users do&#8221;</li>
<li>&#8220;&#8230; I don&#8217;t need to change that, my users will have to get used to it&#8221;</li>
</ul>
<p>Yeah &#8211; I said it! You&#8217;re TRASH! You don&#8217;t deserve to even sit behind a keyboard. You&#8217;re a crappy user, and a crappier developer for saying these things! C&#8217;mon! Why would you want to spend time building something to turn around and frustrate your users?! It wastes everyone&#8217;s time.</p>
<p>If you&#8217;re coming to a platform, and &#8220;trying to learn to develop&#8221; then allow me to suggest to not even think about publishing your first, second, or even third attempt at an application.<br />
There&#8217;s a 90% chance it sucks. Ah screw it, let&#8217;s just say 100%; I know for a fact it will suck. How do I know? I&#8217;ve been doing this a while; and there&#8217;s not only a pragmatic, arguably an algorithmic approach to development &#8211; but presenting your application interface to a user has some psychological aspects to it as well that you&#8217;re just not keen or privy to yet. It&#8217;s ok, you&#8217;re green&#8230; It&#8217;s actually <em>NOT </em>your fault. But it is important you recognize your naivety regarding these topics, and educate yourselves about these things. Worst case, you find out how to build better apps, and sell them better (or rather they sell themselves).</p>
<p>What <em>IS </em>your fault is cruddying up our markets with this garbage. It&#8217;s equivalent to just throwing trash out the window &#8211; it&#8217;s unhealthy to an ecosystem, and ultimately causes other people more work.</p>
<h2>My current take on markets</h2>
<p>There&#8217;s too much crap. WAAAYYYY too much.<br />
One thing that&#8217;s irritated me the most about the Apple store is the boasting of the number of apps&#8230; To me it&#8217;s not about quantity, it&#8217;s about quality. And honestly, given Apple&#8217;s (*cough* Jobs&#8217; *cough*) superior attitude, I&#8217;d expect them to be more strict on the &#8220;single function&#8221; and redundant apps. But again, the marketing is centered around the shear quantity of apps. As a user, I don&#8217;t care for 20,000 flashlight apps and 14,000 fart apps (numbers pulled right out of my ass, btw). that&#8217;s 34,000 apps I just don&#8217;t care about.. and really, if i wanted either of those apps, I shouldn&#8217;t need to browse through that many, as I&#8217;m most likely going to pick ONE to THREE of the top few and move on.</p>
<p>Now before I go any further, let me explain why I think there&#8217;s more than one of any type of app.</p>
<ul>
<li>Some if not at least 50% of it can be attributed to &#8220;noobs&#8221; coming to our markets, and trying to get used to the whole process. It&#8217;s super-hard to bash on them, because honestly their excitement and thirst for knowledge is rather inspirational &#8211; to a point.</li>
<li>I would be willing to attribute another 48% to competition. That is, &#8220;my app is better than yours.&#8221; Hell yeah! You mean I can <em>COMPETE </em>with another app? YES! Well, except the reality of the situation your app is NO different than the other guys. How many ways can you make a flashlight? One? Two? 14, 173? (the answer is no)</li>
<li>And lastly I&#8217;d chalk up the last 2% to ignorance and laziness. As a developer, I just didn&#8217;t check the market thoroughly enough to see if my idea has been done a couple hundred times already. To be fair (and I&#8217;ll get into this more a little later), it may have been difficult to figure out the right search term to pull up an app that satisfies their needs. Whether it&#8217;s a funky name of an app (&#8220;LightHouse&#8221; doesn&#8217;t exactly indicate it&#8217;s a flashlight), or it&#8217;s such an obscure/ambiguous idea that identifying a term is difficult (&#8220;message board&#8221; has so many meanings to me personally).</li>
</ul>
<p>Now, having said that &#8211; I totally believe that competition is a must. After all, I&#8217;m an American (don&#8217;t hate me) and I believe in capitalism. A core fundamental part of that is competition.<br />
However, <a title="Competition, as defined by Wikipedia" href="http://en.wikipedia.org/wiki/Competition" target="_blank">competition</a> is defined as the following:</p>
<blockquote><p>Competition is a contest between individuals, groups, nations, animals, etc. for territory, a niche, or a location of resources. It arises whenever two or more parties strive for a goal which cannot be shared.</p></blockquote>
<p>Wait&#8230; Look at that last part&#8230; &#8220;which cannot be shared.&#8221; Yes folks, that means your competition is trying to <em><strong>out-do</strong></em> the other guy in a way that knocks him off his totem pole. You&#8217;re trying to be the winner here, not comfortably co-exist.</p>
<p>Do you think Apple and Google are content with providing the same features? Hell no! And if you&#8217;re a part of either camp, you know it&#8217;s black and white. It&#8217;s a rare thing to enjoy both platforms, because we as users definitely see, feel, hear, and interact with the competition directly. We vote with our feet and dollars, and we vocalize ourselves (I know I do <img src='http://s2.wp.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ) to state which territory we defend. Dag-nabbit!</p>
<p>So the only way competition can work in a true market is to actually be distinctly different than the next guy (or gal, sorry ladies, no disrespect). <em><strong>SO FREAKIN&#8217; DO IT!<br />
</strong></em>If everyone made Ferrari-like cars, no one would care about Ferrari&#8217;s, and that&#8217;s how I feel about a lot of different apps. If there&#8217;s a discernible difference between them, then by all means, submit your app! Let me have choices!</p>
<p>But with choice, comes great responsibility as a user. I <em>must </em>be willing to help establish a viable ecosystem, and be able to assist in seeding the lifespan of a particular application just as much as the developer himself.<br />
&#8220;How,&#8221; you ask? Simple. VOTE: Mark that bad boy 5 stars, comment on what you like or don&#8217;t like, give feedback DIRECTLY to the developer. This is a two way street folks!<br />
As a quick ancillary point, I really hate seeing comments like: &#8220;Great! 5 Stars&#8221;. You&#8217;re not contributing with that comment. By all means, mark it 5-stars! But if you have no critical feedback, keep it to yourself!</p>
<p>I&#8217;ve been mocked a few times, particularly on some forums about this whole idea of &#8220;there&#8217;s just too much crap in our markets,&#8221; and am often asked &#8220;So you think 150 apps is better than 5000 apps!?&#8221;<br />
Well, to answer that truthfully we have to consider the then and now of things.</p>
<p>As a quick note, I am almost completely oblivious to the Microsoft channel as both a dev and a user. Sorry, but I can&#8217;t speak to this at all. I took one look at their design-language, and decided I wanted to have nothing to do with it.</p>
<p><strong>Then:</strong><br />
Sure, the idea of markets was new. We wanted to explore the entire realm and possibility of what developers could come up with &#8211; without stifling creativity. Granted, developers aren&#8217;t known for their creative, intuitive, or expressive applications; but some of the most successful applications have come from being (without getting into too much detail) &#8220;open&#8221; to types of applications that are allowed to be submitted. We had no clue to what a successful application would be, and what wouldn&#8217;t. We would continually be surprised to hear, as both users and developers that someone was making money off something so simple as a fart application, with equal if not more success as a dedicated team to develop some application such as ShopSavvy or Shazaam.</p>
<p><strong>Now:</strong><br />
We&#8217;ve seen the success stories about a simple tele-banker creating a Bejeweled-type game and get rich over night. Same can be said with a fart app, and something as well executed as Angry Birds. But we&#8217;ve also seen a plethora of applications that have 0-1 star ratings, no comments, and less than 100 downloads (particularly on the Android Market).<br />
The illustrious fart and flashlight applications <em>ARE </em>proof that  simple-function applications have a place in the market &#8211; there&#8217;s no  question there. But do we need tens of thousands of them?<br />
What about simple converters that merely convert Celsius to Fahrenheit?  Shouldn&#8217;t it do more? Give me more conversions, give me more options. I  want to convert all types of units of measurement, not just one. And  I think more importantly, I don&#8217;t want to download 20 different apps to convert  different things. Maybe you&#8217;re not smart enough to develop this type of  application, and that&#8217;s OK. But maybe you shouldn&#8217;t be developing at  all.<br />
So at this point we have the TWO largest markets, Apple and Google, making claims to the number of applications they have as if it warrants them some kind of merit badge. Maybe it should?<br />
After all, it is rather impressive to hear that there&#8217;s a HUGE number of apps &#8211; until you actually see them all. It becomes cumbersome, and often a chore to find something that&#8217;s actually useful. I challenge you to count the number of apps you use in a day, versus a week, versus a month. Not all apps are created equal, and thus aren&#8217;t USED as equally. Granted, if you were to take inventory, you&#8217;d probably find over 60% of your installed apps are useless and just taking up space. Again, I&#8217;m pulling this out of my ass, but quick Google searches prove that people don&#8217;t use apps as much as they think they do. Games being the ultimate exception. Everyone plays Angry Birds while dropping a deuce &#8211; everyone.</p>
<p>So yes, I DO feel that 150 apps is better than 5000 apps&#8230; At least I know those 150 apps are most likely going to actually improve my productivity, utility, and entertainment.</p>
<h2>Upcoming Market(s)</h2>
<h3>RIM/Blackberry PlayBook</h3>
<p>This rant came about from my interaction with a new community and platform for the upcoming BlackBerry Playbook. Honestly, even with my issues with the whole ordeal (which if you keep reading, you&#8217;ll hear plenty about) I still feel like it&#8217;s a strong competitor with the current platforms.</p>
<p>If you&#8217;re a new product line, I think it&#8217;s more important than ever to learn from other products&#8217; mistakes. Just as important, learn from their successes.</p>
<p>Jumping back to the Playbook, we see immediately (especially as Flash/Flex developers) how open RIM is about the Adobe AIR platform, and how they&#8217;re heavily supporting it. This excites me, and is an indirect jab at the big fruity Apple, which I&#8217;m always a proponent of. Except&#8230; Your workflow STINKS. It reeks of inexperience, unprovoked thought processes, and some of the most unintuitive interaction I&#8217;ve seen in a LOOOONG time!<br />
As I said above, I&#8217;m still optimistic about this platform, but they seriously need to work out a LOT of kinks, and arguably start over.<br />
Some developers have completely <a title="Spot on, and a good read!" href="http://blog.jamiemurai.com/2011/02/you-win-rim/" target="_blank">left the market</a> as a choice of publishing their apps because of the high level of frustration. We even have <a title="Joseph Labrecque shows us how to sign our apps" href="http://inflagrantedelicto.memoryspiral.com/2011/02/blackberry-playbook-code-signing-process/" target="_blank">posts <em>disguised </em>as a tutorial</a> (as Joseph puts it) to prove the non-existant intuitiveness of the signing process, which has caused some of us (me included) an insane headache (which still hasn&#8217;t been alleviated). That could be it&#8217;s own entire rant, but I&#8217;ll save you the earache (you&#8217;re welcome!).</p>
<p>Is this ok? Hell no! And I&#8217;d have nothing short of high expectations for RIM to come back to us developers with not only a better process, but an APOLOGY. It doesn&#8217;t have to be a super long and deep felt apology where someone says &#8220;I&#8217;m sorry,&#8221; but at least acknowledge our frustrations and throw us a bone. After all, you too are developers and hardware manufacturers. Let us know you are human, make mistakes, but can also learn from them. Drone or gestapo companies don&#8217;t bode well in my book.</p>
<p>What&#8217;s more is that it doesn&#8217;t seem they&#8217;ve rejected a single app, and instead have actually opened up communication channels with developers to assist them in fixing bugs in their application. This certainly requires time, and time is money. It&#8217;s not just $200-500 per device as some were estimating in the forums; and it&#8217;s most definitely not &#8220;just half a million dollars.&#8221; I would venture to guess it&#8217;s a ton more than that. Lets see you go and try to tell your board members and stock holders you&#8217;re going to give away a potential of a couple million of dollars away on a gamble. It certainly wouldn&#8217;t be easy!</p>
<p>But the notion that cost is limited to ONLY the cost of hardware is not very practical! From a business perspective, they&#8217;ve had to hire WAY more QA/systems engineers/probably managers/etc, possibly purchase more servers to support the submission system, as well as AppWorld. The offer started Dec 7, and will end March 15th.. That&#8217;s just a week over 3 solid months of approvals, and if we&#8217;re looking at a minimum of 4000 apps, that&#8217;s 44 apps per DAY (INCLUDING WEEKENDS) that are to be approved and rejected. If we go above the 4000 mark (which I seem to recall they said we well exceeded that earlier this month) then that speculated number just goes up and up and up. Sure if you only consider the hardware it might be $200-500 out of pocket, but the company as a whole is probably seeing more like $1000-1500 per device. Once more, these are numbers that I&#8217;m making up, and have no evidence to back it up. But common sense tells us we shouldn&#8217;t limit this idea to just the hardware as anyone in business can tell you there&#8217;s overhead costs in EVERYTHING.</p>
<p>An interesting thing we&#8217;ve seen happen a few times over, particularly with gaming consoles, is that the manufacturers will often sell the hardware at a loss. I believe the numbers range from $50-200 loss per unit sold. This is done with the expectation that they will sell more, and make up the costs with royalties, licensing fees to developers/distributors/publishers, and advertising channels. Sometimes it works out&#8230; sometimes it doesn&#8217;t.</p>
<h3>Amazon Marketplace</h3>
<p>This one is SUPER strange to me. It&#8217;s by far the most interesting setup, for a multitude of reasons.</p>
<p>Right off the bat, <a title="Amazon Android App store blog" href="http://www.amazonappstoredev.com/" target="_blank">on their blog</a>, they&#8217;re open about sharing apps between Android and iOS. Even though it&#8217;s an Android store, they&#8217;re <em>informing </em>the developers about considerations for other markets, and potential bumps in the road. They&#8217;re not giving away secret info or anything, but the idea of looking out for the developer is <em>awesome</em>.</p>
<p>What&#8217;s strange though is their pricing schema. Basically- there is none&#8230; Or rather, they choose it for you! Basically the set a price point, and sometimes even promote it by putting it on sale. For some this is irritating, there&#8217;s no guarantee for you to make the income you expect from other markets.</p>
<p>Another point of contention is that this officially fractures the market. Android has had other smaller markets (e.g., AndroidTapp, Slideme, MiKandi, etc) that had wildly varying success &#8211; but none have the infrastructure of Amazon. I&#8217;m not normally one to concern myself with fragmentation and fracturing, but I feel the limitations of setting price-points causes some warrant for a double-take.</p>
<p>But then again, this is Amazon. They&#8217;re no dummies, they&#8217;ve thrived off the e-retail markets venturing from everything from groceries to sex toys, car parts, books (Kindle), electronics, music, and even letting individuals sell whatever they want. It just shows that their business modeling works, and it works well. The retail market is nothing new, and the advancement of the internet has only broadened the reach and potential discreteness of personal shopping. Why would selling applications be any different?</p>
<p>What I&#8217;m curious is if Amazon is going to decide to release their own line of products similar to how they push Kindle &#8211; but this time running Android (be wary, Nook!).</p>
<h2>So&#8230; What now?</h2>
<p>What&#8230; You think I have all the answers? Well I don&#8217;t &#8211; and I <em>know </em>I don&#8217;t. But I have some ideas. In one sense, I feel we&#8217;ve almost gone too far. Our current markets are saturated, and upcoming markets are more concerned with getting a torrent of applications to peddle. I don&#8217;t think this is right.</p>
<p>I think Apple and Google need to prune their markets quite a bit, and take a step backwards in how they promote them. Yes, as a developer, I&#8217;d be upset if I was told my application was now deemed unworthy (especially if I paid $99 for a license) and will be removed, but you know that&#8217;s nothing new. That has always been possible, and in a lot of cases has actually happened! You signed an agreement that said your app can be removed from the market at any time, based on the beliefs of the market runners. Apple&#8217;s yet to be afraid to put their foot down, and on a few occasions Android has had to step in as well.<br />
It&#8217;s my belief that these markets need to be careful of becoming a Goliath. The next David is always around the corner, with slingshot and rocks in hand.</p>
<p>Now with the instance of the Playbook, I&#8217;m actually rather surprised and disappointed. A quick recap: If you submit an app before a deadline, you are eligible for a free Playbook. Eligible? Might as well say &#8220;guaranteed!&#8221; Being heavily active in the community I&#8217;ve come to see MANY apps that just don&#8217;t warrant a free Playbook, and even in some cases don&#8217;t warrant being on the market at all.<br />
One could continue to argue that fart apps can still be successful, and deserve a place in the market &#8211; but others can argue that they don&#8217;t, and the novelty has fully worn off. I&#8217;m apparently one of the few who never installed a single fart app; getting a Playbook won&#8217;t change that for me.</p>
<p>The simplicity of some of the apps I&#8217;ve seen, and also seen how they&#8217;ve advertised their acceptance of getting a free Playbook is a point of disgust for me. I&#8217;ve been told a few times on the forums I&#8217;m in a place of misunderstanding, and that this ploy of RIM is to gain attraction, and that it&#8217;s working. And <em>maybe</em> it is? But as a user, if I get a Playbook in hand, and all I see are really crappy/ugly conversion apps, or equation solvers then I really want nothing to do with the product. What am I going to do with these apps?! NOTHING!</p>
<p>That brings me to a quick side-rant&#8230; If my job is centered around solving inverse sign calculations, then why the hell would I need an app with 3 text fields for this!? I&#8217;m an expert in this field, I shouldn&#8217;t need that! A simple PEMDAS calculator should suffice considering my need for expertise centers around this calculation. Just like I don&#8217;t go into a surgeon&#8217;s office, and feel comfortable with him looking up techniques of removing livers from a reference book or application. That would scare the @#&amp;$ out of me!</p>
<p>I once was a big proponent of the Android Market being fully open as it is. I thought &#8220;Great! I can create a new browser, and not worry about Google rejecting me because it competes with them!&#8221; Heh, apparently I&#8217;m the only one who took it that way. There are plenty of people that saw it as &#8220;Great! I can create some heaping pile of junk, and throw it out there, without anyone to tell me I&#8217;m doing things wrong, and am implementing bad design/UX/and development practices.&#8221;<br />
I don&#8217;t think the Apple market or the Android market are doing things right &#8211; but rather a mix of the two seem to be what&#8217;s needed.</p>
<p>That&#8217;s where I was hoping the Playbook was stepping in &#8211; their clearly open acceptance of Adobe AIR/Java/C++ SDKs, along with HTML5, Flash, and CSS3 compliant browser was an awesome first step in the right direction. It went quickly downhill when they declared their expectation was to have 4,000 apps at launch. Yes&#8230; 4,000. Why even put a number to it? Why 4,000? I&#8217;d rather take 40 super solid apps over 3,960 really crappy apps.<br />
I like the openness, but for the sake of preservation, and more importantly forward moving markets, there needs to be a bit more precision.</p>
<p>I&#8217;m not even going to touch the licensing fees, trials and tribulations of developing for any particular platform, or the market share arguments in this rant&#8230; WAY too much to talk about there. And this is getting long enough.</p>
<p>I also think that markets need to grow faster&#8230; No silly, not in size! Have you not read a single thing I&#8217;ve said? No, instead they need to grow in functionality. It&#8217;s taken a while, but we&#8217;re finally seeing particular markets (Microsoft, AppWorld, etc) allow trial applications, micro payments, subscriptions, etc. But it&#8217;s taking FOREVER &#8211; and these processes and transactions are not fully solidified and often talked about like a bastard child. The point is, markets need to be able to grow instantly, and with confidence. Users are seemingly more than apt and willing to whip out their monies to buy things, you&#8217;re only guaranteeing another channel of revenue by doing so.</p>
<p>As more and more publications start moving digital, this also will be important for markets to support. Kindle and Nook are current pioneers in that industry. But the surprising, yet refreshing introduction of <a title="Martha Stewart Living" href="http://www.marthastewart.com/msl-for-ipad-march-issue" target="_blank">Martha Stewart Living</a> app shows that other publishers are wanting a more rich experience. The only problem is, right now everyone has to roll that out themselves as an application. It would seem to behoove the markets to allow some &#8220;framework&#8221; to support this media-type just like we distribute music.</p>
<p>Once more, as both market leaders are approaching, the &#8220;cloud&#8221; is becoming much more important. It&#8217;s still taking too long in my opinion &#8211; the idea of waiting on future releases of Android and iOS are killing me! Right now with Android, I have a few options to stream media from my personal library; and I&#8217;m sure some exist for iOS as well. But there&#8217;s still some dependency there that I have to be on a private network, with software fully configured. The cloud will eventually diminish the need for all of this.<br />
Google has a bit of a leg up with gmail pushes, calendar syncs, settings and app installs pushed to the cloud, and even Chrome to Phone. It&#8217;s surprising that other markets haven&#8217;t taken this approach YET, and it&#8217;s been a few years now!</p>
<p>My father-in-law has a silly saying, that I love to quote: &#8220;The problem with instant gratification &#8211; is that it takes too damn long!&#8221;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/killerspaz.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/killerspaz.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/killerspaz.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/killerspaz.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/killerspaz.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/killerspaz.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/killerspaz.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/killerspaz.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/killerspaz.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/killerspaz.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/killerspaz.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/killerspaz.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/killerspaz.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/killerspaz.wordpress.com/233/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=killerspaz.wordpress.com&amp;blog=16977534&amp;post=233&amp;subd=killerspaz&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://killerspaz.wordpress.com/2011/02/26/a-plea-to-developers-and-markets/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2be5ab58c033a7f5489a6b8034ae55d7?s=96&#38;d=identicon&#38;r=X" medium="image">
			<media:title type="html">killerspaz</media:title>
		</media:content>
	</item>
		<item>
		<title>MobileNumericStepper, and MobileLabelStepper</title>
		<link>http://killerspaz.wordpress.com/2011/02/08/mobilenumericstepper-and-mobilelabelstepper/</link>
		<comments>http://killerspaz.wordpress.com/2011/02/08/mobilenumericstepper-and-mobilelabelstepper/#comments</comments>
		<pubDate>Tue, 08 Feb 2011 23:30:31 +0000</pubDate>
		<dc:creator>killerspaz</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[date time]]></category>
		<category><![CDATA[date time picker]]></category>
		<category><![CDATA[example]]></category>
		<category><![CDATA[Flex 4]]></category>
		<category><![CDATA[Flex Hero]]></category>
		<category><![CDATA[mobile numeric stepper]]></category>
		<category><![CDATA[numeric stepper]]></category>
		<category><![CDATA[skin]]></category>
		<category><![CDATA[source]]></category>
		<category><![CDATA[Stepper]]></category>

		<guid isPermaLink="false">http://killerspaz.wordpress.com/?p=200</guid>
		<description><![CDATA[As Flex 4 (and in this case particularly Hero [v4.5]) works its way into the public, we continue to see components that aren&#8217;t there yet. Sometimes they do exist, but haven&#8217;t been optimized for mobile (this also has some ambiguity as to what that fully entails). In the interim, we have to fend for ourselves [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=killerspaz.wordpress.com&amp;blog=16977534&amp;post=200&amp;subd=killerspaz&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>As Flex 4 (and in this case particularly Hero [v4.5]) works its way into the public, we continue to see components that aren&#8217;t there yet. Sometimes they do exist, but haven&#8217;t been optimized for mobile (this also has some ambiguity as to what that fully entails).</p>
<p>In the interim, we have to fend for ourselves and build custom components&#8230; Well, that&#8217;s not always all that fun, but also not always that bad!</p>
<p>I&#8217;ve done the dirty work, and created a MobileNumericStepper, as well as a MobileLabelStepper as a parent to it.</p>
<p><span id="more-200"></span></p>
<h2>Whatcha Got?</h2>
<p>Simply put, this is just a stepper. It mimics the Android style where buttons are above and below the text input, but is completely skinnable.<br />
Also by default the bottom button is a flipped version of the top button. This is so you can use a single arrow graphic and the component will just flip it for you to save time.</p>
<p>A few key features:</p>
<ul>
<li>min/max &#8211; set a minimum and max value</li>
<li>loopAtLimits &#8211; auto-loops to the opposite bound by default, but can be disabled. Ex: max = 100, when 101 is attempted, it will loop around to the min value</li>
<li>buttonRotate &#8211; Good for having just a single arrow icon, and flip it for the opposite direction.</li>
<li>stepTimerInitialDelay &#8211; When the user holds down a button, a timer starts to allow for repeated entries. This is the initial delay before starting the quick-stepping.</li>
<li>stepTimerRunningDelay &#8211; After the quick-stepping kicks in, this is how fast to update the next tick.</li>
</ul>
<h2>A Variant Forms!</h2>
<p>There&#8217;s not really a WHOLE lot more to talk about, as it&#8217;s just a  stepper; but the MobileLabelStepper version might interest you.</p>
<p>The label version of the component allows a developer to define label replacements for the number counterpart. For example, if using a display type of Month, then 3 = April (remember zero-based indices).<br />
It also allows for bounds that the label type should allow, again in the month context we&#8217;d limit from 0 to 11.</p>
<p>Be careful to look at the following static vars (indexed by the displayType) if implementing a MobileLabelStepper:</p>
<ul>
<li>BOUNDS_MAP &#8211; specifies an array which defines the lower and upper bounds of the stepper</li>
<li>LABEL_MAP &#8211; specifies an object that maps numbers to their label replacements. For examples, check the source for the TYPE_MONTH/TYPE_AM_PM implementations.</li>
</ul>
<h2>
<p><div class="wp-caption aligncenter" style="width: 510px"><a href="http://dl.dropbox.com/u/1143608/flex%20examples/blog/numstepper/dateTime.png" target="_blank"><img class="    " title="Date/Time Example at RunTime, fully skinned" src="http://dl.dropbox.com/u/1143608/flex%20examples/blog/numstepper/dateTime.png" alt="Date/Time Example at RunTime, fully skinned" width="500" height="150" /></a><p class="wp-caption-text">Date/Time Example at RunTime, fully skinned</p></div></h2>
<h2>The Goods</h2>
<ul>
<li><a href="http://dl.dropbox.com/u/1143608/flex%20examples/blog/numstepper/MobileNumericStepperExample.swf" target="_blank">Example</a> – View Source Enabled</li>
<li><a href="http://dl.dropbox.com/u/1143608/flex%20examples/blog/numstepper/srcview/index.html" target="_blank">Source</a></li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/killerspaz.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/killerspaz.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/killerspaz.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/killerspaz.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/killerspaz.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/killerspaz.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/killerspaz.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/killerspaz.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/killerspaz.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/killerspaz.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/killerspaz.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/killerspaz.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/killerspaz.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/killerspaz.wordpress.com/200/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=killerspaz.wordpress.com&amp;blog=16977534&amp;post=200&amp;subd=killerspaz&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://killerspaz.wordpress.com/2011/02/08/mobilenumericstepper-and-mobilelabelstepper/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2be5ab58c033a7f5489a6b8034ae55d7?s=96&#38;d=identicon&#38;r=X" medium="image">
			<media:title type="html">killerspaz</media:title>
		</media:content>

		<media:content url="http://dl.dropbox.com/u/1143608/flex%20examples/blog/numstepper/dateTime.png" medium="image">
			<media:title type="html">Date/Time Example at RunTime, fully skinned</media:title>
		</media:content>
	</item>
		<item>
		<title>Flex Serialization</title>
		<link>http://killerspaz.wordpress.com/2011/02/02/flex-serialization/</link>
		<comments>http://killerspaz.wordpress.com/2011/02/02/flex-serialization/#comments</comments>
		<pubDate>Thu, 03 Feb 2011 01:30:38 +0000</pubDate>
		<dc:creator>killerspaz</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Adobe AIR]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[Base64]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[serialization]]></category>
		<category><![CDATA[serialize]]></category>
		<category><![CDATA[utilities]]></category>

		<guid isPermaLink="false">http://killerspaz.wordpress.com/?p=156</guid>
		<description><![CDATA[There&#8217;s a few good use-cases for serialization; for me the first and foremost is the performance combined with ease of use. In AIR we have SQLite access, or in a bad case we can write some format to a file and recover it later somehow via parsing. But why? That&#8217;s a lot of work&#8230; And [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=killerspaz.wordpress.com&amp;blog=16977534&amp;post=156&amp;subd=killerspaz&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s a few good use-cases for serialization; for me the first and foremost is the performance combined with ease of use.<br />
In AIR we have SQLite access, or in a bad case we can write some format to a file and recover it later somehow via parsing. But why? That&#8217;s a lot of work&#8230; And it&#8217;s not the fastest approach either.</p>
<p>And what about if we&#8217;re doing a browser application that we want to save a state of something, but don&#8217;t want to host the storage and write a web service to handle data?<br />
We don&#8217;t have stealth access to the filesystem directly, which makes it hard (errr, impossible) to silently store things on behalf of the user.</p>
<p>We can actually tackle both easily using serialization.</p>
<p><span id="more-156"></span></p>
<blockquote><p>Quick note: I could quite possibly be wrong about some of these concepts, as they&#8217;re just things I&#8217;ve come across, and can&#8217;t find an exorbitant amount of documentation about these topics.</p></blockquote>
<h2>Overview</h2>
<p>First thing&#8217;s first&#8230; Let&#8217;s take a quick look at some of the interfaces/classes we might run into:</p>
<ul>
<li><a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/IExternalizable.html" target="_blank">IExternalizable</a> &#8211; When writing a byteArray object, it checks for this interface.</li>
<li><a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/utils/IDataOutput.html" target="_blank">IDataOutput</a> &#8211; Output object for writing bytes to</li>
<li><a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/utils/IDataInput.html" target="_blank">IDataInput</a> &#8211; Input object, exact opposite of IDataOutput</li>
<li><a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/utils/ByteArray.html" target="_blank">ByteArray</a> &#8211; Our binary data source.</li>
<li><a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/utils/Base64Encoder.html" target="_blank">Base64Encoder</a> &#8211; Encodes bytes to a string representation</li>
<li><a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/utils/Base64Decoder.html" target="_blank">Base64Decoder</a> &#8211; Decodes a string to bytes</li>
<li><a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/FileReference.html" target="_blank">FileReference</a> &#8211; A mechanism to save to a user-appointed destination</li>
</ul>
<h2>The act of Serializing data in AS3</h2>
<p>A quick serialization is rather simple, and we use the ByteArray to convert objects for us into AMF bytes. This is done in-memory, so we want to make sure our client systems can handle the amount/quantity of data we&#8217;re serializing. For most situations, this probably is not much of a concern.</p>
<h3>Setting up a serialized Class</h3>
<p>So in order for the Flash Player to know what to de/serialize to/from, we have to assign an Alias to our class.<br />
This is done simply by using the <a href="http://livedocs.adobe.com/flex/3/html/help.html?content=metadata_3.html" target="_blank">RemoteObject metadata tag</a> to define the mapping.</p>
<p><pre class="brush: as3;">
package com.killerspaz.examples.serialize.vo
{
    [RemoteClass(alias=&quot;com.killerspaz.examples.serialize.vo.JunkVO&quot;)]

    public class JunkVO
    {
        //.... Class Implementation ....//
    }
}
</pre></p>
<blockquote><p>Notice that I made my alias the fully qualified class name (that means I include the package name) my alias.<br />
This is NOT required, but I personally suggest doing this. Keep reading to find out why&#8230;</p></blockquote>
<p>If you want to map to a different name (such as something easier to remember, or to match the package space of a remote system) you can easily do so, and is acceptable.<br />
The caveat to this is that in order to deserialize your objects, you MUST register the class alias using <a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/net/package.html" target="_blank">registerClassAlias()</a>:</p>
<p><pre class="brush: as3;">
package com.killerspaz.examples.serialize.vo
{
    [RemoteClass(alias=&quot;MyJunkVO&quot;)]

    public class JunkVO
    {
        //.... Class Implementation ....//
    }
}

//** Before deserializing anywhere, register the class alias:
registerClassAlias('MyJunkVO&quot;, JunkVO);
</pre></p>
<blockquote><p>It&#8217;s typically best to register your aliases as soon as possible, such as on application startup.</p></blockquote>
<h3>Simple Serialization of an Object</h3>
<p>Here&#8217;s a quick snippet of how to serialize your object:</p>
<p><pre class="brush: as3;">
var myJunkVo:JunkVO = new JunkVO();
var bytes:ByteArray = new ByteArray();
// ...
// set some properties on myJunkVo
// ...

bytes.writeObject(myJunkVo);     //Write our object to the ByteArray
bytes.position = 0;              //Reset position of ByteArray to the beginning
</pre></p>
<p>As a quick note, this is one half of the steps required to clone most  objects at runtime. I&#8217;ll probably go over this in another post as well &#8211;  in the meantime, check out <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/utils/ObjectUtil.html#copy%28%29" target="_blank">mx.ObjectUtil::copy()</a>.</p>
<p>Done! Your object is now a ByteArray &#8211; you&#8217;ve serialized! Ok we can all go home now&#8230; Wait&#8230; I&#8217;m not actually done.</p>
<h2>The whole object, and nothing but the whole object</h2>
<h3><strong>a.k.a.</strong> It&#8217;s not working right</h3>
<blockquote><p>If you found yourself going through this post, or any other post you&#8217;ve found, but things just aren&#8217;t working right &#8211; this section is most likely the concept you missed.</p></blockquote>
<p><strong>There&#8217;s 2 considerations to serializing your data:</strong></p>
<ol>
<li>If your object hierarchy is made of completely public properties, then there really is nothing extra special you need to do in order to serialize&#8230;<br />
Seriously, I&#8217;ve never had to do anything fancy for fully public classes.</li>
<li>If your object has complex objects as children, which utilizes encapsulation and needs to save its complete state; well then we have some extra footwork to do.<br />
This is necessary for objects that we can&#8217;t easily derive states from our public variables, and have maybe collections of custom objects. Essentially, the nature of the data is valuable for an instance to function properly.<br />
It&#8217;s an all or nothing thing too &#8211; you either rely on all public vars and everything&#8217;s dandy, or if you want to serialize private/protected vars you&#8217;ll need to ALSO write the public ones!</li>
</ol>
<p>So #1 is what we saw above. Assuming all members of JunkVO are public, we can safely serialize as demo&#8217;d.</p>
<p>As it turns out, #2 isn&#8217;t that difficult to pull off, but can be rather tedious depending on your model.</p>
<h3>Implementing External Serialization</h3>
<p>If you implement the IExternalizable interface, when a ByteArray::writeObject()/readObject() is called, internally it checks for these interfaces and calls the appropriate method.</p>
<p>The trick to implementing these methods is that you do it in the exact same order. For every write, you read, no exceptions! You&#8217;re essentially manipulating the ByteArray your object is stored in.</p>
<p><pre class="brush: as3;">
public function writeExternal(output:IDataOutput):void
{
    output.writeObject(this._createdDate);
    output.writeInt(this.somePropInt);
    output.writeObject(this.somePropString);
}

public function readExternal(input:IDataInput):void
{
    this._createdDate      = input.readObject();
    this.somePropInt       = input.readInt();
    this.somePropString    = input.readObject();
}
</pre></p>
<p>See, pretty simple!<br />
Just remember:</p>
<ul>
<li>Sub-objects could also need to implement the interface for recursive de/serialization to occur properly. If they appear as null or default values when inspecting, count on this being the issue!</li>
<li>Every property MUST be written and read in the same exact order.</li>
</ul>
<h2>Things to do with your serialized ByteArray</h2>
<p>Well, you can take your ByteArray, and shove it right up your &#8230;&#8230;. storage mechanism <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>The easiest way to handle this is writing the ByteArray directly into a file:</p>
<p><pre class="brush: as3;">
protected var _fileReference:FileReference;

protected function save():void
{
    var ba:ByteArray = new ByteArray();
    ba.writeObject(someObjectInstance);
    ba.compress(); //compress to save space
    this._fileReference = new FileReference();
    //Prompt the user to save out to a file. Extension is made up here btw
    this._fileReference.save(ba, &quot;OutputFile.amf&quot;);
}
</pre></p>
<h2>But wait, there&#8217;s more!</h2>
<p>While this works, and is quick and useful &#8211; I prefer to encode the binary data into a String.<br />
This may not be that big of a deal for most of you, but for me personally I like to be able to copy the output and paste it into a sandbox app to see what&#8217;s going on.<br />
I might make this app as simple and quick as possible, so I only have a text field to put the data, and binary data gets all wacky when copy/pasting.<br />
I might also want to store the data into a database column to void a bunch of key/value tables that muddy things up. Binary data can be a pain working with in a database, and generally adds to confusion.</p>
<p>So for that, I&#8217;ve implemented a nice utility class I call <a title="SerializeUtils source" href="http://forr.st/~R8X">SerializeUtils</a>. You can see it in full effect in the example, or just take a look at the interface &#8211; it&#8217;s super simple!</p>
<p>Using the same file-save technique above, you can now save this text out to a file &#8211; just replace the byteArray reference with your string!</p>
<h2>Troubleshooting</h2>
<p>Things don&#8217;t always go as planned. Here&#8217;s some things that I&#8217;ve found along the way:</p>
<ul>
<li>When deserializing, and things are turning into Objects, or ObjectProxy, then we need to check our Alias&#8217;.</li>
<li>If deserializing a built-in Flash object (e.g.: Date), be sure to register the class alias with the fully qualified class name.
<ul>
<li>Not all objects will serialize correctly. Unfortunately the only work around is to store the variables in a custom class of your own, and serialize that data.</li>
</ul>
</li>
<li>An error about converting an Object when writing a ByteArray: Ensure your metadata alias, and/or your registerClassAlias() is correct/exists.</li>
<li>For writing to a file, make sure the client is using Flash Player 10+, this is a new-ish feature.</li>
</ul>
<h2>Example, Source, and Additional Info</h2>
<p>To prove this works, check out the example. Once you serialize the object, copy the Base64Encoded string, and close/reopen the SWF. If you paste it back in and deserialize, you should see that the values are the same as you entered them originally, including the date the object was created!</p>
<ul>
<li><a title="SerializeTest" href="http://dl.dropbox.com/u/1143608/flex%20examples/blog/serialization/SerializeTest.swf" target="_blank">Example</a> &#8211; View Source Enabled</li>
<li><a title="Source" href="http://dl.dropbox.com/u/1143608/flex%20examples/blog/serialization/srcview/index.html" target="_blank">Source</a></li>
</ul>
<p>Some Additional Information:</p>
<ul>
<li><a href="http://help.adobe.com/en_US/Flex/4.0/AccessingData/WS2db454920e96a9e51e63e3d11c0bf69084-7fda.html#WS2db454920e96a9e51e63e3d11c0bf66651-7fd2" target="_blank">Adobe Docs &#8211; Using RemoteObjects: Custom serialization</a></li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/killerspaz.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/killerspaz.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/killerspaz.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/killerspaz.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/killerspaz.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/killerspaz.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/killerspaz.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/killerspaz.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/killerspaz.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/killerspaz.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/killerspaz.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/killerspaz.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/killerspaz.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/killerspaz.wordpress.com/156/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=killerspaz.wordpress.com&amp;blog=16977534&amp;post=156&amp;subd=killerspaz&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://killerspaz.wordpress.com/2011/02/02/flex-serialization/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2be5ab58c033a7f5489a6b8034ae55d7?s=96&#38;d=identicon&#38;r=X" medium="image">
			<media:title type="html">killerspaz</media:title>
		</media:content>
	</item>
	</channel>
</rss>
