<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1527861195609149665</id><updated>2012-01-27T07:18:25.385-08:00</updated><category term='images'/><category term='technology'/><category term='tweetr'/><category term='Microsoft'/><category term='xenapps'/><category term='laser mouse'/><category term='javascript'/><category term='s3'/><category term='OAuth'/><category term='news'/><category term='ec2'/><category term='apple'/><category term='development'/><category term='Meebo'/><category term='Optical Blue'/><category term='hosting'/><category term='social'/><category term='objective c'/><category term='adobe'/><category term='Windows'/><category term='symlinks'/><category term='verified'/><category term='Catalyst'/><category term='e-book'/><category term='tcoz'/><category term='akamai'/><category term='applications'/><category term='Flash'/><category term='mouse'/><category term='iphone'/><category term='amazon'/><category term='symbian'/><category term='apps'/><category term='social graph'/><category term='skinning'/><category term='Mac'/><category term='chat'/><category term='video'/><category term='Flex'/><category term='developer'/><category term='e-reader'/><category term='windows mobile'/><category term='actionscript'/><category term='CS3'/><category term='treo'/><category term='Basic Authentication'/><category term='facebook'/><category term='xml'/><category term='air'/><category term='Flash Builder'/><category term='Spark'/><category term='authentication'/><category term='dx'/><category term='programming'/><category term='xenapp'/><category term='verizon'/><category term='nimblekit'/><category term='games'/><category term='cloud'/><category term='xml rpc'/><category term='blog'/><category term='samsung'/><category term='independent'/><category term='kindle'/><category term='Mate'/><category term='android'/><category term='citrix'/><category term='unix'/><category term='openads'/><category term='html'/><category term='twitter'/><category term='palm'/><category term='components'/><category term='att'/><category term='CS4'/><category term='reader'/><category term='masks'/><category term='tim consolazio'/><title type='text'>Tcoz Tech Wire</title><subtitle type='html'>Discoursing on trends and technologies interesting to Tim Consolazio, sole proprietor of Tcoz Tech Services, specializing in Flash/Flex/Air, iPhone, Facebook, Twitter, and related technologies.&lt;br&gt;&lt;br&gt; "Technology from an indie software developer's perspective".</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>56</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-5165694130433454425</id><published>2012-01-27T07:07:00.000-08:00</published><updated>2012-01-27T07:18:25.397-08:00</updated><title type='text'>If using JQuery, Careful adding Methods to Object</title><content type='html'>This was  tricky one. I've been writing a JavaScript framework based on "The Teaching of Crockford". That is, no deep heirarchies, functional inheritance, etc.&lt;br /&gt;&lt;br /&gt;One of Crockford's utilities is this:&lt;br /&gt;&lt;br /&gt;// enables a form of "super"&lt;br /&gt;Object.method ( 'superior', function ( name ) {&lt;br /&gt;    var that = this, method = that [ name ];&lt;br /&gt;    return function ( ) {&lt;br /&gt;        return method.apply ( that, arguments );&lt;br /&gt;    };&lt;br /&gt;} );&lt;br /&gt;&lt;br /&gt;This is a way of invoking a "super" method on the 'object' that you have inherited from. I don't actually use it; I just included it as a "well, I'll probably want to do that sooner or later" sort of thing (so I slapped it in a utils.js file for the time being). &lt;br /&gt;&lt;br /&gt;My jquery ajax calls suddenly wouldn't work. I kept getting this message:&lt;br /&gt;&lt;br /&gt;Uncaught TypeError: Object function ( name ) {&lt;br /&gt;    var that = this, method = that [ name ];&lt;br /&gt;    return function ( ) {&lt;br /&gt;        return method.apply ( that, arguments );&lt;br /&gt;    };&lt;br /&gt;} has no method 'test'&lt;br /&gt;&lt;br /&gt;Umm...wtf? So, I had to delve deeper into it...and in the unminified version of jquery, I found on line 7763, a loop that checks for the content type of the ajax response (so the call was being made, and the response returning...it was the processing of the response that was breaking). &lt;br /&gt;&lt;br /&gt;The function is:&lt;br /&gt;&lt;br /&gt;// Check if we're dealing with a known content-type&lt;br /&gt;        if ( ct ) {&lt;br /&gt;            for ( type in contents ) {&lt;br /&gt;                alert ( type + " &gt;&gt; " + contents [ type ] );&lt;br /&gt;                if ( contents[ type ] &amp;&amp; contents[ type ].test( ct ) ) {&lt;br /&gt;                    dataTypes.unshift( type );&lt;br /&gt;                    break;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;Because I had added a function "superior" to Object, "superior" now became part of the items that the response type was being tested against. It failed ("superior" did not contain a function "test", which is in the ECMAScript.js2 file, not the jquery one, click on "test" in WebStorm and you'll see). So the ajax call failed. &lt;br /&gt;&lt;br /&gt;Solution: initially, remove the modification to Object, which I wasn't using anyway. While I understand that I could add code to JQuery to ignore this sort of thing, modifying jquery is an iffy practice, because you may have to upgrade it, etc.&lt;br /&gt;&lt;br /&gt;A better solution would probably be to make JQuery handle the error in the event it runs into this sort of thing. &lt;br /&gt;&lt;br /&gt;As always, thanks for visiting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-5165694130433454425?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/5165694130433454425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2012/01/if-using-jquery-careful-adding-methods.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/5165694130433454425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/5165694130433454425'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2012/01/if-using-jquery-careful-adding-methods.html' title='If using JQuery, Careful adding Methods to Object'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-5644617848099425631</id><published>2012-01-25T07:23:00.001-08:00</published><updated>2012-01-25T07:34:55.388-08:00</updated><title type='text'>JSBase Javascript Framework</title><content type='html'>So...I've undertaken the task of creating a JS framework that is:&lt;br /&gt;&lt;br /&gt;- Based on best practices as defined by some of the luminaries I've been researching (things like modules, shallow heirarchies, etc.). &lt;br /&gt;- Does not insulate the user from JS itself by providing an entirely different model for development. I guess I'd call it "unobtrusive framework" design. &lt;br /&gt;- Has easy to understand, well defined domains of concern (model, view, controller, command, renderer, page...that's it, at least for now). &lt;br /&gt;- "Feels" familiar to your average UI developer (meaning, employs general principals of MVC). &lt;br /&gt;- Makes hierarchies explicit (as opposed to making them implied when using them). I'm probably wording that poorly, but you'll see what I mean soon. &lt;br /&gt;- Can be used for typical web apps (for instance, not as massive as Ext JS, not as structureless as just scripting with JQuery). &lt;br /&gt;- Uses JQuery (I mean why not. JQuery is awesome). &lt;br /&gt;- And so forth. &lt;br /&gt;&lt;br /&gt;Why go about this? I've been a UI dev for a long time, and I generally find that the lighter the framework, and the closer it is to the technology you are actually working with, the better. It's why I like things like RobotLegs in the AS world; aside from the context setup and mapping, it feels like I'm working in plain old AS 90% of the time, but there is no denying that the loosely coupled notification model it provides makes it easier to build an app that is more self documenting, modular, and maintainable. I see no reason why these concepts can't be more rigidly applied in the JS world to the same beneficial ends.&lt;br /&gt;&lt;br /&gt;So...simple and lightweight, easily extendable, and always feels like JS, which is meant to be flexible and useful with a relatively short learning curve. &lt;br /&gt;&lt;br /&gt;I'll post a first iteration of the basics soon. &lt;br /&gt;&lt;br /&gt;As always, thanks for visiting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-5644617848099425631?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/5644617848099425631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2012/01/jsbase-javascript-framework.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/5644617848099425631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/5644617848099425631'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2012/01/jsbase-javascript-framework.html' title='JSBase Javascript Framework'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-2225386625370828199</id><published>2011-12-01T06:45:00.000-08:00</published><updated>2011-12-01T06:57:49.959-08:00</updated><title type='text'>Google App Engine Easy crossdomain.xml Pattern</title><content type='html'>Been struggling to figure out how to put a crossdomain.xml file in a GAE app? Static files dirs and all that getting in the way?&lt;br /&gt;&lt;br /&gt;Fear not; the requirement for a crossdomain.xml file is only that it be available as a text/xml response type at the root address of your application. &lt;br /&gt;&lt;br /&gt;It does NOT have to actually be a physical file (that's the trick). &lt;br /&gt;&lt;br /&gt;So, in your GAE app (assuming you are using Python and that you know the basics of setting one up...)&lt;br /&gt;&lt;br /&gt;Add this class to your main.py script (this is the script spec'd in your yaml file as the main execution script). &lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;class SendCrossDomain ( webapp.RequestHandler ):&lt;br /&gt;    &lt;br /&gt;    def get ( self ):&lt;br /&gt;        &lt;br /&gt;        crossdomain =  '&amp;lt?xml version="1.0"?&amp;gt'&lt;br /&gt;        crossdomain =  crossdomain + '&amp;lt!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd"&amp;gt'&lt;br /&gt;        crossdomain =  crossdomain + '&amp;ltcross-domain-policy&gt;'&lt;br /&gt;        crossdomain =  crossdomain + '&amp;ltsite-control permitted-cross-domain-policies="all"/&amp;gt'&lt;br /&gt;        crossdomain =  crossdomain + '&amp;ltallow-access-from domain="*" to-ports="*" secure="false"/&amp;gt'&lt;br /&gt;        crossdomain =  crossdomain + '&amp;ltallow-http-request-headers-from domain="*" headers="*" secure="false"/&amp;gt' &lt;br /&gt;        crossdomain =  crossdomain + '&amp;lt/cross-domain-policy&amp;gt'&lt;br /&gt;    &lt;br /&gt;        self.response.headers [ 'Content-Type' ] = 'text/xml'&lt;br /&gt;        self.response.out.write ( crossdomain )&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now, later in your main.py file, in your "main" method typically, where you spec url endpoint handlers, make sure you have an entry for crossdomain.xml. &lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;application_paths = [ ( '/crossdomain.xml', SendCrossDomain ) ]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now when a user hits the url /yourappid.appengine.com/crossdomain.xml, the SendCrossDomain class will respond to the GET request with XML data sent as text/xml, which satisfies the requirement for the Flash player. &lt;br /&gt;&lt;br /&gt;As always, thanks for visiting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-2225386625370828199?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/2225386625370828199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2011/12/google-app-engine-easy-crossdomainxml.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2225386625370828199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2225386625370828199'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2011/12/google-app-engine-easy-crossdomainxml.html' title='Google App Engine Easy crossdomain.xml Pattern'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-6975274650799724933</id><published>2011-11-09T12:44:00.000-08:00</published><updated>2011-11-09T12:48:48.031-08:00</updated><title type='text'>Host a static Flash app in the Google Application Engine</title><content type='html'>Sometimes the short posts are the winners. &lt;br /&gt;&lt;br /&gt;I've seen more info on this than you'd believe, and for the most part, it just all seems wrong and/or overly complex. I've even read the GAE book and it's not there. &lt;br /&gt;&lt;br /&gt;So I went through the config app.yaml options one by one, trying everything. This is all there is to it:&lt;br /&gt;&lt;br /&gt;- Create a directory on your machine; this is the deploy target for when you run appcfg.py upload. &lt;br /&gt;&lt;br /&gt;For instance, create a directory at the root of your hard drive (mac or PC), "deploy". &lt;br /&gt;&lt;br /&gt;- In that directory, create a subfolder, call it, "flashapp".&lt;br /&gt;&lt;br /&gt;- In that subfolder, put your flash/flex stuff stuff (swfs, swcs, etc.). &lt;br /&gt;&lt;br /&gt;- Put an app.yaml file in there, config'd like this:&lt;br /&gt;&lt;br /&gt;handlers: &lt;br /&gt;- url: /(.*) &lt;br /&gt;  static_files: flashapp/\1 &lt;br /&gt;  upload: flashapp/(.*)&lt;br /&gt;&lt;br /&gt;Run the appcfg.py upload command, pointing at the deploy directory (NOT the flashapp directory). &lt;br /&gt;&lt;br /&gt;Done it several times, works fine. No main.py etc. files required. &lt;br /&gt;&lt;br /&gt;Thanks for visiting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-6975274650799724933?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/6975274650799724933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2011/11/host-static-flash-app-in-google.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/6975274650799724933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/6975274650799724933'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2011/11/host-static-flash-app-in-google.html' title='Host a static Flash app in the Google Application Engine'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-5558330215377152041</id><published>2011-10-24T09:47:00.001-07:00</published><updated>2011-10-24T09:50:49.346-07:00</updated><title type='text'>Using PyAMF in the Google Application Engine (Python AMF gateway for Flash Player apps)</title><content type='html'>Just an update on a prior blog I wrote; I'm using PyAMF in my latest GAE project, and it's working quite successfully. I haven't put it into production yet, but I see no reason why it wouldn't proceed successfully. &lt;br /&gt;&lt;br /&gt;PyAMF provides a Google module that makes integrating with a standard GAE startup class very easy. Adding and altering services is just a matter of adding an entry to the services object, and writing the class or method to back it. I use a command pattern, so my service entries look like { 'myservicename' : MyServiceNameClass.execute ( ) }&lt;br /&gt;&lt;br /&gt;You can find more about PyAMF (AMF for Python) at their website, www.pyamf.com&lt;br /&gt;&lt;br /&gt;As always, thanks for visiting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-5558330215377152041?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/5558330215377152041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2011/10/using-pyamf-in-google-application.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/5558330215377152041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/5558330215377152041'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2011/10/using-pyamf-in-google-application.html' title='Using PyAMF in the Google Application Engine (Python AMF gateway for Flash Player apps)'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-3245360348235966175</id><published>2011-10-12T12:35:00.000-07:00</published><updated>2011-10-12T12:43:56.622-07:00</updated><title type='text'>PyDev and PyAMF; force them to play nice</title><content type='html'>Short one: I use PyDev for my google GAE efforts. &lt;br /&gt;&lt;br /&gt;I used PyAMF as detailed in the PyAMF Google App Engine tutorial (which is braindead easy; just copy the pyamf directory into the base of your GAE project). When added to a vanilla GAE project created with the GAE SDK tool, it worked fine.&lt;br /&gt;&lt;br /&gt;But then I created a project in Eclipse with PyDev; it's always worked. But I dumped in the pyamf directory and, although auto complete worked and I could "click into" the pyamf classes after importing, the app wouldn't run; import errors (no such module). I knew it was a pythonpath problem of some kind, but I couldn't figure it out, and I tried everything. &lt;br /&gt;&lt;br /&gt;I eventually did this, and it worked; I retried it several times, it seems to be the fix for this sort of thing, possibly any such issue related to using a PyDev project. &lt;br /&gt;&lt;br /&gt;Create project in PyDev, but do NOT configure python path (use the "configure later" option), and do NOT configure src directory; just use the base project path. Do all other configs as normal (your GOOGLE_APP_ENGINE config and so on, as if you were doing a usual project). &lt;br /&gt;&lt;br /&gt;Then drop your PyAMF directory into the root of your PyDev project folder (remember, you don't have a src directory), doctor up your main.py to use the WebAppGateway and so on, and it finally sees all the imports and works as expected. &lt;br /&gt;&lt;br /&gt;No idea what's going on, I'd say there's something going on in the way PyDev interprets paths vs. the way many libraries like PyAmf are set up to do their imports. I'm sure there is an elaborate answer to this involving site-directories and so on, but all I wanted was for my PyDev project to see my PyAMF modules properly, and the above steps, which simplify the PyDev project config drastically, seems to work. &lt;br /&gt;&lt;br /&gt;Hope that saves sombody some effort, it killed half a day for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-3245360348235966175?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/3245360348235966175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2011/10/pydev-and-pyamf-force-them-to-play-nice.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/3245360348235966175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/3245360348235966175'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2011/10/pydev-and-pyamf-force-them-to-play-nice.html' title='PyDev and PyAMF; force them to play nice'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-7733303344389530220</id><published>2011-07-22T07:07:00.000-07:00</published><updated>2011-07-22T08:05:24.250-07:00</updated><title type='text'>Clouds: EC2 and GAE in the Indie Dev world.</title><content type='html'>"Cloud computing" is a big bleeding-edge phrase these days. &lt;br /&gt;&lt;br /&gt;In a way, all it really means, is that there's a processing and storage service out there, on which you can build and run software. You don't have to buy or maintain the machines, and for the most part, you don't have to install any of the base software (like operating systems, core services like data and cacheing, etc.). It makes app dev a lot easier; you register an account with your cloud provider, they allocate you a CPU and storage budget, and provide a way for you upload your software to run. This is of course primarily Internet-based apps, anything from a website to a full-on financial RIA. &lt;br /&gt;&lt;br /&gt;In another way, it also means, that you now work under the restrictions of that cloud provider. If they don't want you running certain classes in their cloud infrastructure, they blacklist it; you have to find an alternative. Such restrictions usually involve IO operations like file writes, security and encryption, and other general black hat sort of stuff. &lt;br /&gt;&lt;br /&gt;The trick is to find the balance; a provider that gives you the flexibility you want, without making it just as onerous as actually owning and maintaining the machines (things like auto backups and data replication, etc.). Based on what you need, you go towards either end of that balance. &lt;br /&gt;&lt;br /&gt;I've been working with cloud computing as an app developer for some time now. From a developer's perspective, it's all pretty much the same; "what technology, what APIs/frameworks, where do I put it, what basic server admin do I have to perform." So while I heard a lot of people talk about "the cloud" as a mysterious and nebulous thing, I always just thought of it as another server out there to run my cruft. &lt;br /&gt;&lt;br /&gt;It's evolving though; it's becoming RIDICULOUSLY easy to put a high end app out there, relative to the difficulty of even a few years ago. &lt;br /&gt;&lt;br /&gt;The two clouds I use these days:&lt;br /&gt;&lt;br /&gt;- EC2 (Amazon). Couples with their S3 (simple storage) service, provides a way to actually spin up remote machines of almost any configuration. For example, Amazon has a Linux base called a "micro instance", that you can spin up and access via it's IP address just like any other remote server. You log in as ec2-user with your public/private key, switch to root (you can not log in as root), and SSH all day. Usually you have to employ yum a lot, to install apache, FTP, and what have you, and do a lot of RPM gets to fill in some blanks, but they do a good job of making pretty much everything for a basic server confg available.  &lt;br /&gt;&lt;br /&gt;Admin is simple via the EC2/S3 web interfaces. You can spin up buckets for storage, start/stop instances (which starts/stops billing...you only pay for used CPU and storage space, if your instances are all shut down then all you pay for is storage), make and edit security groups, generate .pems for your keys, and so on. And it's CHEAP. As a dev, I spin up a micro instance, install apache, tomcat, whatever, check the python and perl installs, and am pretty much ready to stage anything. If I shut down the instance when I'm not using it (so say I leave it running 8 hours a day), my bill at the end of the month is literally a few bucks. &lt;br /&gt;&lt;br /&gt;Scaling is up to you. If your micro instance gets slammed, it'll bork. There are services out there that can do this for you; if you're trying to get out of the hardware end of things by getting into cloud computing, a service like this is essential, or you're just going to end up hiring your network and server guys all over again. You can of course also manage it yourself, the EC2 admin tools provide APIs and such to get it done. &lt;br /&gt;&lt;br /&gt;EC2 I like it a lot. I actually canceled all my traditional server hosting, which was costing me in excess of $200 a month just to be able to stage apps for clients, and now it costs me maybe $10 or so. It's also very flexible; basically, there's no difference to me, it's easy to think you actually have a real server out there, when all you actually have is a chunk of the CPU clay pulled off the big CPU clay ball; you configure that chunk however you want, be it Windows, Linux, Unix, web server, app server, whatever. There are some security and storage restrictions, but nothing I've ever run into in day-to-day dev. &lt;br /&gt;&lt;br /&gt;- Google App Engine (GAE)&lt;br /&gt;&lt;br /&gt;I've been writing code as a subcontractor for Google projects these days, (YouTube Town Hall, that sort of thing), and use the GAE for my backends. &lt;br /&gt;&lt;br /&gt;GAE goes the other way from EC2; where EC2 is heavy on flexibility in favor of adding some complexity (like needing public private keys for logins, configuring security groups, having to install things on your instances, monitoring the instances carefully), GAE provides a prescribed way of developing your apps. You can use either Python or Java (unlike the EC2, in which you can use and dev technology I've ever seen). Access for devs is tied to a gmail account. You just sign up for the GAE, get an account/app key, and can deploy 10 apps, utilizing a decent amount of CPU and storage, for free (for now anyway). &lt;br /&gt;&lt;br /&gt;Regarding "Java or Python for the GAE", I've used both; in general, I lean towards Python unless Python makes it difficult, and it often does. I have very unstable results with PyAMF on the GAE, but know I can get AMF running in Java on the GAE, so when I need AMF, I use Java. Also, the Objectify data framework for GAE (Java based) is very powerful and well written, it makes using the GAE datastore pretty straightforward. &lt;br /&gt;&lt;br /&gt;You don't have the tactile sensation EC2 gives you, which is of "solid server". You deploy your code as an upload (like FTPing), and it compiles, validates, and deploys it. You then access the functioning app online at [yourapp].appspot.com. Servlets, services, and all that, provided they made the blacklist cut, will all run as expected. You have an admin interface that tells you how much CPU and storage your app is using, and you can see things like what's in the task queue, inspect your data store, see usage stats, and whatnot. The data service is in the form of an object store (not a relational DB), there's memcache service, a task queue (configurable queues too), cron capability, a bulk data uploader/downloader (which is an admin tool, not an app tool) and some messaging capability. Everything you need to build out a fairly heavy duty app. &lt;br /&gt;&lt;br /&gt;However, those services are what you have to use if you want to do your processing with GAE resources. Unless there are arrangements different than the default one I have, what you see is what you get. Things like file read/writes and such are also much more heavily restricted in the GAE, putting some solid walls around your app and what it can and can't do. If you're inventive, you can generally use the tools they provide to meet the need. &lt;br /&gt;&lt;br /&gt;Scaling is braindead easy in the GAE; you don't think about it really. You just up your budget for CPU/Storage, and you get more CPU time. If your app hits a threshold, the GAE also automatically spins up more "Instances" so that your app can load balance (sort of). You don't worry about it at all, as long as you have the budget, you're good. Even under very heavy load (like hundreds of thousands of hits) I've not seen this budget exceed 60 bucks in a day, and that's VERY unusual, typically it's a few dollars for a reasonably busy app that isn't doing huge background processing jobs (which I would offload to the EC2...)&lt;br /&gt;&lt;br /&gt;Because the GAE is much more prescribed, all you have to do is get that prescribed model, then it's pretty EASY. You fall into repeatable patterns because there aren't multiple ways to do things like data writes; you use Objectify on the GAE datastore API, or use JDO and beware blacklisted classes. It's also very easy to admin; you go to your GAE interface and can inspect the data store, task queues, see how much CPU and storage your app is using, etc. There are some deeper tools too, like the ability to use custom domains instead of appspot ones, but I haven't needed anything like that yet. &lt;br /&gt;&lt;br /&gt;Which do I like better? Hard to say, because I've combined them for a couple of apps. I use the EC2 to spin up instances on which, say, I need to do a lot of scheduled processing, like image or video download/processing. If I have particular requirements from a client for data storage or web serving, EC2 is also the way to go. But for deploying and serving general web application, even ones with some pretty slick data and task requirements, the GAE, as long as python or java is ok with you, is a great, easy, and even fun, way to get the job done. &lt;br /&gt;&lt;br /&gt;Either way, both save you a lot of money and headache. Naturally, the heavier your use, the more money and headaches you'll expend, but for general app dev, particular for testing and staging, and even for long-run apps if you know what you're doing, dump your old hard boxes and use the clouds. &lt;br /&gt;&lt;br /&gt;As always, thanks for visiting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-7733303344389530220?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/7733303344389530220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2011/07/clouds-ec2-and-gae-in-indie-dev-world.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/7733303344389530220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/7733303344389530220'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2011/07/clouds-ec2-and-gae-in-indie-dev-world.html' title='Clouds: EC2 and GAE in the Indie Dev world.'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-2398231983879680434</id><published>2011-05-03T06:42:00.000-07:00</published><updated>2011-05-03T06:50:54.349-07:00</updated><title type='text'>Parsing Params from a UI in PHP</title><content type='html'>I've seen a lot of this out there, and seen a variety of scripts that...well...just don't work. People recommend plugins, frameworks, all that, just for the simple task of some basic params parsing. &lt;br /&gt;&lt;br /&gt;To be frank, as I go on using Zend framework, I find it hard to believe the amount of effort people will put into searching for pre-made solutions for things that are really pretty simple.  I suspect this has to do with the fact that "framework" is misinterpreted as "does everything for you", which leads a lot of what I call "script hackers" to pursue them, when in fact using frameworks is a more advanced programming undertaking that, imho, separates the men from the boys, as it were. I understand that situationally a lot of that might be useful, but for me, when it comes to basic operations such as this, I prefer to use the features of the language without additional bolt-on libs, mods, and what have you. &lt;br /&gt;&lt;br /&gt;Here's the code I use, which has worked consistently well, in a little util class. If you have other character or encoding concerns, just bolt them into the processing before you hit the foreach loop.  &lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;&lt;br /&gt;public static function parseURIParams ( $uri )&lt;br /&gt;{&lt;br /&gt; $params = parse_url ( $uri, PHP_URL_QUERY );&lt;br /&gt; $values = explode ( '&amp;', $params );&lt;br /&gt; $finalParamsArray = array ( );&lt;br /&gt; &lt;br /&gt; foreach ( $values as $str )&lt;br /&gt; {&lt;br /&gt;  $keyVal = explode ( '=', $str );&lt;br /&gt;  $finalParamsArray [ $keyVal [ 0 ] ] = $keyVal [ 1 ];&lt;br /&gt; }&lt;br /&gt;  &lt;br /&gt; return $finalParamsArray;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-2398231983879680434?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/2398231983879680434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2011/05/parsing-params-from-ui-in-php.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2398231983879680434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2398231983879680434'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2011/05/parsing-params-from-ui-in-php.html' title='Parsing Params from a UI in PHP'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-3264549301262299064</id><published>2010-09-07T08:56:00.001-07:00</published><updated>2010-09-07T09:14:21.844-07:00</updated><title type='text'>DataGrid Reminder: Item Renderers Don't Trigger Events Until They're Visible</title><content type='html'>Ran into this recently; no code, since that's not really necessary. But this info is pretty valuable imho. I've seen tons of info on the net in all the forums that work around this every which way without every actually stating the precise issue.&lt;br /&gt;&lt;br /&gt;Say you've set up the following:&lt;br /&gt;&lt;br /&gt;- A datagrid with a dataprovider (say, XML).&lt;br /&gt;- One of the columns in the datagrid has a custom renderer.&lt;br /&gt;- You need to update a model (say, processed XML you will send to a service after the user is done with the grid) with some data that is automatically populated in that renderer's UI field (like a default value).&lt;br /&gt;&lt;br /&gt;For instance, say you have this:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&amp;lt;item&amp;gt;&lt;/div&gt;&lt;div&gt;  &amp;lt;itemdata&amp;gt;Hello&amp;lt;/itemdata&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;lt;/item&amp;gt;&lt;/div&gt;&lt;br /&gt;You use this as your dataprovider. Your custom renderer has a textfield. You write Hello into the textfield on dataChange. Nice nice so far.&lt;br /&gt;&lt;br /&gt;Now, when that textfield changes, you want to update a model of XML, or trigger some other event, whatever. You add the textfields change handler, you see it work, you breakpoint the code that updates the model, and you see the info added. Nice.&lt;br /&gt;&lt;br /&gt;Then you say, "let me blow it out to 20 rows". You add them all, you breakpoint the model code, and it works...up to a point. For some reason, 7 or so of the pieces of data you want in the model are there, but then it just stops, as if the data is getting skipped or just not sent.&lt;br /&gt;&lt;br /&gt;You fiddle with it...sometimes 7, sometimes, 5, sometimes all 10. WTF is going on?&lt;br /&gt;&lt;br /&gt;If you know the answer already, raise your hand...but I bet you don't (I looked and asked around for a week before figuring it out).&lt;br /&gt;&lt;br /&gt;Drum roll...&lt;br /&gt;&lt;br /&gt;...datagrids only render visible rows. If you had to scroll to see any of your rows, then those renderer's events never fired (like it's textfield change event). Which means that the events never dispatch, so your model, or whatever, never gets the message.&lt;br /&gt;&lt;br /&gt;So, if you're counting on events from a renderer events to update a model or trigger some other action when all the data is initially loaded into the datagrid based on a value set in a renderer, don't dispatch the events from the renderers, because if they aren't visible, they'll never send their messages.&lt;br /&gt;&lt;br /&gt;Perhaps a datagrid creationPolicy of "all" would be useful under certain circumstances.&lt;br /&gt;&lt;br /&gt;As always, thanks for visiting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-3264549301262299064?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/3264549301262299064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2010/09/datagrid-reminder-item-renderers-dont.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/3264549301262299064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/3264549301262299064'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2010/09/datagrid-reminder-item-renderers-dont.html' title='DataGrid Reminder: Item Renderers Don&apos;t Trigger Events Until They&apos;re Visible'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-6249752577412100554</id><published>2010-05-21T07:43:00.000-07:00</published><updated>2010-05-21T07:46:36.132-07:00</updated><title type='text'>Passing Simple QueryString Data from SWF to SWF using SWFLoader</title><content type='html'>Lot of posts out there with people trying to get around this one. It's a pain; under certain (most) conditions, if you try to simply load a swf into a swfLoader, and pass parameters by appending the path to the swf, when you test the parameters in the loaded swf, you get nada.&lt;br /&gt;&lt;br /&gt;Ugh.&lt;br /&gt;&lt;br /&gt;Easy workaround; use this in the LOADED swf (so in the code of the swf you loaded):&lt;br /&gt;&lt;br /&gt;Application.application.loaderInfo.loaderURL&lt;br /&gt;&lt;br /&gt;That reveals the entire path the loader of that swf used. After that, parse out your values and off you go. Not as nice as if they appeared as neatly packaged object properties, but it works, and parsing a querystring is 101 stuff anyway.&lt;br /&gt;&lt;br /&gt;Easy one, but effective. &lt;br /&gt;&lt;br /&gt;As always, thanks for visiting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-6249752577412100554?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/6249752577412100554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2010/05/passing-simple-querystring-data-from.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/6249752577412100554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/6249752577412100554'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2010/05/passing-simple-querystring-data-from.html' title='Passing Simple QueryString Data from SWF to SWF using SWFLoader'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-7456193040077692006</id><published>2010-04-13T05:24:00.000-07:00</published><updated>2010-04-13T05:52:10.774-07:00</updated><title type='text'>Adobe CS5 iPhone building is "*Subject to Apple's current requirements and approval."</title><content type='html'>If you read my last post, you know that Apple altered their licensing agreement for applications. Not only is apple telling you how you can distribute them, but now they are telling you how you can build them.&lt;br /&gt;&lt;br /&gt;Here's the meat of the matter:&lt;br /&gt;&lt;br /&gt;"3.3.1 — Applications may only use Documented APIs in the manner prescribed by Apple and must not use or call any private APIs. Applications must be originally written in Objective-C, C, C++, or JavaScript as executed by the iPhone OS WebKit engine, and only code written in C, C++, and Objective-C may compile and directly link against the Documented APIs (e.g., Applications that link to Documented APIs through an intermediary translation or compatibility layer or tool are prohibited)."&lt;br /&gt;&lt;br /&gt;It's corporate control at it's worst. Apple has surpassed Microsoft in terms of "evil empire". Microsoft may be berserk with their licensing pricing and enforcement, but one thing is true, they NEVER told me that I couldn't use my computer whatever way I wanted as far as a developer. As long as the binary output runs, I can install it, for FREE. Apple, however, has decided that's not enough money or control. Now they want to specify the language you write in, how it should be compiled, and all the rest of it, AND get a fee JUST so you can put an app on an iPhone, iPod Touch, or iPad. The more I look at it, the more I see corporate, hysterical paranoia. Apple simply wants to own and control all content distribution on the web.&lt;br /&gt;&lt;br /&gt;Apple = Open Web? No, they do not. They = closed devices supporting the technologies they choose, the way they specify. They are doing evil; they could learn a lot from Google.&lt;br /&gt;&lt;br /&gt;What evil? &lt;br /&gt;&lt;br /&gt;The change has affected numerous small development shops that were counting on Adobe's Release of Flash CS5, as well as shops working on compilers for various dev technologies. Apple is taking every step they can to keep anything other than Apple licensed developers, and Apple licensed tools, out of the realm of Apple mobile development, in particular, the petulant snubbing of Adobe's Flash. They offer all kinds of weak, easily repudiated reasons for not allowing the technology to be installed in their Safari browser on the iPad and the iPhone, or as a runtime that can support Air apps. I won't rehash these, other than to say, if a $250 netbook can run Flash and Air, then there's no reason in the universe that the iPad shouldn't be able to, unless all it really comes down to is that the iPad is a glorified iPod Touch without the camera. I mean...no USB port...no Flash...no multitasking yet...come on. Has Apple forgotten that technology isn't just about designing cool looking things?&lt;br /&gt;&lt;br /&gt;Anyway, Adobe has added this little quip to the pre-release announcement of the CS5 Master Suite, due for release in mid-May:&lt;br /&gt;&lt;br /&gt;"Publish content virtually anywhere, using Adobe AIR® for desktop applications and mobile platforms including the iPhone®*, or Adobe Flash Player for browser-based experiences.&lt;br /&gt;*Subject to Apple's current requirements and approval."&lt;br /&gt;&lt;br /&gt;Notice that last line. This means that, Adobe may give you a tool that can build iPhone apps from Flash/ActionScript...but you may never be able to use it. All Apple has to do is keep modifying the license agreement to shut Adobe out forever, and as they clearly show by the new 3.3.1 paragraph, they're more than willing to do it.&lt;br /&gt;&lt;br /&gt;For shame Apple. You're supposed to enfranchise developers, let us create tools to work with your platform. But instead, you react by putting more mortar on the walls around your mobile platform, paid for by developers that just want to put an app on an iPad.&lt;br /&gt;&lt;br /&gt;HP Slate for me (google it), and depending on how Android 2 goes over the remainder of my iPhone contract, it's a distinct possibility I'll abandon Apple's mobile platform altogether. My whole perception of what I see when I look at my iPhone has changed, and I don't like it. Sure, this may only matter to developers, but developers build the apps you love. Historically, where the developer goes, the consumer follows. If Apple keeps heading this way, it's just a matter of time until people start jumping ship.&lt;br /&gt;&lt;br /&gt;Is this all written in stone? Hard to say. But it is indeed written, at least for now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-7456193040077692006?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/7456193040077692006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2010/04/adobe-cs5-iphone-building-is-subject-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/7456193040077692006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/7456193040077692006'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2010/04/adobe-cs5-iphone-building-is-subject-to.html' title='Adobe CS5 iPhone building is &quot;*Subject to Apple&apos;s current requirements and approval.&quot;'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-2962975339497420422</id><published>2010-04-09T09:05:00.001-07:00</published><updated>2010-04-09T09:14:17.710-07:00</updated><title type='text'>Apple tightens control over development...again.</title><content type='html'>Take a look at this: Before today, the Apple License Agreement for apps read like this:&lt;br /&gt;&lt;br /&gt;3.3.1 — Applications may only use Documented APIs in the manner prescribed by Apple and must not use or call any private APIs.&lt;br /&gt;&lt;br /&gt;As of today, it looks like this:&lt;br /&gt;&lt;br /&gt;3.3.1 — Applications may only use Documented APIs in the manner prescribed by Apple and must not use or call any private APIs. Applications must be originally written in Objective-C, C, C++, or JavaScript as executed by the iPhone OS WebKit engine, and only code written in C, C++, and Objective-C may compile and directly link against the Documented APIs (e.g., Applications that link to Documented APIs through an intermediary translation or compatibility layer or tool are prohibited).&lt;br /&gt;&lt;br /&gt;Now, I don't think this necessarily means the Flash CS5 is torched (if you didn't know Flash CS5 has the ability to compile ActionScript apps to run on iPhone). The only thing it MUST do is, it must appear to the external eye that the app was written in C (objective, C++, etc.). If there is a compiled binary that speaks to the iPhone API through an intermediary layer, it's out of license.&lt;br /&gt;&lt;br /&gt;Whatever the case, this is going too far. Not only does Apple want to specify how you can distribute your apps, they want to tell you exactly how to write and compile them. I'm reasonably confident this won't stop Adobe, as they wouldn't have gone this far without understanding Apple's probable reaction to their iPhone compiling tools, but it will certainly torch a number of efforts underway to get iPhone dev into general development, like Java, etc; I know for sure the .Net-&gt;to-&gt;iPhone effort is now out of license, as it uses an intermediary layer (or did anyway).&lt;br /&gt;&lt;br /&gt;C'mon Apple. You've got your distro lock, for pete's sake if home engineers can come up with another way to put it on wax, and it passes your already existing restrictions, back the hell off.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-2962975339497420422?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/2962975339497420422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2010/04/apple-tightens-control-over.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2962975339497420422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2962975339497420422'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2010/04/apple-tightens-control-over.html' title='Apple tightens control over development...again.'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-3463913455408578494</id><published>2010-03-19T06:19:00.000-07:00</published><updated>2010-03-19T06:25:40.620-07:00</updated><title type='text'>Text Layout framework for Flash/Flex (Player 10)</title><content type='html'>Like many of you I'm sure, I've struggled with text in Flash/Flex more than once. For the most part, I've learned to get it to do what I want, but, there's still some things missing, especially when it comes to allowing users to manipulate text, an easy way to integrate robust HTML text for formatting, that sort of thing.&lt;br /&gt;&lt;br /&gt;I haven't played around with it enough to write anything useful, but this looks very promising:&lt;br /&gt;&lt;br /&gt;http://labs.adobe.com/technologies/textlayout/&lt;br /&gt;&lt;br /&gt;The gist is, the text framework is getting a complete overhaul; we'll have it Gumbo, and it's already in CS4, all targeted at Player 10 (which is a significant evolution, what with the ability to save files locally and such as well).&lt;br /&gt;&lt;br /&gt;Summary of highlighted features, this is interesting stuff:&lt;br /&gt;&lt;br /&gt;- Bidirectional text, vertical text and over 30 writing systems including Arabic, Hebrew, Chinese, Japanese, Korean, Thai, Lao, the major writing systems of India, and others&lt;br /&gt;- Selection, editing and flowing text across multiple columns and linked containers, and around inline images&lt;br /&gt;- Vertical text, Tate-Chu-Yoko (horizontal within vertical text) and justifier for East Asian typography&lt;br /&gt;- Rich typographical controls, including kerning, ligatures, typographic case, digit case, digit width and discretionary hyphens&lt;br /&gt;- Cut, copy, paste, undo and standard keyboard and mouse gestures for editing&lt;br /&gt;- Rich developer APIs to manipulate text content, layout, markup and create custom text components.&lt;br /&gt;&lt;br /&gt;Interesting stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-3463913455408578494?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/3463913455408578494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2010/03/text-layout-framework-for-flashflex.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/3463913455408578494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/3463913455408578494'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2010/03/text-layout-framework-for-flashflex.html' title='Text Layout framework for Flash/Flex (Player 10)'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-2918791848383383619</id><published>2010-03-11T15:08:00.001-08:00</published><updated>2010-03-11T15:11:03.859-08:00</updated><title type='text'>March Edition of Flash Flex Dev Mag is out.</title><content type='html'>The March Edition of this mag is available now, with my article, "Dynamic Views and Mediators in PureMVC".&lt;br /&gt;&lt;br /&gt;Check it out at:&lt;br /&gt;&lt;br /&gt;http://ffdmag.com/download-2-2010&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-2918791848383383619?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/2918791848383383619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2010/03/march-edition-of-flash-flex-dev-mag-is.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2918791848383383619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2918791848383383619'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2010/03/march-edition-of-flash-flex-dev-mag-is.html' title='March Edition of Flash Flex Dev Mag is out.'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-3590157718459549928</id><published>2010-03-09T07:53:00.001-08:00</published><updated>2010-03-11T15:01:05.519-08:00</updated><title type='text'>This blog has moved</title><content type='html'>&lt;br /&gt;       This blog is now located at http://tcoztechwire.blogspot.com/.&lt;br /&gt;       You will be automatically redirected in 30 seconds, or you may click &lt;a href='http://tcoztechwire.blogspot.com/'&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;       For feed subscribers, please update your feed subscriptions to&lt;br /&gt;       http://tcoztechwire.blogspot.com/feeds/posts/default.&lt;br /&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-3590157718459549928?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://tcoztechwire.blogspot.com/' title='This blog has moved'/><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/3590157718459549928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2010/03/this-blog-has-moved.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/3590157718459549928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/3590157718459549928'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2010/03/this-blog-has-moved.html' title='This blog has moved'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-6747783957414248436</id><published>2010-03-05T05:39:00.001-08:00</published><updated>2010-03-05T05:56:45.878-08:00</updated><title type='text'>My Comments on Steve Job's attacks on Flash technology: C'mon Steve, it's about money and control.</title><content type='html'>Recently, Steve Jobs has escalated his war on Flash technology. You can read about it here:&lt;br /&gt;&lt;br /&gt;http://gawker.com/5474900/what-steve-jobs-said-during-his-wall-street-journal-ipad-demo&lt;br /&gt;&lt;br /&gt;There’s so much contrary info available to me about Steve Jobs’ war on Flash that I can’t find his position credible. It’s amazing that anybody would take it seriously.&lt;br /&gt;&lt;br /&gt;I’ve been a Flash dev for a long time. Flash hasn’t crashed my computer in years. Browser now and then, yes, computer, never. And I run three macs, and do all my development on them. Steve is telling a half truth here; if he was being accurate, he would say that POORLY WRITTEN flash apps take down BROWSERS. That is the fact.&lt;br /&gt;&lt;br /&gt;This is no less true of a poorly written iPhone app. Go to the forums, bad iPhone apps take down iPhones all the time; memory allocation, lockups, you name it. &lt;br /&gt;&lt;br /&gt;Steve Jobs is being dishonest about his motivation for his attack, and it’s obvious to anybody that knows how iPhone content distribution works; this is entirely about control, and money, that’s it. If you allow Flash on the iPad/iPhone, people will be able to write games, audio/video experiences, and deliver them to the iPad, without the deathgrip approval process Apple has over applications (you must submit your app to Apple, and get approval, before distributing to the iPhone via iTunes; Apple gets a distribution fee, AND you have to pay every year to be a registered developer to be allowed to submit apps at all) . Apple won’t make the money on the app distribution, and won’t have to force you to go through the app approval process.&lt;br /&gt;&lt;br /&gt;That’s the real issue. I am confident that an army of Flash/Flex devs, and Adobe, as well as any legit third-party evaluation process, would state that there is no technical reason that an iPad can’t support Flash. &lt;br /&gt;&lt;br /&gt;It is also interesting that, for video solutions, he points to h.264 video (quicktime), which is a patented and privately licensed technology. And guess who owns it. Sure, cheap now...but when people start depending on it, watch Apple change that for "enterprise content distribution" or some such.&lt;br /&gt;&lt;br /&gt;Finally, Steve says Flash is on the way out; that statement, more than any other, I just can't fathom. Flash is in no way dying at all, in fact, as a developer using it for years, I have never seen so much Flash/Flex work. I turn down good work all the time because I’m far too busy. 3d advancements and other useful technologies are allowing Flash to go where it has never gone before.&lt;br /&gt;&lt;br /&gt;Apple was heavily vested in Flash technology for years; shortly before the release of the iPhone, they ripped it all off their website; I happened to notice this, and was suspicious of the motivation. A few months later, they announced the app store, and the model for development and distribution; then it became clear to me why you would never see Flash on the iPhone. &lt;br /&gt;&lt;br /&gt;Apple can’t control content delivered via Flash.&lt;br /&gt;&lt;br /&gt;Folks, people say Microsoft is the evil empire, but one thing for sure, they never tried to control the content you see and use on your devices to the extent Apple is currently enforcing. They should call the device the iCensor.&lt;br /&gt;&lt;br /&gt;Me, I’m not getting an iPad. If I buy a device of this nature, I want the entire web experience, not some dumbed-down version Apple is foisting off to enforce control and print more mountains of money. A phone, alright…Flash does take CPU cycles and may not be ideal for a phone (though I don’t have enough info to know this for a fact), and dumbed-down versions of Flash for mobile don’t appeal to me. But there is no excuse for the iPad, unless that device is technically just a big iTouch, in which case, imho, it’s a waste of money. I'll buy a device that doesn't tell me "we don't like it so you can't have it".&lt;br /&gt;&lt;br /&gt;Watch out Apple, you're creating a real mud-slinging marketing opportunity for Microsoft here. Windows 7 is on the rise and people are fast forgetting Vista.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-6747783957414248436?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/6747783957414248436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2010/03/my-comments-on-steve-jobs-attacks-on.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/6747783957414248436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/6747783957414248436'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2010/03/my-comments-on-steve-jobs-attacks-on.html' title='My Comments on Steve Job&apos;s attacks on Flash technology: C&apos;mon Steve, it&apos;s about money and control.'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-1655557566932651490</id><published>2010-02-02T08:09:00.000-08:00</published><updated>2010-02-02T08:20:15.982-08:00</updated><title type='text'>Flash Builder BUG: Services failing, SWF trying to load crossdomain.xml from localhost:37813?</title><content type='html'>Oh man this one cost me some time.&lt;br /&gt;&lt;br /&gt;I have a swf loading data from some services at IP yadayada. It's working fine, both from the FB IDE, and when I copy the bits to the remote server, pull up a browser, and hit the remote IP.&lt;br /&gt;&lt;br /&gt;Then I try it from another machine, same browser, same FP version, same IP address. I see this gobbledy gook:&lt;br /&gt;&lt;br /&gt;Warning: Failed to load policy file from http://localhost:37813/crossdomain.xml&lt;br /&gt;*** Security Sandbox Violation ***&lt;br /&gt;Connection to http://localhost:37813/?q=services/amfphp?hostport=[ipommitted]&amp;https=N&amp;id=-1 halted - not permitted from [myswf]&lt;br /&gt;&lt;br /&gt;WTF, why, why, why is that request trying to load the crossdomain file from localhost:37813, screwing up everything on all but my dev machine? Yes, I know dev machines aren't the acid test, but I'm not running the project from the IDE, or even the browser the IDE uses, I'm pulling up an "off to the side" browser and hitting the remote address, exactly as I am on any other computer.&lt;br /&gt;&lt;br /&gt;I went through all the security settings, found posts directing me time and again to the new meta policy and socket policy documents and white papers: I've read them all, several times in the past, I'm good with Flash security, I KNEW I was doing all this correctly.&lt;br /&gt;&lt;br /&gt;So, I abandoned Flash security, assuming I had everything correct. Where else had I seen URLS redirected to localhost:port?&lt;br /&gt;&lt;br /&gt;HTTP Sniffers, like Fiddler. They intercept HTTP traffic, channel it to a local port, trace the data, and forward the request along.&lt;br /&gt;&lt;br /&gt;Was I running one? No...oh wait, yes. &lt;br /&gt;&lt;br /&gt;THE NETWORK MONITOR IN FLASH BUILDER.&lt;br /&gt;&lt;br /&gt;IT COMPILES THE REDIRECT INFO INTO YOUR SWF.&lt;br /&gt;&lt;br /&gt;So, if you compile your swf with the network monitor active, which you may not realize is the case, you have just told your swf to redirect all traffic to localhost:37813. So you'll deploy it, and guess what? Because no other machine is running the FB network monitor, the calls will fail. GAH.&lt;br /&gt;&lt;br /&gt;Turn network monitor off. Recompile your swf. Redeploy. Voila.&lt;br /&gt;&lt;br /&gt;GAH. What a pain. Anyway, if you have this problem, hopefully this saves you from the frustrated grumbling and cursing I spent a few hours going through.&lt;br /&gt;&lt;br /&gt;As always, thanks for visiting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-1655557566932651490?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/1655557566932651490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2010/02/flash-builder-bug-services-failing-swf.html#comment-form' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/1655557566932651490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/1655557566932651490'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2010/02/flash-builder-bug-services-failing-swf.html' title='Flash Builder BUG: Services failing, SWF trying to load crossdomain.xml from localhost:37813?'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-8898914598264135572</id><published>2009-12-17T05:04:00.000-08:00</published><updated>2009-12-17T05:51:22.750-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='skinning'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash Builder'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='Spark'/><category scheme='http://www.blogger.com/atom/ns#' term='components'/><title type='text'>Flash Builder: Spark Skinning Issue to look out for (hopefully they'll fix this)</title><content type='html'>If you're in the ActionScript world and haven't cracked open the beta of Flash Builder (the latest version of Flex Builder, just rebranded), it's time to hit the Adobe site and pull it down. There's a lot to like about it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It ain't perfect yet though. Here's a brief post about a couple of things I've discovered that might throw you when you get started.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Spark Skinning&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The new Spark components (get ready for the new s: namespace) seem to work great, and have a lot less overhead than the old mx flex ones. For instance, "groups", like s:HGroup and s:VGroup, can be used instead of "boxes", like HBox and VBox. They work the same way, but don't contain logic for scrollbars and such. This somewhat mediates the old Flex issue of nested containers impacting performance. Although you should still always be careful nesting containers, its good to know that, at least to a point, you can be a little more creative about their use without overtly damaging your app's perf. You can also do more with CSS than in the past as far as skinning, fonts, and so forth. Great stuff.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;However, it's still in beta, and I stumbled across what appears to be more of an API/OOP design flaw than a bug, but nevertheless still feels like something is broken, so here it is:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;When using a Spark List component, you may want to reskin the Scrollbar (let's face it, the default scrollbars are UGLY). To skin the scrollbar, you would implement a new skin class for the part of the scrollbar that you want to alter, then simply apply it to that element of the scrollbar. The easiest way to to this would be to just copy the content of the default skin class, put it in a new class, modify it to suit your needs, then apply it in place of the default one. Note that the Spark documentation says this is the way to go; you shouldn't override or extend skin classes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;However, the default scrollbar skin for the increment and decrement arrows contains an "Arrow" MXML piece. Remember, this is the SKIN class, not the implementation class. Even if I omit the skin class entirely, I would expect the app to still compile and run; a null check would avoid any errors, though you may not see a skin for the scrollbar, or a default system skin would be used; something other than the app completely breaking without any compile-time errors.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can find the Spark skin classes in [FB Install folder]/sdks/[version]/frameworks/projects/sparkskins/src/mx/skins/spark, which is great; using them as a starting point for skinning you Spark components makes this actually very easy.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Anyway, in those default Arrow classes (the ones I'm interested in are ScrollBarUpButtonSkin, and ScrollBarDownButtonSkin), you'll see this MXML fragment:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt; &amp;lt;!-- arrow --&amp;gt;&lt;br /&gt;    &amp;lt;s:Path horizontalCenter=&amp;quot;0&amp;quot; verticalCenter=&amp;quot;-1&amp;quot; id=&amp;quot;arrow&amp;quot;&lt;br /&gt;          data=&amp;quot;M 3.5 0.0 L 7.0 7.0 L 0.0 7.0 L 3.5 0.0&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;s:fill&amp;gt;&lt;br /&gt;            &amp;lt;s:RadialGradient rotation=&amp;quot;90&amp;quot; focalPointRatio=&amp;quot;1&amp;quot;&amp;gt;    &lt;br /&gt;                &amp;lt;s:GradientEntry id=&amp;quot;arrowFill1&amp;quot; color=&amp;quot;0&amp;quot; alpha=&amp;quot;0.65&amp;quot; /&amp;gt;&lt;br /&gt;                &amp;lt;s:GradientEntry id=&amp;quot;arrowFill2&amp;quot; color=&amp;quot;0&amp;quot; alpha=&amp;quot;0.8&amp;quot; /&amp;gt;&lt;br /&gt;            &amp;lt;/s:RadialGradient&amp;gt;&lt;br /&gt;        &amp;lt;/s:fill&amp;gt;&lt;br /&gt;    &amp;lt;/s:Path&amp;gt;              &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now, I don't want that, because I'm drawing some very custom shape in place of this default arrow. So, I omit that MXML fragment, and replace it with a Graphic object, in which I use the new drawing MXML stuff to create a new arrow.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;&amp;lt;s:Graphic width=&amp;quot;25&amp;quot; height=&amp;quot;20&amp;quot;&amp;gt;   &lt;br /&gt;  &amp;lt;s:Path data=&amp;quot;M 0 0 &lt;br /&gt;    L 25 0 &lt;br /&gt;    L 25 10&lt;br /&gt;    L 12.5 20&lt;br /&gt;    L 0 10&lt;br /&gt;    L 0 0&amp;quot; &amp;gt;&lt;br /&gt;   &lt;br /&gt;   &amp;lt;s:stroke&amp;gt;&lt;br /&gt;    &amp;lt;s:SolidColorStroke color=&amp;quot;0x29a094&amp;quot;/&amp;gt;&lt;br /&gt;   &amp;lt;/s:stroke&amp;gt;&lt;br /&gt;   &lt;br /&gt;   &amp;lt;s:fill&amp;gt;&lt;br /&gt;    &amp;lt;s:LinearGradient rotation=&amp;quot;90&amp;quot;&amp;gt;&lt;br /&gt;     &amp;lt;s:GradientEntry color=&amp;quot;0xFFFFFF&amp;quot; alpha=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;     &amp;lt;s:GradientEntry color=&amp;quot;0x7ac8c5&amp;quot; alpha=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;/s:LinearGradient&amp;gt;&lt;br /&gt;   &amp;lt;/s:fill&amp;gt;&lt;br /&gt;   &lt;br /&gt;  &amp;lt;/s:Path&amp;gt;&lt;br /&gt; &amp;lt;/s:Graphic&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;After making the new class with the Graphic element instead of the old "arrow" drawing path one, I applied it to my Spark List component and compiled; new errors. I ran the program though, and it crashed right away. The error was that the "arrow" property could not be found, and there was no default value, etc. So, out of curiosity (and the desire to get the app running), I just added a public var, "arrow" : Object, and again compiled without errors. Running it though caused another error, and then another, because "arrowFill1" and "arrowFill2" were not found, no default value, etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, I had to add these three public vars to my custom class to get the app to run.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="postcode"&gt;&lt;br /&gt;// don't remove these, they are placeholders for the wonky &amp;quot;arrow&amp;quot; mxml that isn't needed here.&lt;br /&gt;public var arrow : Object = { };&lt;br /&gt;public var arrowFill1 : uint = 0;&lt;br /&gt;public var arrowFill2 : uint = 0;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;After that it worked.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To me, this is broken; as long as the skin class is properly made, it shouldn't need to contain ANYTHING in order to run properly, as long as any necessary interfaces are implemented (a well built API should be interface based). Implementation of functional objects should not be a concern of the skin class. But it is; you have to put in those dummy properties to get this to work.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I circulated this find, and the consensus seemed to be that yes, this should be fixed; there's no reason a required visual object should be in a skin class, circumventing compile time errors and crashing the entire app when it tries to instantiate a skin for a scrollbar. Evidently, more hacking away found that this is the case in a number of Spark skins.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Insurmountable? Nah, just add the public properties to satisfy the Spark parent component demand for whatever it's looking for. But it's wonky and, as far as the consensus of the people I referred the error to, should be addressed by Adobe before the product is released, for the sake of elegance if nothing else.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As always, thanks for visiting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-8898914598264135572?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/8898914598264135572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/12/flash-builder-spark-skinning-issue-to.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/8898914598264135572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/8898914598264135572'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/12/flash-builder-spark-skinning-issue-to.html' title='Flash Builder: Spark Skinning Issue to look out for (hopefully they&apos;ll fix this)'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-7815298229127958124</id><published>2009-09-09T10:57:00.001-07:00</published><updated>2009-09-09T11:03:07.828-07:00</updated><title type='text'>Put an image (or whatever) next to any character in a TextField that wraps and is multiline.</title><content type='html'>Somebody on the Adobe AZFPUG (Arizona Flex Programmer's User Group) asked today, "I have a TextField that is multiline, and has numerous wrapped lines. I want to be able to put an image RIGHT NEXT to the last character. How?"&lt;br /&gt;&lt;br /&gt;Most of the responses were along the lines of "get the x loc of the textfield, and get the width, then get the y loc, and the height, then put the image". &lt;br /&gt;&lt;br /&gt;That'll always put it to the lower left of the TextField. It won't put it next to the last (or any) character within the TextField. &lt;br /&gt;&lt;br /&gt;I've dealt with this before, and was surprised to see that this person was really having a hard time finding a solution. So I gave her one: Here it is.&lt;br /&gt;&lt;br /&gt;If you're not familiar with getCharBoundary ( indexOfChar ), look it up. It can save your life. It returns a rectangle that bounds any character you specify in a text field. A rectangle has an x, y, width, height. So you get the rectangle, do the math as below, and voila...place your display object. &lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;private function doIt ( ) : void&lt;br /&gt;{&lt;br /&gt; // can be anything, movieclip, combobox, image, whatever&lt;br /&gt; var img : Image = new Image ( );&lt;br /&gt; img.source = "timprofile.jpg";&lt;br /&gt; &lt;br /&gt; addChild ( img );&lt;br /&gt;   &lt;br /&gt; _txt = new TextField ( );&lt;br /&gt; _txt.x = 100;&lt;br /&gt; _txt.y = 100;&lt;br /&gt; _txt.multiline = true;&lt;br /&gt; _txt.wordWrap = true;&lt;br /&gt; _txt.width = 200;&lt;br /&gt; _txt.height = 200;&lt;br /&gt; _txt.text = "Hello how are you I am fine ok that's very nice thank you ok let's wrap some text I hope this wraps let's wrap it up nice ok";&lt;br /&gt; &lt;br /&gt; rawChildren.addChild ( _txt );&lt;br /&gt; &lt;br /&gt; var r : Rectangle = _txt.getCharBoundaries ( _txt.text.length - 1 );&lt;br /&gt; &lt;br /&gt; img.x = _txt.x + r.x + r.width;&lt;br /&gt; img.y = _txt.y + r.y;&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As always, thanks for visiting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-7815298229127958124?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/7815298229127958124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/09/put-image-or-whatever-next-to-any.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/7815298229127958124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/7815298229127958124'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/09/put-image-or-whatever-next-to-any.html' title='Put an image (or whatever) next to any character in a TextField that wraps and is multiline.'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-6506274923835385990</id><published>2009-08-11T05:23:00.000-07:00</published><updated>2009-08-11T05:59:17.632-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='symlinks'/><title type='text'>(To Unix guy) Yes, it does...Windows Has Symlinks.</title><content type='html'>This is one really started to irk me lately, so here we go. &lt;br /&gt;&lt;br /&gt;Qualifier: I am not a Windows fanboi at all. My primary machines are Macs, with a Windows box for Windows-only games and testing, and a remote one for development (I have two, one Centos, the other Windows Server). However, I am not a Mac fanboi either. The primary reason I own Macs is that in my field, most people work on Macs. Mac is also ruling the roost of UI-think these days, and I'm a UI developer. If and when the wheel turns, depending on the wants and needs of my clients, I will too. The ability to reinvent yourself is what keeps you viable and current; just ask David Bowie or Will I Am. &lt;br /&gt;&lt;br /&gt;That said, to all the Unix guys who wave symlinks in the face of the Windows developer:&lt;br /&gt;&lt;br /&gt;WINDOWS HAS SYMLINKS. YES IT DOES. THEY ARE CALLED NTFS JUNCTIONS. &lt;br /&gt;&lt;br /&gt;I post this because recently, a friend who runs a business got shafted by some PHP developer, who got in over his head, screwed up his site, and suddenly "wasn't available". He got the entire site zipped up and sent it to me. It didn't work when I just dumped it into XAMPP on a Windows dev box I have running; the pages were requesting directories that didn't exist in the file structure I was sent. &lt;br /&gt;&lt;br /&gt;I contacted him, and he responded, "what are you running it on", I said, "oh, a Windows box". He said, "you can't do that, the site uses symlinks". &lt;br /&gt;&lt;br /&gt;While I understand the "why" of why he did this (easily point at other directories to try other versions), I don't really think it's in the interests of the client (and therefore, isn't a good idea). You can just rename directories to try alternate versions of a codebase. It also defeats the purpose of the whole "can run on anything" mantra; as far as this developer knew, he had tied a basic PHP site to Unix-based OSs, with the thought that, "you shouldn't run Windows". My friend (the business owner) had no knowledge of this decision whatsoever, as far as he knew, PHP ran anywhere, mySQL ran anywhere, the site was portable. &lt;br /&gt;&lt;br /&gt;So here's a pro note: don't tie your websites to a particular platform unless you have to, and inform your client if you do, that "you will not be able to move this to Windows", or ".Net is, in practical terms, Windows technology. Your site will not be directly portable, if at all, to Unix/Linux". &lt;br /&gt;&lt;br /&gt;Anyway, I responded, "that doesn't matter, Windows has symlinks". &lt;br /&gt;&lt;br /&gt;He responded, and I have heard this from people at a particular startup I did some work for not long ago, who considered themselves superior to anybody that touched a Windows machine, "Windows doesn't have symlinks". &lt;br /&gt;&lt;br /&gt;And like I said then:&lt;br /&gt;&lt;br /&gt;YES IT DOES. THEY ARE CALLED NTFS JUNCTIONS. &lt;br /&gt;&lt;br /&gt;So, either get the Windows Server Resource Kit to get the "linkd" tool, or just get the small, free Junction tool that's been around for a few years. If you have either of them though, it's a breeze. &lt;br /&gt;&lt;br /&gt;With Junction (which is what I use), it's as easy as:&lt;br /&gt;&lt;br /&gt;- Create an empty directory (your "symlink"). &lt;br /&gt;- junction c:\path\simlinkname c:\path\actualdirectory. &lt;br /&gt;&lt;br /&gt;That's it. There's also commands to inspect directories for symlinks, delete them, and so on. &lt;br /&gt;&lt;br /&gt;Note that, as far as I know, symlinks to directories on remote shares are not supported by Windows. This may not be true on the newer server versions, I dunno. &lt;br /&gt;&lt;br /&gt;Here's a list to Junction (which I use now instead of moving around the whole Windows Server Resource Kit, which you can look up if you're so inclined):&lt;br /&gt;&lt;br /&gt;http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx&lt;br /&gt;&lt;br /&gt;Happy Windows symlinking!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-6506274923835385990?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/6506274923835385990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/08/to-unix-guy-yes-it-doeswindows-has.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/6506274923835385990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/6506274923835385990'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/08/to-unix-guy-yes-it-doeswindows-has.html' title='(To Unix guy) Yes, it does...Windows Has Symlinks.'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-3707520137635463506</id><published>2009-07-30T07:04:00.000-07:00</published><updated>2009-07-30T07:29:07.715-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='images'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='masks'/><title type='text'>Flex: Masking Images using other remotely loaded images</title><content type='html'>I had to do this recently, due to their being a very large number of images in the project I'm working on, which needed the backgrounds knocked out; it was easy to generate the masks in an automated way, it was not easy to alter the images to alpha out the backgrounds. &lt;br /&gt;&lt;br /&gt;In Flex, they say one display object can work as a mask for another. This is true of course, but for dual remotely loaded images,  properly making sure the images are entirely loaded via load.complete events, and so forth, is the key. &lt;br /&gt;&lt;br /&gt;The following little technique shows this, code snippet below. This is proving to be quite a timesaver for the team as a whole, since the graphics guys don't have to worry about altering their entire catalog of images. I've already recommended that a back-end process should generate AND apply the masks so that Flash doesn't have to make 2x the requests for images (every image needs a mask): from a performance standpoint this is a bit of a nightmare, but, it's a solution that is moving the project forward and is easy enough on my end to implement. &lt;br /&gt;&lt;br /&gt;Note that the images I'm using for masks are not the standard black/white masks you use in photoshop. They are PNG-8s, with everything BUT the shape you want to see alpha'd out, with 8 colors, not converted to sRGB, no metadata, etc. A roughly 400x400 image mask comes in at around 2kb with this profile. &lt;br /&gt;&lt;br /&gt;I'm aware this isn't exactly new, and it's documented, but it's solving such a significant problem I figured I'd make it visible. I actually use this code snippet in an itemrenderer, so that I can just chuck an array of objects at a tilelist, and have the item renderer do the two-step loading. &lt;br /&gt;&lt;br /&gt;Notice also: &lt;br /&gt;&lt;br /&gt;- I'm combining pngs and jpgs, it doesn't matter it's all rendered as bitmaps by the client in the end anyway. &lt;br /&gt;- I'm using a two-step loading chain; it seems you don't have to do this necessarily, but every now and then, it seems to fail if you don't. The two step ensures the mask is ready to go before the image every time. &lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;  import mx.controls.Image;&lt;br /&gt;  import mx.events.FlexEvent;&lt;br /&gt;  &lt;br /&gt;  private var _mask : Image;&lt;br /&gt;  private function onCreationComplete ( event : FlexEvent ) : void&lt;br /&gt;  {&lt;br /&gt;   _mask = new Image ( );&lt;br /&gt;   _mask.cacheAsBitmap = true;&lt;br /&gt;   _mask.addEventListener ( Event.COMPLETE, onMaskLoadComplete );&lt;br /&gt;   _mask.load ( "images/testmasks/picturemask.png" );&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private var _img : Image;&lt;br /&gt;  private function onMaskLoadComplete ( event : Event ) : void&lt;br /&gt;  {&lt;br /&gt;   _img = new Image ( );&lt;br /&gt;   _img.cacheAsBitmap = true;&lt;br /&gt;   _img.addEventListener ( Event.COMPLETE, onImageLoadComplete );&lt;br /&gt;   _img.load ( "images/testmasks/picture.jpg" );&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private function onImageLoadComplete ( event : Event ) : void&lt;br /&gt;  {&lt;br /&gt;   addChild ( _img );&lt;br /&gt;   addChild ( _mask );&lt;br /&gt;   _img.mask = _mask;&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As always, thanks for visiting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-3707520137635463506?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/3707520137635463506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/07/flex-masking-images-using-other.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/3707520137635463506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/3707520137635463506'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/07/flex-masking-images-using-other.html' title='Flex: Masking Images using other remotely loaded images'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-7846407319616951018</id><published>2009-06-22T09:58:00.000-07:00</published><updated>2009-06-23T14:19:53.533-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xenapp'/><category scheme='http://www.blogger.com/atom/ns#' term='Mate'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon'/><category scheme='http://www.blogger.com/atom/ns#' term='citrix'/><category scheme='http://www.blogger.com/atom/ns#' term='s3'/><category scheme='http://www.blogger.com/atom/ns#' term='ec2'/><category scheme='http://www.blogger.com/atom/ns#' term='air'/><title type='text'>TcozTwitter: A Twitter Client using Adobe Air and the Flex Mate Framework - Day 7: Running on the iPhone...really?</title><content type='html'>This post covers my progress developing a Twitter client using the technologies mentioned in the article title, but also takes another interesting turn. I've been working on the side with Citrix to understand their latest &lt;a href="http://www.citrix.com/english/ps2/products/product.asp?contentid=186"&gt;XenApp Server&lt;/a&gt; product, and how a Flash/Flex/Air developer might be able to leverage it. To this end, I decided to branch my Air code base, and use what I've already done to drive forward a version of TcozTwitter that could be delivered on the iPhone...or any mobile device for that matter.&lt;br /&gt;&lt;br /&gt;Notice I said “branch”, not “start all over again with a different technology”, and “any mobile device”, not just “iPhone”. Those are the important things to get here. More on that in a minute. &lt;br /&gt;&lt;br /&gt;If you're interested in the history, links to all the previous blog articles are at the end of the article. &lt;br /&gt;&lt;br /&gt;To summarize, here's the “thin line” of technologies you'll need to be familiar with, if you want more detailed summaries, look at the links at the bottom of this article:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2 Cloud and S3&lt;/a&gt;. EC2 is essentially a vast pool of processing power that you can isolate a piece of to run whatever you need. I frequently liken it to a ball of clay; you grab a chunk and shape it the way you want; when you're done, you take a snapshot of the configuration (so that you can “restart” it from where you left off), and put the chunk back on the bigger ball. S3 is “Simple Storage Service”. It's basically a huge pool of storage space that you can access via an API or one of many downloadable clients. When you take your “snapshot” of your “chunk” (or in EC2 parlance, when you “bundle” your “instance” into an “AMI”), the AMI is saved to a “bucket” (essentially a directory) that you've previously created in S3. When you “restart” your instance, you point to the configuration file that gets stored with your AMI data, fire it up, and there ya go.  &lt;br /&gt;&lt;a href="http://www.citrix.com/english/ps2/products/product.asp?contentid=186"&gt;XenApp Server and Desktop&lt;/a&gt;. There's a lot to this technology, but I'm focusing on the iPhone-tweaked version of the product, which you can &lt;a href="http://www.infoworld.com/d/developer-world/citrix-developing-xenapps-and-xendesktop-iphone-645"&gt;read about here&lt;/a&gt;. Briefly, XenApp and Desktop are server-side software that “virtualizes” applications and allows you to view them over a variety of different clients. You install whatever app on a server—any technology that the server supports is fine—then “publish” it via the XenApp software so that it can be accessed remotely by Citrix Viewer and Receiver clients. Citrix has published an AMI in the EC2 cloud that you can use to experiment with. Remember, an AMI is a saved configuration, ready to go. All you need to do is go the cloud, fire it up, install your app, publish it, and remote clients can access and run it. The Citrix XenApp AMI is a demo that times out in three months; plenty of time to learn your way around.&lt;br /&gt;Flex/Air, and Mate. Flex is an ActionScript 3 component framework used to build applications that run in the Flash player, Mate is a Flex-specific framework, heavily leveraging MXML, to simplify and organize building applications with Flex and ActionScript 3. I'm using Mate purely to familiarize myself with it. I'll say this; compared to other frameworks, it's pretty easy to get your head around, and it does simplify a lot of tasks. I have some concerns, but that's true of any prescribed development approach.&lt;br /&gt;The iPhone. Enough said about that I think, and then some. &lt;br /&gt;&lt;br /&gt;You'd be surprised, once you know exactly how it all works, how easy it is to set this all up and get basic applications working. I can publish an app, or an app update in a matter of minutes. &lt;br /&gt;&lt;br /&gt;Here's some screenshots of my Twitter client, running on the iPhone, using all the above mentioned technologies:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/citrix/twitterclient_citrix_pic2.PNG" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/citrix/twitterclient_citrix_pic3.PNG" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/citrix/twitterclient_citrix_pic4.PNG" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It really works, even over EDGE on an OG iPhone (as I write this article, I'm actually expecting the delivery guy with my new 3GS 32mb Black. UPDATE, I have the new iPhone, and the Citrix stuff runs great over the 3G network). I leave it up and running on my iPhone while it's docked to see my tweets come in without any page refreshes and whatnot. &lt;br /&gt;&lt;br /&gt;I also have to say, Citrix' luminaries Chris Fleck and Ray Yang have been great. When I started my experiments, I pinged them with a few questions, and they've been supporting my efforts with tech info and advice ever since, because they're interested in my perspective on these technologies. &lt;br /&gt;&lt;br /&gt;It's that perspective that, perhaps, makes this all interesting, so much so that TechCrunch published a story on my findings that stayed on the front page of their site for weeks and sparked a lot of debate, mostly revolving around “There's no need for Flash on the iPhone,” and “why don't you just build a native app”. Flash is a great candidate for building mobile apps. The industry just seems to have a variety of issues that prevent it from getting out there on mobile devices, and I have good reason to believe they're not primarily technical ones. &lt;br /&gt;&lt;br /&gt;Anyways, I'm an independent developer; in a nutshell, that means I go from contract to contract, building various kinds of applications for various kinds of clients of all sizes. I've worked for Microsoft, Viacom, Thomson Reuters, IAG Research, American Express, CitiGroup, IEEE/Spectrum, and a slew of smaller shops and startups. I'm pretty proud of my portfolio, and I work hard to stay cutting edge; I run servers to host all kinds of development environments and server software, like Flash Media Server, TomCat, BEA WebLogic, MAMP, Red5, Blaze, Ruby/Rails, .Net, Air, SVN, FTP, mySQL, SQL Server, Oracle Comm. Edition, etc. etc. &lt;br /&gt;&lt;br /&gt;It's a lot of work, and isn't cheap; sure I write it off, but I have to do the cash layout, and admin/maintain them. IMHO, it's necessary; a good independent developer should know how to put together a good development and staging environment in just about any technology.&lt;br /&gt;&lt;br /&gt;So, enter the Amazon EC2 cloud. Now, I can spin up instances of virtually any kind of development environment...install this and that software/app/etc...save the configs and shut them down...for about 10 cents an hour. After doing the math, that works out to about half what I pay now for a fully dedicated hosted box at a solid host company, and that's only if I leave it up and running 24/7. It's WAY flexible.  For staging and development testing, it's fantastic.&lt;br /&gt;&lt;br /&gt;However, most of what I do for a living involves Flash development. I love the iPhone and have learned Objective C, got my business accepted into the dev program—it turned out to be more than a matter of just paying for it to my surprise—and so on. But I've been working with Flash for a decade, and it's a big disappointment that Flash doesn't run on it. &lt;br /&gt;&lt;br /&gt;Enter XenApps, which Citrix makes available as a demo AMI config in the EC2 cloud. All I have to do is select the AMI, launch it, and I'm looking at a clean build of Windows Server 2k3 with XenApps, Desktop, and all that; everything I need to work with to see if I can deliver a Flash/Flex/Air application to an iPhone. &lt;br /&gt;&lt;br /&gt;I settled on Air, mostly due to the fact that Air doesn't deal with browser security and sandboxes the way that Flash/Flex do; Air is a native runtime, with it's own encrypted data store and access to NativeWindow and other elements that make it a fairly powerful RIA desktop development environment. Crossdomain and such isn't a hassle as well. You can also publish an Air app (which, on Windows, is an .exe) in a very straightforward way from the XenApp environment, as opposed to using AppViewer, which is a .Net app Citrix distributes that you run in lieu of your actual SWF by pointing it at the web page that embeds it. It works and works well, but I figured why bother with web pages and such if I can just run my Flash app in a native runtime environment without the involvement of the browser footprint. &lt;br /&gt;&lt;br /&gt;The connection should be evident; there I was developing a Twitter client in Flex Builder, and publishing it to Air, using the Mate framework. So I decided to marry the two efforts, and see if I could branch my slowly developing Twitter app—it's hard to find spare time, but I fit it in now and then—and see if I could tweak it for delivery to the iPhone via XenApps. &lt;br /&gt;&lt;br /&gt;Yay verily, it worked; I installed the Air runtime on the Windows instance, installed my Air TcozTwitter client, published it through the XenApps server, and pointed the iPhone Citrix Receiver at it, and there it was, touch enabled and all. True, I had to rethink the UI in terms of the iPhone. I've had people say that Flash apps won't port directly to the iPhone because they use mouseovers and such—think about it, the iPhone doesn't have “fingerovers”, which is interesting—but that's true of any technology no matter what. As a UI developer, you have to look at the device, consider the interactivity, and develop your app, using your given technology, in that context. If you factor your code well and the UI is truly abstracted, this isn't that big a deal though at all, certainly a heck of a lot less work than writing the whole thing all over again in Objective C...and then Symbian...and then Android...and then Windows Mobile...and then Blackberry...and whatever else winds up getting cranked out of BigTech Labs XYZ.&lt;br /&gt;&lt;br /&gt;Here's points I found to be VERY interesting about this manner of development:&lt;br /&gt;&lt;br /&gt;I'm not an “enterprise”, I'm an independent developer. But, I don't just write code for clients, I build things off to the side to keeps my chops fresh and who knows, maybe make some money. I find that this technology, although created by Citrix which is typically associated with “enterprise”, works for me. The Citrix guys seemed to find that interesting too. A library of demo apps that I can bang off a single EC2 instance is also a powerful demo tool for landing contracts. As I mentioned once before, I could probably get work just by having put all this together. &lt;br /&gt;With just UI refactors, I can roll out the same codebase to any mobile device that Citrix has written a Receiver for. They've covered a number of them, see their website for more info.&lt;br /&gt;The XenApps “tweaked” version I'm working with, via the Receiver, presents your apps as a selectable library; so, the user downloads ONE app (the phone-specific Receiver), and they can access ALL the apps that I publish though XenApps.&lt;br /&gt;Consider the above...all I have to do, to deploy a new app to my entire userbase, or update one, is install it on my EC2 instances, which you access via RDP or the Citrix Receiver desktop app (I use the Mac version). No app store approval iterations. It'll be interesting to see how this shakes out. &lt;br /&gt;Because the app runs on a regular server, I don't have the development restrictions inherent on the iPhone. I can make any number of network connections of any kind, store data in a variety of ways locally, and whatever else I need to do. The available technology I can use to drive my apps is essentially unlimited. &lt;br /&gt;For proving out concepts and getting user reactions, this can't be beat. I can build apps rapidly in one codebase, get them deployed to all kinds of devices, and see what users think. What hits on a Symbian may not hit on an iPhone. Depending on the reaction, I can decide to build a native app, or abandon the effort for a given platform. &lt;br /&gt;&lt;br /&gt;There are some things I have yet to figure out, the Citrix guys say they are interested in helping me find solutions:&lt;br /&gt;&lt;br /&gt;Encrypted data store in the Air runtime is having some issues; I believe these are probably related to the permissions that XenApp is using to run apps under; some server config will probably solve this, if not, I can always just dump everything to a SQL DB or some such.&lt;br /&gt;iPhone mechanisms, like the auto-complete for text, the new cut 'n paste, and such, don't work, because the app isn't actually running on the phone. Fixable, because I can just build the capability into the application, and just make sure I emulate the iPhone look 'n feel. The investment of time can in fact give me the same look and feel consistently across any device...nice for my end users on different platforms, and of course very useful looking forward to things like NetBooks and touchscreen e-readers.&lt;br /&gt;&lt;br /&gt;Will I abandon building native apps for the iPhone, and whatever else I find the time to learn how to build apps for? Of course not. There's money to made out there, and different development technologies is something I'm interested in. So, the Objective C book and Xcode will still take up space on my hard drive, and be frequently used. &lt;br /&gt;&lt;br /&gt;But, if I work with a client that needs apps rapidly deployed to a variety of devices, without going through the rigor of building multiple versions and maintaing multiple code trees, will I be glad that I learned how to do this...and, will I continue to ensure that apps I build are constructed in such a way where I can branch and get a version running on the iPhone this way in relatively little-to-no time? &lt;br /&gt;&lt;br /&gt;You bet. Citrix has most definitely found a place in this independent developer's toolbox. &lt;br /&gt;&lt;br /&gt;I wonder how many other contract Flash developers have said that. &lt;br /&gt;&lt;br /&gt;As always, thanks for visiting. &lt;br /&gt;&lt;br /&gt;Article Links:&lt;br /&gt;&lt;br /&gt;TcozTwitter: A Twitter Client using Adobe Air and the Flex Mate Framework: &lt;a href="http://www.tcoz.com/blogger/2009/05/tcoztwitter-twitter-client-using-adobe.html"&gt;Day 1&lt;/a&gt;, &lt;a href="http://www.tcoz.com/blogger/2009/05/tcoztwitter-twitter-client-using-adobe_28.html"&gt;Day 2&lt;/a&gt;, &lt;a href="http://www.tcoz.com/blogger/2009/05/tcoztwitter-twitter-client-using-adobe_31.html"&gt;Day 3&lt;/a&gt;, &lt;a href="http://www.tcoz.com/blogger/2009/06/tcoztwitter-twitter-client-using-adobe.html"&gt;Day 4&lt;/a&gt;, &lt;a href="http://www.tcoz.com/blogger/2009/06/tcoztwitter-twitter-client-using-adobe_12.html"&gt;Day 5&lt;/a&gt;, and &lt;a href="http://www.tcoz.com/blogger/2009/06/tcoztwitter-twitter-client-using-adobe_17.html"&gt;Day 6&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Flash/Flex...on the iPhone? &lt;a href="http://www.tcoz.com/blogger/2009/05/flash-flexon-your-iphone.html"&gt;Initial Exploration&lt;/a&gt;, &lt;a href="http://www.tcoz.com/blogger/2009/05/citrix-interview-thing-client.html"&gt;Follow up with Citrix&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Why the Amazon EC2 Could and S3 is a great thing for the independent developer, &lt;a href="http://www.tcoz.com/blogger/2009/06/why-amazon-ec2-is-great-thing-for-indie.html"&gt;Article Link&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-7846407319616951018?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/7846407319616951018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/tcoztwitter-twitter-client-using-adobe_22.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/7846407319616951018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/7846407319616951018'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/tcoztwitter-twitter-client-using-adobe_22.html' title='TcozTwitter: A Twitter Client using Adobe Air and the Flex Mate Framework - Day 7: Running on the iPhone...really?'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-7100147722788443408</id><published>2009-06-19T07:02:00.000-07:00</published><updated>2009-06-19T08:39:32.038-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iPhone 3G S Unboxed, and some immediate things I noticed...</title><content type='html'>Here it is, in all it's shiny new glory. Time to upgrade from the OG (though I will keep it on as a developer device...it's still a perfectly good phone).&lt;br /&gt;&lt;br /&gt;Some immediate things:&lt;br /&gt;&lt;br /&gt;- Looks like WiFi settings don't roll over on a fully sync, I had to dig up two of my old wifi keys. &lt;br /&gt;- Compass looks like it's subject to interference. I had it near a monitor and a wireless mouse, aside from that I can't see any powerful magnets or wireless devices that would cause undue interference. &lt;br /&gt;- The home button doesn't "click" anymore, you just touch it. EDIT wrong...it was just sticky. It clicks. &lt;br /&gt;- Initially, the Tekkeon "MyPower" battery/sleeve I bought, which worked fine with the iPhone OG and says it works for the 3GS on their website, reports "charging is not supported with this accessory" on the 3GS. Not good. &lt;br /&gt;- The restore went VERY quickly; the 8mb from my OG iphone was done in about five minutes. &lt;br /&gt;- It doesn't come with a little dock. &lt;br /&gt;- The OG docks doesn't seem to fit. &lt;br /&gt;&lt;br /&gt;Compass Fail:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/iphoneunbox/compass.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tekkeon Fail:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/iphoneunbox/img_0332.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;iPhone Unbox:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/iphoneunbox/img_0318.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/iphoneunbox/img_0319.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/iphoneunbox/img_0320.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/iphoneunbox/img_0321.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/iphoneunbox/img_0322.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/iphoneunbox/img_0323.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/iphoneunbox/img_0324.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/iphoneunbox/img_0325.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/iphoneunbox/img_0326.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/iphoneunbox/img_0327.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/iphoneunbox/img_0328.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/iphoneunbox/img_0329.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/iphoneunbox/img_0330.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/iphoneunbox/img_0331.jpg" /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-7100147722788443408?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/7100147722788443408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/iphone-3g-s-unboxed.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/7100147722788443408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/7100147722788443408'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/iphone-3g-s-unboxed.html' title='iPhone 3G S Unboxed, and some immediate things I noticed...'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-6738256963505383268</id><published>2009-06-17T13:59:00.001-07:00</published><updated>2009-06-17T15:21:45.113-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='Mate'/><category scheme='http://www.blogger.com/atom/ns#' term='citrix'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='air'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><title type='text'>TcozTwitter: A Twitter Client using Adobe Air and the Flex Mate Framework - Day 6: Running on the iPhone</title><content type='html'>It's been a few days since my last post, but I've been VERY busy. Swift3d V6 is out (it's great 3d modeling and animation software, very Flash and Papervision friendly), I'm still skilling up my iPhone dev chops, I'm digging in to Flash Media Server 3.5.2, my current contract is coming to release (V1.0 of Thomson Reuters Insider), and...well, you get the idea. &lt;br /&gt;&lt;br /&gt;If you've been following my blog, you know I've been working with Citrix to use their XenApps image in the Amazon EC2 cloud to deliver Flash/Flex/Air apps to the iPhone using the Citrix Receiver. You can view the previous post links on the right of the blog page, or search for "iPhone" and "Citrix" tags to review previous posts on how I'm going about this. &lt;br /&gt;&lt;br /&gt;I've got the issues sorted for the most part: design parameters for an iPhone app delivered this way, how to get rid of the Adobe Air EULA so that users don't have to click through it, and so forth. I've even got ads integrated (I'm running an OpenAds server that I've set up a couple of campaigns on for friends that own businesses...free ads for them, proof of concept for me). &lt;br /&gt;&lt;br /&gt;I'm going to put up a full blog post on the issue, but for now, here's a picture of what I'm looking at on my iPhone. I just leave it up in my iPhone doc, and see my tweets come in without any refreshes; it's a fairly real-time twitter client. I've even tried it over the EDGE network, it works fine (remember, that client is actually not running on the iPhone). No awkward refreshes like standard VNC or RDP, etc. &lt;br /&gt;&lt;br /&gt;With this as a base, adding features to complete the functionality is pretty straightforward. I'll be adding a login screen (right now it just uses my creds), a post-tweet screen, a fancy loader, and all that. But it's all just Flash development at this point, the mechanism to deliver it to the iPhone running as a native app, all I need to do is update the Air app on the EC2 cloud instance to deploy a new version; users of the Citrix Receiver won't have to update the app, they'll just have to restart the Citrix client. &lt;br /&gt;&lt;br /&gt;Pic below, detailed blog post in next couple of days. Interestingly enough, there's not that much to tell. If you know how to put it all together, it's actually pretty easy to set it all up. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/citrix/tcoztwitter_citrix_pic1.png" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-6738256963505383268?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/6738256963505383268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/tcoztwitter-twitter-client-using-adobe_17.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/6738256963505383268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/6738256963505383268'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/tcoztwitter-twitter-client-using-adobe_17.html' title='TcozTwitter: A Twitter Client using Adobe Air and the Flex Mate Framework - Day 6: Running on the iPhone'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-7282863989807628981</id><published>2009-06-12T04:54:00.000-07:00</published><updated>2009-06-12T06:24:00.001-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='Mate'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='air'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><title type='text'>TcozTwitter: A Twitter Client using Adobe Air and the Flex Mate Framework - Day 5 : Multiple views, control bar, and Mate wishlist item</title><content type='html'>This is a continuation of a series of articles on my experiments with writing a Twitter desktop client using the Twitter API, the Mate Framework for Flex, and Adobe Air. Previous blog posts are here at &lt;a href="http://www.tcoz.com/blogger/2009/05/tcoztwitter-twitter-client-using-adobe.html"&gt;Day 1&lt;/a&gt;, &lt;a href="http://www.tcoz.com/blogger/2009/05/tcoztwitter-twitter-client-using-adobe_28.html"&gt;Day 2&lt;/a&gt;, &lt;a href="http://www.tcoz.com/blogger/2009/05/tcoztwitter-twitter-client-using-adobe_31.html"&gt;Day 3&lt;/a&gt;, and &lt;a href="http://www.tcoz.com/blogger/2009/06/tcoztwitter-twitter-client-using-adobe.html"&gt;Day 4&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This time around, I decided to get two views working: the public timeline, and my own @tcoz_tweet timeline, the latter of which is made up of my own tweets, and tweets by the members I follow. &lt;br /&gt;&lt;br /&gt;To accomplish this, clearly I needed a way to organize different list views, and a way to switch between them. From a UI perspective, naturally a control bar seemed to be the way to go. Anticipating this, I'd already left some space at the top of the application above where tweets appear, and it turned out to be just enough; 35 pixels to be precise. &lt;br /&gt;&lt;br /&gt;A quick look at the current state:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/twitterclient/day5_1.png" /&gt;&lt;br /&gt;&lt;br /&gt;Starting to finally look like something isn't it? This might not be my final design, but it serves the current purpose, and doesn't look all that bad. Notice the "next" button, which currently doesn't do anything--there's nothing to go "Next" to yet--but from a forward-looking perspective, I plan on integrating search, profile views, that sort of thing. It seemed like a good idea to assume I'll need more room than what's in that one strip. &lt;br /&gt;&lt;br /&gt;If you're curious how I'm doing the skinning, note that there are no embedded or static images of any kind being used as backgrounds for the tweets, the buttons, or any other such thing; everything is done with the AS3 drawing API. The matrix object makes gradient fills very easy--well, compared to how they used to be--with the createGradientBox utility method. Here's a sample of how I put together gradient fills:&lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;var matrix : Matrix = new Matrix ( );&lt;br /&gt;   matrix.createGradientBox ( width, height, Math.PI / 2 );&lt;br /&gt;   graphics.beginGradientFill ( GradientType.LINEAR, Model_Config.getInstance ( )._tweetColors, [ 1, 1 ], [ 128, 255 ], matrix );&lt;br /&gt;   graphics.drawRect ( 0, 0, width, height );&lt;br /&gt;   graphics.endFill ( );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note that I'm pulling the colors for the gradient off of my Model_Config object and applying it to the graphics object of my view. In my coding style, Models are frequently singletons, and if you recall from a previous article, I populate this model with data from an XML file, which the user can edit to alter the appearance of certain UI elements, like the background colors of tweets (again, thanks for the inadvertent feature request iJustine). Some may say that I should be accessing the data through a proxy, and that accessing Models directly is evil, and in a larger effort, I'd tend to agree. But the deeper I get into this app, the simpler I think it is. Writing a twitter client with even some semi-advanced features isn't all that difficult. &lt;br /&gt;&lt;br /&gt;Now, you notice that I have two buttons that matter at this point: My Timeline, and Public Timeline. Click one, see one, click the other, see the other. Again, from a previous article, you know that I'm pulling collections of objects from the Twitter API, and binding them into lists. To toggle these list views, I decided to use a flex ViewStack, and it works like a charm. &lt;br /&gt;&lt;br /&gt;If you're not familiar with ViewStack, it's a component that makes it easy to swap the currently visible view. All you do is set the selectedItem property on it to bring the desired view to the top: 0 is the first item in the stack, and so on. Here's the code:&lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;&amp;lt;mx:ViewStack id=&amp;quot;timelineViewStack&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; creationPolicy=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;mx:Canvas label=&amp;quot;My Timeline&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; backgroundAlpha=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;mx:TileList id=&amp;quot;userAndFriendsList&amp;quot; backgroundAlpha=&amp;quot;0&amp;quot; borderStyle=&amp;quot;none&amp;quot;&lt;br /&gt;      height=&amp;quot;100%&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;      itemRenderer=&amp;quot;com.tcoz.twitterclient.renderers.Renderer_Tweetr&amp;quot; &lt;br /&gt;      paddingBottom=&amp;quot;0&amp;quot; paddingTop=&amp;quot;0&amp;quot; paddingLeft=&amp;quot;0&amp;quot; paddingRight=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt; &amp;lt;/mx:Canvas&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;mx:Canvas label=&amp;quot;Public Timeline&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; backgroundAlpha=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;mx:TileList id=&amp;quot;publicList&amp;quot; backgroundAlpha=&amp;quot;0&amp;quot; borderStyle=&amp;quot;none&amp;quot;&lt;br /&gt;      height=&amp;quot;100%&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;      itemRenderer=&amp;quot;com.tcoz.twitterclient.renderers.Renderer_Tweet&amp;quot; &lt;br /&gt;      paddingBottom=&amp;quot;0&amp;quot; paddingTop=&amp;quot;0&amp;quot; paddingLeft=&amp;quot;0&amp;quot; paddingRight=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt; &amp;lt;/mx:Canvas&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/mx:ViewStack&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pretty simple; the ViewStack is a top-level MXML wrapper. In it, I've got a stack of canvases which act as the swappable views. Inside those canvases, I have my TileList components, which is what I bind my data object arrays to. The TileList takes that array of objects, creates a specified ItemRenderer for each one, and passes it one of the data objects, which has properties that map to a tweet, like name, thumbnail url, etc. The specified item renderer receives that object, which is automatically available as instance name "data", and binds the properties to the UI elements where I specify. Here's the internal of my ItemRenderer, which will power all of the TileLists that display tweets (properties like x/y and such omitted for clarity):&lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;&amp;lt;mx:Image source=&amp;quot;{ data.user.profileImageUrl }&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;mx:Text text=&amp;quot;{ data.user.name }&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;mx:TextArea text=&amp;quot;{ data.text }&amp;quot; /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That's it! The Flex framework makes this pretty easy. It's completely extensible: I make a new API call, like search for tweets, I get back an array of objects from the Tweetr, or my own (I'm currently using both) library. I drop another TileList into the ViewStack, and bind the data to it. I put up a button, which when clicked, sets the selectedItem property of the viewstack, which makes the desired view appear. &lt;br /&gt;&lt;br /&gt;Now, onto something I discovered about Mate. First of all, I have found myself really liking that when I need to dispatch an event from anywhere at all, all I need to do is either do it from a view or from a Mate GlobalEventDispatcher, set it to bubble, and add the handler to my EventMap, which directs it as needed. &lt;br /&gt;&lt;br /&gt;But...there's something missing. Take a look at this code from my evolving EventMap:&lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt; &amp;lt;mate:EventHandlers type=&amp;quot;{ Event_ControlBar.SELECTED_MY_TIMELINE }&amp;quot; debug=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;mate:MethodInvoker generator=&amp;quot;{ Manager_States }&amp;quot; method=&amp;quot;changeTimelineState&amp;quot; arguments=&amp;quot;{ someComputedArg }&amp;quot; /&amp;gt;&lt;br /&gt; &amp;lt;/mate:EventHandlers&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;mate:EventHandlers type=&amp;quot;{ Event_ControlBar.SELECTED_PUBLIC_TIMELINE }&amp;quot; debug=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;mate:MethodInvoker generator=&amp;quot;{ Manager_States }&amp;quot; method=&amp;quot;changeTimelineState&amp;quot; arguments=&amp;quot;{ someComputedArg }&amp;quot; /&amp;gt;&lt;br /&gt; &amp;lt;/mate:EventHandlers&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note that both of these event handlers call the same method on the same Manager object.&lt;br /&gt;&lt;br /&gt;I would very much like to have been able to do something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;&amp;lt;mate:EventHandlers type=&amp;quot;{ Event_ControlBar.SELECTED_PUBLIC_TIMELINE | Event.ControlBar.SELECTED_PUBLIC_TIMELINE }&amp;quot; debug=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;mate:MethodInvoker generator=&amp;quot;{ Manager_States }&amp;quot; method=&amp;quot;changeTimelineState&amp;quot; arguments=&amp;quot;{ ( someComputedArg ) }&amp;quot; /&amp;gt;&lt;br /&gt; &amp;lt;/mate:EventHandlers&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The difference here is, I've set the event handler to accept two events as the trigger with a bitwise OR. So, if either of those events are received, the argument can be determined and passed along to the Manager. This would also be useful for bitwise exclusions, and so forth. &lt;br /&gt;&lt;br /&gt;As far as I can tell, there is no way to do this directly in the EventMap in Mate. Every time you need to receive a different kind of event, even if it's the same arguments, same Manager, same method, etc., you have to create an entirely new MXML fragment and place it in the EventMap. &lt;br /&gt;&lt;br /&gt;In AS3, I'd typically do something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;myObj.addEventListener ( MyEventClass.EVENTONE, onMyEventClassEvent );&lt;br /&gt;myObj.addEventListener ( MyEventClass.EVENTTWO, onMyEventClassEvent );&lt;br /&gt;&lt;br /&gt;private function onMyEventClassEvent ( event : MyEventClass ) : void&lt;br /&gt;{&lt;br /&gt;     if ( event.type == MyEventClass.EVENTONE )&lt;br /&gt;          // do something&lt;br /&gt;     else if ( event.type == MyEventClass.EVENTTWO )&lt;br /&gt;          // do something else&lt;br /&gt;} &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I'm looking further into this, but so far, after searching through the docs and such, I've found no indication that you can use a common handler for multiple event types. It might be possible with a standard if statement or some such, but I was really hoping for the elegance of bitwise operators.&lt;br /&gt;&lt;br /&gt;This is one of my misgivings about Mate, and MXML in general; it's VERBOSE. WAY more verbose than straight code. I suppose that might just be a point of view; some people may prefer the hierarchy of nested markup. At this point in time though, I don't. &lt;br /&gt;&lt;br /&gt;Anyway, that's it this time around. As always, thanks for visiting. &lt;br /&gt;&lt;br /&gt;Next up: refreshing Tweet lists, ensuring I only add the most recent tweets, which means, either issuing a request based on the time of the last received tweet, or just receiving the bulk and trimming off the ones that I've already got in my list.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-7282863989807628981?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/7282863989807628981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/tcoztwitter-twitter-client-using-adobe_12.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/7282863989807628981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/7282863989807628981'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/tcoztwitter-twitter-client-using-adobe_12.html' title='TcozTwitter: A Twitter Client using Adobe Air and the Flex Mate Framework - Day 5 : Multiple views, control bar, and Mate wishlist item'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-2125185738307338116</id><published>2009-06-11T03:30:00.001-07:00</published><updated>2009-06-11T05:42:06.528-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Catalyst'/><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><title type='text'>Flash Catalyst: Why I'm not so sure this is a good idea.</title><content type='html'>If you read this blog, you know I'm a Flash/Flex/Air type developer. I've been working with these technologies in one form or another since ActionScript was called Lingo, and I know where the FS in FSCommand comes from. &lt;br /&gt;&lt;br /&gt;To make my point early on, I am having serious reservations about Catalyst. I saw a live presentation from Adobe yesterday introducing the Catalyst beta, in which I feel the presenter sidestepped my questions regarding how Catalyst was actually a step back, not forward. I've downloaded and played around with the tool, and while I think it's a remarkable GUI authoring environment, I believe that it is going to reintroduce a variety of workflow and stability problems that were finally getting solved with Flex. &lt;br /&gt;&lt;br /&gt;Catalyst, which is marketed as, "Adobe® Flash® Catalyst™ is a new professional interaction design tool for rapidly creating user interfaces without coding.", is detailed at the&lt;a href="http://labs.adobe.com/technologies/flashcatalyst/"&gt; Adobe Catalyst Beta web site. &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now the discourse:&lt;br /&gt;&lt;br /&gt;As an independent, I've worked on teams of all kinds, every shape and size, in a variety of different business verticals: entertainment, media, financial, you name it. After a while, you get a notion of what works, and what doesn't. When I get pinged about a project, I've gotten pretty good at anticipating what I'm getting into based on the project description, who was involved before, and what the current state is. &lt;br /&gt;&lt;br /&gt;One of my biggest nightmares in the ActionScript world is getting involved in a project where, "the code is already written, we just need some changes and fixes to be made." Naturally, I always respond with, "why can't the original developer do it?" The usual reply, "oh he's not available." This may be the whole project, or just a piece of it, but the result is the same. &lt;br /&gt;&lt;br /&gt;I've come to know, that almost without variation, this actually means:&lt;br /&gt;&lt;br /&gt;"We had some great visual concepts for this application we wanted. We interviewed a number of developers that talked about things like wireframes, functionality, and specs. It seemed complicated and time consuming, we wanted immediate gratification. We found a guy who had this great looking website, really good design, who said he knew Flash. So we hired him. It was going along great, really fast, but when we requested some new features, and changes to old ones, and integration of some new data, the developer turned out to be unavailable." &lt;br /&gt;&lt;br /&gt;I have visions of this designer, who at best may have understood a handful of canned script procedures, furiously googling ActionScript samples, hunting down code scattered all over named timeline frames, looking at a library of unnamed assets that was allowed to get out of control, posting "can anybody help me" on the boards...&lt;br /&gt;&lt;br /&gt;...and now the client wants an "expert" (vis a vis, "somebody else to share the blame") to come in and clean it all up. No documentation, no access to the developer, or at best a hasty email saying "it's all on frame 2 just look at the code", missing external assets, often not even a project that will compile. &lt;br /&gt;&lt;br /&gt;This isn't a once-in-a-while scenario. I see it ALL the time. When I was making my bones as a contractor, I'd take these jobs. Now I avoid them like the plague, because they're losers. Why? Because the client will feel that because it used to work, or currently does but just not the way they want it to, it should be cheap and easy for an "expert" to get it running as required. &lt;br /&gt;&lt;br /&gt;What they don't know is, the project is a disaster, there's virtually no unravelling it, and even if you can, huge portions of it will need to be rewritten anyway in order to get the extended features working properly...&lt;br /&gt;&lt;br /&gt;...but, they cry, "Flash is a visual development environment. It's supposed to be easy to create interactive widgets. I don't understand why OOP, or documentation, needs to be involved with this at all. We're not looking for an application per se, we just want this little bit of video/playlist/data functionality, but instead of doing it this way, we need some changes. We need you to be flexible." &lt;br /&gt;&lt;br /&gt;This is what happens when designers are put either in charge, or at the top of the process, of actually building software. &lt;br /&gt;&lt;br /&gt;If you're a designer, you're probably insulted now. Stay with me, I think you'll see what I mean. If it helps to keep you reading, I have IMMENSE respect for a designer that understands how to work with a software developer. It's just that the overwhelming majority of "Flash" designer/developers don't, because they assume that coding is secondary to design. I know it for a fact.&lt;br /&gt;&lt;br /&gt;If a coder makes comments about design, the designer will certainly not take it as authoritative. Why? Because a coder != designer. If you've taken it upon yourself to study both design and coding properly, more power to you. But in general, a coder may have some design ability, or a designer may have some coding ability, but the "some" is secondary, it's not a studied, practiced, primary skill. &lt;br /&gt;&lt;br /&gt;Flash is not a design tool. I don't care what Adobe tells you, or what you've seen people do with the vector drawing tools. Flash is a tool used to build interactive, web-based software. Call them widgets, call them stand-alone components, call them "players", call it "a design-time scripting environment that builds interactive media", whatever. Those are euphemisms. &lt;br /&gt;&lt;br /&gt;YOU ARE BUILDING SOFTWARE, and that ENTAILS SPECIFIC SKILLS. &lt;br /&gt;&lt;br /&gt;No, Flash isn't for building operating systems. It doesn't have to be. An extension on the house for grandma, or a new hi-rise on the waterfront, are both "buildings" created through the process of "construction". You have to get permits, zoning, you need blueprints, good material, and a knowledgeable contractor with specific skills. &lt;br /&gt;&lt;br /&gt;If you've ever watched BBC, there's a show called "How Not To Decorate". These two Brit designers ("the Lads") go into these nice homes that are atrociously decorated, and have them restructured to accommodate their design vision...THEN they add the design. I love this show because I see it as being directly analogous to software development. Do you see these guys selecting foundation materials, or trying to put cushions in the room before the builders say "ready"? Do you see them working without blueprints, only using their comps? Do you see them trying to find tools that build foundations without doing any digging?&lt;br /&gt;&lt;br /&gt;No. You don't. They recognize their expertise, and work within the boundaries of their roles. They hire top-notch builders to explain to them what can and can't be done in terms of the design concept. They push the builders, but in the end, when the construction lead says say "not with this budget, not in this time, not in this space, not in this ground", they accept the limitation and rethink. They are integrated in the process, they attend the meetings when it makes sense, in fact, they are in charge. But they don't actually do the construction work. And in the end, they never get "pixel perfect" according to their original design vision; they work with the finished structure, rethink some of the concepts, and succeed. They don't say, "my comp shows this 10 inches this way. Tell the builders to tear down the wall and rebuild the room." &lt;br /&gt;&lt;br /&gt;WHY does this basic, obvious, logical and sensible thinking, fall apart when it comes to Flash? There are so many bad examples to prove it, so many that Flash is easily maligned by all the "Web 2.0"--whatever that is--fanbois (apologies to Mr. O'Reilly) as being unstable and bulky garbage. &lt;br /&gt;&lt;br /&gt;A few years ago, enter Flex. Adobe takes a stand: Flash development is about CODE, and that means, CODERS. I saw an Adobe presenter proclaim this vehemently in both the presentations I saw him give. The designers were up in arms; how dare you! I'm a designer, I don't want to have to learn about code. I want the tool to do it for me. You are ruining my livelihood! &lt;br /&gt;&lt;br /&gt;No, we're not. We're simply giving you the opportunity to do what you do properly. Flex has a great workflow for this; finally, architects and coders were back to doing the construction. Designers were integrated where it made sense; they created assets based on areas of the project that are completed and stamped "ready" by the builders. They worked on the CSS and images in Photoshop and Illustrator, burned them up into vector images and/or swfs, or whatever, and placed them as static assets or libraries, ready to be applied to the finished components. It's a solid workflow.&lt;br /&gt;&lt;br /&gt;The job boards are the evidence: enterprises are starving for Flex developers, because at last, it seems like we're getting some stable software out there. Flash isn't a toy after all, you just have to apply professional workflow, to any size project, to get it running. Architects and coders lead construction. Designers create vision and assets, which are integrated when the time is right. That's how you build things. Event "the Lads" know that. &lt;br /&gt;&lt;br /&gt;Yesterday, the Adobe presenter said that Flex put code and development first, design second, and that they saw this is being "backwards"; the fix is Catalyst. Designers would once again be given a tool which, with very little or no code, they can use to take their designs FIRST, and THEN apply code, which is auto written. &lt;br /&gt;&lt;br /&gt;He even went so far to say that the Flex developer can view the code, and edit it as necessary. Oh-my-gawd...say it isn't so. You are actually saying it's a good idea that I work with code whacked together by somebody that knows nothing other than how they want it to look, and maybe has a rough notion of how it should work? And that they should be doing this on their own in a completely different development tool? &lt;br /&gt;&lt;br /&gt;Think of it this way: why doesn't Adobe create a tool that let's programmers auto-generate designs based on wireframe structures? Let us give designers .psd or .ai files with auto-generated and named layers, pre-sized assets, all the rest of it, and let them just clean it up as needed. &lt;br /&gt;&lt;br /&gt;Why? Because it wouldn't work. Designers would shit all over it. And they'd be right to. But this is exactly what they did to developers with Flash, fixed with Flex, and are doing all over again with Catalyst. Designers are getting involved in more than design, they are now generating MXML...lots of it. And the Flex developer is going to have to deal with it.&lt;br /&gt;&lt;br /&gt;I talked to two other experienced ActionScript coders, that work heavily with Flex, about this. They felt the same way; here we go again. Designers are going to throw stuff over the wall to us and we're just going to have to deal with it. If an event doesn't fire correctly, or a state change doesn't work, we're not going to be able to go back to the designer and say "rework the component". They'll say no, it's not their job. And the client, as usual, will side with the designer, because...designers aren't coders. That's your job, Mr. Flex OOP guy. &lt;br /&gt;&lt;br /&gt;Adobe has caved; this is 180 degrees from what they were saying maybe three years or so ago. Once again, they're marketing immediate gratification via Catalyst. Designers will latch onto it because they can make text fields change color when a button is clicked, and the assets will look exactly how they want, but they won't really understand what the tool is generating, because Adobe is telling them not to worry about it, let the Flex guy sort that out. &lt;br /&gt;&lt;br /&gt;With all that said, my predictions: &lt;br /&gt;&lt;br /&gt;- Catalyst will flood the field, once again, with designers fronting themselves as developers, and when a serious ActionScript guy on the project says, "this stuff is useless, the designer needs to rework the component", everybody will say...no man, that's your job.  &lt;br /&gt;- I will end up using Catalyst, because I'll frequently tell a designer, "just send me the assets, I'll rebuild the component". So, Adobe's notion that designers will use Catalyst, developers Flex, is misguided. Exactly as I am frequently forced to crack open Flash to fix these things, so I will be forced to crack open Catalyst. &lt;br /&gt;&lt;br /&gt;Can Catalyst be used productively? Sure, if a team discusses the tool with the designers and specifies how exactly it's to be used. Unfortunately, in the world of independent development, that rarely happens. Marketed and prescribed workflows are rarely adhered to in all but the most well-funded, tightly controlled, corporate projects. I've seen startups collapse and corporations throw away piles of money because of this, and I don't think it's entirely their fault. They're being misled into thinking that software development is a commodity skill that should be cheap and on-demand. Design, on the other hand...now that takes something special, that's an art. &lt;br /&gt;&lt;br /&gt;Ugh. Once again I'm going to hear...&lt;br /&gt;&lt;br /&gt;...we had this designer come in, he used Catalyst, so all the code is written. There's a few fixes though, and we need some changes made to extend the functionality...&lt;br /&gt;&lt;br /&gt;...and once again, now that I don't need to deal with that BS anymore, I'll hang up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-2125185738307338116?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/2125185738307338116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/flash-catalyst-why-im-not-so-sure-this.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2125185738307338116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2125185738307338116'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/flash-catalyst-why-im-not-so-sure-this.html' title='Flash Catalyst: Why I&apos;m not so sure this is a good idea.'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-7647738900159357866</id><published>2009-06-09T05:16:00.001-07:00</published><updated>2009-06-09T05:37:26.769-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='att'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Buying the iPhone 3GS: Existing customers, buying from either Apple or AT&amp;T doesn't matter, and woe to the non-upgrade eligible!</title><content type='html'>Figured I would blog this to put an actual experience buying an iPhone 3GS, with details on upgrades and non-upgrade purchases. Not to mention that...I mean, c'mon. I gotta have a blog post about the new iPhone, and at this point, aside from what everybody already knows from the WWDC, this is all I've got to add. &lt;br /&gt;&lt;br /&gt;I'll start with the bad news: if you're not eligible, this article from Boing Boing is the reality:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gadgets.boingboing.net/2009/06/08/iphone-3g-s-worlds-b.html&lt;br /&gt;"&gt;IPHONE 3G S: WORLD'S BEST PHONE SADDLED TO WORLD'S WORST CARRIER&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The article states:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;For non-qualified customers, including existing AT&amp;T customers who want to upgrade from another phone or replace an iPhone 3G, the price with a new two-year agreement is $499 (8GB), $599 (16GB), or $699 (32GB). Visit www.wireless.att.com for eligibility information.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Lucky for me, this doesn't apply. I didn't see the upgrade to 3G to be worth it. True I was a little jealous of the network speed now and then and the maps feature on 3g worked better, but the overall ROI just didn't seem to be there. Funny the things people said; the CEO of a startup I did some work for said, "you must not be a power user". Erm...no. I'm just an adult that made a decision based on value.&lt;br /&gt;&lt;br /&gt;Anyway, let's talk about upgrade purchase. I have an OG iPhone, have had it since day one. Yesterday I bought a 32gb 3GS iPhone from the Apple Store, right after I got the email following the WWDC, so it was about 6:30 p.m. EST. It cost $299, and the ordering process appeared aware of my current AT&amp;T plan and upgrade eligibility, actually asking me if I wanted to upgrade any portion of it. I also paid for one-day shipping, which was $16 dollars. The total was $337.05 with tax, and the shipping date is June 19th. All this was sent to me in an order confirmation as well, so as far as I can tell, I'm good. &lt;br /&gt;&lt;br /&gt;So, to clarify, because people have told me otherwise...THERE IS NO DIFFERENCE BUYING FROM THE APPLE STORE OR AT&amp;T. NONE. The Apple store is aware of your upgrade options and so on, and AT&amp;T customer service told me point blank that it doesn't matter.&lt;br /&gt;&lt;br /&gt;Why didn't I buy from AT&amp;T directly? Only because I got the offer email from the Apple Store first, and wanted to place me order ASAP. &lt;br /&gt;&lt;br /&gt;Anyway, to nail in the facts, I went to the AT&amp;T site, and checked out both "Add an new Line", and "Upgrade".&lt;br /&gt;&lt;br /&gt;This picture was identical for both "add a new line" and "upgrade". Note it's $299. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/iphone3gs/pic1.png" /&gt;&lt;br /&gt;&lt;br /&gt;A visit to the website, a call to customer service, and my email confirmations, confirmed it all. If you're reading this, you have the facts: eligible for an upgrade, the phone will cost you $299, not eligible, it'll cost you $699 for the high end. And there is no difference if you buy it from the Apple store or from AT&amp;T.&lt;br /&gt;&lt;br /&gt;I'll tell you this, for that money, I would just upgrade the 3G to the 3.0 OS and forget the new phone; wait for the next one. I just don't see it being worth the money, exactly as I didn't see the 3g being worth the money compared to the original, and, if you're already a 3g owner, you're on the faster network. I have a feeling that, aside from the better camera (which really still isn't all that great) and the bigger capacity for the high end one, there isn't much of a difference to the typical user. &lt;br /&gt;&lt;br /&gt;What would NOT surprise me though, is if all of us upgraders get ROOKED six months from now, exactly as we did when the iPhone first released, the price plummeted later on, and they gave us a $100 rebate usable for in-Apple-store purchases (thanks Steve J. for the $87 power cord for my $3,200 first-day Macbook 17). Six months later they'll put out a faster network and another phone on it or some BS like that. Apple has a history of this and it sucks. &lt;br /&gt;&lt;br /&gt;But then I'll just resign myself to another two years, and enjoy my new iPhone, exactly as I do my current one. I never lost a contract because I broke out a pre-3G. &lt;br /&gt;&lt;br /&gt;There you have it. As always, thanks for visiting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-7647738900159357866?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/7647738900159357866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/figured-i-would-blog-this-to-put-actual.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/7647738900159357866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/7647738900159357866'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/figured-i-would-blog-this-to-put-actual.html' title='Buying the iPhone 3GS: Existing customers, buying from either Apple or AT&amp;T doesn&apos;t matter, and woe to the non-upgrade eligible!'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-5760105853575817790</id><published>2009-06-08T05:45:00.000-07:00</published><updated>2009-06-08T06:57:36.195-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mate'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='air'/><title type='text'>Flex Mate: If you've asked "Why don't my events seem to be getting to the EventMap", this may help. Consider performance though.</title><content type='html'>I see this a lot out there, so figure a blog post might be very helpful to developers exploring the Flex Mate framework. If you're not familiar with Mate, go to the &lt;a href="http://mate.asfusion.com/"&gt;ASFusion Mate&lt;/a&gt; site. &lt;br /&gt;&lt;br /&gt;People hear how great and lightweight the Mate framework for Flex development is, and it is interesting to work with (though it does have its issues...however, what framework doesn't). Invariably, every developer crashes into the same problem:&lt;br /&gt;&lt;br /&gt;"I have a class that extends EventDispatcher. I dispatch an event from it. The EventMap has the correct type of event registered in its MXML markup, I've got my Manager set up to handle the logic for the event, exactly as it shows in the examples. I then dispatch an event from the Manager. WHY DOESN'T IT WORK the EventMap never seems to see the event ARGH!". &lt;br /&gt;&lt;br /&gt;The first thing to note is, there's no explicit listener set up for your event handling. Mate just seems to magically know that you dispatched an event. &lt;br /&gt;&lt;br /&gt;Naturally, there's nothing magic about it. The general idea is, if you dispatch an event, it needs to be told how to find a handler. Typically, you just set up an addEventListener for the type of event on the object you want to listen for the event from, then from that object, you dispatch the event. It's a many-to-one thing, but it's explicit. If no object has set up a listener for that event, then even if the event is dispatched, nothing will happen. &lt;br /&gt;&lt;br /&gt;However, events have an argument you may have seen: "bubbles". By default, this is set to "false", which is how the vast majority of developers are used to using it. As the name implies, if it's "false", the event will not "bubble". &lt;br /&gt;&lt;br /&gt;But, if "bubbles" is set to "true", then the dispatched event will "bubble" up through it's object hierarchy until it finds a handler set up to listen for that event. &lt;br /&gt;&lt;br /&gt;From the documentation (note that ancestors mean "objects that came before", e.g. parents):&lt;br /&gt;&lt;br /&gt;&lt;i&gt;In the bubbling phase, Flex examines an event's ancestors for event listeners. Flex starts with the dispatcher's immediate ancestor and continues up the display list to the root ancestor. This is the reverse of the capturing phase.&lt;br /&gt;&lt;br /&gt;For example, if you have an application with a Panel container that contains a TitleWindow container that contains a Button control, the structure appears as follows:&lt;br /&gt;&lt;br /&gt;Application&lt;br /&gt;    Panel&lt;br /&gt;        TitleWindow&lt;br /&gt;            Button&lt;br /&gt;&lt;br /&gt;If your listener is on the click event of the Button control, the following steps occur during the bubble phase if bubbling is enabled:&lt;br /&gt;&lt;br /&gt;Check the TitleWindow container for click event listeners.&lt;br /&gt;Check the Panel container for click event listeners.&lt;br /&gt;Check the Application container for click event listeners.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;So now you get an idea of how the EventMap works. The EventMap is put in the top-level Application (or WindowedApplication for Air developers). So, all events need to "bubble" to the top, so that the EventMap, which has the listeners, will receive them. &lt;br /&gt;&lt;br /&gt;So you might think, "great, put in my EventMap listeners, then, just set all my events to bubbles=true and voila." &lt;br /&gt;&lt;br /&gt;If only it were that simple; notice in the first line of the documentation quote, it says, "Display List". If you're not familiar, here's the relevant documentation blurb regarding the display list and events:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Every object in the display list can trace its class inheritance back to the DisplayObject class. The DisplayObject class, in turn, inherits from the EventDispatcher class. The EventDispatcher class is a base class that provides important event model functionality for every object on the display list. Because the DisplayObject class inherits from the EventDispatcher class, any object on the display list has access to the methods of the EventDispatcher class.&lt;br /&gt;&lt;br /&gt;This is significant because every item on the display list can participate fully in the event model. Every object on the display list can use its addEventListener() method--inherited from the EventDispatcher class--to listen for a particular event, but only if the listening object is part of the event flow for that event.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;In other words, if the object you dispatch the event from is not in the display list...so, if your object does not inherit somewhere along the way from DisplayObject, and hasn't been added as a child to some other object that inherits from DisplayObject, which ultimately can trace its DisplayObject ancestors back to level where the EventMap is, it'll never get there. &lt;br /&gt;&lt;br /&gt;Why is this a problem? Say you dispatch an event from a DisplayObject that is in the display list that resolves to the EventMap.  So far so good, the EventMap will pick it up, and send it to a specified Manager to run a function and complete the handling. Now, from that Manager, after it does something, like set properties on a model or whatever, you want to dispatch an event, the handler for which has been set up in the EventMap. The Manager extends EventDispatcher, the event is set to bubble. &lt;br /&gt;&lt;br /&gt;No dice. The EventMap won't see it, because the Manager is not a DisplayObject; it's not in the display list.&lt;br /&gt;&lt;br /&gt;The solution: in your non-DisplayObject and/or not-in-the-display-list object, declare a public variable of type GlobalDispatcher (I usually call it "dispatcher"), and either instantiate it in the constructor, or right before you dispatch your event. Use it to dispatch your event. The EventMap will now see it. &lt;br /&gt;&lt;br /&gt;If you've never encountered GlobalDispatcher before, it's not that terrible an oversight; it's not a Flex thing, it's a Mate thing. If you've looked at the Mate framework source, you find it in the "core" namespace. The comment in the code indicates:&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;  * GlobalDispatcher is the default dispatcher that &amp;quot;Mate&amp;quot; uses. &lt;br /&gt;  * This class functions as a dual dispatcher because we can register to &lt;br /&gt;  * listen an event and we will be notified if the event is dispatched in &lt;br /&gt;  * the main application and in the SystemManager. &lt;br /&gt;  * &amp;lt;p&amp;gt;Because SystemManager is the parent of all the popup windows we can &lt;br /&gt;  * listen to events in that display list.&amp;lt;/p&amp;gt;&lt;br /&gt;  */&lt;br /&gt;&lt;br /&gt;Example code:&lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;public class Manager&lt;br /&gt;{&lt;br /&gt; [Bindable] public var dispatcher : GlobalDispatcher;&lt;br /&gt; &lt;br /&gt; public function Manager ( )&lt;br /&gt; {&lt;br /&gt;  dispatcher = new GlobalDispatcher ( );&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public function doSomethingThenDispatch ( data : Object ) : void&lt;br /&gt; {&lt;br /&gt;  dispatcher.dispatchEvent ( new Event ( Event.SOMETHING_EVENTMAP_IS_LISTENING_FOR ) );&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note that because you are using a GlobalDispatcher, Manager doesn't have to extend EventDispatcher. You may want to get a little more OOP about this, inheriting from a base Manager class that has the global dispatcher on it already, and then just either override a function in an extended class or just use the dispatcher parent instance directly, whatever floats your boat. &lt;br /&gt;&lt;br /&gt;I wonder about this kind of global dispatching and the wisdom of it from a performance perspective; I suspect that bubbling all your events through the entire display list in an application can degrade performance, and that seems to be a supported notion. Take a look at this quote from the &lt;a href="http://www.adobe.com/newsletters/edge/april2009/articles/article5/index.html?trackingid=EOCQZ"&gt;April 2009 issue of Adobe's Edge&lt;/a&gt; newsletter:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;There are performance considerations with this approach. Because we are relying on bubbling to communicate our event all the way up the Display List, Flash Player must broadcast an event all they way through the ancestor chain of the component that dispatched the event. If our component is buried deep inside many HBoxes, VBoxes, and Canvas containers, then our event could bubble through hundreds of objects before it reaches the top. If our application is communication-heavy, the overall performance of the application could degrade when a large number of messages need to be passed on. This is a factor developers must consider when choosing this solution&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;An experienced Flex/Air developer may say, "well of course. Don't build apps that nest heavily. Break up your event maps. Only bubble events that are logical to bubble". Fact is though, people use frameworks because they want a prescribed model; the EventMap is EASY. So just nest your containers based on what works fast, and bubble the events to the EventMap. Bang. The bigger your app gets, the more this will degrade performance, until you eventually top out some ceiling and it all comes down. &lt;br /&gt;&lt;br /&gt;So, it would seem that a best practice for Mate would be, even more so than usual...CAREFULLY NEST CONTAINERS, and, don't use the EventMap, or numerous EventMaps, for all your events. ONLY bubble events that are otherwise not practical to set up dedicated listeners for, i.e. for components that you would might consider taking the easy way out with things like "this.that.that.that.addEventListener", and that sort of thing. There's no reason that you can't use the standard ActionScript model, and the Mate model, to get the best of both worlds and build a solid application. &lt;br /&gt;&lt;br /&gt;As always, thanks for visiting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-5760105853575817790?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/5760105853575817790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/flex-mate-if-youve-asked-why-dont-my.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/5760105853575817790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/5760105853575817790'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/flex-mate-if-youve-asked-why-dont-my.html' title='Flex Mate: If you&apos;ve asked &quot;Why don&apos;t my events seem to be getting to the EventMap&quot;, this may help. Consider performance though.'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-7787655448927016211</id><published>2009-06-05T05:49:00.001-07:00</published><updated>2009-06-05T06:45:05.111-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon'/><category scheme='http://www.blogger.com/atom/ns#' term='ec2'/><category scheme='http://www.blogger.com/atom/ns#' term='hosting'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><title type='text'>Why Amazon EC2 is a great thing for the Indie developer. At least, that's what I'm finding.</title><content type='html'>I've been working with Amazon EC2 a lot lately. I'll tell ya, this is a great thing for independent developers.&lt;br /&gt;&lt;br /&gt;For those of you that don't know, EC2 is Amazon's computing cloud, in which you can run instances of virtually any kind of computing environment for pennies an hour. It's all managed right through a web interface. Go to the &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon Elastic Compute Cloud&lt;/a&gt; website and check it out. &lt;br /&gt;&lt;br /&gt;As an independent, I work with different clients all the time. Some use Linux, some Unix, some Windows. That doesn't matter to me per se, because I generally work with technologies that have runtimes for most commercially viable platforms. But, in order to look more professional, I've taken it upon myself to provide clients with a staging server, as well as SVN and FTP repositories. You would be amazed at how many times a client has said to me, "you can do all the staging, AND will set us up with SVN accounts?". Yep, I'm serious about this business, and want to make it as easy as possible to integrate me into your workflow without the hassle of setting me up internal accounts and access for the piece I'm building. &lt;br /&gt;&lt;br /&gt;The staging server is a Windows box. The reason for this choice: I can run .Net on it. People frequently ask me, "why do you bother with that," to which I offer canned response, "I'm not going to lose work because I have a religious belief about a given technology". If the client wants .Net web services to power the Flex UI, that's fine with me. If they want Java, or PHP, or Ruby, same thing. All of these technologies are fully available on Windows. The same is not the case with Unix or Linux. People guffaw at this, pointing to .Net implementations on the Unix base, but that's not what clients use. So, to run as many technologies as I can, Windows was the logical choice. I can drop a MAMP server on it for PHP/MySql, run Tomcat and Oracle Comm. Edition for Java, and power IIS with .Net and SQL Server, or any combination of the above, all at the same time. &lt;br /&gt;&lt;br /&gt;It costs me money though, even when I'm not using it. About $150 a month to be precise. I host with &lt;a href="http://www.liquidweb.com"&gt;Liquid Web&lt;/a&gt;, which I must say does a GREAT job. GREAT. Their support is on point, and I've never had an outage in more than two years. But fact is, I do most of my development locally, and just do a daily dump it on staging so the client can eyeball it, but otherwise, I store my SVN repos on their, do some experimentation with server products and whatnot, and that's about it. If I want to test on anything other than Windows though, I do it on local virtual machines, like a Parallels Centos VM or some such. Its been a great model for working with all kinds of clients, managing the environments is great experience of course, but...&lt;br /&gt;&lt;br /&gt;...enter Elastic Compute Cloud. The concept is this: it's a big ball of clay. When I want a piece, I pull it off; this is my "instance". I can shape it any way I want, and only get billed for when it's active. When I'm done with it, I "bundle" it (essentially a saved configuration) and put the raw material back onto the big ball, which stops billing. &lt;br /&gt;&lt;br /&gt;Billing, btw, for a "small instance", which is roughly equivalent to my $150/month hosted box, is 0.125 dollars/hour...that's twelve and a half cents and hour. &lt;br /&gt;&lt;br /&gt;Amazon provides you with all kinds of pre-configured instances: Fedora running Ruby on Rails, LAMP, 64 bit versions, Windows Server 2003 and 2008, etc. Additionally, the "community", which is made up of all kinds of platform developers like Citrix and what not, provides Windows, Debian, Fedora, SUSE, Ubuntu, Solaris, Gentoo, etc. images of all kinds, running their databases, VM servers, and what have you. They also put out a lot of demo instances so you can check out new technologies and services...for FREE, all pre-config'd. No downloading, installation issues, and all that. True, it's important to know how something installs, but first, let me see if I'm interested in the technology before I fight with a download and install. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/ec2forindie/pic1.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/ec2forindie/pic2.png" /&gt;&lt;br /&gt;&lt;br /&gt;So, here's the scenario. I have a client that works entirely in Linux using MySQL, and they want to see the deployment of my product in that environment. Currently, I can't do it, because my box is Windows; I can certainly demo the product working and use MySQL, but it's not Linux. So, I send it to them and have them deploy it, but that detaches me from the process, which causes iterations. I need to see it running--or breaking--to fix it fast. &lt;br /&gt;&lt;br /&gt;With EC2, I can just develop locally, test on a Linux VM, and when I'm ready, fire up a Linux instance in EC2 and deploy it. I make any necessary changes and fixes, and when I'm done, can show it to the client running in an environment similar to theirs, and be reasonably certain that if they deploy it correctly--and there's nothing exotic going on, and of course there's nothing I can do about their internal security boundaries--it'll work. &lt;br /&gt;&lt;br /&gt;I start the instance when I need it, stop it when I don't. Even if I leave it running 24/7, it's ~90 a month, still sixty bucks cheaper than my current environment. I write it all off true, but it's not just about the money, it's about being able to come as close as possible to the deployment environment. It looks really pro and builds client confidence. "Wow...you have this running as an instance in a cloud? How did you set that up?" is a question I've already been asked. &lt;br /&gt;&lt;br /&gt;And because it's cheap and timed, it's very easy to bill back to a client. I usually don't do this, preferring to just build it into my rate, but in this day and age of economizing, being able to draw out line items on an invoice is important. If a client declines, that's fine, but I make the point that for essentially pennies they are compromising my ability to ensure they are getting a working product in as few iterations as possible. I expect that my clients will say, "spend the fifty bucks". &lt;br /&gt;&lt;br /&gt;Lastly...I'm an independent developer, and am getting a firm, hands-on grasp with cloud computing and how to use it effectively. That's the sort of experience that sets you apart from the typical "I do flash sites" kind of hacker. &lt;br /&gt;&lt;br /&gt;There you have it. If you have the chops, being an indie dev isn't as hard as you'd think. I find it far more rewarding than a straight corporate job, and if you read my blog, you know I've had 'em. But to stay on top of it, when new tools or services come along that let you economize and work smarter, you gotta get involved. For me, EC2 is definitely in my toolbox. &lt;br /&gt;&lt;br /&gt;As always, thanks for visiting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-7787655448927016211?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/7787655448927016211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/why-amazon-ec2-is-great-thing-for-indie.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/7787655448927016211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/7787655448927016211'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/why-amazon-ec2-is-great-thing-for-indie.html' title='Why Amazon EC2 is a great thing for the Indie developer. At least, that&apos;s what I&apos;m finding.'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-7804136348652676453</id><published>2009-06-03T15:32:00.000-07:00</published><updated>2009-06-04T05:53:30.009-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='nimblekit'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><category scheme='http://www.blogger.com/atom/ns#' term='objective c'/><title type='text'>iPhone app development...using JS and HTML instead of Objective C? Freakin' amazing!</title><content type='html'>I had to try this; check out &lt;a href="http://www.nimblekit.com"&gt;NimbleKit&lt;/a&gt;. I dabble in iPhone development, and have already gone through the rigor of Objective C, but I mean...JS and HTML?&lt;br /&gt;&lt;br /&gt;NimbleKit touts, "NimbleKit is the fastest way to create applications for iPhone and iPod touch.You don't need to know Objective-C or iPhone SDK. All you need is to know how to write an HTML page with Javascript code."&lt;br /&gt;&lt;br /&gt;I'm dubious to say the least; write in one language, compile to another completely different environment, is something I've seen blow up more than once. But then again, I was dubious of the Google Web Toolkit, and that worked really well when I needed it. With that said, let's give it a try. I downloaded the installer, which adds a new project type to your XCode iPhone Applications project templates:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/nimblekit/pic1.png" /&gt;&lt;br /&gt;&lt;br /&gt;Firing it up brings you to the dev interface for the project. It looks more or less like a regular app, with the addition of a the NimbleKit supporting binaries, like libNimbleKit.a, the NKit.js library, and an HTML folder in the project explorer. The page of interest to me is located in that HTML folder, called main.html, and we see it includes the NKit.js file. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/nimblekit/pic2.png" /&gt;&lt;br /&gt;&lt;br /&gt;So, let's compile and run the project on the iPhone (I'm a registered developer) using just the default HTML text in the emulator...BONK! NimbleKit wants you to register NimbleKit, and initialize it with the serial number they send you in order to test on the iPhone. I'm not inclined to do that at this point but, it did show that NimbleKit will deploy the app to the iPhone without issue; I actually see the icon on the iPhone and everything exactly as you'd expect. The pic below is a screenshot from the iPhone:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/nimblekit/pic3.png" /&gt;&lt;br /&gt;&lt;br /&gt;So, for now we're using the emulator. My confidence is building though, if this thing really pans out I might just register and get a serial number. Right now though, there's very little documentation and only one tutorial. I think I'll wait for another rev to commit. &lt;br /&gt;&lt;br /&gt;There's a tutorial showing how to build a simple "Radio" application, but what I think I'm going to do is just try to knockout a hello world that loads an image. Right off the bat, you can see that, while you use JS and HTML as your "MainView", which is what you put UI items on. Let's try to add a button, and an image control, so that when we click the button, the image loads. Nothing fancy, but this gets us through creating and positioning UI elements, hooking up events, and UI elements that react based on the result of that event (in this case, a button click). This is a basic exercise I try in any UI development environment I come across. &lt;br /&gt;&lt;br /&gt;In Objective C, the code might look like this; this is the implementation class, I'll leave out the interfaces and whatnot. Note that in the NimbleKit project, I don't have to worry about the separate interface and implementation objects, I just work right on that HTML page directly. &lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;- (void)loadView &lt;br /&gt;{&lt;br /&gt; [ super loadView ];&lt;br /&gt; &lt;br /&gt; mainView = self;&lt;br /&gt; &lt;br /&gt; btn = [ UIButton buttonWithType: UIButtonTypeRoundedRect ];&lt;br /&gt; btn.frame = CGRectMake ( 110, 10, 100.0, 20.0 );&lt;br /&gt; [ btn setTitle: @&amp;quot;Load Pic&amp;quot; &lt;br /&gt;    forState: UIControlStateNormal ];&lt;br /&gt; [ btn addTarget: self action: @selector(btnClicked:) forControlEvents: ( UIControlEventTouchDown ) ];&lt;br /&gt;   &lt;br /&gt; [ self.view addSubview: btn ];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (IBAction) btnClicked:(id)sender&lt;br /&gt;{&lt;br /&gt; /*&lt;br /&gt; UIAlertView *alert = [ [UIAlertView alloc] &lt;br /&gt;        initWithTitle:@&amp;quot;Hello DevX&amp;quot; message:   &lt;br /&gt;        @&amp;quot;iPhone, here I come!&amp;quot;  &lt;br /&gt;        delegate:self cancelButtonTitle:@&amp;quot;OK&amp;quot; &lt;br /&gt;        otherButtonTitles:nil, nil];&lt;br /&gt; [alert show];&lt;br /&gt;    [alert release];&lt;br /&gt;  */&lt;br /&gt; img = [ UIImage imageNamed: @&amp;quot;cat.jpg&amp;quot; ];&lt;br /&gt; CGSize imageSize = img.size;&lt;br /&gt; myImageView = [ [ UIImageView alloc ] initWithImage: img ];&lt;br /&gt; myImageView.frame = CGRectMake ( 0, 100, imageSize.width, imageSize.height );&lt;br /&gt;&lt;br /&gt; [ mainView.view addSubview: myImageView ];&lt;br /&gt; [ myImageView release ];&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So, let's try and port that same idea into NimbleKit. Although there's no documentation, I saw in the video and in the screenshot on the home page that the UI elements are preceded with "NK". Those aren't native iPhone framework names...hmm, where do I get the object names? My guess would be, since you do this all in a JS script tag, I'd need to look in the nkit.js file, and sure enough, that's where I found what I was looking for; NKButton, and supporting methods.&lt;br /&gt;&lt;br /&gt;&lt;pre class="showCode"&gt;&lt;br /&gt;function NKButton()&lt;br /&gt;{&lt;br /&gt; this.init = NKPlaceNativeButton;&lt;br /&gt; this.show = NKShowNativeButton;&lt;br /&gt; this.hide = NKHideNativeButton;&lt;br /&gt; this.setTitle = NKSetNativeButtonTitle;&lt;br /&gt; this.setImage = NKSetNativeButtonImage;&lt;br /&gt; this.id = CallNKitAction("NKCreateButton?sync=yes");&lt;br /&gt;}&lt;br /&gt;function NKSetNativeButtonImage(imageName)&lt;br /&gt;{&lt;br /&gt; CallNKitAction("NKSetNativeButtonImage?image="+imageName+"&amp;id="+this.id);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function NKSetNativeButtonTitle(title)&lt;br /&gt;{&lt;br /&gt; CallNKitAction("NKSetNativeButtonTitle?title="+title+"&amp;id="+this.id);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function NKPlaceNativeButton(x, y, width, height, callback)&lt;br /&gt;{&lt;br /&gt; CallNKitAction("NKPlaceNativeButton?x="+x+"&amp;y="+y+"&amp;width="+width+"&amp;height="+height+"&amp;callback="+callback+"&amp;id="+this.id);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function NKShowNativeButton()&lt;br /&gt;{&lt;br /&gt; CallNKitAction("NKShowNativeButton?id="+this.id);&lt;br /&gt;}&lt;br /&gt;function NKHideNativeButton()&lt;br /&gt;{&lt;br /&gt; CallNKitAction("NKHideNativeButton?id="+this.id);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So, with this info in hand, I tried to write out the JavaScript. Doing "var btn = new NKButton ( ), and setting the properties every which way, didn't make a native button appear. Ok, I'll go with a NKNavigationController instead; this worked as expected, a nav controller appeared on the top of the emulator screen with a button, and a test event handler that shows an NKAlert worked. So far so good. &lt;br /&gt;&lt;br /&gt;It then dawned on me that I wasn't thinking about this right; I'm supposed to be using HTML and JS, not trying to figure out how the standard iPhone SDK applies. So, let's shift thinking: I'll still use the NKNavigationController (though based on what I can see, the button should have worked...DOCS PLEASE!), but I'll also add a button under it that does the same thing; clicks and makes the image appear. For the image, I'll just put in an HTML "img" tag, with no "src" attribute specified. When I click either the button in the nav bar, or the standard HTML button, I'll call a JS function to load the image. Here's my code:&lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;NKit.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;var navController = new NKNavigationController ( );&lt;br /&gt;navController.setTitle ( &amp;quot;Testing NimbleKit&amp;quot; );&lt;br /&gt;navController.setStyle ( &amp;quot;black&amp;quot; );&lt;br /&gt;navController.addNavigationItem ( &amp;quot;Image&amp;quot;, &amp;quot;showImage&amp;quot; );&lt;br /&gt;&lt;br /&gt;function showImage ( )&lt;br /&gt;{&lt;br /&gt; img.src = &amp;quot;cat.jpg&amp;quot;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Load Image&amp;quot;, onClick=&amp;quot;showImage ( )&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;img id=&amp;quot;img&amp;quot; src=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And I will be freakin' damned...they both worked perfectly. Screenshots below. I gotta say, I'm stunned. The potential for this development kit is pretty staggering when you think about it. The developer of NimbleKit has essentially put basic iPhone development into the hands of every basic web page developer. &lt;br /&gt;&lt;br /&gt;You think there's a lot of apps in the iPhone store NOW...just wait 'til this gets out!&lt;br /&gt;&lt;br /&gt;As always, thanks for visiting. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/nimblekit/pic4.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/nimblekit/pic5.png" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-7804136348652676453?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/7804136348652676453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/iphone-app-developmentusing-js-and-html.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/7804136348652676453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/7804136348652676453'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/iphone-app-developmentusing-js-and-html.html' title='iPhone app development...using JS and HTML instead of Objective C? Freakin&apos; amazing!'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-6015417857267123476</id><published>2009-06-03T05:20:00.000-07:00</published><updated>2009-06-03T06:57:35.255-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='OAuth'/><category scheme='http://www.blogger.com/atom/ns#' term='Mate'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='authentication'/><category scheme='http://www.blogger.com/atom/ns#' term='tweetr'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='Basic Authentication'/><category scheme='http://www.blogger.com/atom/ns#' term='air'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><title type='text'>TcozTwitter: A Twitter Client using Adobe Air and the Flex Mate Framework - Day 4 : Getting into Authentication</title><content type='html'>This is a continuation of a series of articles on my experiments with writing a Twitter desktop client using the Twitter API, the Mate Framework for Flex, and Adobe Air. Previous blog posts are here at &lt;a href="http://www.tcoz.com/blogger/2009/05/tcoztwitter-twitter-client-using-adobe.html"&gt;Day 1&lt;/a&gt;, &lt;a href="http://www.tcoz.com/blogger/2009/05/tcoztwitter-twitter-client-using-adobe_28.html"&gt;Day 2&lt;/a&gt;, and &lt;a href="http://www.tcoz.com/blogger/2009/05/tcoztwitter-twitter-client-using-adobe_31.html"&gt;Day 3&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;This time around, I started researching the dreaded topic, "Authentication". That is, in order to do anything really meaningful on behalf of a user, an application has to ask for your username and password, and one way or another, send it to Twitter for processing so that they can tell you "this is a known user, here's access to their stuff". &lt;br /&gt;&lt;br /&gt;This is an interesting conundrum, since once you've installed a custom application and started using it, there's very little to prevent the application from taking your account information and sending it to a non-Twitter service. After all, you're just filling out a username and password form that isn't on the Twitter site, and clicking a button saying "sign in". The application could be sending that data anywhere. More tech-savvy users will know to use bad credentials first and monitor http calls carefully; if you see something not going to Twitter, something could be fishy. &lt;br /&gt;&lt;br /&gt;There are social network apps and widgets out there that do this: IMHO YOU SHOULD NOT USE THEM. You are essentially giving your username and password to an unknown entity. Assurances aside, why take the risk? There is a better way...keep reading. &lt;br /&gt;&lt;br /&gt;Let's assume that I'm not going to do anything nefarious with my own credentials. Unless I develop full-blown paranoia of some kind, I'm relatively certain that me-the-developer isn't going to compromise my Twitter account.&lt;br /&gt;&lt;br /&gt;A visit to the &lt;a href="http://apiwiki.twitter.com/"&gt;Twitter API Wiki&lt;/a&gt; to review Twitter authentication reveals that there are two ways for an application to go about authenticating a user for access to their account-specific info: OAuth, and Basic Authentication. In brief layman's terms:&lt;br /&gt;&lt;br /&gt;- Basic Authentication is a widely supported authentication mechanism involving sending the user's username and password encoded as Base64 via an HTTP POST. I won't get into what that means exactly here, suffice to say that it is a standard way of sending values to a web server, with those values represented in such a way that certain kinds of characters will not confuse or compromise the authentication mechanism. Such a transmitted string might look like "QWxhZGRpbjpvcGVuIHNlc2FtZQ==". While this may appear to be "secure" to the eye, since it's not the original string value (like your password), it isn't at all, because Base64 is easily decoded into it's original value. In other words, your credentials can be intercepted, decoded, and revealed.&lt;br /&gt;&lt;br /&gt;Twitter allows the use of Basic Authentication, but they clearly don't like it. They're considering removing it in favor of OAuth. On their site, they say "We would like to deprecate Basic Auth at some point to prevent security issues but no date has been set for that." &lt;br /&gt;&lt;br /&gt;So me, I'll use Basic Authentication will I'm dinking around with nailing in the UI for my Twitter client. But when I get ready to go live, I'll definitely want to switch to OAuth. It might very well for this reason that Twitter leaves Basic Authentication lying around; it's just easier to develop an app if you don't have to deal with OAuth.&lt;br /&gt;&lt;br /&gt;- OAuth (useful &lt;a href="http://www.hueniverse.com/hueniverse/2007/10/beginners-guide.html"&gt;beginners guide here&lt;/a&gt;) is an authentication protocol that allows users to approve applications to act on their behalf without sharing their password. The basics of it are this; the developer has to inform Twitter directly that they have created an application that will be making calls into their API that require authentication. You fill out the form and register your app at &lt;a href="http://twitter.com/oauth_clients"&gt;Applications that User Twitter&lt;/a&gt; page. Twitter returns to you tokens to be used when requests are being sent back and forth.  A Token is generally a random string of letters and numbers that is unique, hard to guess, and paired with a secret key to protect the token from being abused. &lt;br /&gt;&lt;br /&gt;The flow then goes something like this: you, the user fire up your Twitter client. If you have not already done so, the Twitter client should direct you to a web page where you can say, "Yes, allow this application to access my information based on my id" (not your username and password). From that point forward, the application sends its key, along with your unique Twitter-system user id, to the API. The Twitter system looks at the key, and the ID, and asks, "has this user authenticated this application". If the answer is yes, the interaction proceeds, if not, it's declined. Remember, this key is coupled with another secret token, so just intercepting the in-transit data won't work (unless the hacker has obtained your secret key somehow). &lt;br /&gt;&lt;br /&gt;OAuth is considered sufficiently secure for this sort of interaction, and prevents the problem I described before about being able to capture user credentials, since the user never directly provides credentials to the application. Yes, once you approve the app at the Twitter site, the application can do wonky things, like making bad tweets on your behalf, but as soon as you see that you can either de-authorize the app, or Twitter will ban the application entirely by revoking the tokens. OAuth is most definitely what you should be looking at if you intend to release any kind of Twitter client. It is a VERY common security paradigm, e.g. Facebook uses it, so any developer getting into building apps for social networks should definitely get their head around it. &lt;br /&gt;&lt;br /&gt;So, that aside...like I said, I want, for now, to be able to make calls as simply as humanly possible into the Twitter API, I don't care if they're secure or not at this point. &lt;br /&gt;&lt;br /&gt;To that end, I found the &lt;a href="http://code.google.com/p/tweetr/"&gt;tweetr ActionScript 3 library&lt;/a&gt;. By just copying the code in their example "Retrieving One Tweet from authenticated User Timeline", I was able to call into the API with my username and password, and as the name implies, retrieve one tweet from my account (it turned out to be my last one). &lt;br /&gt;&lt;br /&gt;I haven't looked at the source code, but, since the library takes a username and password to make the request, and I haven't registered my application, I'm assuming with good reason that this library uses basic authentication, at least for this example. As I said, during this dev phase, that's fine, but I'm going to have to revisit this eventually. &lt;br /&gt;&lt;br /&gt;The code looks like this; yes, I took out my username and password. Notice I put this in a Command-based class (it implements the ICommand interface, typically "execute ( )"). So I'm using Commands in the Mate framework. Nice. &lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;private var tweetr:Tweetr;&lt;br /&gt;public function execute ( ) : void&lt;br /&gt;{&lt;br /&gt; tweetr = new Tweetr();&lt;br /&gt;    &lt;br /&gt;    // set the browserAuth to false so we actually use&lt;br /&gt;    // the AIR authentication scheme&lt;br /&gt;    tweetr.browserAuth = false;&lt;br /&gt;    &lt;br /&gt;    tweetr.username = &amp;quot;xxx&amp;quot;;&lt;br /&gt;    tweetr.password = &amp;quot;yyy&amp;quot;;&lt;br /&gt;    &lt;br /&gt;    tweetr.addEventListener(TweetEvent.COMPLETE, handleTweetsLoaded);&lt;br /&gt;    tweetr.addEventListener(TweetEvent.FAILED, handleTweetsFail);&lt;br /&gt;       &lt;br /&gt;    // tweetr.getUserTimeLine();&lt;br /&gt;    tweetr.getFollowers ( );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function handleTweetsLoaded(event:TweetEvent):void&lt;br /&gt;{&lt;br /&gt;    // assign the latest response to a data object&lt;br /&gt;    var tweet : StatusData = event.responseArray [ 0 ] as StatusData;&lt;br /&gt;    &lt;br /&gt;    // trace some data&lt;br /&gt;   trace ( tweet.user.profileImageUrl );&lt;br /&gt;    trace  ( tweet.user.screenName, tweet.text, TweetUtil.returnTweetAge ( tweet.createdAt ) );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function handleTweetsFail(event:TweetEvent):void&lt;br /&gt;{&lt;br /&gt;    trace ( &amp;quot;TWITTER ERROR ARGH &amp;quot;, event.info );&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So far so good; I've found a library that lets me proceed with my development, like creating user interfaces for posting tweets, managing friends and favorites, and so on. I'm using Basic Authentication for now, but I know I need to change it, and since I've done Facebook application development already, I shouldn't have any problem tracking down resources and libraries to get me through this on the Twitter side. &lt;br /&gt;&lt;br /&gt;Next, retrieving my own timeline, and creating a view for it, such that I can toggle back 'n forth between the public timeline and my own.&lt;br /&gt;&lt;br /&gt;As always, thanks for visiting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-6015417857267123476?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/6015417857267123476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/tcoztwitter-twitter-client-using-adobe.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/6015417857267123476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/6015417857267123476'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/tcoztwitter-twitter-client-using-adobe.html' title='TcozTwitter: A Twitter Client using Adobe Air and the Flex Mate Framework - Day 4 : Getting into Authentication'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-9214424494890880798</id><published>2009-06-02T05:39:00.000-07:00</published><updated>2009-06-02T05:54:57.156-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='CS4'/><category scheme='http://www.blogger.com/atom/ns#' term='CS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash Builder'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><title type='text'>Adobe Flash Builder (formerly Flex), first looks: Compatibility with older Flex, different namespaces...other immediate differences?</title><content type='html'>Adobe Flash Builder (formerly Flex), first look: Compatibility with older Flex, different namespaces...any other immediate differences?&lt;br /&gt;&lt;br /&gt;Yesterday, Adobe announced the general availability of Flash Builder 4 Premium Beta, and Flash Catalyst, which I may or may not discuss some other day. The coder tool is Flash Builder, and that's my primary interest by far, though Catalyst does look interesting...and possibly headache inducing, as it's a way for non-coders to generate code without actually understanding it. Historically, that's always been a mess. &lt;br /&gt;&lt;br /&gt;This article focuses on my initial experiments with Flash Builder, which is the new Flex, rebranded. I installed it on my only non-work machine, which is a Windows XP box. Apologies to the Mac loyalists. &lt;br /&gt;&lt;br /&gt;My first concern is, can I use old Flex projects in the new Flash Builder? This is primary to me because, if you went through the whole wrestling match of Eclipse Flex Plugin projects vs. Flex Builder Projects vs. Flash projects (which really don't exist, it's just a folder with relatively located assets), and of course the whole CS3 to CS4 upgrades with subsequent months of, "I don't have Flash CS4 can you export to CS3...I don't have Photoshop CS4 can you downgrade the .psd," you know that it's EXTREMLY important that you be able to import old projects, and export new ones in the older formats. This still makes the whole SVN thing a mess if people are using different versions, but that's more a team workflow/standards thing; a team should agree on a version and all upgrade at the same time. &lt;br /&gt;&lt;br /&gt;Anyway, I found some issues. I'm sure I'll find more, and of course it's possible there's more for me to learn about the new tool and V4 SDK, but this is where I'm at onDay 1.&lt;br /&gt;&lt;br /&gt;On launch, the new Flash Builder looks pretty much identical to the old one. Screenshot below.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/flashbuilder/pic1.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Right off the bat, when I go to the File menu, there it is: "Import Flex Project" and "Export Flex Project (FXP)" menu selections. Alrighty, let's try the import process on a fairly big Flex project, the codebase for my PlanetSudoku game. &lt;br /&gt;&lt;br /&gt;After selecting the project folder (which I just dragged onto my Windows desktop from my Mac Flex Builder 3 workspace), a dialog popped up asking me what Flex SDK I wanted to use. The default is Flex 4.0, but I could select any other SDK I had installed (it appears to also install 3.4 for you, which is nice). Let's be daring: I'll compile it with 4.0. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/flashbuilder/pic2.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Continuing on, I get the warning, "If you convert, you won't be able to use this project in older versions of Flash Builder...". Hmm, ok, I guess I could always just use the Export feature if I needed to...more on that later. &lt;br /&gt;&lt;br /&gt;Note: If you are getting the idea into your head that you can start using the Beta full-time now because you can import and export projects, that is a BAD idea. BAD. It's a beta product, you should NOT use it for production work. And as you read on, you'll see how bad it can be.&lt;br /&gt;&lt;br /&gt;Without trying to run it, the import worked, here's a shot of the project structure. Good 'ol bin-debug is still there, html-template, my asset folders, my sounds, all the structure looks like it imported cleanly. Note that "Flex 4.0" is now it's own library category, and there looks like there's some new things in there. That'll have to wait for another blog post. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/flashbuilder/pic3.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ok, no errors, let's open an ActionScript file and look at the code editor. Here's a nice surprise; all .as files are nodes, which when expanded, show the structured outline of the file, just like the "Outline" window. I guess that window is sort of redundant now, though it does have sorting options and such. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/flashbuilder/pic4.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;At first glance, things look pretty much the same in the code editor window, though there does seem to be some new icons to assist in scanning through the lists of auto complete selections, like below (notice the "Native" icon):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/flashbuilder/pic5.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ok, enough dinking around, let's run this thang...AHAH! When I go to the Run button, I see a new choice, something that appeals to the "enterprise" in me...Execute Flex Unit Tests! Clearly evidence that Adobe is getting more serious about the more serious coder. Gotta look that one up in the help files ("Help" appears identical to old Flex help FYI). More :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/flashbuilder/pic6.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Help says the following about the FlexUnit Test Environment:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;The FlexUnit test environment allows you to generate and edit repeatable tests that can be run from scripts or directly within Flash Builder. From Flash Builder, you can do the following:&lt;br /&gt;&lt;br /&gt;Create unit test cases and unit test suites&lt;br /&gt;&lt;br /&gt;Flash Builder wizards guide you through the creation of test cases and test suites, generating stub code for the tests.&lt;br /&gt;&lt;br /&gt;Run the test cases and test suites&lt;br /&gt;&lt;br /&gt;You can run test cases and test suites various ways from within Flash Builder or outside the Flash Builder environment. The results of the tests are displayed in a test application. Flash Builder opens a Flex Unit Results View for analysis of the test run.&lt;br /&gt;&lt;br /&gt;Navigate to source code from the Flex Unit Results View&lt;br /&gt;&lt;br /&gt;In the Test Results panel, double-click a test to open the test implementation.&lt;br /&gt;&lt;br /&gt;The Test Failure Details panel lists the source and line number of the failure. If the listed source is in the current workspace, double-click the source to go directly to the failure.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Ok, that's definitely another blog article in the making. There's unit testing frameworks out there for Flex that I've seen, but integrated? That's significant. &lt;br /&gt;&lt;br /&gt;So, back to running the project...ARGH. A browser window pops up, but then an ActionScript error window comes up with the following message:&lt;br /&gt;&lt;br /&gt;"VerifyError: Error #1014: Class IAutomationObject could not be found." &lt;br /&gt;&lt;br /&gt;Ok, I know it's probably fixable using SDK 4, however, what I'm going to try is deleting the entire project, and reimporting it using the 3.4 SDK (which is the only other one available in the dropdown; I might actually not have another Flex SDK installed on this machine, so it's nice they seem to install 3.4 for you).&lt;br /&gt;&lt;br /&gt;First thing I notice; the Flex 4 folder is now Flex 3.4, and some of those "new things" are gone. Ok, so the Flex 4 SDK is quite a bit different than 3.4, that's good to know. &lt;br /&gt;&lt;br /&gt;No errors, let's try running it...SUCCESS! The project ran just fine. &lt;br /&gt;&lt;br /&gt;So, Compatibility Lesson 1: DON'T USE THE Flex 4 SDK FOR 3.x SDK PROJECTS. At least, not unless you're willing to wrestle with differences to use the newer one. Predictable, but now confirmed.&lt;br /&gt;&lt;br /&gt;Now, let's try a Debug run. No surprises. Seems to work just like the old one. &lt;br /&gt;&lt;br /&gt;Time to try it the other way around. I'll create a "Hello World" project in Flash Builder 4, using the V4 SDK, export it, and try to load it into Flex Builder 3. &lt;br /&gt;&lt;br /&gt;When creating the new project, I notice it's not a "Flash Builder" project, it's still a "Flex Project." All the choices look identical to Flex 3.The project created as expected, but I noticed one thing: The top level MXML file still contains the Application element, but it looks different (note the "s" and "fx" namespace declarations):&lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;s:Application xmlns:fx=&amp;quot;http://ns.adobe.com/mxml/2009&amp;quot; xmlns:s=&amp;quot;library://ns.adobe.com/flex/spark&amp;quot; xmlns:mx=&amp;quot;library://ns.adobe.com/flex/halo&amp;quot; minWidth=&amp;quot;1024&amp;quot; minHeight=&amp;quot;768&amp;quot;&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;/s:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Application now falls under this namespace declaration: xmlns:s="library://ns.adobe.com/flex/spark". If you recall from the screenshot of the Flex 4 folder above, there is a .swc called "sparkskins". Hmm. Drastic changes afoot?&lt;br /&gt;&lt;br /&gt;Aside from that, the dev tasks look the same. I'll drag 'n drop a button and a label, and set up the click event handler to populate label with "Hello Flash Builder Export Test!". &lt;br /&gt;&lt;br /&gt;Bonk! When I went to type &amp;lt;mx:Script&amp;gt;, like I usually would, it didn't get recognized: no CDATA tags and closing &amp;lt;/mx:Script&amp;gt; tags got generated. After a little dinking by looking at the declared namespaces, I found the Script tag in the fx namespace. This has the desired result...but oh jeezus. I'm going to have to unlearn some pretty basic things it seems. &lt;br /&gt;&lt;br /&gt;The test code looks like this, and worked exactly as expected. Interestingly, no more weird Flex green background, it was just plain white (thank you Adobe...wtf was with that grey/green background anyway). No screenshot for this, just imagine a white background, with a Flex (erm..."Flash Builder") button, which when clicked, populates an mx:label (erm..."s:label"):&lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;s:Application xmlns:fx=&amp;quot;http://ns.adobe.com/mxml/2009&amp;quot; xmlns:s=&amp;quot;library://ns.adobe.com/flex/spark&amp;quot; xmlns:mx=&amp;quot;library://ns.adobe.com/flex/halo&amp;quot; minWidth=&amp;quot;1024&amp;quot; minHeight=&amp;quot;768&amp;quot;&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;fx:Script&amp;gt;&lt;br /&gt; &amp;lt;![CDATA[&lt;br /&gt;  private function onClick ( event : MouseEvent ) : void&lt;br /&gt;  {&lt;br /&gt;   lbl.text = &amp;quot;Hello Flash Builder Export Test&amp;quot;;&lt;br /&gt;  }&lt;br /&gt; ]]&amp;gt;&lt;br /&gt;&amp;lt;/fx:Script&amp;gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &amp;lt;s:Button x=&amp;quot;192&amp;quot; y=&amp;quot;28&amp;quot; label=&amp;quot;Button&amp;quot; click=&amp;quot;onClick ( event )&amp;quot;/&amp;gt;&lt;br /&gt; &amp;lt;mx:Label id=&amp;quot;lbl&amp;quot; x=&amp;quot;96&amp;quot; y=&amp;quot;86&amp;quot; text=&amp;quot;Label&amp;quot; width=&amp;quot;288&amp;quot;/&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;/s:Application&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Export time. I'll use the File...Export Flex Project (FXP) option. This creates a Flex Project archive, which I should be able to import nicely. Here goes...&lt;br /&gt;&lt;br /&gt;...not even close. Again, undoubtedly because I created the project using the Flex 4 SDK. Meh, I was curious, but this is exactly what I expected. so I'll recreate the project using the 3.4 version and re-export it. In the new 3.4 SDK project, I notice that the "mx" namespace is back, everything looks kosher, just change the "fx" and "s" namespaces to "mx", and the code ported over fine. &lt;br /&gt;&lt;br /&gt;Over in the Flex Builder 3 UI...import FXP...BLEARGH! It didn't work. This simple little project, when imported into Flex Builder 3, failed. Wouldn't build, nothing in bin-debug, nada. So it seems, Lesson 2: at least for now, DON'T BUILD PROJECTS IN FLASH BUILDER AND EXPECT FLEX USERS TO BE ABLE TO EASILY IMPORT THEM! &lt;br /&gt;&lt;br /&gt;Sure, as always, there's things I probably don't know, but I appear to be following the guidelines pretty straight. Time to RTFM, look at the help docs more carefully, etc. &lt;br /&gt;&lt;br /&gt;Anyway, that's a long enough post. Thanks for coming along on my first tour of Adobe's new Flash Builder.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-9214424494890880798?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/9214424494890880798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/adobe-flash-builder-formerly-flex-first.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/9214424494890880798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/9214424494890880798'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/adobe-flash-builder-formerly-flex-first.html' title='Adobe Flash Builder (formerly Flex), first looks: Compatibility with older Flex, different namespaces...other immediate differences?'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-2050807648030099741</id><published>2009-06-01T07:35:00.000-07:00</published><updated>2009-06-01T07:45:05.939-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon'/><category scheme='http://www.blogger.com/atom/ns#' term='s3'/><category scheme='http://www.blogger.com/atom/ns#' term='citrix'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='ec2'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='air'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><category scheme='http://www.blogger.com/atom/ns#' term='xenapps'/><title type='text'>Flash Flex on the iPhone? Setting up the Amazon Cloud Instance running Citrix XenApps</title><content type='html'>This is a continuation to my series of articles detailing how to get Flash Apps running on an iPhone...sort of. You really don't run Flash on the iPhone, you run it on a Citrix XenApps server, which runs on a Windows instance in the Amazon EC2 cloud. &lt;br /&gt;&lt;br /&gt;My previous blog articles can be found here: &lt;br /&gt;&lt;br /&gt;- &lt;a href="http://www.tcoz.com/blogger/2009/05/flash-flexon-your-iphone.html"&gt;Flash, Flex...on your iPhone?&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://www.tcoz.com/blogger/2009/05/citrix-interview-thing-client.html"&gt;Monday, May 18, 2009 The Citrix Receiver Follow Up: Flash/Flex (and then some) on your iPhone...or Symbian...or WinMo...or...&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Quick blurbs on what the technologies I mention above are:&lt;br /&gt;&lt;br /&gt;- Flash/Flex/Air: if you're reading this article, no explanation needed. &lt;br /&gt;- Citrix, simply, specializes in terminal-based delivery of applications. Think "thin client" delivery of applications. &lt;br /&gt;- XenApps, in there own words, "Citrix XenApp virtualizes an individual application, be it Microsoft Office, PowerPoint, Excel, or SAP (sic, or Flash, etc.), allowing users to run those applications on a client directly from a XenApp server hosted with a Windows application." &lt;br /&gt;- Amazon EC2, cloud-based computing infrastructure. I describe this more below. &lt;br /&gt;&lt;br /&gt;So, my goal is to "Deliver Flash/Flex/Air apps, initially for the iPhone but eventually for any client, from the EC2 cloud running an instance of a Windows Server running Citrix' XenApps". &lt;br /&gt;&lt;br /&gt;Whew. I could probably land a contract just by saying I know what that means. &lt;br /&gt;&lt;br /&gt;In order to get this rolling, I'll have to get a Citrix XenApps instance running in the on the Amazon EC2 cloud. Citrix offers a video showing how to do this, you can &lt;a href="http://community.citrix.com/display/xa/Amazon+Web+Services"&gt;view it here&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Three IMPORTANT notes, this is fair warning, and this is coming from somebody that has worked with resources in clouds before (I've just never been responsible for actually configuring and maintaining one). &lt;br /&gt;&lt;br /&gt;- WATCH THE WHOLE VIDEO CAREFULLY. Believe me, you won't figure it out on your own if you've never done anything like this before. &lt;br /&gt;- DO NOT SKIP THE VIDEO IN FAVOR OF THE "STEP BY STEP" IMAGES BELOW THE VIDEO. They don't provide enough detail. &lt;br /&gt;- DO NOT USE SAFARI. If you're a Mac user, you probably know Safari doesn't always work well in sites that have multiple form submissions. The Amazon web pages broke quite a bit until I switched to Firefox. &lt;br /&gt;&lt;br /&gt;Let's talk about what "an instance in the EC2 cloud" means. An "instance", is conceptually like a dedicated server...but it's not. It's an allocation of resources that appears to me to be a server, but which is disposable; when you terminate an instance, it's configuration is saved so you can restart it, but otherwise, the resources are freed up. The company, like Amazon, uses commodity hardware to build a platform to make instances available, and you pay for the time that each of your instances runs, because you're using resources in their cloud. When I terminate the instance, I don't get billed anymore, because there's no server to keep up and running, just a stored configuration that gets reconstituted into an instance if and when I start it back up. &lt;br /&gt;&lt;br /&gt;Conceptually, the "cloud" is like a big ball of clay. When I need a chunk of clay, I grab off as big a handful as I need; I pay for that chunk based on the size of it, and how long I keep it out of the main big ball. When I'm done, I take a snapshot of the chunk, and just put it back onto the big ball. It's now available for anybody else to use, and my billing stops until I grab a new chunk, which by using my snapshot, can get instantly reshaped to the last known configuration. I can grab as many chunks as I need, shape them all differently, and so on. &lt;br /&gt;&lt;br /&gt;It's a great model. In addition to a website hosted by Brinkster (where my blog and main site is), I currently pay almost $150 a month for a dedicated Windows server that I use for deployment and testing of customer apps. I pay for it whether or not I'm actually doing anything with it, which has irked me more than once. It's a business write off and all that, and IMHO an essential tool for any independent web-based software developer, but still, if I can economize by just using cloud instances of windows and linux servers, activating and deactivating them when I actually need them, and enjoy the easy flexibility of multiple environments (this one runs Tomcat on Linux...this one .Net on Windows Server 2008, etc.) I can cut that cost to a fraction and save myself multiple webserver config headaches and such. &lt;br /&gt;&lt;br /&gt;Anyway, to get started, you go to the &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon Elastic Compute Cloud EC2 Site&lt;/a&gt;. Initially, this is a little scary, because you see a list of usage fees by the hour, and you have to submit a credit card. But I'm intrepid, and have a business credit card, so on I go. I needed to set up an EC2 account, which lets me run select all kinds of pre-made server images that I can run as instances, and an Amazon S3 account, which is the storage mechanism for my files and so forth. They run independently of one another; again, remember that you're not actually running a server, you're running an allocation of resources, broken down into processing and storage. This way, I can run the same image as multiple instances, each with different (or differently configured) apps, using different amounts of processing power, all pointed at the same storage, or different areas of storage. Very flexible and elegant. &lt;br /&gt;&lt;br /&gt;Anyway, the EC2 account I want to run my server images in is "$0.125 per Small Windows Instance (m1.small) instance-hour (or partial hour)". According to the documentation, it breaks down like this:&lt;br /&gt;&lt;br /&gt;- You're paying by the hour, 12.5 cents, for every hour your instance is running. Hmm...let's assume I'll leave it up all day for a month: 12.5 x 24 = 300 cents = three bucks a day, x 30 = 90 bucks a month. I don't mind that as an investment in learning this technology and proving its use; if I land one contract because of this, it'll more than repay me in a couple of hours. And if course, I don't have to run it all the time. &lt;br /&gt;&lt;br /&gt;- The specs for a Small Windows Instance, which should be plenty for my development experiments and demos: 1.7 GB of memory, 1 EC2 Compute Unit (1 virtual core with 1 EC2 Compute Unit), 160 GB of instance storage, 32-bit platform. Hmmm...we'll have to see how it goes. The large instance has 7.5 GB or memory, but is fifty cents an hour. So, here's hoping the Small Windows Instance can swing it. &lt;br /&gt;&lt;br /&gt;So, you fill out the forms (again, don't use Safari), which when complete, takes me to a page with the following message:&lt;br /&gt;&lt;br /&gt;"Thank you for signing up for Amazon Elastic Compute Cloud. We will e-mail you a confirmation when the web services are available for you to use. In order to begin using this service, you will need a X.509 certificate. You can Create a New X.509 Certificate or Upload Your X.509 Certificate."&lt;br /&gt;&lt;br /&gt;Ok...so let's create the X.509 Certificate. If you don't know what one is, an X.509 certificate binds a name to a public key value; more generally, a public-key certificate is a digitally signed statement from one entity, saying that the public key (and some other information) of another entity has some specific value. So, by using a certificate, a browser and an application know that they are speaking to the intended targets by comparing those values; if it checks out, the communication is coming and going from where it's supposed to. &lt;br /&gt;&lt;br /&gt;After a minute or so to create the certificate, I now have a certificate assoicated with my EC2 account, and my instances will be run using it. &lt;br /&gt;&lt;br /&gt;That really seemed to be about all there was to it; strangely enough, by signing up for EC2, I seemed to have already signed up for S3; I went to the S3 page to sign up, but it told me I already had access, and as far as I know, I've never signed up for it before. It makes sense, but seemed a little implicit; I'd prefer to have at least received an explicit notice of some kind. It doesn't seem to cost me any additional money though. &lt;br /&gt;&lt;br /&gt;Once that's done, you go to the EC2 Console and look up an image of the XenApps demo image. This image is located in the Community AMIs list after you click "Launch Instances" (search for "XenApps"). In order to do so, you'll need to create a security group and a key under which to run the instance; these items do things like open ports so that you can access the instance however you need, like HTTP, RDP, and via the Citrix clients. WATCH THE VIDEO, it explains exactly how to do this and what it means. &lt;br /&gt;&lt;br /&gt;All in all, not so bad to get this end of it up and running. I still need to know how to upload and configure apps to make them available, but that's the next step. For now, I'm an independent developer with direct experience in setting up custom configured server instances in a cloud. I understand the benefit of it and can put out a wide number of configurations for any kind of client to access and test applications, and it's costing me twelve-and-a-half cents an hour to play with. Worth every penny IMHO. &lt;br /&gt;&lt;br /&gt;Next, making Flash/Flex/Air apps available on my fancy new server instance running XenApps. &lt;br /&gt;&lt;br /&gt;As always, thanks for visiting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-2050807648030099741?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/2050807648030099741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/this-is-continuation-to-my-series-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2050807648030099741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2050807648030099741'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/06/this-is-continuation-to-my-series-of.html' title='Flash Flex on the iPhone? Setting up the Amazon Cloud Instance running Citrix XenApps'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-6154976084520816268</id><published>2009-05-31T08:09:00.000-07:00</published><updated>2009-05-31T08:22:51.887-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='xml rpc'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='Mate'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='openads'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><title type='text'>TcozTwitter: A Twitter Client using Adobe Air and the Flex Mate Framework - Day 3</title><content type='html'>TcozTwitter: A Twitter Client using Adobe Air and the Flex Mate Framework - Day 3&lt;br /&gt;&lt;br /&gt;As @lancearmstrong says, "onward".&lt;br /&gt;&lt;br /&gt;This is a continuation of &lt;a href="http://www.tcoz.com/blogger/2009/05/tcoztwitter-twitter-client-using-adobe.html"&gt;TcozTwitter: A Twitter Client using Adobe Air and the Flex Mate Framework - Day 2&lt;/a&gt;, in which I decided to complete a number of technical exercises by building a Twitter desktop client using the Twitter API, Adobe Air and the Mate Framework. &lt;br /&gt;&lt;br /&gt;This time around, I completed two major steps: the full parsing of a tweet with all associated data (so that I can display the message info finally), and preliminary incorporation of ads, which I tried to make as unobtrusive as possible. &lt;br /&gt;&lt;br /&gt;Parsing the tweets turned out to be easy. If you want to get an idea of the XML that makes up a tweet, &lt;a href="http://www.tcoz.com/blogger/assets/twitterclient/public_timeline_dump.xml"&gt;take a look at this file&lt;/a&gt;, which is a dump of the raw XML returned from the service call I discussed in the &lt;a href="http://www.tcoz.com/blogger/2009/05/tcoztwitter-twitter-client-using-adobe.html"&gt;day 1 article&lt;/a&gt;. Make sure you view the source of the page; if you just click the link and view it as a regular web page, it'll look like an endless string of jumbled user data.&lt;br /&gt;&lt;br /&gt;If you look at the XML, you see that a user's data is actually represented by an element called "status" that contains two parts; a top-level set of children that holds the message info, and a child element called "user", which contains all the user info, like name, id, number of followers, etc. Manager_Tweets gets fed all that XML when it returns from the EventMap handler (see days 1 and 2 for an explanation of this), breaks it up into an array of "status" elements, and pushes them onto Model_Tweets as an array of new Data_Tweet objects. So, whenever I want to grab the current list of public tweets, I just have to call Model_Tweets.getInstance ( )._publicTweets, and I'll get back an array of Data_Tweets. As I get more tweets, I just keep pushing them onto these waiting arrays on Model_Tweets, so I get a running list of tweets for the entire user session. As I work with different kinds of tweets, like Area, Trends, and different accounts, I'll just add more service calls to the EventMap, add more arrays to Model_Tweets, and push new Data_Tweets onto them. &lt;br /&gt;&lt;br /&gt;Each Data_Tweet object gets one "status" element, which it cuts up into two XML fragments: the message, and user, parts. I then iterate each of the child elements in both parts and push the values onto objects, with the element names as the property names. The end result; each Data_Tweet exposes two objects, one with all that user's message info, and one with all that user's identity info. &lt;br /&gt;&lt;br /&gt;The code in Data_Tweets that does the chopping up looks like this. Note that I've created two arrays filled with the property names I'm interested in, then I iterate those arrays, using the property names as the identity of the XML elements I want. This is sort of a lazy man's way of pseudo-typing data; eventually I'll probably just use real properties so that code hinting and such reveals the properties like any other typed object. But for now, this is a good, fast way to get the job done, and I am still using the actual property names instead of something made up. &lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;_messageInfoProps = [  &amp;quot;created_at&amp;quot;,&lt;br /&gt;       &amp;quot;id&amp;quot;,&lt;br /&gt;       etc. etc. ];&lt;br /&gt;&lt;br /&gt;_userInfoProps = [  &amp;quot;id&amp;quot;,&lt;br /&gt;     &amp;quot;name&amp;quot;,&lt;br /&gt;     etc. etc. ]; &lt;br /&gt;&lt;br /&gt;_messageInfo = new Object ( );&lt;br /&gt;_userInfo = new Object ( );&lt;br /&gt;&lt;br /&gt;var xml : XML = XML ( data );&lt;br /&gt;for ( var each : String in _messageInfoProps )&lt;br /&gt; _messageInfo [ _messageInfoProps [ each ] ] = XML ( xml [ _messageInfoProps [ each ] ] ).text ( ).toString ( );&lt;br /&gt;&lt;br /&gt;var userPropsList : XMLList = xml.user;&lt;br /&gt;var userPropsXML : XML = XML ( userPropsList.toXMLString ( ) );&lt;br /&gt;for ( each in _userInfoProps )&lt;br /&gt; _userInfo [ _userInfoProps [ each ] ] = XML ( userPropsXML [ _userInfoProps [ each ] ] ).text ( ).toString ( );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There's really nothing to it; get the XML from the Mate handler, pass it to Manager_Tweets, which breaks it into a list of "status" elements, then itereate that list, feeding each element to a new Data_Tweet, which parses the data into the pseudo-typed objects, then push those Data_Tweet objects onto a waiting array in Model_Tweets. I now have a subsystem to receive, parse, and store, tweets. For now I'm just using public ones, but I'm willing to bet that account-specific ones are no different.&lt;br /&gt;&lt;br /&gt;Now onto the money shot: ads. ARGH, I know, god damn ads. But c'mon; I'm investing time and effort, not to mention using software and hardware I purchased, and so on; it'd be nice to actually make some money doing this, or at least, show that I understand how to do it, which is a great demo item for getting contract work. &lt;br /&gt;&lt;br /&gt;I decided right away, that however I implemented ads, I wanted to make sure:&lt;br /&gt;&lt;br /&gt;- The ad impression (an industry term for showing an ad) is immediately visible, but unobtrusive. &lt;br /&gt;- There is only one "forced impression" per user session, and it won't last more than five seconds. &lt;br /&gt;- There needs to be a way to view the ad again in case the user is interested. &lt;br /&gt;- I want to be free to tweak this at will. &lt;br /&gt;&lt;br /&gt;The implementation:&lt;br /&gt;&lt;br /&gt;- The ad appears at the bottom of the app for five seconds, then fades out. &lt;br /&gt;- After fading out, the ad is replaced with a very thin, translucent bar at the bottom of the app. &lt;br /&gt;- This "ad bar" displays a message "Click to see the [name of advertiser] ad".&lt;br /&gt;- When you click the bar, it shows the ad again for five seconds. If you never click it, you'll never see another ad. &lt;br /&gt;- When you click the ad, it opens a browser window for the target URL. &lt;br /&gt;&lt;br /&gt;Regarding freedom to tweak, that means, not compromising this unobtrusive design in any way, which means, I can't pander to the requirements of any particular ad agency. So, I actually set up my own ad server. I'm using the latest version of OpenAds, which is a free and full-featured ad server, used by such techno-luminaries as TechCrunch. I've worked with OpenAds before, but never actually built out an instance of it. I was pleased to find, OpenAds is simple to set up and simple to use. Just go through the instructions and tutorials carefully, and you'll have a full-featured, industrial strength ad server, with campaign provisioning and tracking, even marketing integration, all ready to go. From Flash, you make XML-RPC calls to the OpenAds server, it runs its logic, and returns an ad it selects as an XML response containing the info to display, like URL of the ad, target when you click it, etc. &lt;br /&gt;&lt;br /&gt;To get started, I have a friend that owns a business called Genius Ride; he leases smart cars, delivered right to your door. I took his ad, dumped it into the OpenAds system, and set up an advertising campaign with it. The Flash client calls OpenAds when it starts, requests an ad (which at this time always returns genius ride, because it's the only campaign I'm running), and displays it as previously mentioned. &lt;br /&gt;&lt;br /&gt;The screenshots below show the current in-progress state of the TcozTwitter desktop client. &lt;br /&gt;&lt;br /&gt;As always, thanks for visiting. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;With ad:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/twitterclient/day3_1.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;After ad fades:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/twitterclient/day3_2.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Expanded:&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/twitterclient/day3_3.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-6154976084520816268?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/6154976084520816268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/tcoztwitter-twitter-client-using-adobe_31.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/6154976084520816268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/6154976084520816268'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/tcoztwitter-twitter-client-using-adobe_31.html' title='TcozTwitter: A Twitter Client using Adobe Air and the Flex Mate Framework - Day 3'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-580672727987806860</id><published>2009-05-29T04:30:00.000-07:00</published><updated>2009-05-29T05:43:12.181-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='akamai'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='air'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><title type='text'>"Buffering Video..." takes a hit: Akamai offers Flash Media Server 3.5 Dynamic Streaming</title><content type='html'>Akamai has recently announced support for Flash Media Server (FMS) 3.5 dynamic streaming; for the video developer muggle, this basically means that while watching a video, if your connection degrades, the player, coupled with the backend intelligence, can switch you to a lower bitrate video transparently. Although a lower quality video, the viewing experience will be interrupted considerably less--ideally, not at all--by buffering. &lt;br /&gt;&lt;br /&gt;You can read the &lt;a href="http://www.akamai.com/html/about/press/releases/2009/press_051209.html"&gt;announcement here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can also see it in action at &lt;a href="http://www.streamflashhd.com"&gt;streamflashhd.com&lt;/a&gt;. If you have a decent connection, you can watch videos encoded at bandwidths from 500Mbit to 3000Mbit, and the quality will toggle as bandwidth fluctuations happen. If you have a bandwidth throttler, Charles, Fiddler, whatever, this can be an interesting thing to check out.&lt;br /&gt;&lt;br /&gt;This is an opportunity for the higher end Flash developer type to differentiate him/herself from the rest of the pack, which is oh-so-important in the indie software developer world. Read on...&lt;br /&gt;&lt;br /&gt;My clients are primarily in the entertainment and media industry; I build widgets, sites, applications, whatever they need. Frequently, this means dealing with video, and if you deal with video on an industrial level, you will sooner or later (probably sooner) run into Akamai. &lt;br /&gt;&lt;br /&gt;I don't mind it at all. Akamai has a developer kit that makes it pretty easy to hook into their streams, with passwords, bandwidth detection, whatever (in fact, in their developer sdk there is a class, HTTPBandwidthEstimate, which is a generally useful utility). You can find more out about how Akamai helps Flash developers get up and running with their technology &lt;a href="http://www.akamai.com/flash"&gt;at their Flash developer page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Anyway, just knowing that--and being able to prove it--has landed me work. But now, Akamai offers more.&lt;br /&gt;&lt;br /&gt;Video delivery has become a lot more sophisticated in a very short period of time. Even just two or three years ago, it was enough to serve a catalog of video in a generic player as long as it was relatively stable; all the things we see now, like seeking in on-demand video streams, ways to interact with the player, HD video over the web, and all that, were generally avoided because it was VERY difficult to get right; users didn't have the bandwidth or patience for the buffering, complex video infrastructures are difficult to implement; a video player that does nothing but break when you touch it is just frustrating, and so on (and how many of those have we seen). Nowadays, users want more; ways to interact with video, like commenting and clip sharing, and of course, a smooth, uninterrupted, and easily seekable, experience. &lt;br /&gt;&lt;br /&gt;Akamai has always been out there though, working to make enterprise-level video serving less of a headache. The principle is pretty simple. You are not a video delivery company. We are. Pay us to house and expose your video, use our services, feeds, and developer kits, to make them available to the public. Or, try and do it by uploading all your video to in-house web servers, you tube, whatever. That may work for a small effort, but if you have a lot of content and need it monitored, maintained, looked after every day...good luck. &lt;br /&gt;&lt;br /&gt;That's not to say Akamai is without its issues; I've heard grumbling about their downloader, and network outages have made many a corporate manager sweat all over their cel phone. Say what you want though, they've survived and grown in the industry, and like I said before, the heavy hitters use them liberally. Whatever they're doing, there's enough value for people to want them to keep doing it. &lt;br /&gt;&lt;br /&gt;As an entertainment/media focused developer (which so many Adobe-based developers are), having worked with Akamai is a powerful resume item. Frequently, if you hear "video" in a contract, you can expect it to be followed by something like BrightCove or Akamai. So like I said before, if you have experience dealing with these video hosts, you've got a leg up. &lt;br /&gt;&lt;br /&gt;Now, if you have that background, AND know how to take advantage of Flash Media Server's dynamic stream switching, you're at the top of the industry. FMS 3.5, as far as I know, was announced in November, so there's been opportunity to get your feet wet for about half a year. You can read about the &lt;a href="http://www.adobe.com/devnet/logged_in/ktowes_fms35.html"&gt;release of FMS 3.5 here&lt;/a&gt; (note that the current version is 3.5.2, which is a maintenance update):&lt;br /&gt;&lt;br /&gt;So Flash devs, get to the Adobe FMS and Akamai sites, and start gearing up; time to break out of the world of banner ads. &lt;br /&gt;&lt;br /&gt;As always, thanks for visiting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-580672727987806860?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/580672727987806860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/buffering-video-takes-hit-akamai-offers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/580672727987806860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/580672727987806860'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/buffering-video-takes-hit-akamai-offers.html' title='&quot;Buffering Video...&quot; takes a hit: Akamai offers Flash Media Server 3.5 Dynamic Streaming'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-729955061212513912</id><published>2009-05-28T09:53:00.001-07:00</published><updated>2009-05-28T10:30:56.887-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='reader'/><category scheme='http://www.blogger.com/atom/ns#' term='kindle'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><title type='text'>Amazon adds Browser Access to Kindle User Highlights and Notes</title><content type='html'>Amazon continues to enhance the Kindle experience. I got this email a little while ago:&lt;br /&gt;&lt;br /&gt;--------------------------&lt;br /&gt;Dear Amazon.com Customer,&lt;br /&gt;Our customers have told us that they love being able to add highlights and notes to their Kindle books. We want to make it possible for you to access your highlights and notes directly from a Web browser too. So we've released http://kindle.amazon.com, an online tool that enables you to do just that.&lt;br /&gt;&lt;br /&gt;To try it out, go to http://kindle.amazon.com, sign in with your Amazon account, and simply select one of your books where you have added highlights or notes.&lt;br /&gt;&lt;br /&gt;We hope you enjoy this new feature. If you have feedback please send it to us at amazonkindle-feedback@amazon.com.&lt;br /&gt;&lt;br /&gt;The Amazon Kindle Team &lt;br /&gt;---------------------------&lt;br /&gt;&lt;br /&gt;Tellin' ya, I love the Kindle. The more I use it, the more I know that anything remotely resembling a backlit laptop, netbook or otherwise, isn't a substitute. You can use it anywhere and it's never inappropriate, because for all intents and purposes, you're reading a book or a notepad. I only refrain from using the keypad now and then, like in crowded, subdued situations, e.g. when you're in a conference session, around people eating dinner in a restaurant, etc; it can be distracting.&lt;br /&gt;&lt;br /&gt;A while ago, I got into an online back 'n forth about the usability of a Kindle compared to a real book. One of the forum commenters said that it's harder to take notes on a Kindle, and that he'd rather just use a book. &lt;br /&gt;&lt;br /&gt;I respect books, I own a lot of them; but fact is, we waste a LOT of paper on them, and many kinds of books  aren't intended to convey that aura of "book". Technical manuals, programming books, general paperbacks, reference guides, blogs, etc., are about conveying information to me; I just want the content. For that sort of thing, if you can make a better book, which makes annotation, highlighting, clipping, bookmarking, and searching faster and more robust, you've got my interest. &lt;br /&gt;&lt;br /&gt;The highlighting and annotation feature of a Kindle is essentially, pushing a button and moving a cursor. It can be a little awkward across pages, otherwise it's easy and fast, certainly faster than carefully drawing long horizontal lines. Clipping articles and taking notes is essentially the same thing; hit Menu, select Add Note or Clip Article, and it's done. There's keyboard shortcuts I'm sure, but the menu options don't bother me, so I haven't really explored them. &lt;br /&gt;&lt;br /&gt;What happens to these notes, highlights, and clippings? They get stored in a sort of "book" of their own. On your main book list, you open "My Clippings", and lo and behold, there they all are. This information is actually saved to a .txt file on your Kindle (right in the root directory), so if you want, you can even move it to your computer and print or edit it. I find this VERY handy. If I could print right from the device that might be welcome, but again, the Kindle is supposed to be a better book, not a laptop or tablet; I appreciate the distinction. &lt;br /&gt;&lt;br /&gt;All this data gets backed up to your Kindle account online via the free "Whispernet" 3g wireless access you get with the device. So, if you ever lose your Kindle, or want to view the information on a different Kindle, your good to go; just sync it to the new device. I was disappointed to find that "My Clippings" didn't seem to be on the iPhone though. Well, at least I can grab the txt file...&lt;br /&gt;&lt;br /&gt;...no need anymore. Now I can just use any browser-enabled device, access my Kindle account, and get to My Clippings. Here's a shot of it on the iPhone, this not being possible until today. &lt;br /&gt;&lt;br /&gt;Note: To get it REALLY right, you should just be able to access "My Clippings" from any Kindle reader, iPhone-based or whatever. It's still not on the iPhone native app as far as I can tell. &lt;br /&gt;&lt;br /&gt;The below shows a book I read on my Kindle, which had a music exercise (you had to write down the key a piece is written in based on a the chords used to create the music). I just did it with the keypad on the Kindle while on the subway. Below you can see the chords I entered (got 'em all right btw yay). &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/kindleblog/highlites.png" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-729955061212513912?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/729955061212513912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/amazon-adds-browser-access-to-kindle.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/729955061212513912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/729955061212513912'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/amazon-adds-browser-access-to-kindle.html' title='Amazon adds Browser Access to Kindle User Highlights and Notes'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-7044721488237860921</id><published>2009-05-28T04:12:00.000-07:00</published><updated>2009-05-28T05:50:57.251-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='Mate'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='air'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><title type='text'>TcozTwitter: A Twitter Client using Adobe Air and the Flex Mate Framework - Day 2</title><content type='html'>This is a continuation of &lt;a href="http://www.tcoz.com/blogger/2009/05/tcoztwitter-twitter-client-using-adobe.html"&gt;TcozTwitter: A Twitter Client using Adobe Air and the Flex Mate Framework - Day 1&lt;/a&gt;, in which I decided to complete a number of technical exercises by building a Twitter desktop client using the Twitter API, Adobe Air and the Mate Framework. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you recall, last time I was able to successfully make a call to the Twitter public data feed that returns the last 20 public tweets, and display them in a list in my client. It looked like this:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://www.tcoz.com/blogger/images/twitterclient/twitterclient_1.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, clearly I've got a ways to go, but certainly this represents a major element of the development; get the data, parse it, bind it to a list with the UI elements to properly display the data. Keep reading; the app doesn't look like this anymore.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The next step was to clean up the UI a bit, which is what we'll look at here. Although not a programmer as far as I know, iJustine, an internet/lifestyle tweeter and blogger of some notoriety, unknowingly gave me a suggestion for how to proceed. She said that she couldn't change the background color of her tweet display; I assume that if she wanted this feature, it would probably be a popular one, so I decided to implement a way to skin my Twitter client at a rudimentary level. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And I must say, Mate made it pretty easy to do. I think any framework would have, being as the task of reading in config data is the same as reading in any other kind of XML data, and I had already set up a call/receive pipe for the public tweet XML, so ideally I should just be able to use the same exact technique, and that's exactly how it panned out. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the last article, I showed the fragment of Mate code (which is just MXML) that retrieved the public tweet feed. The code below does the same exact thing, except it hits a relative file, config.xml, instead of a remote service. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Mate formula for hitting data and storing it seems to be this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Create your Event class (in this case, Event_Config). This is a standard Flex/Flash event, nothing fancy. It should have a static constant (at least one, though it can have several) with the name/type of event you want to dispatch (which is always a best practice for events not matter what environment you're in). &lt;/div&gt;&lt;div&gt;- Create a Manager class that will be passed arguments when the event is handled by the EventMap. This means creating at least one public method on the class. Interesting that none of the examples I have seen ever suggest exposing these public methods via an interface...which is something I'll comment on later. I used Manager_Config.&lt;/div&gt;&lt;div&gt;- Create a Model class, I like to use singletons, to hold the elements the Manager parses out.&lt;/div&gt;&lt;div&gt;- Tie the Event, and it's handler, to the Manager, via the EventMap. &lt;/div&gt;&lt;div&gt;- Dispatch your event as needed, remembering that in Mate, events have to bubble to the EventMap, which initially, will be located in the top-level MXML file. This means that you can either only dispatch from an object that participates in the app-level DisplayList, or by using the GlobalEventDispatcher workaround detailed in my last article. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The code fragment that does the above looks like this:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;&amp;lt;mate:EventHandlers type=&amp;quot;{Event_Config.GET_CONFIG}&amp;quot; debug=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt; &amp;lt;mate:HTTPServiceInvoker url=&amp;quot;xml/config.xml&amp;quot; resultFormat=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;mate:resultHandlers&amp;gt;&lt;br /&gt;   &amp;lt;mate:MethodInvoker generator=&amp;quot;{Manager_Config}&amp;quot; method=&amp;quot;storeConfig&amp;quot; arguments=&amp;quot;{resultObject}&amp;quot; /&amp;gt;&lt;br /&gt;  &amp;lt;/mate:resultHandlers&amp;gt;&lt;br /&gt; &amp;lt;/mate:HTTPServiceInvoker&amp;gt;&lt;br /&gt;&amp;lt;/mate:EventHandlers&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;So, when the app starts, I want to load the config.xml file, which I do like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- In creationComplete of TcozTwitter_AIR, I dispatch an instance of Event_Config, using type Event_Config.GET_CONFIG. &lt;/div&gt;&lt;div&gt;- This bubbles to the EventMap handler MXML tag, which makes the call to the HTTPService, receives the result, and directs it to the Manager_Config class public method, storeConfigOptions.&lt;/div&gt;&lt;div&gt;- That method takes the result argument, parses the XML, stores the elements on the associated properties in Model_Config, which exposes them for use throughout the app. &lt;/div&gt;&lt;div&gt;- At the appropriate times, the UI elements, like Tweet backgrounds, apply their colors as style elements. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;iJustine, there ya go. Again, more or less the same exact idea as grabbing tweets, or any data it would seem. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some observations on this flow:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is the way the tutorials, and even more advanced samples I've seen, prescribe retrieving service data. Typically though, I would not use the HTTPService MXML tag (or any such MXML based mechanism for that matter), I'd forward the handling to a class using the Command pattern. I've read some ways to do this in Mate, but it seems that it's not the common practice; using the EventMap handler as the Command, and distributing the management of the result to Managers, is the norm. For basic things, this might be ok, but what if you have a complex command of some kind that runs several service calls? The MXML could get very bulky, or you'd need multiple handlers, which would seem to make atomic operations difficult to manage. In fact, I think that in an app of any size, EventMaps could get bulky fast, which would cause you to start thinking of your app in terms of layers of EventMaps. Conceptually, perhaps this isn't that much different than thinking of your app in terms of layers of Mediators in PureMVC, but plain old code looks a lot leaner 'n meaner to me than all those MXML carats, quotes, equal signs, and so on. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Based on that, I'll probably only use an EventMap handler tag to initiate a command, like calling a service, if there is only ONE simple command and result. Anything more and I will broker it to a Command class, which fortunately, I know how to make dispatch events now (same as any non-view class, use GlobalEventDispatcher). I know Managers could be thought of as Commands, but they're really not, see below. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another observation which I touched on before; use of MXML tags instead of instances of classes lets developers avoid thinking of factoring their class hierarchies and exposing their public members using interfaces. I understand that the classes that back the MXML tags are well factored in this manner, but for example, in PureMVC, part of it is implementing the Command pattern as the "C" in "MVC" (control). As you may know if you've gotten this far, the Command pattern uses an interface to expose "execute". If you use a Template pattern (so you create a base class that implements the interface and you extend that base class whenever you create a specific kind of command), you've just made all your commands polymorphic, which lends to things like "undo", command stacks and chaining, etc. Mate doesn't seem to have this concept built in. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Good thing, bad thing? I don't know. To me, one of the points of a framework is to prescribe patterns of development for common application tasks, like executing logic. If you use Cairngorm or PureMVC, all I need to know is that a developer understands the framework, and I know that when I say "call a service, handle the data, store it", that the developer--in the case of PureMVC--will dispatch an event to a Mediator, which will send a Command Notification to the Facade, which will execute the a Command class, which will make the service call and handle the result, then broker that result to to a Proxy class, which will parse the data and store it on the Model, which makes it available to the application. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It may sound verbose, but it's explicit and actually saves a lot of time; I KNOW how the developer will perform the task, and if you're managing a bunch of them, that's a GREAT thing. Using Mate, it would seem that I'd have to lay out the flows myself and communicate them to the team as standards, and make sure they were doing it. With a team of PureMVC junkies, we may quibble about the best way to cut up an application with mediators, or the best way to represent a Model via a Proxy, but otherwise things like views calling views or views talking directly to models will never happen; if it does, the fix is to educate the developer on the prescribed mechanisms of the framework. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, enough of that. The bottom line is, you make edits to an XML file, restart your app, and voila, there are your colors, nice gradients and all that. Note that an XML file is not how I intend to keep this; settings is a great opportunity to take advantage of Adobe Air local storage. But for now, until I establish a base set of requirements for preferences and settings, it's easiest to just keep it in something abstract and lightweight, as opposed to building out the settings UI now, knowing that it will just change drastically several times before I have a locked feature set. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One other thing I took advantage of: Air's ability to have the app resize like a desktop app, and reflow the layout. This is a great thing IMHO; if you resize the Twitter HTML page, the tweets don't reflow to take up the entire width, they stay in one column. My client reflows the tweets to take advantage of the entire space, letting you see more tweets without scrolling. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Next step: incorporating the metadata associated with a user, and getting that message field populated. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Screenshots of the latest client below, showing the application of the config.xml, and the resize-reflow. As always, thanks for visiting.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://www.tcoz.com/blogger/images/twitterclient/twitterclient_2.png" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://www.tcoz.com/blogger/images/twitterclient/twitterclient_3.png" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-7044721488237860921?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/7044721488237860921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/tcoztwitter-twitter-client-using-adobe_28.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/7044721488237860921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/7044721488237860921'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/tcoztwitter-twitter-client-using-adobe_28.html' title='TcozTwitter: A Twitter Client using Adobe Air and the Flex Mate Framework - Day 2'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-1797057648397287396</id><published>2009-05-27T04:05:00.001-07:00</published><updated>2009-05-27T05:16:53.073-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Meebo'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='chat'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><title type='text'>Meebo Chat: browser-based universal client. I use it, I like it. The new notifier has Email notifications now...Windows only though (argh!)</title><content type='html'>I'm a longtime fan of Meebo, &lt;a href="http://www.meebo.com/"&gt;click here to check 'em out&lt;/a&gt;. In a nutshell, they are a browser-based chat client that allows you to connect to just about any chat service in a single view: Yahoo, AIM, Jabber, Facebook chat, and more. You can use them all nice 'n neatly, with all your contacts mixed 'n matched as needed, in a single browser tab.&lt;br /&gt;&lt;br /&gt;Meebo has announced the following via their blog (which pops up in a chat window when you start Meebo), this version shortened to highlight the important bits:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;"Mail notifications for the notifier (plus proxy and ssl!)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;We have something pretty cool to announce - the Meebo Notifier now supports email notifications!...Meebo Notifier for Windows can now alert you when you get new emails for your Gmail, Yahoo, Hotmail, and AIM accounts.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Whenever you get a new email, the notifier will show a popup notification just like it already does for IMs, and will also create an icon in the system tray next to the Notifier icon (as shown below) so that you can easily access your email accounts.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;A simple click on a mail notification or its corresponding icon will take you right to your mail web page.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;By the way, in case you missed them, we introduced a couple other new features in the Notifier a few weeks ago: HTTPS support...Proxy access."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The notifier is a native app, which at this point, unfortunately only runs on Windows, so I don't use it (MAC CLIENT PLEASE). It looks like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.meebo.com/site/img/notifier-click.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Why I started using Meebo is actually sorta funny. I was on a big account in NYC--you've all seen the work more than likely--and needed to communicate with some developers about external video feeds.&lt;br /&gt;&lt;br /&gt;Naturally, you send URLs back and forth; we were using AIM to do so. Security had decided they didn't want URLs going back and forth through their routers; don't ask me why, it's ridiculous I know. Everybody got around it just by typing, "go to www dot domain slash dot" and so on. Dilbertian corporate thinking at its best; hinder an employee's ability to do a job, call it security, and check something off your list.&lt;br /&gt;&lt;br /&gt;One day I was walking around the floor, and an employee was using some browser-based chat client. I saw a URL pop up in one of the chat windows.&lt;br /&gt;&lt;br /&gt;I queried, "WTF is that?". He replied "Meebo. It runs over HTTP/port 80 so security doesn't block it".&lt;br /&gt;&lt;br /&gt;Five minutes later I had a meebo account, and I've been using it ever since; that's probably at least three years, maybe more.&lt;br /&gt;&lt;br /&gt;Meebo has evolved quite a bit since I started using it as a humble way to beat corporate security. The notifier is a recent thing (but again I don't use it MAC CLIENT PLEASE). It also didn't have advertising; it does now, and I must say, if you must have advertising, their model is an example of how to do it without pissing off your users. Ads appear as a slide-up panel at the bottom of the window, which you can click an arrow to close into an unobtrusive bar at the bottom. They tried one or two other more intrusive models, users didn't like it, they ditched it. We recognize they're a startup and need money, but if any service compromises gets pushy about premium access by destroying the original experience, I'll drop you the same day.&lt;br /&gt;&lt;br /&gt;Pic below:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/meebo/pic1.png" /&gt;&lt;br /&gt;&lt;br /&gt;They've also got a browser-based Mobile client, which works fairly well, a screenshot from the iPhone of the contact list is below; you sign in, you see your contact list as pictured below, you tap a contact, you go to a window dedicated to that conversation. You can run multiple conversations by tapping back 'n forth to the contact list.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/meebo/pic2.png" /&gt;&lt;br /&gt;&lt;br /&gt;You can set some nice options, like backgrounds and such, turn notification noises on and off, add/remove accounts, use hide/invisible on each of them, use custom status messages, review chat history, and so on. All the things that you'd expect these days from a chat client. Meebo even implemented file transfer a little while back.&lt;br /&gt;&lt;br /&gt;Meebo also has a nice little service feature; you can actually create your own Meebo room on your own web page. Think of it as a turnkey chat solution. You go to their Meebo widget configurator page, set some options, and blammo, you have a dedicated Meebo room that other people can visit. If you look at the first page, you can see the un-blurred "tcoz's room" entry at the top of the contact list. When you double click it, you see this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/meebo/pic3.png" /&gt;&lt;br /&gt;&lt;br /&gt;Notice the "embed" button at the top. When you click it, you get a window that lets you copy markup for pasting into your own web page, and blammo, your site is chat-enabled with your own Meebo room. I don't use them because I dislike the advertising integration, and there may be a way to turn it off that I haven't found, but if you're looking for something fast that works, it's a good option.&lt;br /&gt;&lt;br /&gt;So, Meebo has gotten more interesting. If you're on Windows, try the notifier.&lt;br /&gt;&lt;br /&gt;One more time...&lt;br /&gt;&lt;br /&gt;MAC NOTIFIER CLIENT PLEASE ok plz ty.&lt;br /&gt;&lt;br /&gt;As always, thanks for visiting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-1797057648397287396?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/1797057648397287396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/meebo-chat-browser-based-universal.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/1797057648397287396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/1797057648397287396'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/meebo-chat-browser-based-universal.html' title='Meebo Chat: browser-based universal client. I use it, I like it. The new notifier has Email notifications now...Windows only though (argh!)'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-168746306960272187</id><published>2009-05-25T07:16:00.001-07:00</published><updated>2009-05-26T07:35:28.123-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='Mate'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><title type='text'>TcozTwitter: A Twitter Client using Adobe Air and the Flex Mate Framework - Day 1</title><content type='html'>QuickStart: This subject of this article is a project that satisfies three goals: &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- To complete a practical exercise of using the Twitter API.&lt;/div&gt;&lt;div&gt;- To create complete a practical exercise of using the Flex Mate framework.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- To have a Twitter desktop client that works *exactly* the way I want it to.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To that end, I decided to build a Twitter client, using Adobe Air and the Mate Framework. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Onto the discourse...&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Why this group of technologies? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Twitter: If you're reading this article, I don't have to tell you why it's important, as a developer, to do more than dabble with it. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Air: I really like building Air apps. At it's most basic level, you could say that Air is Flash running on your desktop in a native dedicated runtime manager (called "Air"). Freed of the browser sandbox, Air has a lot of capability Flash doesn't, like real local file access and data storage, and doesn't suffer from some of the general performance issues of the browser-based Flash player. The NY Times has dumped Microsoft Silverlight in favor of Air, as has the Major League Baseball tech organization. It's a pretty exciting technology, and if you're already good with AS3/Flex, the learning curve is more a speed bump than a hill; write one Air app, run it on any machine with it's OS-specific runtime installed. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mate: I'm predisposed to being dubious of Mate, because I prefer frameworks and patterns that translate to as many technologies as possible, and I prefer to avoid markup for UI layers whenever possible, because it tends to create scripted spaghetti. PureMVC, for example, is easy to implement in just about anything, and inclines the developer to some level of genuine C-style OOP. Mate, on the other hand, is inherently Flex targeted; it makes heavy use of Flex MXML and databinding. But, love it or hate it, I realized a while back that avoiding MXML isn't good for my business, so I skilled up, and these days a lot of people are loving Mate, so I should get a working knowledge--though I will say, this is often the case of things that make a complex technology seem easy, and it all collapses once you hit big apps. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you want to know more about the Mate Framework, go to the &lt;a href="http://mate.asfusion.com/"&gt; Mate Flex Framework Home Page&lt;/a&gt;. There you can find the SVN and/or SWC downloads, tutorials, etc. etc.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Add these three things up, and it'd seem that, if I put in the time, I'll have a pretty cutting edge Twitter desktop client, insofar as the technologies involved to make it work are concerned. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, down to the bits 'n bytes of Day 1, TcozTwitter. I'll assume you know about things like Flex, working with APIs, and so on. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As I said, I have mixed feelings about Mate; it's true that it's pretty easy to learn and get working, which no doubt contributes to it's popularity. People talk about it like the second coming, and say that it doesn't prescribe a particular kind of development, your app isn't tied to it, etc. But from what I can see initially--granted I'm no Mate expert, but I've worked with other frameworks pretty deeply--this isn't true. Your app is VERY tied to it.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For example, Mate prescribes how you use events in a VERY particular way. Events dispatched directly from non-views (typically "managers" in Mate parlance) don't hit the all-important EventMap (essentially a clearing house for event handling), because in Mate, you bubble all your events up to the top-level application for handling, and bubbling is a function of the DisplayList; non-views need not apply. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is a workaround; in the non-view, create an instance of a GlobalEventDispatcher and use that to dispatch the event so that it immediately hits the top level app, which contains the main EventMap, but that's not at all what I'd typically do; usually I'd just have the non-view extend EventDispatcher, either directly or in a base class, and dispatch away. I was surprised by this; in Cairngorm or PureMVC, the basis of how you dispatch an event isn't prescribed by the framework; what you do with that event once you catch it is. I guess this is a matter of perspective, and no doubt this statement will annoy the Mate advocate, but there it is. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note: I don't dislike Mate. It's growing on me. But at this point I still prefer PureMVC. This may change over time, we'll see. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you'd like to try some Mate twittering yourself, for your first Twitter call, here's a simple MXML fragment showing what to put in your MainEventMap (which is essentially a manager for handling bubbled-up events in the Mate framework):&lt;/div&gt;&lt;br /&gt;&lt;pre class="postCode"&gt;&lt;br /&gt;&amp;lt;mate:EventHandlers type="{Event_GetLatest20Public.GET}" debug="true"&amp;gt;&lt;br /&gt;&amp;lt;mate:HTTPServiceInvoker url="http://twitter.com/statuses/public_timeline.xml" resultFormat="xml"&amp;gt;&lt;br /&gt;&amp;lt;mate:resultHandlers&amp;gt;&lt;br /&gt;&amp;lt;mate:MethodInvoker generator="{Manager_Tweets}" method="storePublicTweets" arguments="{resultObject}" /&amp;gt;&lt;br /&gt;&amp;lt;/mate:resultHandlers&amp;gt;&lt;br /&gt;&amp;lt;/mate:HTTPServiceInvoker&amp;gt;&lt;br /&gt;&amp;lt;/mate:EventHandlers&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Notice in there we have an HTTPServiceInvoker pointing to the twitter endpoint that dumps out the latest 20 public timeline tweets. You can grab them in a variety of formats just by changing the extension of the public_timeline call (instead of .xml, use .json for example). This is strictly preference; I like XML, so that's what I'm using. In addition to this, you'd have to write your Manager_Tweets class, with the "storePublicTweets" method, and dump it onto a model for binding and so on. If you need a primer that shows you how to set this all up (it's very easy), &lt;a href="http://mate.asfusion.com/page/documentation/getting-started"&gt;go through this tutorial&lt;/a&gt;. I used this as as starting point for my Mate explorations a while back and it was very helpful. While there's certainly a lot more to learn about Mate, understanding how the EventMap works in conjunction with Managers is the most important part, and this tutorial makes it very clear. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With all that understood, my first effort was to take that XML and bind it into a TileList, which has an itemRenderer that receives the individual data objects, which have properties that map to the original XML elements. So, in the itemRenderer, just by setting the image component's source to "data.profile_image_url", and the top text components text property to "data.name", I get the expected result; a scrolling TileList of the latest 20 public posts, with profile images and names. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's not pretty; I didn't work out the sizing or layout, or scrolling, etc. This is entirely the first step. But hey...I've got an Air client, using the Mate framework, hitting the Twitter API and displaying user data. I'm on the way to achieving the three goals I mentioned at the top of this article.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So far so good. Next step; clean up that UI to display the scrolling list more neatly, and add in the message and metadata to that display of public posts. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As usual, thanks for stopping by. Pic of in-progress client below:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://www.tcoz.com/blogger/images/twitterclient/twitterclient_1.png" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-168746306960272187?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/168746306960272187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/tcoztwitter-twitter-client-using-adobe.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/168746306960272187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/168746306960272187'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/tcoztwitter-twitter-client-using-adobe.html' title='TcozTwitter: A Twitter Client using Adobe Air and the Flex Mate Framework - Day 1'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-3934857871528760901</id><published>2009-05-22T07:04:00.000-07:00</published><updated>2009-05-22T07:50:32.676-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='Optical Blue'/><category scheme='http://www.blogger.com/atom/ns#' term='mouse'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><category scheme='http://www.blogger.com/atom/ns#' term='laser mouse'/><title type='text'>Microsoft's Optical Mouse Blue: Any good?</title><content type='html'>&lt;div&gt;I've gotten a couple of comments that I take a while to get to the point; I'm abashed, as I did study journalism and was a newspaper reporter for a couple of years.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I'll put it right out there; if you're mobile and do the kind of work where using the laptop mousepad just doesn't cut it, get one of these new Optical Mouse Blues. I bought an Explorer Mini Mouse (four button, wireless, multi-directional mousewheel) at Staples for 50ish bucks. Thumbs up. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Great features: the new Optical Track Blue technology allows the mouse to track reliably on just about any surface. They say "not clear glass or mirrored", but I use it on a clear glass table and it works fine...not "sort of", but completely fine. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It also has a little "snap in" recess on the underside that allows you to store the USB receiver (which is suitably small), and when you do so, it completely powers down the mouse. This has been a problem in the past; I'd open up my bag, see the mouse laser active, and know that my battery would be on the wane. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And now the discourse:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This blog is about things that matter to me as an independent software developer; part of that means buying tools that allow me to work faster and smarter. Sure, I don't want to have my pants pulled down when I hand over a credit card for new equipment, but if the tool lets me do my job better-faster-stronger, I'll lay out the cash and look forward to the write-off. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I work in a lot of different places; onsite for client presentations, code reviews, and plain ol' hacking away. If you do the same, you can appreciate why I'd be interested in a mouse that supposedly works reliably on more surfaces. Chrome, stainless steel desks, glass table tops, textured counters, granite, and any number of other non-optimal mousing surfaces, can stymie the standard "red" optical mouse. Since I typically don't carry a mousepad in my bag, especially these days when I'm all about traveling as light as possible, I've ended up using a magazine or notepad...which, as you may know, totally sucks.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I took the plunge and bought one of these new Optical Blue Track things--Microsoft actually made the press announcement in Sept. 2008, &lt;a href="http://www.microsoft.com/presspass/press/2008/sep08/09-09BlueTrackPR.mspx"&gt;see here&lt;/a&gt;--and so far, I'm happy with it. There really is a difference. In fact, more of a difference than they seem to think.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cases in point: my dining room table. It's a textured wood surface. My Logitech laser mouse seems to get hung up on it a lot; I'll move the mouse, the cursor jitters. So I switch to the Microsoft USB explorer (red laser) mouse; better, but not great, and it doesn't have all the extra wheels and such that the Logitech one has. Same for watching TV and mousing on the couch cushions. I always end up just using the laptop touchpad, which even after all these years, I still don't like; gimme a regular mouse any day. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Blue Track Mouse, as long as I can keep it in more-or-less steady contact, is a rock. Interestingly enough, Microsoft says it doesn't work on clear glass surfaces. I beg to differ; I have a laptop on a glass table that I use for powering my Line6 POD (a digital effects modeler for guitarists), and it works fine. The table is clear glass, there's no tint. Kudos to Microsoft for the warning, but I'm tellin' ya, it works.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And, the blue glow is REALLY cool :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So there you go; another positive recommendation from this indie software developer. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pics below:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://www.gearfuse.com/wp-content/uploads/2008/08/microsoft_bluemouse.jpg" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;a&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-3934857871528760901?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/3934857871528760901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/microsofts-optical-mouse-blue-any-good.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/3934857871528760901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/3934857871528760901'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/microsofts-optical-mouse-blue-any-good.html' title='Microsoft&apos;s Optical Mouse Blue: Any good?'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-2556682235521955608</id><published>2009-05-20T12:08:00.000-07:00</published><updated>2009-05-21T05:10:17.320-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='verified'/><category scheme='http://www.blogger.com/atom/ns#' term='independent'/><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><title type='text'>The Facebook "Verified" Apps Program...Should I Do It?</title><content type='html'>I know Facebook wants me to. But do I? Hmm...&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you don't know what this is all about, Facebook told developers with applications in their Apps directory months ago that they were implementing a "Verification" program that would enable us to differentiate our apps by having them in a paid tier of the Application store. These applications would represent the cream of the FB app crop, and so on. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Initially I said, "oh yeah gotta do that, anything for more credibility". I love FB development, have a couple of apps out there, and was excited about the differentiation. But I hesitated, then stopped...what exactly do I get, by paying $375 to get my app listed as "Verified"? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I know they're overhauling the overall Apps directory: all apps get a new profile page with their own news feeds, there's a new Applications You May Like section, an auto-generated list that combines the most popular apps on the site, apps your friends are using (oh great, "Flair"), and apps Facebook thinks you might like, based on what you're currently using...ok, that's all good stuff, it creates buzz, makes it all more visible, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But as far as "verified", aside from saying "I have a verified app" to the world, here's the checklist of "what you get", as far as I know:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- A green check mark next to the rating stars under your app name/icon. &lt;/div&gt;&lt;div&gt;- A Facebook "Verified App" icon on your about page.&lt;/div&gt;&lt;div&gt;- A "two-bucket boost" in requests and notification allocations, which "continue to be subject to the application reputation system which adjusts allocations based on various user response metrics".&lt;/div&gt;&lt;div&gt;- A $100 Facebook advertising credit. &lt;/div&gt;&lt;div&gt;- Discounted registration fees to FB-type events. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's a photo of the new overall app listing showing apps with the green check mark, and a photo of the verified logo from an about page:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://graphics8.nytimes.com/images/2009/05/20/technology/bits_facebook_appdir.480.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://developers.facebook.com/images/verification_badge.gif" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yeah, it's a good little kudo. But overall, I'm not going to rush to shell out $375 bucks for this, and I have a feeling many shops that crank out FB apps aren't going to tell their clients, "Oh yeah you GOTTA submit for verification". There's a lot of other ways to get the word out about an app: Twitter, FB fan pages, all the other social network mechanisms, you name it. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This sort of reminds me of that "Windows Compatible" app signing program that Microsoft ran (or whatever the actual verbiage was); after a while, nobody cared anymore. Install instructions for apps that aren't branded this way warn you that it didn't have this accolade, and just told you to "Proceed Anyway", which is exactly what we all do. I never made an app choice because it had the OS manufacturers "compatible" logo on it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Facebook also says this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; "Facebook's Application Verification Program is an optional program designed to provide applications with a way to stand out and reassure users that they will provide a good experience. Users of verified applications can feel confident that these applications strive to be transparent about how they work and respect social expectations between friends."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What about the rating system, the discussion boards you can place around the app, the overall reputation system? If I look at this and see a lot of slag, I'm not going to touch that app. If my friends, or just a lot of people in general, say it's great, I might check it out. It's true, I may be somewhat more initially inclined to give an app a chance if it's verified, if there's no other data available. But I'll always consider what people say more heavily than I will consider any green checkmark. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another thing: many, many popular Facebook apps are here-today-gone-tomorrow. Would you spend $375, and wait, to get such an app verified? Probably not. Is that a good thing? Again, a lot of these apps run well and are popular, they're just not built for a long shelf life. I'm not sure that shuffling such apps to the "ordinary" category is the right thing to do. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm surprised to find myself cynical about this, because I think Facebook does a great deal for the indie application developer. You can get an app, with robust social graph integration, into the FB world, for the price of learning their API and building something halfway decent. That's a great deal, both for the developer (exposure) and Facebook (content). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But I think I'm going to hold onto my $375 and see how this plays out before I submit Planet Sudoku for verification. Even that might be a mistake though, because it's possible that the only time "Verified" will really matter is when it launches, and a little while after. When the novelty wears off, yeah you can still submit, but it might be just to get a verified app on your resume. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Facebook will undoubtedly shuffle this one around a bit as they get feedback and so forth though...or, if it's just pointless and/or more trouble than it's worth, dumb it down or even abandon it. Unlikely, even very unlikely, but not, imho, in the realm of impossibility. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-2556682235521955608?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/2556682235521955608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/facebook-verified-apps-programshould-i.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2556682235521955608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2556682235521955608'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/facebook-verified-apps-programshould-i.html' title='The Facebook &quot;Verified&quot; Apps Program...Should I Do It?'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-2967861356492385026</id><published>2009-05-20T05:37:00.000-07:00</published><updated>2009-05-20T06:55:42.166-07:00</updated><title type='text'>The Rebranding of Flex: Back to Flash We Go.</title><content type='html'>&lt;div&gt;You may have heard that Adobe is rebranding their Flex Builder tool to "Flash Builder". The FlashBlog goes into Adobe's perspective, &lt;a href="http://theflashblog.com/?p=998"&gt;read more here.&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;I don't market myself "a Flash guy", even though the majority of my projects are UIs delivered by the Flash player. My brand is "ActionScript developer" with expertise in OOP, widely used frameworks (like Flex, PureMVC, Mate, etc.), and back end technologies that feed the UI (remoting gateways, rest services, xml and JSON feeds, built out of PHP, Java, .Net, Ruby, etc.). I'm good with PaperVision and Facebook development, and can do all kinds of motion and graphic stuff as well, but the latter usually falls under, "yes I can handle that if you need me to." &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Why the distinction? From the perspective of this self-employed indie software guy, three major reasons:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Type of work. "Flash guys" do banner ads, click-through widgets, simple video players, that sort of thing. It tends to be short-run, short-notice work that commands the lower end of Flash-based developer rates. Lots of pick-up ad agency work, holiday campaign work, that sort of thing. It's sort of like cooking tacos; once a month, if I have the time, it's fun.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Customer perception. I've heard this so frequently that I just accept it as the truth; a "Flash guy" is not perceived as a serious programmer or technologist. At best, you'll get considered a good designer that can do a little scripting.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Availability. There are so many "Flash guys" out there it's unbelievable (interestingly, if you're any good at all, even today, there's no problem finding work). But there are very few proven, independent ActionScript developers; I personally know of about five in my area, and we're all very busy. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In short, the longer term and more interesting work comes if you can brand yourself as somebody that can work with the back-end team to implement a robust interface to the UI, and then build the UI using frameworks and patterns that can be represented as repeatable architectures with consistent implementation methodologies. This is lead programmer/architect work, which is a lot more interesting to me, and of course commands a considerably higher rate. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A few years ago, Adobe introduced Flex. Everybody thought it was a different technology; it wasn't, it was just a more programmer-centric way of creating UIs with ActionScript and a form of XML markup called MXML. "Flex" is actually nothing more than an ActionScript framework, but like any other framework, it encouraged a well-factored, consistent development methodology. On top of that, MXML could be used in top-level component files to represent where these components got placed on the screen, and ActionScript could be used to populate those components with data in a variety of ways, including databinding (which sort of auto-magically updates the UI as data changes), and so forth. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The "Flex Builder" was also released as the programming environment for the Flex framework and MXML. It was built on Eclipse, which is a world-class, industry standard programming tool. It has integrated performance analyzers, full-featured debugging tools, and just about everything else a serious programmer would expect to find, and of course, you can use it to build other areas of the same project, like a Java back end. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note: you can still build crappy apps in Flex. But, because of the nature of the tool and use of a real framework, it attracted more academic programmers, who usually have more training, or at least interest, in real professional programming methodologies. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This was extremely well received by the "Flash guys" that had evolved beyond the ad-hoc, inconsistent spaghetti generally seen in Flash widgets. This sort of Flash developer was truly a a professional programmer, but it was very difficult to get a customer to understand why we were different than your run-of-the-mill banner ad guy. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Flex was not extremely well received by the "Flash guy" designer type, who, from comments I saw at Adobe events and projects I've worked on, seemed to be afraid that they'd have to actually learn programming to continue doing banner ads in Flash. Imagine that.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Of course, the answer is, you need both. I do the heavy lifting as far as programming is concerned. I work with "Flash guys" to create things like sexy loaders and animations, which I integrate into the application. There's room for both kinds of developers, and Adobe managed to pull this off by having the "Flex" developer, and the "Flash" developer. Customers have come to understand the difference, which is why you'll see people looking for one or the other depending on what they need. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But now, Adobe has decided to turn "Flex Builder" into "Flash Builder". They're even changing the logo (though it's still the Flex grey, as opposed to the Flash red). Hmm...does this muddy the waters, does it compromise a distinction that, after all these years, made it easy to explain to a customer why I'm better for this role than the designer/Flash type?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Adobe says, "On the contrary, Flex is now much more understandable. Flex is an ActionScript framework for creating RIAs and that is not changing. This name change actually makes the Flex brand more solid and understandable."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Oh c'mon. That might be true from the perspective of a technologist that understands Flash technologies, but I know technical recruiters and business guys that depend on the distinction. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"I thought Flex programmers were more serious than Flash programmers, but now there's no more Flex.". &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Err...no. There was actually never a 'Flex programmer', we are all Flash programmers, what you thought of as a 'Flex Programmers' is actually a Flash programmer that uses the Flex Framework, and the Flex Builder, to build Flash applications". &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Customer: Huh? Are you a Flex programmer, or not?&lt;/div&gt;&lt;div&gt;Me: ...yes sure. I'm a Flex programmer. &lt;/div&gt;&lt;div&gt;Customer: Ok, why didn't you just say that? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I know for a FACT I will have this conversation. The customer will be frustrated and make comments like, "damn engineers, fixing what isn't broke". I'm confident I can manage it, because I worked for Microsoft and got used to explaining to customers why something that was a certain way was actually better if we changed it, even though nothing had actually changed other than how we want you to look at it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, Adobe has given me a job to do. I don't mind all that much; I'll reach out to all my clients and make sure they understand it. That's good client relationship work--and might even drum up a little business. However, I do think Adobe is understating how difficult understanding the difference between Flex and Flash initially was, how successful and welcome it was at differentiating the two kinds of developers based on the two distinct brands, and how confusing it's going to be for a lot of hiring organizations when they're told "I use the Flash Builder to build Flex programs."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Maybe what we now know as Flash CS3 needs to be rebranded as "Flash Designer".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Like any other change of this ilk, it'll rumble for a while and then be gone, we'll get around it. My advice to the independent Flex developer out there though...erm wait, the independent Flash developer that knows the Flex framework...or however you brand yourself: let Adobe do the explaining. Forward your clients the FlashBlog link. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Aside from that, leave it at "it's a marketing thing. Nothing has actually changed. You can still refer to me as a Flex developer if you like." &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-2967861356492385026?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/2967861356492385026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/rebranding-of-flex-back-to-flash-we-go.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2967861356492385026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2967861356492385026'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/rebranding-of-flex-back-to-flash-we-go.html' title='The Rebranding of Flex: Back to Flash We Go.'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-2074680886127519962</id><published>2009-05-19T03:14:00.000-07:00</published><updated>2009-05-19T06:30:59.164-07:00</updated><title type='text'>Working Off-Site: Practices for the Indie Software Developer</title><content type='html'>Being an indie software developer isn't easy; getting and keeping clients, managing payment and collections, doing the books, complex taxes, ensuring you have software licenses and top-end gear, setting up a home office properly, and keeping up-to-date on the latest technologies, finding and managing benefits like health care and a 401k, all without a manager telling you to get it done, isn't for everybody. It's hard work. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For me, there's no doubt. Like an actor, writer, or musician, I'm all about the project and my role. I perceive myself as "talent", and like to be in direct control of what I work on, when I work on it, and how much I earn for doing it. For the first 10 years of my career in technology, I worked in strategic planning and R&amp;amp;D at American Express, and as a technology specialist (essentially a field technologist, building prototypes and comparative demonstrations) for Microsoft. I won't get into a lot of detail as to why I decided to leave and go it on my own; suffice to say that I prefer the freedom to pursue work that interests me every day, and I like to keep my focus very specialized. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One you actually pull the trigger on self-employment though, you find a lot of the romance of "being your own boss" dries right up. It's scary, and you find yourself working harder than ever; keeping your books straight, or learning a new programming language, is time consuming work, but nobody is going to pay you for it. Working from home is a discipline as well; it's so easy to "take a break", and watch some TV, play a little guitar...and kill the whole day. "Oh, I'll make up the time, pull an all nighter," and all that. Sure, maybe once in a while, but if you do it all the time, you won't be able to sustain it and your work will suffer. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With all that said, here are some of the more valuable tips I've compiled from my five years as an indie software developer. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Don't jump in suddenly. Doing it right costs money and will take time to get up and running, you have to be prepared for some lean times. If you don't have any money in the bank or are just having trouble finding a job, you're better off spending your time at networking events and job fairs, and finding training to get your skills together. Collect unemployment and beat the street, there's no shame in that if you're really working it, and employers will recognize the effort. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Take a business class, get a couple of books on starting and running a small business. I dreaded this, but did it, and have to say it was one of the most valuable bits of training I've ever had. In particular, I picked up a book "How to be a Successful Freelancer", and found it invaluable. Aside from the obvious "keep your books straight" sort of stuff, I got a template for a freelance contract, advice on the kind of clients I should pursue, how to set a rate confidently, some basic negotiation strategies, and an understanding of how important documenting the entire process of approach, negotiation, contract, work status, and closing out, is. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Set up a business checking account, register your business name under a DBA ("doing business as"), and use something like Harvest (google it) or Quicken, to track money coming into that account. I use Harvest and can tell you exactly how many hours I've worked, how much I've made, and how much I've got coming in, at any time. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Create a workflow for working with a client; set up a process, make sure you have templates of your contract ready, have your resources (development server and testing environment, etc.) all up and running. Let your client know in advance how you typically set up and work on a project. This isn't to say that you should be like, "this is how I work and this is how you're going to work with me," but more like "typically, after we get through exchanging NDA and work agreement, I'll set up the space on my testing server and give you access so you can monitor the in-progress product whenever you like...I provide daily status updates at the end of each day, I'd appreciate if you could review them periodically to make sure I'm on the right track...I can be contacted at this AIM account, or on Skype, or by phone, during normal business hours, but feel free to leave me messages at any time...", that sort of thing. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- I can't believe how many indie developers don't have this set up, so I'll put it in caps...HAVE A WEBSITE AND A DEDICATED, REGULARLY BACKED UP, SUPPORTED, DEVELOPMENT SERVER. PAY FOR IT. If you're indie and want to beat out the organized dev shops for a contract, you have to be GOOD. If you don't have your own tools, like a basic website with links to samples of your work and your resume/contact info, and a server to show in-progress work or experiments you're tooling with, you're not going to convince anybody you're really into what you do. More than likely, this sort of developer is just one that can't find a job, and is trying to freelance a little until they find one...which means they'll drop your project the second they do. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- It's hard to believe I have to say this, but from what I've seen, it's necessary; don't steal to do your job, don't depend on others to provide you with your tools. Invest in a good laptop and the software you need. Pirating your software isn't cool, it doesn't make you look smarter or hipper. If you'll steal the software from the manufacturer because of some Robin Hood rationale, sooner or later, you'll probably steal from me. Spending a couple thousand dollars for the tools you plan on making a living with, which you get to write off anyway, isn't unreasonable at all. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Provide your clients with FTP and SVN. I run both on my server, and give access to my clients for free for the duration of the project; I know of no other solo indie developer that does this, and I can't imagine why not, particularly since, aside from the server, it's all free. If the client has these resources set up and wants me to use theirs, great. But even if that's the case, saying I have it and can provide it--and many clients take advantage of it even if they do have it already--makes me look more pro. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Work regular hours as much as possible. There's this whole "I work while you sleep" thing. It's unhealthy. I don't want to know I can contact a developer at 2 a.m., I want to know that I can contact them at from 9-5, and that they'll be awake and lucid. Saying you weren't available for a conversation at 11 a.m. because you were up 'til 6 a.m. isn't good, and email timestamps at 3 a.m. with some garbled message are worse. People that work regular schedules at standard business hours generally do better work, because they don't work past the point of diminishing returns. I used to do all that; I don't anymore, I don't walk around burnt out with headaches from too much coffee and lack of sleep anymore, and my client list is stronger than ever. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Don't work in your bedroom if you can help it. It's really important to unplug when you're done for the day, and keeping your workstation in the same place you sleep makes it almost impossible. Set up a desk in your living room if you have to. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Offer to be available for onsite, schedule meetings. I generally don't work onsite because I invest heavily in tools and space to maximize my productivity. If a company insists on full-time onsite, I'm a lot more expensive, primarily because I want to deter it, but also because I have no intention of providing the services of a full-time employee that gets no benefits. However, if there are developer meetings once or twice a week and it's possible to be there physically, ask if you can go. If they say yes, GO AND DON'T BE LATE. If you can't physically go, ask for a conference number. You're indie, but for the duration of the project, it's important to be perceived as accessible by, and interested in, the rest of project team. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Don't go dark; from 9-5, fire up Skype, whatever IM the client uses, have your phone on and your email up, and respond immediately, even if just to say "I've reviewed the data, give me some time to respond". This is critical; I'm asking a client to trust me off site. If I stay visible and responsive all day every day, I  build the client's confidence tremendously. Again, it's funny how many indie developers will just go dark for a few days, thinking they understand what they need to do and don't need to communicate. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Send status every day when you wrap up, and post your work to your dev/testing server for review. State what work you've done, and any issues holding you up. If you don't get a response for a day or two, send an email asking if the client has been reading them, and if not, if they can get on a half hour call to review. It's extremely important to get daily feedback, even if they say "got your update, will review later". If the client goes dark, inform them that you're going to stop work until they respond. Don't give a client the opportunity to say "I looked over your work for the past two weeks today and have numerous issues, we're not satisfied." You'll end up doing work for free. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Don't work without a signed work order of some kind. The client MUST sign a document saying that you are getting paid X rate for Y work, and may end the relationship at any time, at which time all unpaid work comes due, and that the client (which could be the subcontractor) is directly responsible for this payment. It is NOT in your interest to let a client talk you out of this, you're better off without the work. If the actual client refuses to pay the organization that subcontracts you, that's not my problem. If they say "tough", get a debt collector on them and make no bones about the fact you'll spread the word. I have had to do this twice, and both times they paid up and even offered me more work, which of course I declined. Only once has a client actually not paid me, but that was early on, I know now that I compromised too much and should never have taken the client. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- State, as part of that work order, that you are getting paid for time and service, not for a finished product. More than once I've seen a project go bad because another developer screws it up or vanishes, or the actual client (i.e. if you're being subcontracted) terminates the project. I hate when that happens, but ok, you still got my time, and I want to get paid for it. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Don't do flat rates; if you do, take your estimate, double it, and add 15%. Tell the client if you finish sooner you'll pro rate it, but that the budget must cover your initial figure. I've never, ever gotten involved in a project at a flat-rate that turned out to be really worth it, because clients add features and change requirements far too often to make the initial estimate valid, and argue when you say you need more money  because it's not the same project anymore. If you go by the hour, or a day rate (I even offer a monthly, with the contracted stipulation that if you book me for a month at my monthly rate, I am guaranteed the month's wage), you don't have this problem. Clients will frequently understate the complexity of a project to get a low bid, because they need to keep their budget down, often because they underbid a project themselves and are trying to find cheaper development to make the ends meet.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Again, unplug at the end of the work day. Stop working. It's important. I go from 7 a.m. to 5:30 p.m. That's a long day, and my returns diminish after that. Go to the gym, take a bike ride, get some dinner, play your guitar, whatever. Get a good night's sleep and wake up refreshed. You'll do more consistent, higher quality work. Many don't believe it or think it's not "hardcore" or whatever; rarely do I say this as an absolute, but if you're one of them, you're wrong. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's about it for now; there's more, but those are the ones that are top-of-mind for me. But it's time to get down to business on my day project so I can knock off at 5:30 p.m, hit the gym, get a couple of songs down for band practice Thursday, and get a good night's sleep. Practice what you preach. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As always, thanks for visiting. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-2074680886127519962?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/2074680886127519962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/working-off-site-practices-for-indie.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2074680886127519962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2074680886127519962'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/working-off-site-practices-for-indie.html' title='Working Off-Site: Practices for the Indie Software Developer'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-3685440253716798638</id><published>2009-05-18T08:11:00.000-07:00</published><updated>2009-05-18T09:44:08.851-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='citrix'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='symbian'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><title type='text'>The Citrix Receiver Follow Up: Flash/Flex (and then some) on your iPhone...or Symbian...or WinMo...or...</title><content type='html'>I said I'd follow up on my story &lt;a href="http://www.tcoz.com/blogger/2009/05/flash-flexon-your-iphone.html"&gt;Flash, Flex...on your iPhone?&lt;/a&gt;, (this story generated a lot of press, got picked up by TechCrunch and blogs all over) and here it is. &lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As a quick recap, I looked at the Citrix Receiver iPhone app, and was impressed with the experience. It's not a VNC or RDP solution; Citrix has created a client that, by use of a highly optimized communication protocol, lets you view apps running in the EC2 cloud (for the layman, that means "you see it on your phone but it's actually running somewhere else") without installing them on your phone. This means that you can build an application out of any technology, deploy it to the remote server infrastructure, and access it on your phone, or computer, or any device that runs the Citrix Receiver. The technology is optimized for this use; there's no awkward, blocky screen redraws, no browser toolbars, etc. A properly designed application appears to be running as a full-screen application on the phone, no matter what technology it's built out of. This suite of tools is branded "XenApps" for the most part; I'm not one of their marketers and know there's more to it, but "Xen..." is a big Citrix branding buzzword these days.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's amazing how many people responded negatively, clearly without trying the Citrix Receiver demo. For the most part the issues are around the rampant abuse of Flash all over the web; poorly programmed banners, autoplay video players, that sort of thing. I concede: the web is full of bad Flash, and if that's the extent of your experience, you'll probably be pretty close minded about the subject. I've been a Flash developer for a long time though, and have never programmed a banner. I work on enterprise-level applications that make companies money; I've built applications that you've more than likely used, and that have helped people sell companies, and is currently helping a startup stay in business. Flash development, with Flex and Air, is stronger than ever and isn't going anywhere. Hating it is a waste of time. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To continue my rant, I'll tell you one thing for sure: I don't want to be in the business of porting those apps to every different platform on earth. Yes, I could make money doing it. But it's boring and doesn't move me along to the next new project. People say, "forget Flash just build an iPhone app". Erm...what about Android? And Blackberry? And Symbian? And Windows Mobile? And Windows desktop? And OSX Desktop? Hire all those developers....maintain all that code...I've got better things to do. I want my app to have as much reach as humanly possible with as little work as possible, and porting the code to everywhere isn't a good strategy. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note: Citrix said that for Blackberry and Android clients, we have to "stay tuned". The guys on the call wouldn't nail in any dates or promises about this, but they didn't say "no". I'd assume that, considering how attractive this technology could be to corporations, a Blackberry client would be a no brainer. There is currently one for the iPhone, Symbian, and Windows Mobile 6.1.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Citrix Receiver, backed by the Citrix technology on the server side, is the sort of thing that makes this possible. Again I'll say, and Chris Fleck, VP of Solutions Development for Citrix agreed readily, that it's not for every kind of app; if you have something that requires lots of real-time graphical updates, like a MMORG or something, you should probably consider going native. But that's the minority of apps; 75% of the stuff I've seen in the iPhone app store, or more, could be served using the Citrix technology, which would give the developers the opportunity to deploy it to all the new platforms coming out. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One big thing though; the Citrix Receiver is branded Citrix. This was a big downside, and I told the Citrix guys so; if I'm MTV, or Thomson Reuters, or CNN, or Disney, I'm not going to want my front-end gateway UI to be branded Citrix. I want people searching their platform's app store for my brand, and when they pull it down, I want to see my logo on their phone. Here's what it currently looks like:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://www.tcoz.com/blogger/images/citrix/branded.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To this, Citrix responded, "that's a real valid point. We're going to look into this". One of their developers that was on the call seemed to think it would be a no brainer to implement. So, from what I can see, Citrix is going to enable this. So, you brand the Citrix Receiver as your own...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...YOU DON'T EVEN HAVE TO BUILD IT. You just brand it and get it in the [ fill in mobile platform ] app store. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then you take your code base, deploy it to the Citrix solution on the EC2 cloud, and that's it. Anybody with the receiver can use your app, no matter what technology it's built out of. It just stuns me that people don't see the potential for this. If Citrix really puts in the time and makes this solution rock solid, it could very well represent a significant direction of the next wave of mobile device use. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Citrix showed me how easy it is to do it; in fact, it looks so easy, and so cost effective to get up and running, that I'm going to try it with my Planet Sudoku app. They even have a little app shell, called "AppViewer" which you can embed your tech in, that takes care of the full-screen look-and-feel for you. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Initially, I was going to port this thing to the iPhone, but now, as an experiment, I'm going to just refactor the UI to fit the iPhone, use the AppViewer shell, and deploy it with the Citrix solution; you'll be able to play my Sudoku client on your iPhone in a lot less time than if I retooled the whole thing to Objective C. More blogging to come on that one I'm sure. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Is it really that easy? I don't know for sure, but as far as I can tell, this is a heck of a lot easier than porting the app to Objective C. In their own words (note that where they say "Windows", you can sub in "apps that run on Windows", like Java, Flash, Flex, Air, Silverlight, etc.):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"While unmodified Windows applications can be delivered to mobile devices via Citrix XenApp, XenApp also provides an excellent platform for delivering custom mobile applications. Citrix is seeing interest in this area from a number of it's ISV partners. The concept is to build the application using tools normally used to build full Windows applications, but simply design the user interface with the smaller screen size and resolutions of mobile devices as a design consideration. The concept is to reskin the UI of larger applications with a smaller form factor UI. As long as the custom mobile application can be published on Citrix XenApp, it can be delivered to mobile devices with the Citrix Receiver installed."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, if this indie software developer can make this work, I'd pretty much say that anybody can, not matter what your reach is. You don't need deep corporate pockets; I don't actually know this for a fact yet, but I'm optimistic, and am actually trying it now, so I'll let you know. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For more info on this topic, and/or to learn how to get involved in this sort of development, visit the &lt;a href="http://community.citrix.com/display/xa/Custom+Mobile+Apps+on+XenApp"&gt;Citrix developer community site&lt;/a&gt;, and take a look at the Tips and Tricks sections. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-3685440253716798638?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/3685440253716798638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/citrix-interview-thing-client.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/3685440253716798638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/3685440253716798638'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/citrix-interview-thing-client.html' title='The Citrix Receiver Follow Up: Flash/Flex (and then some) on your iPhone...or Symbian...or WinMo...or...'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-96642887024182005</id><published>2009-05-17T05:40:00.001-07:00</published><updated>2009-05-17T07:32:43.768-07:00</updated><title type='text'>Tcoz Tech Wire (Kindle Edition) is available in the Amazon Store! If only the subscription process WORKED...oh wait it does but it didn't seem to...</title><content type='html'>A few days ago, when Amazon announced they were allowing all bloggers to submit their blogs to Kindle Publishing, I decided to do it; I went through the process, filled out the forms, and awaited approval. You can read that post here:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.tcoz.com/blogger/2009/05/subscribe-to-my-blog-on-your-kindle.html"&gt;Weds., May 13th, 2009 Subscribe to my Blog On Your Kindle!&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lo and behold, today I checked in, and found that Tcoz Tech Wire (Kindle Edition) is now live. Users all around the world can have my blog delivered daily right to their Kindle e-books. Naturally, I wanted to blog about the fact that my blog is now available as a Kindle-published blog. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Like I said in my last article, I don't really expect to make any money doing it, especially since it's been reported that Amazon gets 70% of the subscription price which in my case, Amazon set at $1.99 (Amazon sets the price for you based on what they determine the worth is...hmm...). But, it's fun, puts me in the Amazon store, and makes me searchable on the Kindle blog list, all free. I'll take it. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, back to Tcoz Tech Wire, Kindle Edition. The screenshot below shows the splash page at Amazon:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://www.tcoz.com/blogger/images/kindleblog/screenshot.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There I am, in the Amazon store. How about that? I need a subscriber, so I may as well be the first one.  I got out my Kindle, went to "Shop in Kindle Store", went to the "Blogs" section, went to the "Internet &amp;amp; Technology" section...and saw 124 pages of blogs. Ugh...time for search. I typed in "tcoz", and up popped the Tcoz Tech Wire subscription offer. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, I subscribed; you get a 14-day free trial, so I figured if I don't like this guy's work, I can always ditch him anonymously. I clicked "Subscribe"...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...and BLAMMO. A message pops up, "We were unable to process your subscription request at this time. We are working on the problem. You can contact Kindle Customer Service at 1-866-321-8851 or try subscribing again later." &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Kindle specialist team had this to say:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"There is a waiting time, even after it's approved and listed, until you can actually subscribe". I pointed out that I submitted the blog the day this service went live, which seemed to make the support rep a little uncertain of her first answer, so I got put on hold for a bit while she did a little checking. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;She came back with, "You appear to be subscribed to the blog.". I checked the device, and there it was, delivered to my book list. I mentioned that I hadn't received any success message or any such confirmation on the Kindle device, etc. etc., and that I hadn't double clicked during the processing (you see the little spinning icon in the upper left of the Kindle, letting you know network access is active), they said they'd look into it. She did say that double clicking on the subscription would generate the error, and even though I hadn't double-clicked, it still seems borky; it should say that your subscription is pending, or that you've already subscribed. All in all, she agreed and said they'd look it over. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, there it is, on the Kinle. Now let's open it up; there's Saturday's article ("Turn your IPhone into a Web Server"). Easy to read, properly formatted, with my images all there. Note: my blog is very simply formatted, no gew-gaws or advanced CSS of any kind. For Kindle publishing, this might be the way to go, at least for now. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Great, so it's working on the Kindle, let's go to my Dashboard at the Kindle Publishing site and see what happened...hmm. I don't see any way to tell how many subscribers I have, or any other such data. I'll have to put in a call about that. My vendor reports and such are all unavailable...interesting. All right, the program is young, I have some things to learn about managing it probably. I'll have to blog it another day. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All in all, I'm pretty happy with the way things are going. I do think that 70% of a $1.99 subscription is a heavy hammer blow, and there seems to be a couple of glitches along the way, but it's all FREE. People compare this to the Apple store, but they leave out the fact that, as an independent developer to register a business as an "official" iPhone developer, you pay $105 a year, and they still take some off the top of all app sales. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For the indie blogger/software developer type, my view is, this is a great opportunity to get your stuff out there. If you're not happy with the arrangement, don't use the Kindle Publishing tool. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now please go and subscribe to Tcoz Tech Wire on your Kindle :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As always, thanks for visiting. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-96642887024182005?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/96642887024182005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/tcoz-tech-wire-kindle-edition-is.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/96642887024182005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/96642887024182005'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/tcoz-tech-wire-kindle-edition-is.html' title='Tcoz Tech Wire (Kindle Edition) is available in the Amazon Store! If only the subscription process WORKED...oh wait it does but it didn&apos;t seem to...'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-2428342442062267159</id><published>2009-05-16T04:27:00.000-07:00</published><updated>2009-05-16T06:40:54.883-07:00</updated><title type='text'>Turn your iPhone into a Web Server...Your Website In Your Pocket!</title><content type='html'>Sure, you can take a picture with your iPhone and upload it to Facebook, you can use a VNC or RDP app to remotely control a server and tweak a website...&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...but what if you could turn your iPhone into the machine hosting the website? As in, literally walk around with an http web server in your pocket, with a public website that people can access to see your photos and other media?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For the typical techno-muggle, the whole "server" thing is still a bit of a mystery. Your average web user knows that they can upload photos somewhere, and somewhat more advanced ones might know they can blog by typing an article into an edit box and clicking "publish", maybe even linking in the previously mentioned photos. Where and how that content exists is unknown though, so if it wasn't for tools like Blogger, Flickr, Facebook, etc., the typical user would have little or no web presence. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I don't think it's because your average web user is incapable of understanding servers, I'd guess it's more a matter of just being exposed to a web server and understanding how a it makes content available. If you could put one on your iPhone, which is connected to the Internet, and use it to publish your pictures, and/or other info, that might fit the bill. It wouldn't necessarily mean building out web sites; say for instance, you took a picture, and the tool automatically copied it to the folder on the iPhone that makes is publicly available; you'd just tell people the link to your phone, and there you go.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Think of it as a personal, portable, data and media center. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Looks like it's starting; Freebit, a Japanese company, has put out a free iPhone app, called "ServersMan", which does this. Your phone literally becomes a mobile server. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Check it out at (make sure to look in the upper right for the "English" link):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;http://www.serversman.com&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I couldn't believe it; I had to try it. I'm astonished to say, it's very easy and seems to work. I haven't run load capacity tests or any such things yet, and to be honest I don't know "exactly" how it works or whether there's any smoke and mirrors, but from what I can tell initially, it legitimately makes your iPhone into a walking http web server, with WebDAV installed so you can manage the content externally (the iPhone doesn't have a way to do this natively). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can actually try it; my iPhone is on and serving. Go to this link:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;http://serversman.net/tcoztech-node/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This sends you to the ServersMan infrastructure, which proxies your request to my iPhone. You'll see a frameset page, which actually lives on my iPhone, with a message in the top frame telling you what you're looking at, and my blog in the bottom frame. Note that ONLY the frameset page is on the iPhone; the pages that fill it are on my usual www.tcoz.com server, but from what I can see, if I wanted to, I could have put it all right on my phone. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ServersMan has some other interesting capability too. They say that by using the tools provided with the app (remember this is all right on your phone), you can easily create a "mashup" website on-the-go. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For example, go to this link:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;http://serversman.net/tcoztech-node/photos/picture.jpg&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You are now looking at a picture that I took with my iPhone camera (one of my guitars), being served from my iPhone, automatically named "picture.jpg" and made available. You can even make your whole camera roll viewable with one click if you want to, it'll build out a web page with links and everything, right on your phone. Ordinarily, you'd have to upload all this and so on, now you can just it in bulk and manage all the content right on your phone. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now take a look at this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;http://serversman.net/tcoztech-node/location.html&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Serversman can take your GPS information, save the information locally, and make it available through the Google Maps API. So at any time, I can just leave this capability on, and you can see exactly where I am (more or less). Why is this a great thing? Say I'm trying to get to you and I'm lost. Just hit my iPhone address and you'll see exactly where I am, and you can say "make your next right".  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All these little mashup gadgets are right on the iPhone. I didn't have to go to an external website, or hit "upload", or anything like that. Again, the phone IS the server. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How do you manage content on it though? For that, you do have to go to a website, because there's no way on the phone to explore folders and move around files (iPhone doesn't give you Finder-like access natively). For this, ServersMan uses WebDav, which in a nutshell, is a way to enable access and management of web server content remotely, like from a tool or website. You log into the ServersMan website with your account credentials, it connects to your phone through WebDAV, and there you see all the content on your phone in a simple folder structure. You can upload things (which transfers them to your iPhone directly), move things around, and so on. Using this tool, you can build a complete website right on your iPhone. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There's other features too; voice notes, music, all can be made available from the device. I don't use any of this, but it's there and if it works as well as the rest of the app, should be fine. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have to say, it's amazing. I'll leave my iPhone-site up and running for a bit so the links in this blog work; tweet me if it's down and you want to try it. One thing I haven't figure out yet is whether or not I can switch to another app without shutting down the web server. If the app is up, and I leave the phone alone, it's fine, but if switch to another app, it seems to shut down; this may be because I just don't know something. It could just be the iPhone itself though, since as of yet, "run in background" for apps is pretty much non-existent (this is actually a huge downside for iPhone app developers).  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A lot of people may say, "this is ridiculous I  can already do that this way that way etc. etc."; there's always the knee-jerk "this is stupid" type. People used to say the same thing about cel phones and ATMs. Download it, use it, experiment with an open mind, and you might find that it changes the way you use and/or think about your iPhone.  I already know that I'll use it for a couple of things. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Screenshots below, not served from my iPhone though...isn't it amazing you could actually ask that question?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Screenshots of the basic app admin pages, etc.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://www.tcoz.com/blogger/images/serversman/img_0013.png" /&gt; &lt;/div&gt;&lt;div&gt;&lt;img src="http://www.tcoz.com/blogger/images/serversman/img_0014.png" /&gt; &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://www.tcoz.com/blogger/images/serversman/img_0018.png" /&gt; &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://www.tcoz.com/blogger/images/serversman/img_0015.png" /&gt; &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://www.tcoz.com/blogger/images/serversman/img_0016.png" /&gt; &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://www.tcoz.com/blogger/images/serversman/img_0017.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This photo is what you'll see if you nav to my iPhone web server and ServersMan isn't active:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://www.tcoz.com/blogger/images/serversman/screenshot.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As always, thanks for coming by. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-2428342442062267159?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/2428342442062267159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/turn-your-iphone-into-web-serveryour.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2428342442062267159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2428342442062267159'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/turn-your-iphone-into-web-serveryour.html' title='Turn your iPhone into a Web Server...Your Website In Your Pocket!'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-5991035695637147849</id><published>2009-05-15T04:15:00.000-07:00</published><updated>2009-05-15T05:19:52.379-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='citrix'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Flash, Flex...on your iPhone?</title><content type='html'>I'm a Flash/Flex/Air developer primarily, with expertise in what I think of as "supporting" technologies (gateways and data layers built out of .Net, Java, PHP, Ruby, etc.). My usual contract gig is, I manage and/or work on an application's UI, using ActionScript technologies, and offer whatever assistance is needed to set up the gateway and data transfer backends. Sometimes I build all of it, sometimes I just have to work with the backend guys to understand how something like OpenAMF or Fluorine works, it depends on the client's expertise, but that's why they hire me. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Flash/Flex, however, has been one of my greatest disappointments with the iPhone. We were promised "the complete web", and it's one of the reasons I jumped on the OG iPhone day one. Shortly after dumping my other phone and signing onto AT&amp;amp;T, I visited one of my ActionScript-based web apps...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...and discovered there was no Flash. Apple and their fanbois came back with a few short, lame justifications for this disclosure omission: "we support the open web, Flash is proprietary", "the Flash player is not really a Web 2.0 technology", were some of the things I saw bandied about. Fact is, it's the best solution for RIAs, and is getting stronger all the time. I've been doing this for 15 years, picked Flash/Flex for a reason, and the industry seems to support my decision; the NYTimes recently dumped Silverlight for Adobe Air, MLB did the same thing a while back if I remember correctly, and I'm currently working on a very large project that I can't talk that much about, but which will go live soon (and then I'll talk about it as much as I can). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have actually viewed Flash apps on my iPhone over VNC and RDP connections (check out WinAdmin in the app store). This lets me pull up a browser remotely, and access any web page I want, including ones with embedded flash apps. If the Flash app is designed properly, with a web page that properly sizes the browser, removed as many tool/status bars as possible, and so on, the experience isn't bad, but, I admit it's unreasonable to ask your average user to buy and install WinAdmin, or some other VNC client, to play a Flash game. I'd also have to provide the server for browser access, etc. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It seems somebody has set out to solve this problem: Citrix. Take a look at this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;http://citrixcloud.net/&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;They offer a client for iPhone, called Citrix Receiver, which offers a 2-hour session, expires-in-24-hours, demo of access to the CitrixCloud. In their own words, the CitrixCloud, or C3 is "a complete set of service delivery infrastructure building blocks for hosting, managing and delivering cloud-based computing services. C3 includes a reference architecture that combines the individual capabilities of several Citrix product lines to offer a powerful, dynamic, secure and highly available service-based infrastructure ideally suited to large-scale, on-demand delivery of both IT infrastructure and application services. "&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For the layman, that means more or less, "you can use our products to expose your apps to pretty much any client. With one of our viewers, a user can use any application on just about any client as if it was installed on their desktop". &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, by now you may have guessed: The Citrix Receiver can provide access to Flash and Flex applications in a very compelling way. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ultimately, it's still the iPhone accessing web pages, but, it's not doing it through Safari, which can't run the Flash player. It's accessing a browser on a Windows machine remotely. The Citrix Receiver hides this though; you wouldn't really know it unless you were looking for it. The applications are sized full-iPhone-screen, some for landscape, some for portrait, and there's no browser toolbar or anything like that; you appear to be using a full-screen Flash/Flex app. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, when they go live with this (again, Citrix Receiver is a demo), does this mean I'll have to install the Citrix Receiver and understand all this cloud stuff to simply run an iPhone game?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yes...and no. Here's a total hypothetical. Say you're an internet game company of some kind, something like a Pyzam. You're in the business of buying and developing Flash games, integrating advertising, all that. You create a branded version of the Citrix Receiver, and get your cloud infrastructure set up. Users go to the App Store, and get your branded viewer for free. They create an account, log in, and happily play Flash/Flex/Air games on their iPhone, with advertising and whatever else the developers build into the games/widgets/etc. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think that's compelling. Sure it needs more thinking through, and at this point is probably most useful to corporations or organizations housing large portfolios of Flash apps. But this is a direction that shows that, with some ingenuity, even today, you can offer applications built out of pretty much any technology on the iPhone. This also works with Windows apps, Silverlight, and so on, but I'm really interested in Flash/Flex. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, it gets around a lot of the "pay for and we must approve" apps scenario, and enables use of ActionScript development resources, which are nowhere near the scarcity and premium of good iPhone development. If Apple doesn't like your content, they can reject your viewer though I suppose. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So in the end...will phones just become all about the screen, and what viewer/cloud-access apps they can run? The thin-client finally plants its flag for good in the mobile world? Hmm...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Below are some screenshots from the Citrix Receiver demo. As always, thanks for reading Tcoz Tech Wire. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Remember, these are Flash and Flex apps. They look great, and work as expected. These are screenshots right from the iPhone.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;These two photos are of the Citrix Receiver interface for accessing different kinds of apps:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/citrix/IMG_0001.png" /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/citrix/IMG_0002.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;These images show some basic Flash/Flex apps from their demo. The first is a pretty standard reports app, the second shows network statistics in real time, the meters moved and everything just like a native app:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/citrix/IMG_0004.png" /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/citrix/IMG_0006.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;These images show a Shirt Configurator: you select colors, styles, logos, etc., and can save the profile. I found this very interesting.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/citrix/IMG_0007.png" /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/citrix/IMG_0008.png" /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/citrix/IMG_0009.png" /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/citrix/IMG_0010.png" /&gt;&lt;br /&gt;&lt;img src="http://www.tcoz.com/blogger/images/citrix/IMG_0011.png" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-5991035695637147849?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/5991035695637147849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/flash-flexon-your-iphone.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/5991035695637147849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/5991035695637147849'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/flash-flexon-your-iphone.html' title='Flash, Flex...on your iPhone?'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-1131001715320531873</id><published>2009-05-13T17:24:00.000-07:00</published><updated>2009-05-14T04:15:55.627-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='kindle'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Subscribe to my Blog On Your Kindle!</title><content type='html'>I know that the masses aren't going to flock to an amateur blogger's site; I don't expect to make any money. I anticipate one subscriber though at least, maybe two (if I can talk my girlfriend into it). But, my blog is on the Kindle list with the big boys, albeit a lot further down methinks. Sure, you can always just hit it on the web; but why do that when you can really use your Kindle to the max and subscribe in a civilized way that will drive me on to ever-more-interesting blogger heights? Erm...because the web one is just as good, and free? You have a point...&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...but, one of the intriguing things about the web is how it levels the playing field as far as presence is concerned. I don't have to be Oracle or Microsoft to have a web page, or to publish a blog. Li'l ol' me, with some resourcefulness and my programming skills, can create enough assets and presence to rival many a big shop. This has always appealed to me, and the Kindle blog capability, which is free, just adds to it, thank you Amazon. I blog...and have a website...and an FB page...and a Twitter account...and membership in forums...and come up in Google links... therefore, I am.&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That aside, how did I manage this? Yesterday, the news hit the wires that Amazon was opening up it's Kindle blog publishing platform to Kindle owners. I have a Kindle, I love it, I have a blog, I contribute to it frequently, I'm a tech nut...add it all up, and I was a perfect candidate to give it a whirl. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If nothing else, it's incentive for me to blog hard; one day maybe, somebody I haven't promised to take out to a nice dinner will subscribe to my blog, a complete and total stranger. On that day I'll drop my clients, tell my girlfriend to quit her job, move us out to San Diego, blow my savings on a top-end 'Benz, and live the high life with the blogerati. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Or, I'll smile, text a couple of people the good news, tweet it, and greedily wait for that first south-of-$10 deposit from Amazon. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, the process, if you're interested; this assumes you already have a blog with an RSS/atom.xml feed of some kind set up properly (Blogger for example):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Go to the Kindle Publishing for Blogs Beta site, &lt;a href="http://kindlepublishing.amazon.com/"&gt;Kindle Publishing for Blogs Beta&lt;/a&gt;&lt;/div&gt;&lt;div&gt;- You can't use your standard Amazon credentials, you have to create a fresh account. &lt;/div&gt;&lt;div&gt;- Fill out the surprisingly simple form; basic identification, a couple of security-in-case-you-forget questions, and provide a bank account number for Amazon to dump your hordes of riches into. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's all there is to signing up. Following this, you get taken to a page showing three tabs: Dashboard, Reports, MySettings. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Dashboard: provisions your blog. You click "Add Blog" off to the right, then provide your blog's RSS/Atom feed address (nice, I don't have to republish my blog, they actually pull my existing Blogger blog in and format it for the Kindle automagically), title, tagline, description, publisher, screenshot, masthead/banner, and website address. Easy enough&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Reports: Two reports are available; single issue purchases, and monthly subscriptions. Mine are empty (hint). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- My Settings: change password, security questions, the usual sort of thing. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And that's it. Preview your blog, publish it, and 48-72 hours later, you're available for purchase. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note: if your blog is simple, primarily text and image based, your published results will probably be more consistent. If you have all kinds of Flash gew-gaws and whatnot in there, the formatting may be less consistent, since Amazon will just omit the gadgets, either truncating, or just leaving in, the space they usually take up. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Make my day...buy a single issue! If you like it and are the sort that can spare a few bucks for an aspiring blogger...subscribe for a month! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Free or paid, thanks for coming by :)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-1131001715320531873?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/1131001715320531873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/subscribe-to-my-blog-on-your-kindle.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/1131001715320531873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/1131001715320531873'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/subscribe-to-my-blog-on-your-kindle.html' title='Subscribe to my Blog On Your Kindle!'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-5951210058920072330</id><published>2009-05-13T13:37:00.000-07:00</published><updated>2009-05-13T14:11:09.472-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='att'/><category scheme='http://www.blogger.com/atom/ns#' term='palm'/><category scheme='http://www.blogger.com/atom/ns#' term='samsung'/><category scheme='http://www.blogger.com/atom/ns#' term='verizon'/><category scheme='http://www.blogger.com/atom/ns#' term='treo'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><title type='text'>Hey OG iPhone Owners: First-Run Contracts end in June, Will You Consider Another Phone?</title><content type='html'>I just realized today, while reading the news about the no Steve Jobs at WWDC announcement that my AT&amp;amp;T shackles will end soon; my contract is coming up. I'm free to switch to another phone without penalty (unlike the nearly $200 penalty I paid to leave T-Mobile and go AT&amp;amp;T/iPhone).&lt;br /&gt;&lt;br /&gt;Will I? I can't say right off the bat "no". It's also possible that I might double up; I'm an iPhone developer (well, emerging one anyway), and might go with another phone purely for techno must-have. I really don't know for sure.&lt;br /&gt;&lt;br /&gt;There's some pretty interesting options out there. Things that attract my attention:&lt;br /&gt;&lt;br /&gt;- Everybody says Verizon is better than AT&amp;amp;T. I bought my girlfriend an iPhone, and she loves it, but she says this all the time. AT&amp;amp;T does seem to drop a lot of calls and have peculiar dead spots, and the iPhone does occasionally just seem to drop signal, compelling me to shut it down and restart it. That's annoying.&lt;br /&gt;&lt;br /&gt;More robust video media. Lots of phones have WAY better cameras, can capture video, and so on. It's be nice to actually be able to use my phone as a full-time camera; I pretty much consider the iPhone camera semi-useless. For example, the Samsung Omnia, which is very iPhone like, has a 5.0 megapixel camera, and a nice touchscreen on Windows Mobile 6.1, which is supposed to be really nice. This phone would actually be a contender.&lt;br /&gt;&lt;br /&gt;Innovation. People are learning things from the iPhone, and creating some pretty slick devices like, the Samsung Alias 2, with "morphing keys" (the correct keys appear based on the context of your use, like dialing a call vs. texting). (Verizon). This keypad is powered by e-ink technology...very interesting. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, along innovation, the Palm Treo Pro. Sprint is working hard on their network, I've heard from people it's solid now. I loved my Palm, and definitely am interested in what they're up to. It runs MS Office Mobile (hmm...full Office app on the phone? I miss that...), Windows Mobile 6.1 (again people say great things), a revamped IE Mobile, a touch screen with stylus (I used to use this a lot on the Palm), Bluetooth 2.0 (iPhone really sorta fell down in the bluetooth world)..another contender. &lt;br /&gt;&lt;br /&gt;Storage options, like the T-Mobile G1, with a really nice touchscreen, running Android, which means Google muscle and thinking, which is a significant consideration. This phone has a microSD card slot. The phone has some flaws though; I'd probably only buy this to get involved with Android. A second run on this phone though will likely be a significant improvement. Multiple home screens might also be very useful.&lt;br /&gt;&lt;br /&gt;In the end though, what the choice really seems all about is the OS, and your techno-religious beliefs, i.e. Microsoft is evil...no, corporations are, so Apple is too...I hate MSFT stooges...I hate Apple hipsters...only Open Source for me...I really loved my Palm...and so on. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Do you like Windows 6.1 (which really does seem nice, but again I don't know from direct exposure), Android (probably for the techno geek...but I am one), Palm for the old loyalist or because it's easy to use, Mac/iPhone? They all support developer platforms, all have touchscreens, music services, GPS, etc. etc. etc...&lt;br /&gt;&lt;br /&gt;Hard to say, and I'll probably stick with the iPhone. But will I look? Damn right...why not? When my contract times out, it won't cost me anything to do so anymore.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-5951210058920072330?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/5951210058920072330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/hey-og-iphone-owners-first-run.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/5951210058920072330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/5951210058920072330'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/hey-og-iphone-owners-first-run.html' title='Hey OG iPhone Owners: First-Run Contracts end in June, Will You Consider Another Phone?'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-6272461571486097364</id><published>2009-05-13T03:52:00.000-07:00</published><updated>2009-05-13T05:19:32.177-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='e-book'/><category scheme='http://www.blogger.com/atom/ns#' term='kindle'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon'/><category scheme='http://www.blogger.com/atom/ns#' term='dx'/><category scheme='http://www.blogger.com/atom/ns#' term='e-reader'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><title type='text'>News is FREE on the Kindle, and Other Useful Kindle Tidbits</title><content type='html'>So much of what people are saying about the Kindle seems misinformed. Both casual and serious pundits are publishing information and opinions about the device, seemingly without having used one for more than an hour, let alone own and use one for enough time to actually get a feel for it.&lt;br /&gt;&lt;br /&gt;Example: everybody is talking about the features of the Kindle DX, TechCrunch published how the device will fail unless people pirate books for it, others say it's not worth the money, and how it does this and not that, or not that but this, or how it's just a "holdover device". Interesting, since the device hasn't even released yet and we have no idea what Amazon has in store for textbook reading folks, like student, programmers, engineers, etc. Discounts? Programs? Student pricing? Aside from rumor and speculation, nobody really knows.&lt;br /&gt;&lt;br /&gt;But I guess folks have to say something about it, even if it's just something they heard from somebody who heard something somewhere they know not where..&lt;br /&gt;&lt;br /&gt;So, here's some things you should probably know, from somebody that actually owns a Kindle 2 and uses it every day:&lt;br /&gt;&lt;br /&gt;- News is FREE. You do NOT have to subscribe to get it. In fact, the Kindle's integrated web browser, which is suitable for rendering text and image versions of just about any newspaper website, comes with pre-installed bookmarks for CNN, BBC, CNET, ESPN, MSN Money, and others. And of course, you're always free to visit NYTimes, etc.&lt;br /&gt;- Same with Blogs. Use the browser.&lt;br /&gt;&lt;br /&gt;I actually do pay-subscribe to a couple of blogs, like TechCrunch and OReilly Radar, and have bought a couple of single issues of the NYTimes, but I don't have to at all.&lt;br /&gt;&lt;br /&gt;- Whispernet (which I believe is Sprint 3g) works, and is free. I've heard people say "well yeah but you have to pay for the wireless". No, you don't. It's one of the things that imho makes the device worth the premium dollar tag (well, it is still pricey).  So on top of free news and such, you can surf and access it for free.&lt;br /&gt;&lt;br /&gt;- Free content: there's a lot of it. Of course, some is dreck. But that's indie for ya; it's up to you to find the gems.&lt;br /&gt;&lt;br /&gt;- You don't end up spending a fortune on new things, though of course you have the opportunity. Really though, it's not like iTune songs or apps, how many books will you buy in a month?&lt;br /&gt;&lt;br /&gt;- The device is not intended to be a laptop replacement. I've heard, "pointless, I'm going to get a Netbook (or some such app) when it comes out." It's apples and oranges. I've always carried a book, or three, and/or a newspaper, along with my laptop, and I would never break out my laptop on a subway or in any kind of upscale social setting, like a nice restaurant or some such. A tablet, or netbook, or anything else backlit, will always have the readability issues of a computer. The Kindle is more like a book than a laptop, e-ink technology and all that, and consolidates my reading material nicely. It's a complement, exactly as my bag 'o books used to be, but without the bulk and weight.&lt;br /&gt;&lt;br /&gt;- Navigating the device is easy. There's keyboard shortcuts and simple menus. When you first pick it up, you may not think so. People said the same thing about the iPhone. Two or three days later, you're skipping around the device like a pro.&lt;br /&gt;&lt;br /&gt;- Same for highlighting, taking notes, bookmarking, etc. It's easy and fast. With the way people thumb type these days, I don't think the keyboard is a detractor. In fact, hardcore thumb typers still seem to prefer the tactile keys over the iPhone-style screen keyboards.&lt;br /&gt;&lt;br /&gt;- Your annotations and clippings are not hard to find, primarily because they get automatically put into another "book" of their own (more like a file actually) called "My Clippings". This is great; I can clip articles, highlight and annotate passages, and review them in a consolidated document. Also, using "My Notes and Marks" while in the book itself, is easy.&lt;br /&gt;&lt;br /&gt;- You CAN use PDFs on the Kindle 2, and in fact, the DX is documented as supporting them natively. For the Kindle 2, you mail the document (word files too) to your Kindle account (me@kindle.com), and it converts it to Kindle-friendly format, which you can then download to your device from your Kindle portal.&lt;br /&gt;&lt;br /&gt;- The PDF conversion works. I haven't had any trouble with any documents so far. I know that complex PDFs can break, but I haven't encountered the issue yet.&lt;br /&gt;&lt;br /&gt;Note: this is something I actually don't know all that much about other than some basic testing. There seem to be numerous conversion utilities, like Stanza, that enable converting and sharing with a Kindle, but for now, I've just been using the Amazon store for content primarily. I suspect over time there will be numerous ways to convert other e-book formats and documents to your kindle, and again, the DX has more robust format support, and future versions of the product no doubt will augment this.&lt;br /&gt;&lt;br /&gt;- Printing: "My Clippings" is just a .txt file. You can connect via USB, grab the file, and print it. True, it's a limited .txt file, but printing is sort of contrary to the intent of the device; again, it's more like a book than a computer. Books don't have a "send to printer" feature.&lt;br /&gt;&lt;br /&gt;- You can replace the fonts for greater contrast. I've already done it, and it substantially enhances the readability. The process is easily reversible and does not brick your device. You can find the info here:&lt;br /&gt;&lt;br /&gt;https://sites.google.com/a/etccreations.com/kdesignworks/Home/font-install-files&lt;br /&gt;&lt;br /&gt;In closing, the more I use it, the more I think the Kindle is a great device. If you're the sort that carries around books, reads enough on a computer to make your eyes hurt, and likes to read on the go or pretty much anywhere you have a few minutes to relax, I recommend it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-6272461571486097364?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/6272461571486097364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/news-is-free-on-kindle-and-other-useful.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/6272461571486097364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/6272461571486097364'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/news-is-free-on-kindle-and-other-useful.html' title='News is FREE on the Kindle, and Other Useful Kindle Tidbits'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-2978601831711243779</id><published>2009-05-12T04:25:00.000-07:00</published><updated>2009-05-12T06:14:40.452-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='apps'/><category scheme='http://www.blogger.com/atom/ns#' term='applications'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iPhone Apps I Can't Live Without (or actually just really like).</title><content type='html'>I'm not an App Store addict, but I definitely bought the iPhone to consolidate my on-the-go kit; I carried a Palm and a clamshell/Razor type phone for quite some time, then rolled over to a Dash for a while, which allowed me to cut loose the PDA for the most part (I loved the Dash, best speakerphone ever). It still wasn't the whole package though; the screen was small, Windows Mobile with ActiveSync could be problematic and apps frequently never worked properly...I wanted more function, less trouble.&lt;br /&gt;&lt;br /&gt;A friend of mine had a line on three iPhones the day they released. He called me, said cough up the $600, and I would be among the cel phone elite. Funny how back in the day, people would've given an arm for an iPhone, but now it's, "there's no way I'd have spent that much money". Even all the "I don't need an iPhone and touch typing sucks" people now can't put their iPhone 3gs down. I always said, the only people who say they don't need one are people that don't own one.&lt;br /&gt;&lt;br /&gt;Note: I never upgraded to the iPhone 3g, and still think it was the right thing to do. I'll be eligible for upgrade to the iPhone 3 (4g?) right off the bat, and from what I can see, there just isn't enough difference between the first and second gens to compel me to print more money for Steve Jobs (I also own a MBPro 17, a Macbook 13, and a Mac Mini). I bought my girlfriend a 3g, and have done a pretty close comparison; at the outset, I was a bit jealous of not needing wifi for some things, and the 3g is a bit faster, but over time that's evened out to the point where it doesn't bother me at all.&lt;br /&gt;&lt;br /&gt;People say, "I have the 3g", I say, "I have the OG".&lt;br /&gt;&lt;br /&gt;Regarding apps, I'm not an "app of the day" type. I select mine carefully because I'm looking for something specific, and when I buy one, I tend to use it hard; if I find it's not useful, I get rid of it quickly, and I've gotten rid of lots of apps. My phone isn't completely cluttered with freebies and all that; the apps in this list I find truly useful every day because they are part of my workflow and/or appeal to my interests directly. I don't look for distractions or time-killers, I look for ways to continue pursuing my interests.&lt;br /&gt;&lt;br /&gt;Listed in no particular order, other than the order I keep them in on my iPhone:&lt;br /&gt;&lt;br /&gt;- ToDo 2.0. I was totally disappointed in the ToDo list on the iPhone, just like everybody else as far as I know. ToDo is a robust, easy to use app with great sorting options, customizeable lists, a great and organized display, alerts, iCal todo list synchronization via the Appigo Sync desktop app (very unintrusive), a "focus list" for critical tasks, item tagging, drag 'n drop this 'n that, badge notification...it's absolutely what the iPhone ToDo list needs to be. It also syncs with ToodleDo, which I don't use, but people tell me it's really useful, so who knows, maybe I'll sign up. "It's freakin' great," pretty much says it all.&lt;br /&gt;&lt;br /&gt;- NoteBook (www.appigo.com, the same makers as ToDo). A great notepad app in it's own right. Create notebooks to organize notes, have links in your notes, email notes, etc. etc. Way better than the standard "Notes" app (which I actually used all the time until installing NoteBook). The best thing though, is it integrates directly with ToDo; you can save a ToDo item as a note, or vice versa. Notes can contain web page and phone number links...again, it's freakin' great.&lt;br /&gt;&lt;br /&gt;- Skype. I've been a Skype user since it got up and running, and have saved a fortune using it, not to mention giving me the satisfaction of stickin' it to the man. I do most of my communication through email, text and chat; phone conversations are brief, frequently cut short with a request to just email me the details. I also live and work in and around the NYC area, so wifi is usually close. Skype lets me bottom out my minutes plan, taking my monthly bill down significantly. The UI is completely in sync with the desktop app and I've never encountered any bugs. Freakin' great; saves me money and works fine.&lt;br /&gt;&lt;br /&gt;- FireBox. Encrypted storage for personal info, passwords, etc. I've tried some others, but Firebox allows you to set up your own form templates and categories in a way that appeals to me. I store my credit card numbers and info, server logins, and all my website logins, etc., right on the phone. Lose your phone? No problem; the encryption is industrial strength, and there's a desktop app that syncs the encrypted store to your desktop. In fact, you can add and remove forms, categories and entries in the desktop app. This app has made the iPhone as important to me as my wallet, possibly moreso, since I don't actually carry a traditional "wallet" (I use a large business card holder, silver and fancy people compliment it frequently, and just fold up my money in my pocket). FireBox appeals to me more than other solutions because it is extremely flexible. I can configure my categories and entries exactly as I like, whereas other solutions I've tried have things like a "credit card template" that either wants too much or too little info, has fields named in ways unintuitively (at least to me), and so on.&lt;br /&gt;&lt;br /&gt;- Twitterific. For me, the best Twitter app. Admittedly, I'm not the most experienced Twitter user, but I checked out Tweetie and a couple of others; I like the look and feel of Twitterific best. It's easy to use, exposes the functionality that's important to me very plainly and simply, multiple accounts and timelines are easy to navigate...I know, people are religious about their Twitter apps. For now though, this is the one for me. I use Tweetie as a backup (and have never actually had to use it, I really got it because so many people are like TWEETIE for god's sake!).&lt;br /&gt;&lt;br /&gt;- Guitar Toolkit. I've been playing guitar for 23 years, with very few extended breaks, and usually take it more seriously than your typical non professional; lessons and all that. GuitarToolkit has a metronome, chromatic tuner, scale and mode reference with root tones indicated (all graphic on the fretboard, and interactive; touch the fret, hear the note), a chord finder for identifying and locating various chord positions and fingerings, and more. It's by far one of the most fully functional music/guitar apps period, let alone just on the iPhone. True, the tuner can bork in noisy settings, and some of scale generation logic needs a little tweaking (the positions are always right, but for example, sometimes an A sharp will be used in stead of a B flat, making the scale appear to be missing a note until you look at it twice), but since it's not intended to be a teaching tool and the positions are always correct, it doesn't bother me. The GuitarToolkit guys are affiliated with Agile Software, a dev shop in NYC that I actually do work for as well.&lt;br /&gt;&lt;br /&gt;- GuitarChords, basically just a breakout of the chord reference by the guys at GuitarToolkit; useful because you don't have to init the whole app every time you want to just browse some chords to refresh your memory. They give this one away.&lt;br /&gt;&lt;br /&gt;- Grand Pro. Imho, the best piano keyboard simulator for the iPhone. You can record and store your diddling, replay it, etc. Nice display options (single or double octave, small or large keys, etc.). Great for theory study on-the-go, comping ideas, and retrieving them later for notation.&lt;br /&gt;&lt;br /&gt;- Karajan. A very interesting music learning tool, primarily useful for ear training. Sounds out series of chords, intervals, scales, etc., and you have to guess which one you're hearing, either from a list, or right on a keyboard. Ear training is an essential and overlooked part of many non-pro musician's study regimen, even serious ones. This app without a doubt helps me keep my ear in-tune while on the go.&lt;br /&gt;&lt;br /&gt;- BofA iPhone app (Bank of America). I bank at BoA. Originally, the app was just short of a clunky web page shell. Now it's pretty slick, enables me to do transfers, balance checks, all sorts of online banking, with a glance 'n tap. I use this all the time.&lt;br /&gt;&lt;br /&gt;- Kindle Reader. I'm a Kindle 2 (and soon DX) fan. I use the Kindle Reader to continue reading in settings where pulling out the Kindle and a booklight might not be appropriate, or just to browse and purchase reading material that I'll pull down on my Kindle later. A great complement to a great product. For reading though, the Kindle 2 rules, or I think so anyway.&lt;br /&gt;&lt;br /&gt;Games:&lt;br /&gt;&lt;br /&gt;- Chicktionary. A word game, create lots of words from a starting combination of letters, which is fun, but the graphics and sounds are really fun; I want a Chicktionary stuffed chicken that squawks when you squeeze it! The game is actually harder than you'd expect, sometimes frustrating in fact, but I prefer that to being too easy, which many iPhone games are.&lt;br /&gt;&lt;br /&gt;- Caissa Chess: Challenging, great UI, great features you'd expect in chess software. I looked over a number of chess apps, and believe this is among the best. I'm not a pro or even advanced player, but I do enjoy the game and play on and off.&lt;br /&gt;&lt;br /&gt;- Chess Player: A chess app, but you don't play, it steps through classic chess games of all kinds, allowing pause, replay, etc. Great for game analysis and allows a glimpse into the minds of the greats. Sometimes it's nice to just kibitz.&lt;br /&gt;&lt;br /&gt;- Learn Chess: an interactive e-book, great for the learner, nice for the hobbyist. Lets you learn and/or brush up on all the rules (e.g. many don't know what En Pasante is), basic strategy, and some nice extras. Probably not for the advanced player, but still fun, and a great example of the "interactive e-book" genre, which is something I'd actually not heard of in the context of the iPhone. Might be worth a blog post of it's own.&lt;br /&gt;&lt;br /&gt;- Trism. One of the first "featured" game apps in the App store. Sort of a Bejeweled kind of game, but uses the accelerometer to allow collapsing and shifting the tiles in any direction. Interesting features like bombs, tile locks, and so on. I still play this game when I'm too fried for chess, word games, or music study. Updates have made the game a lot smoother.&lt;br /&gt;&lt;br /&gt;- Light Bike, the game right out of Tron. Can get kind of tiresome after ten or so minutes, but is still fun, and a great example of a 3d game working really well on the iPhone. Also has head-to-head play, which I've never used, but I've heard it works great.&lt;br /&gt;&lt;br /&gt;That's pretty much it: I've got some other miscellaneous apps on there, but the ones I've mentioned above are the ones I use all the time; those apps have made the iPhone far more than just a phone and/or PDA to me. Naturally I also use it to watch movies, email, text, and all that as well, but if you're not sporting at least a handful of apps, you're not getting the full bang out of your iPhone.&lt;br /&gt;&lt;br /&gt;As always, thanks for reading, any questions or comments, feel free, tcoz@tcoz.com.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-2978601831711243779?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/2978601831711243779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/iphone-apps-i-cant-live-without-or.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2978601831711243779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2978601831711243779'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/iphone-apps-i-cant-live-without-or.html' title='iPhone Apps I Can&apos;t Live Without (or actually just really like).'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-2347812198187946027</id><published>2009-05-11T03:48:00.000-07:00</published><updated>2009-05-11T05:41:41.824-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcoz'/><category scheme='http://www.blogger.com/atom/ns#' term='developer'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='applications'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='tim consolazio'/><category scheme='http://www.blogger.com/atom/ns#' term='objective c'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Climbing Mount iPhone Developerest: At the Foot (Getting it Up and Running)</title><content type='html'>If you didn't know from the blog description or my profile, I'm a software developer by trade. I've worked for American Express R&amp;amp;D, Microsoft, count Citigroup, Spectrum/IEEE and Thomson Reuters among my current project clients, and have run my own cottage dev shop for five years (lucratively enough to make a living, thank the powers).&lt;br /&gt;&lt;br /&gt;My specialty for quite some time, actually as long ago as 10 of my 15 years in the field, has been, on top of competency with Java, .Net, PHP, and assorted ECMA scripting languages and whatnot, ActionScript development. I don't consider myself a "Flash" developer; "ActionScript programmer" is more accurate, though these days, I would add "Flex Developer" as well, since I work with and manage resources for some pretty big Flex projects. Facebook development is also up my alley, I actually was a paid reviewer for both O'Reilly Facebook dev books, but on the tech side, that really boils down to skill with ActionScript, JavaScript, and PHP (I do understand that  integration of the social graph is another and equally important matter).&lt;br /&gt;&lt;br /&gt;Note: Check out my Facebook Sudoku app, Planet Sudoku, at http://apps.facebook.com/planetsudoku.&lt;br /&gt;&lt;br /&gt;Based on a history of development tools and languages that focus on the UI, and the fact that I own an iPhone and find it indispensable, it's probably no surprise that I got interested in iPhone development.&lt;br /&gt;&lt;br /&gt;So there you are one day, saying out loud to nobody in particular (well, I do that now and then anyway), "I gotta get this rolling," and off we go.&lt;br /&gt;&lt;br /&gt;Note: I'm aware of the open source alternatives to the official Apple SDK and so on; at this point, I'm only interested in being a fully legit, licensed, Apple iPhone developer, particularly because Apple makes it clear that any unsanctioned use means no App Store approval. I'm sure I won't be good enough to fool them for a long time, if ever, and I'm not prepared to take up the Jolly Roger for that cause right now.&lt;br /&gt;&lt;br /&gt;So, my learning process, in a nutshell:&lt;br /&gt;&lt;br /&gt;- Get a beta or something of the dev kit.&lt;br /&gt;- Get the language book.&lt;br /&gt;- Put on the strong black tea.&lt;br /&gt;- For a month or so, allocate the time used for relaxing, working out, and playing guitar, to going through the samples, cursing at the screen, eventually figuring out how to make hello world appear when you click a button, getting the eventing mechanisms straight, learning how to call and use data, figuring out how to manipulate images...all the key stuff that you'd have to understand to be able to translate requirements, into features, into an app.&lt;br /&gt;&lt;br /&gt;Additionally:&lt;br /&gt;&lt;br /&gt;- Find the useful community resources (often done by googling for things that either seem broken in the book, or just because you know from experience there has to be a better way to do a certain something)&lt;br /&gt;- See if any frameworks I already work with exist for the given environment (e.g. PureMVC for iPhone).&lt;br /&gt;&lt;br /&gt;FYI, PureMVC for iPhone: http://www.darklump.co.uk/blog/?p=185. I will more than likely blog my experience with this port some day.&lt;br /&gt;&lt;br /&gt;- See if you can find some practice certification material, or get the cert book; this is important to me not because I necessarily want to get certified (I used to take certification seriously, I don't anymore, but that's a topic for another day), but it's valuable to me to make sure I understand what's considered "essential" areas for a given technology.&lt;br /&gt;- Maybe take a class or two. Instruction can never hurt, and it shows real interest to a potential client. This can be costly, but it's a write off.&lt;br /&gt;- Avoid the design-time GUI tool until I know how to create basic applications with just the language. I firmly believe, if you don't know how the basic plumbing works and depend entirely on the UI design tool, and something doesn't work the way you expect, you'll be seriously behind the 8-ball.&lt;br /&gt;&lt;br /&gt;That's how I've always done it, it's always worked, and that's how I intended to start my climb up Mt. iPhone Develeporest.&lt;br /&gt;&lt;br /&gt;So...&lt;br /&gt;&lt;br /&gt;- Go to the iPhone Developer Center, http://developer.apple.com/iphone/.&lt;br /&gt;&lt;br /&gt;Tutorials, community, and download for the dev tool, XCode. So far so good, several of my steps knocked right out.&lt;br /&gt;&lt;br /&gt;- Get the language book.&lt;br /&gt;&lt;br /&gt;I got this one first, and recommend it, but I'll say it right now, it is NOT enough, even to get you started: iPhone SDK Application Development, O'Reilly, Jonathan Zdziarski.&lt;br /&gt;&lt;br /&gt;I say "NOT enough" for two main reasons:&lt;br /&gt;&lt;br /&gt;First, Objective C is different from C-based languages in many ways syntactically; at first glance, it's really cryptic. You ultimately see that it's actually not bad at all, but all the brackets and unfamiliar keywords, and having to write two distinct parts for every class (interface and implementation), can take you out of your comfort zone. I love interfaces and such, I'm an OOP nut, but I still found the conventions of Objective C a bit disorienting.&lt;br /&gt;&lt;br /&gt;Second, iPhone development involves understanding "Views" and class hierarchies related to them. If you don't understand the language already, working with the iPhone API to implement views and attach things to them is not easy at all.&lt;br /&gt;&lt;br /&gt;Realizing all this quickly, I got this book: Programming in Objective-C 2.0, 2/e, Stephen G. Kochan.&lt;br /&gt;&lt;br /&gt;Now we're talking; excellent book that demystifies Objective-C. For the most part, you write "utility apps", like simple calculators and so forth, but it gets you grounded in the language, which really unlocks the iPhone API for you. I like the language now and have no issue writing classes and having them work together nicely.&lt;br /&gt;&lt;br /&gt;Alrighty; I understand the language, at least enough to work with the tool somewhat productively. XCode has an iPhone emulator, so I've ported some of the utility examples from the Objective C book to the iPhone (like adding real buttons for the calculator) and run them in the emulator with no errors. I'm starting to feel like an iPhone developer.&lt;br /&gt;&lt;br /&gt;So, let's get one of these sample apps on the iPhone. You have to register your phone as a "developer" phone...ok, not so bad, the iPhone site walks me through this, yeah yeah I know if I blow it up or it catches fire Apple is not responsible...alrighty let's get "Hello World" on and see how this process works...BLAMMO. Dead stop.&lt;br /&gt;&lt;br /&gt;In order to put an app on your own iPhone (now registered as a dev unit), you have to register as an iPhone developer with Apple, and they have to send you a license key, which you use in combination with a certificate, to sign your app, so that it can be transmitted via your usual USB connector to your iPhone (XCode actually makes this seamless, very nice). Otherwise, you'll just develop with the emulator forever (again, I am not interested in hacks or workarounds to this).&lt;br /&gt;&lt;br /&gt;This process takes time, and may not be as easy as it sounds. You can register a number of different ways; for example, as an independent developer under your own name, or as a business. I opted for the latter; Tcoz Tech Services, a sole proprietorship with a DBA that I've used for five years. Apple required that I fax (can you believe they don't accept emails of scanned forms?) my business registration documents to them, and that they review them, etc. If approved, you go on to the next step.&lt;br /&gt;&lt;br /&gt;So, I complied. Again, BLAMMO. I don't live at the address that I originally registered the business under anymore. Apple won't approve your registration unless the mailing address you apply under, and the addresses on the documents (in my case, a DBA), are identical. This held me up for almost two months, so I will say in caps:&lt;br /&gt;&lt;br /&gt;IF YOU ARE A CONTRACTOR RUNNING A SOLE PROPRIETORSHIP WITH A DBA, AND WANT TO REGISTER YOUR BUSINESS WITH THE IPHONE DEVELOPER PROGRAM, MAKE SURE THE ADDRESS OF YOUR BUSINESS REGISTRATION MATCHES THE ONE YOU REGISTER WITH!!!!!&lt;br /&gt;&lt;br /&gt;Fair warning.&lt;br /&gt;&lt;br /&gt;After quite a bit of back and forth, Apple did allow me to change my registration address to the one on the DBA; this was reasonable, because there is no law saying I have to live at the same address, it's entirely Apple's policy. It held me up, but they worked with me and I pushed it through. One day, Apple telephoned me, asked me some confirmation questions, welcomed me/my business to the program, and said I'd receive a mail taking me to the last step.&lt;br /&gt;&lt;br /&gt;Hah, guess what...the last step is to PAY. That's right. You don't have to pay to learn Objective-C, or get the XCode dev tool, or the emulator. But that's all meaningless if you want to be an independent developer building iPhone apps that sell in the App Store. You need to be able to put them on the iPhone accordinlg to Apple hoyle, and unless you pay up (a little more than $100 a year), you can't do it. Talk about incentive to build and sell at least 120 copies of my first 0.99$ app!&lt;br /&gt;&lt;br /&gt;I grumbled, and again considered going the open source hacker route (interestingly, as I understand it, the developers of the first iPhone SDK are in fact the guys that wrote the open source unofficial one, which preceded the official one), but no, I'm a pro, do the right thing, keep it above board.&lt;br /&gt;&lt;br /&gt;After a journey of roughly four months, all the pieces are in place, and I'm now testing apps on my iPhone. Look out for my first iPhone app; will it be a hit? I don't know. It certainly won't be my magnum opus, but I do know it's original; I've looked carefully and there isn't one available that does what I have in mind.&lt;br /&gt;&lt;br /&gt;Feel free to contact me at tcoz@tcoz.com if you have any questions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-2347812198187946027?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/2347812198187946027/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/if-you-didnt-know-from-blog-description.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2347812198187946027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2347812198187946027'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/if-you-didnt-know-from-blog-description.html' title='Climbing Mount iPhone Developerest: At the Foot (Getting it Up and Running)'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-4496814038552722152</id><published>2009-05-10T06:36:00.000-07:00</published><updated>2009-05-10T14:18:44.959-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='social'/><category scheme='http://www.blogger.com/atom/ns#' term='social graph'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='kindle'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>The New Sunday Morning: Kindle and iPhone</title><content type='html'>It used to be, you got the NYTimes and Daily News--I mean c'mon, you gotta have the comics--sat down to your breakfast, brunch or early lunch, chatted with whomever is at the table, and/or just wrapped yourself up in a cocoon of news and thought. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How things have changed, or maybe they've just evolved...or devolved. Hmm.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It struck me this morning that while the ritual is similar, the tools have changed. Today I found myself sitting with my tea and girlfriend--and thinking of a mimosa, ahem--but no newspapers. Instead, I was flipping around some unread sections of blogs and looking over the news on my Kindle 2, and when I found something of interest, quietly pushed it out to my friends on Facebook, or tweeted it, on my iPhone. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Interesting; has this civilized Sunday self enrichment ritual, involving newspapers, discussion, and reflection, devolved into looking for anything to FB update or tweet because I hadn't said anything in a while? Am I actually getting as much quality time and info as I used to?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Many might say, "I've been reading news online for years, I get it free, and I get more of what I want, because I can search and yada." Well ok, but do you and your wife/girlfriend/friends bring your laptops to Frank's Waterfront in Edgewater, break them out on the table, and engage in discussion while typing/searching and all that? I think not. A working lunch, or a solo nosh, sure, but with people or in any kind of upscale place...no.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This isn't to say that this sort of thing is universally unacceptable; there's places that cater to it. I hang out at some excellent spots in Brooklyn along Atlantic and down Clinton and Smith streets, get great food, and bring my laptop, and I'm sure every neighborhood has such a place, or at least, one close by.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...as I changed from the Sunday Times for a minute to scan some news via the integrated web browser on the Kindle, I actually found that Thomson Reuters had blogged a first disclosure of the Reuters Insider, an online news product that is an industrial strength example of "narrowcasting". I found it interesting, particularly because I'm managing a team of UI developers on the project, and am under strict NDA not to discuss the project other than saying "I'm working on it". I handed the Kindle to my girlfriend and showed her the article, and we discussed it (paranoid assurance: I only discussed the content of the article). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note: If you're interested, google Reuters Insider, and look for the "Full Disclosure" blog link, it should be the first one. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This specific interaction prompted me to blog today. It was exactly as if I had handed over a newspaper and pointed out an article. Sure I could have done it on my iPhone, but there was something much more appealing about handing over the Kindle, and while she looked it over, I could discreetly refresh my tweets. We discussed a little, then she handed back the Kindle, and the cycle resumed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As far as information and retention, I scanned my NYTimes, and CNN, and blogs, bookmarked and annotated some things on the Kindle for later review, and so on; I believe I got my fill of news updates and such, and additionally, saw some interesting comments and interactions from the threads I follow on Twitter and Facebook. Not to mention that a day without Sockington would be a tough one, and possibly KingPoo (who I'm giving a chance). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Regarding social appropriateness, nobody seems bothered by me using the paperback-sized, slim, subdued device (note, I have pre-ordered a Kindle DX, but probably won't bring it to a setting like this, it's a lot bigger). There have been curious looks and even a couple of "what's thats", but because the device emits no light or noise, lies slim and flat (unlike a laptop) on the table and holds like a book, and frankly looks quite nice in its leather cover, it seems that it passes social muster. Also, the iPhone, with all volume turned off (buzz enabled of course), is very subtle, since you can nav with one hand very quickly and discreetly, unlike many hold-in-front-of-your-face thumb typing phones with their audible thumb typing clicks. Naturally, excessive texting would compromise this, but that's getting back to the aforementioned Irish Pub thing. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;End result; it was fun, interesting, integrating the social graph enhanced the experience, and the combination of Kindle and iPhone, used with restraint, didn't appear to irk anybody. A laptop wouldn't have enabled the  same environment or interaction; the e-book reader, with the hyper-enhanced ability to scan, search, and mark up blogs and news, all of which will sync to my iPhone Kindle reader, and the discreet use of FB and Twitter when I felt like looking over popular topics, adds up to my new Sunday brunch gigbag. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Oh right, I still got the comics, both with the Kindle 2 and iPhone's Safari. I mean c'mon...you've gotta have the comics. &lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-4496814038552722152?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/4496814038552722152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/new-sunday-morning-kindle-and-iphone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/4496814038552722152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/4496814038552722152'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/new-sunday-morning-kindle-and-iphone.html' title='The New Sunday Morning: Kindle and iPhone'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-4863774491976773086</id><published>2009-05-09T07:01:00.000-07:00</published><updated>2009-05-09T08:52:12.755-07:00</updated><title type='text'>Day One with Twitter: Sockington, the iPhone, Broken Apps and Adult Dating</title><content type='html'>I admit that I always considered Twitter to be masturbation; a way for people afraid to stay alone with their own thoughts to distract themselves, contributing to the modern devolution of "fame" by planting any kind of flag at all in a visible area.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This impression isn't without cause. A couple of months ago, I was standing in line on 7th ave. in NYC getting a cup of tea in Starbucks. There was a girl in front of me tweeting away on an iPhone (I could see she was on the Twitter website)..."I am getting coffee". "I am ordering coffee". Yes, while standing in front of the counter attendant, this person was making us all wait while she tweeted this activity &lt;span class="Apple-style-span" style="font-style: italic;"&gt;before &lt;/span&gt;ordering her coffee. Let's not try to say this is uncommon; if you were to quantify it, I'd be willing to bet at least half of Twitter is filled with such dreck. No doubt, Twitter is a big enabler of crossing-the-street-without-looking behavior.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fact is though, I'm into technology, and I started to see people I know and respect get interested in Twitter. From a development standpoint, they have an API, which means I can build apps that integrate it. Add it up: people are flocking to it, you can integrate it via the API, all the tech blogs are following it, I'm an app developer...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...I have to learn about Twitter, and the best way seems to be to sign up and start tweeting. After a day of it, I thought it would be interesting to blog my perspective before I joined the Twitterati. I will no doubt blog on the subject again, it'll be interesting to see how my perspective evolves.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I came to the conclusion to get on the tweet wagon (twagon?) while noshing serrano and manchego at a local Spanish restaurant's bar area, where I was reading TechCrunch and Amazon Daily on my Kindle 2 and once again seeing several Twitter stories, one that mentioned an iPhone app called Twitterific, which seemed to have a lot of appeal. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note: A Kindle 2 and an iPhone is enough to keep anybody busy for a few hours, and is so much more civilized than breaking out a laptop in a public place. Funny thing is though, with the leather cover, if you're in a restaurant, people think you've been staring at your check the whole time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mid nosh, I got urgent: why wait? I broke out my iPhone, pulled Twitterific down (paid version, 3.99), created an account at the Twitter website (Twitterific's "Create Account" interface doesn't seem to work, it just asks you to log in--erm, I don't have an account, that's why I'm trying to sign up--I had to go to Twitter.com to create an account, then go back to the app and enter credentials etc.), and there I was, tweet-enabled (tweenabled?).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Twitterific greeted me with a cute little bluebird next to a popup telling me I had 100 new tweets, and an audible "tweet tweet" sound, which I really liked, it was very welcoming; the app has a light-text-on-dark-background look, very polished, and lots of ways to search, follow, move channels (or timelines, or whatever you call different threads, my jargon is still weak), and so on. From a UI dev perspective, I liked it a lot, and must say I enjoy Sockington's battle with the enemy pillow.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A lot of people tweeted that they prefer Tweetie though, mostly due to speed. So I pulled that one down (2.99 I believe), and signed in. Right away I thought Twitterific's UI was better for me; it's more appealing and seems to expose more of Twitter's functionality. This might show my Twitter noobishness (twoob?) since speed doesn't really matter to me now--we're talking a few seconds, and as I said before, frantic texting/tweeting (twexting?) irks me--so at least for the time being, on iPhone, I'm a Twitterific user, with Tweetie as backup.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To get started, I tweeted my Kindle blog article. Then my meal came and I shut down. After some wine and a finishing up my reading for the day, I walked home and called it a night.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lo and behold, this morning, I had two followers already: Blogging 101, which I thought was great, and another user, whom when I clicked to see the profile, turned out to be...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...AN ADULT DATING SERVICE. Immediately blocked of course, but it showed me the ugly side of Twitter. People are abusing it in a Craigslist sort of way. The intent of this user, who undoubtedly has a custom app using the Twitter API to scan tweets and follow them, or just really dedicated staff, was to have me click through to an adult dating site where I could probably have a "massage therapist" come over with drugs for a sniff 'n rub, and who knows, stab me in the neck and rob me. What fun! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...today I got on Facebook, and shot out an update, "Follow me on Twitter and I'll follow you, tcoz_tweet". I wasn't sure if this was right-think, but meh, why not. One of my friends responded, "Isn't Twitter and FB redundant?". &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ah, I thought; I'm not the only person out there unfamiliar with Twitter. I responded that no, it wasn't, but you really have to try it to see why, it's sort of hard to explain. I guess I'd sum it up as, "With Twitter, anybody can follow your status updates, sort of like walking by a newsstand and reading the front pages as many times a day as you want; you don't have to be invited. FB is more like letting somebody into your house."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I know; Twitterati will say UGH how basic, Twitter is so much deeper than that, how dare you trivialize it...ARGH /tweet "IYAM PIZZED http://tinyurl.com/pizzed"! You have to start somewhere though, and since this is how I understand it, and it helped me get there, it seems a fair way to lay it out to the Twitter muggles (twuggles?).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You know, I might Tweet that. Accurately and clearly describe Twitter, so that anybody can understand it (so watch your shortspeak), and how it differs from, but enhances, FB. If anything interesting arises, I'll post it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Moving along, I found that yes, you can connect FB and Twitter via the FB Twitter app. GREAT, I searched FB, found it right away, went to install...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...and it's broken. Nothing but a blank page shows up. On the About page for the app, people are complaining with the usual WTF IZ BOKEN sort of post that surely has FB tech support giving thumbs up for detail and clarity and is clogging up the Twitter ruby-on-rails Unix boxes. Bah, I thought; I guess I'll have to wait for the zen of FB-Twitter integration, and in the meantime, will just have to status update my FB friends to follow me at tcoz_tweet on Twitter.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, at the end of one day (actually more like 16 hours) of getting into Twitter, that's where I'm at. Off to tweet this blog post.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-4863774491976773086?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/4863774491976773086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/day-one-with-twitter-sockington-iphone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/4863774491976773086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/4863774491976773086'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/day-one-with-twitter-sockington-iphone.html' title='Day One with Twitter: Sockington, the iPhone, Broken Apps and Adult Dating'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-2942975267259560360</id><published>2009-05-08T07:37:00.001-07:00</published><updated>2009-05-08T08:21:32.432-07:00</updated><title type='text'>So far, I almost love my Kindle 2</title><content type='html'>I've been looking at e-book readers for some time.&lt;br /&gt;&lt;br /&gt;Naturally I looked over the Sony line; very attractive, the new one. Touch screen, "real" notes on the page, all that. Book availability not so bad. But they so screwed up the screen with the material they used for the touch overlay, I couldn't get myself to spend the five hundred. And of course, who wants the old one, I'll just wait for the next one.&lt;br /&gt;&lt;br /&gt;The first Kindle was another option, but c'mon, it was ugly and clunky looking. Now that I'm all Mac and we're in a smooth, ever-flattening flat screen world, devices have to be attractive; I would have really NEEDED an e-book reader to buy a Kindle 1.&lt;br /&gt;&lt;br /&gt;A quick note on other readers; I looked at iRex, all that sort of thing. Expensive, and with questionable futures insofar as formats, book availability, ease of purchase, etc. Good, targeted devices, but not "consumerish" enough for me.&lt;br /&gt;&lt;br /&gt;Kindle 2 though; a friend  recommended it. I looked it over; sleek, looks nice in the leather cover, Whispernet (Sprint 3g I believe) for FREE, one click purchases, etc. etc. etc...I saw all my programming and music theory books, as well as my blog subscriptions and such, getting collapsed into a nice, clean device that I could carry easily in my slim 13 inch laptop bag with my slim 13 inch macbook (got tired of lugging and finding room for the 17, which sits home mostly now), and I pulled the 400-ish dollar trigger (with cover and reading light).&lt;br /&gt;&lt;br /&gt;I have to say I like the device; I'm close to love, but not there yet. Here's why.&lt;br /&gt;&lt;br /&gt;- Contrast. It's about 25% less sharp than I'd like. There is an excellent reversible hack that allows you to put darker fonts on it (https://sites.google.com/a/etccreations.com/kdesignworks/Home/font-install-files), and this took it to about 15-10%, but...why the hell did they make the background so grey? You can wrap the kindle in a black wrapper to create the illusion of more contrast, but fact is, PAGES ARE WHITE. NOT LIGHT GREY.&lt;br /&gt;&lt;br /&gt;Note: this is the one area where the old Sony shines. It has great contrast.&lt;br /&gt;&lt;br /&gt;- Size. You get the device, and read a blog or textbook (of course I had to put the Hobbit on immediately). It's great (with the font hack). Then I put a programming book on it...hmm, the examples, probably on one page in the printed book, are now on two, or three, depending on your font size. Manageable, but inconvenient. Then I tried a music theory book; worse yet. Many of the standard notation passages are images, which are downsized far too much to fit the paperback-sized screen. Yes, you can zoom, but then you have to turn the device (it zooms in landscape), and it takes you out of the context of the page.&lt;br /&gt;&lt;br /&gt;Note: A few days after I ordered the Kindle 2, and the day after I received it...Amazon announces the Kindle DX, which has a 9.7 (or some such) inch screen. Does this solve the problem? Nope...because I don't want to read a paperback on a 9.7 inch screen.&lt;br /&gt;&lt;br /&gt;So, it dawns on you...when I buy the print books, they are certain sizes for specific reasons. Thinking all books would fit on one device was short sighted. Ah well...here's five hundred more dollars for the Kindle DX, which is on pre-order, I expect to have it in a month or two.&lt;br /&gt;&lt;br /&gt;- Bag size: I would typically carry 2-3 books in my bag (chess, music theory, programming), along with my laptop, Bose headphones, assorted DVI adapters and keychain drives, etc. BULKY. Now all one slim, 10oz device. Fits right into my campaign to carry a lot of power in a slim, light package. Sure a lot of people say, "get an ebook reader on your laptop", but I'm not pulling out a new 13inch macbook in a nice restaurant bar or on a subway.&lt;br /&gt;&lt;br /&gt;- Book Cost. My theory and programming books are EXPENSIVE. True, I write them off, but they are way, way cheaper in e-book form. The money for the devices (The 2 and the DX together, with case, are about 1k) will even out soon enough, especially with all the new Adobe and iPhone dev books coming out.&lt;br /&gt;&lt;br /&gt;Note: Whether or not the life of the device is long enough for this even-out to happen, I don't know. They're already talking about an 8.5x11 Kindle, with touch screen and so forth, by Christmas! True, the first run of that device will probably be shaky, but still, say half a year later they get it right...I'm sure that device won't be free to Kindle 2/DX owners, there probably won't even be a discount (there was no discount for the Kindle DX for Kindle 2 owners).&lt;br /&gt;&lt;br /&gt;- NO CD (if it normally comes with the book). Easily fixable; the publisher could just put the MP3 tracks on a website, and you could pull them down and dump them on the Kindle 2, which can store and play MP3s. But I haven't seen that become a practice yet. This is a pretty big drawback in the world of music theory books.&lt;br /&gt;&lt;br /&gt;- Storage/Green: I throw away tech books by the box every year or so, and have at least two big shelves, and a floor pile, dedicated. That problem goes away. I store all my books, large and small, in two sleek devices. I love that.&lt;br /&gt;&lt;br /&gt;- Page turning: Turning pages on a music stand or a book holder on your desk is annoying. Pushing a button is great.&lt;br /&gt;&lt;br /&gt;- Bookmarks, notes, highlights: Easy to create, and saved in a separate "book" so you can review them en masse. It'd be like making notes all over a newspaper and having them automatically dumped to an appendix and indexed. GREAT.&lt;br /&gt;&lt;br /&gt;- Multi devices; Kindle reader for iPhone. Yeah, it's not an Ebook. But if I'm waiting for somebody in a bar and don't have my bag, or it was too warm to wear a jacket with a big enough pocket for the smaller kindle, I can get by with the iPhone reader. The integrations are pretty seamless; everything syncs to your online Amazon Kindle account, so any book I buy can be pulled down to as many Kindle devices, as many times, as I need (a good thing, storing lots of books on my iPhone first gen would force me to remove one of the two movies I carry).&lt;br /&gt;&lt;br /&gt;- Daily updated blogs etc: I love that I just open up the device, and my TechnoCrunch, Amazon Daily, Boing Boing, etc. is ready for me, and I can easily flip through articles, bookmark/annotate things for later review, and all that. Makes it easier to stay up with the trends, which is important for folks in the tech industry.&lt;br /&gt;&lt;br /&gt;- PDF support; The Kindle 2 allows you to mail PDFs and word docs to your kindle account (yourname@kindle.com), and it converts it for you, making it available as an archived item on your device...not bad, but high end PDFs can come out sketchy. The Kindle DX has integrated PDF support, so that's better. I carry around a lot of PDFs, it'd be nice to have them on the reader instead of depending on the computer.&lt;br /&gt;&lt;br /&gt;All that, and I've actually been using the device for five days.&lt;br /&gt;&lt;br /&gt;I'm sure I'll talk more about it as they do firmware upgrades and all that (they are hinting at contrast fixes, which would nail it for me), but for now, that's where I'm at with this truly interesting device.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-2942975267259560360?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/2942975267259560360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/so-far-i-love-my-kindle.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2942975267259560360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/2942975267259560360'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/so-far-i-love-my-kindle.html' title='So far, I almost love my Kindle 2'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1527861195609149665.post-5039417906735214519</id><published>2009-05-07T05:52:00.000-07:00</published><updated>2009-05-07T06:57:19.390-07:00</updated><title type='text'>About the Tcoz Tech 'n Toys Blog</title><content type='html'>I've blogged before...well, no. Rather, I've occasionally updated my website with some notes as to what I'm up to in the industry these days. That no longer seems adequate; what with everybody Tweeting, Twooting, Twishitting, Friending, Sending, Poking, and what have you, I figure I better get with it to a degree. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Voila, Tcoz Tech 'n Toys. The name is apropos; I avidly pursue lots of cutting edge programming and server technologies, and I do love my tech toys. Why I've never blogged is more about, "meh I dunno," than anything else. I'm certainly vocal about my experience and opinions. Here's the rundown:&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I worked in Strategic Planning and R&amp;amp;D at American Express for roughly five years, left to run an internet redesign project at NYC-based Empire Blue Cross Blue Shield using Microsoft based technologies, which got me recruited for a roughly five-year stint at Microsoft, and then...the epiphany.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It became evident to me that there were some real disadvantages to working for large corporations, and that they precluded me being really happy at any typical corporate tech position; in particular, you get hired for specific skills to do "an urgent project", you complete it, then lose visibility and spin off into maintenance and errata limbo until something else interesting comes through the oft-clogged corporate pipe. After a time, "management" begins to get thrown your way, or somebody decides you would be "great in a new, important role." &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Case in point: Microsoft took my position, which was primarily technical and secondarily sales support--and which I loved--and flip-flopped it; the most important question at team meetings went from something like, "so how's that proof-of-concept .Net vs. Java project going", to the sorry mantra, "so how many seats do they have, what's the opportunity, how many people have you cold called...?".  You know, I don't care. I know it's important, but it's just not what I'm interested in, and I'm not going to act like I'm ever going to be (well, I tried for about six months. I couldn't stand it). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, I left to start my little cottage industry, counting on my non-Microsoft-like habit of experimenting with competitive technologies, and fairly deep knowledge of MSFT ones, to get me some work. It paid off; after scraping together some drastically underpaid project work and proving I could build a solution from the ground up, I started getting bigger contracts, and now the work comes in regularly enough that I really don't have to go looking for it...much.  My specialities are Flash/Flex, AS2/3 (I started working with Flash, or Director/Lingo actually, in my Amex days), and related technologies (like Java, .Net or PHP on the backend, etc.). I'm also a big fan of Facebook development (I was a tech reviewer on both O'Reilly Facebook dev guides), and have gotten my business, Tcoz Tech Services, into the "official" iPhone developer program. I manage projects, lead teams, and have the option to decline. Not a bad place to be. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A warning to the techie who would follow my lead, especially nowadays; it was not easy. I lived out of pocket for about a year and it was scary. Don't attempt this unless you've planned for it carefully. I can't say don't try it at home though, since that's sort of the point. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Additionally, I was involved in a startup for a little over a year as an equity partner, Nabbr.com. But that's a tale for another post. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Regarding toys: I love the iPhone, have started with the Kindle, love Line 6 digital modeling equipment (love my guitars), am a Windows-to-Mac OSX convert (Vista...argh) and have always been a gamer, currently PC and PS3 (the Witcher and Dead Space are two of my recent favs). I'll be blogging about them as I go. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So there it is; another blog by another guy interested in technology, toys, music, and so on. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hmm...you know, I'm still not sure why I'm getting into this. I guess we'll see. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1527861195609149665-5039417906735214519?l=tcoztechwire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcoztechwire.blogspot.com/feeds/5039417906735214519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/about-tcoz-tech-n-toys-blog.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/5039417906735214519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1527861195609149665/posts/default/5039417906735214519'/><link rel='alternate' type='text/html' href='http://tcoztechwire.blogspot.com/2009/05/about-tcoz-tech-n-toys-blog.html' title='About the Tcoz Tech &apos;n Toys Blog'/><author><name>Tcoz</name><uri>http://www.blogger.com/profile/17434548501583589938</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Vi99xrTXzL0/SgRO38eaXvI/AAAAAAAAAAM/s6jJZVzmCG4/S220/n1343871834_9458.jpg'/></author><thr:total>0</thr:total></entry></feed>
