<?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-17704783</id><updated>2011-04-21T20:20:16.951-07:00</updated><category term='Adobe'/><category term='Flex'/><category term='Design'/><category term='iPhone'/><category term='Data Visualization'/><category term='Apple'/><category term='Component Development'/><category term='Degrafa'/><category term='Software Industry'/><category term='Dashboards'/><title type='text'>Form and Function</title><subtitle type='html'>Data Visualization, Immersive User Experiences, Adobe Flex, Processing and all other manner cool tech related topics that catch my fancy.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>43</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-17704783.post-2251478775751350345</id><published>2008-12-22T13:29:00.000-08:00</published><updated>2008-12-22T13:30:04.539-08:00</updated><title type='text'>US Trade Deficit Visualized</title><content type='html'>see post here: &lt;a href="http://www.twgonzalez.com/blog/?p=78"&gt;http://www.twgonzalez.com/blog/?p=78&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-2251478775751350345?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/2251478775751350345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=2251478775751350345' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/2251478775751350345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/2251478775751350345'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/12/us-trade-deficit-visualized.html' title='US Trade Deficit Visualized'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-1066839378794068900</id><published>2008-10-13T18:33:00.000-07:00</published><updated>2008-10-13T18:34:54.175-07:00</updated><title type='text'>360 Flex Data Visualization and Dashboard Preso</title><content type='html'>Adobe just released my Data Visualization and Dashboard Presentation from 360 Flex in San Jose.  You can see it here on my new blog:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.twgonzalez.com/blog/?p=59"&gt;http://www.twgonzalez.com/blog/?p=59&lt;/a&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/17704783-1066839378794068900?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/1066839378794068900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=1066839378794068900' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/1066839378794068900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/1066839378794068900'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/10/360-flex-data-visualization-and.html' title='360 Flex Data Visualization and Dashboard Preso'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-3977604842073533663</id><published>2008-09-19T19:03:00.000-07:00</published><updated>2008-09-19T19:07:18.596-07:00</updated><title type='text'>My Blog Has Moved</title><content type='html'>Well all, the time has come to move over to a blog tool that provides a little more customization, aka: Word Press.  I am sure these are not the words Google/Blogger want to hear, but alas it is so.  I have been very happy with my Blogger experience, but I need more control over my templates and the domain in general to provide a more unique blogging experience for myself and the few of you out there who actually read this stuff.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So without further ado:  &lt;a href="http://www.twgonzalez.com/blog/"&gt;www.twgonzalez.com/blog/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I will see you there.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Tom&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;p.s. I have moved all the posts and comments from this blog over to the new one.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-3977604842073533663?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/3977604842073533663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=3977604842073533663' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/3977604842073533663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/3977604842073533663'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/09/my-blog-has-moved.html' title='My Blog Has Moved'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-795566310467505884</id><published>2008-09-19T09:58:00.000-07:00</published><updated>2008-09-19T10:00:24.995-07:00</updated><title type='text'>iTunes Genius, Tricky like a Fox</title><content type='html'>&lt;div&gt;Well, thus far the iTunes "Genius" has quickly allowed me to fill some gaps in my music collection by finding some obscure tracks that I did not know existed without me having to lift a finger.   It was a win-win for me and Apple, I got to listen to some new cool music, and Apple got to take even more of my $$$.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But alas, the Genius ain't so smart.  On three separate occasions I have now purchased tracks that the Genius said I was missing, only to realize I actually owned the song.  It is a little hard to keep track of the thousands of songs I own in my head, and I have mistakenly trusted the Genius when it says I am missing those tracks.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The biggest benefit I see to Genius is that it is a time-saver and reduces the friction for me to find music that interests me and at the same time reduces the friction between my bank account and Apples ;).  But, if I have to go validate each Genius recommendation by doing a manual search (on the same song title) each time, it completely undermines the benefit and REALLY makes it for an annoying experience.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now I am stuck in the unenviable position of having to go figure out where I purchased music I already own and then struggle with the abysmal "refund"  UX in iTunes to get my money back.   So far, I have purchased about $30 of music via iTunes Genius, of which about $10 was music I already owned.  The cost for me to get my $10 back will easily be $100 of my time.   So not only did Apple abscond with my $10, they make the friction to get it back very high.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Way to go Apple, excellent customer experience.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-795566310467505884?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/795566310467505884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=795566310467505884' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/795566310467505884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/795566310467505884'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/09/itunes-genius-tricky-like-fox.html' title='iTunes Genius, Tricky like a Fox'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-1410492851799567781</id><published>2008-09-19T07:20:00.000-07:00</published><updated>2008-09-19T07:23:20.938-07:00</updated><title type='text'>360 Flex Feedback - Thanks Community</title><content type='html'>&lt;div&gt;I just got &lt;a href="http://www.360conferences.com/surveyresponses/?attendeeID=2917864"&gt;feedback&lt;/a&gt; from my &lt;a href="http://www.360conferences.com/360flex/"&gt;360 Flex&lt;/a&gt; session, and I must say it was very pleased to see how many people found the session valuable.  It is always very hard when preparing to present technical information to guess what people already know and what they want to learn.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I spent quite a bit of time polishing code and generating some new stuff that I could share with the community, and the reality is that if this were a billable engagement (the work required to prepare for my preso) it would have been a good size project.  So I was very gratified to see such positive feedback from the community.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have not done a lot of public speaking, and as such it is something I am trying to learn how to enjoy more and become more effective at.  One of the real challenges I find is how to be engaging and dynamic when discussing detailed technical information.  I tend to be more about "here are the facts" and less about "here I am to entertain you."  I think there is a happy medium somewhere in the middle that a speaker finds over time, this is something I am striving for.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I look forward to MAX, and even more so the next 360 Flex to have an opportunity to create even more engaging and valuable presentations that I can share with the community.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-1410492851799567781?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/1410492851799567781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=1410492851799567781' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/1410492851799567781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/1410492851799567781'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/09/360-flex-feedback-thanks-community.html' title='360 Flex Feedback - Thanks Community'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-8861551618958199592</id><published>2008-09-11T17:38:00.000-07:00</published><updated>2008-09-11T17:45:27.739-07:00</updated><title type='text'>A Few Processing Sketches</title><content type='html'>Here are a couple of sketches I was playing with today that were derivatives of the &lt;a href="http://form-function.blogspot.com/2008/08/processing-fireworks-show.html"&gt;Fireworks&lt;/a&gt; subsystem (okay lets be honest, the subsystem is less than 100 lines of code)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nhNEg19wGd0/SMm6cTXV_fI/AAAAAAAAAEM/ZHcnYYKwDW4/s1600-h/Picture+1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_nhNEg19wGd0/SMm6cTXV_fI/AAAAAAAAAEM/ZHcnYYKwDW4/s400/Picture+1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5244928236446940658" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nhNEg19wGd0/SMm7C6j9K2I/AAAAAAAAAEs/8y-ANORrXGo/s1600-h/Picture+2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_nhNEg19wGd0/SMm7C6j9K2I/AAAAAAAAAEs/8y-ANORrXGo/s400/Picture+2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5244928899803851618" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nhNEg19wGd0/SMm7DIG_peI/AAAAAAAAAE8/nms-2za6cKI/s1600-h/Picture+4.png" style="text-decoration: none;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;img style="text-decoration: underline;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; " src="http://3.bp.blogspot.com/_nhNEg19wGd0/SMm7DIG_peI/AAAAAAAAAE8/nms-2za6cKI/s400/Picture+4.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5244928903440475618" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nhNEg19wGd0/SMm7fHEoXMI/AAAAAAAAAFE/1nJ7ukiKqUI/s1600-h/Picture+5.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_nhNEg19wGd0/SMm7fHEoXMI/AAAAAAAAAFE/1nJ7ukiKqUI/s400/Picture+5.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5244929384198462658" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-8861551618958199592?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/8861551618958199592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=8861551618958199592' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/8861551618958199592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/8861551618958199592'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/09/few-processing-sketches.html' title='A Few Processing Sketches'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_nhNEg19wGd0/SMm6cTXV_fI/AAAAAAAAAEM/ZHcnYYKwDW4/s72-c/Picture+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-6976128340031682610</id><published>2008-09-10T08:26:00.001-07:00</published><updated>2008-09-10T09:47:39.514-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dashboards'/><category scheme='http://www.blogger.com/atom/ns#' term='Data Visualization'/><title type='text'>Which Data Visualization works Best?</title><content type='html'>&lt;div&gt;1) Heat Index Grid (click for full view)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a target="blank" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nhNEg19wGd0/SMfoLiG1NgI/AAAAAAAAADc/chAA99emFSQ/s1600-h/heatindex.png" style="text-decoration: none;"&gt;&lt;img style="text-decoration: underline;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; " src="http://1.bp.blogspot.com/_nhNEg19wGd0/SMfoLiG1NgI/AAAAAAAAADc/chAA99emFSQ/s400/heatindex.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5244415575927895554" /&gt;&lt;/a&gt;&lt;br /&gt;2) Micro Histogram  &lt;a target="blank" href="http://www.brightpointinc.com/flexdemos/ummicrochart.swf"&gt;(click for interactive version)&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" target="blank" href="http://3.bp.blogspot.com/_nhNEg19wGd0/SMfunSuwkZI/AAAAAAAAAEE/Ju4JeZvT5Wc/s1600-h/micro.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_nhNEg19wGd0/SMfunSuwkZI/AAAAAAAAAEE/Ju4JeZvT5Wc/s400/micro.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5244422649906499986" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;3) Punch Card Grid&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" target="blank" href="http://2.bp.blogspot.com/_nhNEg19wGd0/SMft8seegvI/AAAAAAAAAD0/LF6IPmviXZs/s1600-h/circle.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_nhNEg19wGd0/SMft8seegvI/AAAAAAAAAD0/LF6IPmviXZs/s400/circle.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5244421918083154674" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" target="blank" href="http://1.bp.blogspot.com/_nhNEg19wGd0/SMfpHj-91gI/AAAAAAAAADs/GfWcx7xXkME/s1600-h/circle.png"&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;Recently I was asked by Universal Mind if I would be interested in consulting for them on the User Experience and Data Visualization aspects of their ground-breaking geo-spatial product &lt;a href="http://www.spatialkey.com/"&gt;SpatialKey.&lt;/a&gt; I felt it was a great compliment and privilege to have such a well recognized and respected company in the RIA world ask for my input, and I was excited by the prospect of working with such people as &lt;a href="http://www.universalmind.com/#/about-us"&gt;Mike Connor&lt;/a&gt; (VP Business Development), &lt;a href="http://www.universalmind.com/#/about-us"&gt;Tom Link&lt;/a&gt; (CTO) and &lt;a href="http://www.dougmccune.com/blog/"&gt;Doug McCune&lt;/a&gt; (Flex Rockstar) and the many other talented people at UM. &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Whiile many of you in the Flex community probably have already heard about SpatialKey, for those of you who have not, definitely go check out their &lt;a href="http://www.spatialkey.com/spatialkey/technology-preview/technology-preview_home.cfm"&gt;technology preview&lt;/a&gt;. Basically, SpatialKey represents some really innovative work on showing high volume data sets as they relate to geo-coded data with visual interpolation techniques that far eclipse the standard pin-based metaphor found on most geo-spatial visualization tools.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;In that vein one of the tactical areas I was asked to look at is the effectiveness of certain types of visualizations for specific types of analysis. One of those areas was trying to plot crime incident data data by hour and day of week for a given 7 day period. From this discussion we came up with three alternative ways to visualize this data... one existed currrently within the system, one I created based on the visualization problem as i saw it, and one was found by surfing the web. One of the challenges in doing Data Viz work, is the more work you do in the field the more unique visualizations you create the stronger your preference for certain visual patterns becomes, thus creating a bias in what seems most effective for you.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;While I believe I have scientific reasons to explain why I think one of the visualizations above is more effective than others, it comes down to what casual users find most intuitive. To that end, I would be greatly appreciative for any readers to vote on the visualization they feel is most compelling to solve the analysis problem of spotting trends and subtle differences in numeric counts (arrests) as plotted hour-by-hour for a seven day period. While we are interviewing real users in the SpatialKey target market, getting feedback from the Flex community is just as valuable. Just use the comments section to vote for 1 (heat index grid), 2 (micro histogram), or 3 (punch card). (Pics 1 &amp;amp; 2 show the same data, Pic 3 is a different data set, which I realize make the comparison a little harder, but hopefully still valid.)&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: center;"&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/17704783-6976128340031682610?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/6976128340031682610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=6976128340031682610' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/6976128340031682610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/6976128340031682610'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/09/which-data-visualization-works-best.html' title='Which Data Visualization works Best?'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_nhNEg19wGd0/SMfoLiG1NgI/AAAAAAAAADc/chAA99emFSQ/s72-c/heatindex.png' height='72' width='72'/><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-4224216556516261741</id><published>2008-08-29T19:37:00.000-07:00</published><updated>2008-08-29T21:40:55.467-07:00</updated><title type='text'>Processing - A Fireworks Show</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nhNEg19wGd0/SLi0iudhWCI/AAAAAAAAADU/vTcJkRc0vNM/s1600-h/pastedGraphic.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_nhNEg19wGd0/SLi0iudhWCI/AAAAAAAAADU/vTcJkRc0vNM/s400/pastedGraphic.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5240136675125975074" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;This is my first &lt;a href="http://www.brightpointinc.com/processing/fireworks/index.html"&gt;attempt&lt;/a&gt; at creating something in Processing which I started to work with a few days ago.  Originally my goal was to create a fireworks show that resembled what I saw this 4th of July on the Mall in Washington DC, with my wife, two boys, and my sisters family.  I had fond memories of that trip and was hoping to re-create it in some artwork.  I am not sure this qualifies as artwork, but when my three year old came into my office, saw this running and instantly exclaimed "Fireworks Daddy!  Auntie Kim!" I knew I had reached a modicum of success.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With Processing you can very rapidly iterate and experiment with sketches, this version is about my 5th iteration, after experimenting with some Handel (Classical) I settled on Radiohead (my favorite band.)  Each iteration had its own unique appeal, and some things happened quite by accident.  For instance the circles that form and shoot off were a result of tweaking one number by .01.  I continue to be impressed with the power of processing, and I will probably see if something similar can be done in Flash.   &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I am also using this work to serve as partial inspiration for what I am doing within Degrafa and with the Flash Player.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You will need the java runtime installed and the appropriate security permissions to view this, also please be patient when it launches as it is loading up a 4mb song.    &lt;a href="http://www.brightpointinc.com/processing/fireworks/index.html"&gt;Click here to view.&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-4224216556516261741?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/4224216556516261741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=4224216556516261741' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/4224216556516261741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/4224216556516261741'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/08/processing-fireworks-show.html' title='Processing - A Fireworks Show'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_nhNEg19wGd0/SLi0iudhWCI/AAAAAAAAADU/vTcJkRc0vNM/s72-c/pastedGraphic.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-6758851839782008296</id><published>2008-08-27T15:31:00.000-07:00</published><updated>2008-08-27T16:22:20.115-07:00</updated><title type='text'>Chart Slicer Component Released</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nhNEg19wGd0/SLXZFlMCN3I/AAAAAAAAADE/-w7WtWJ7DOU/s1600-h/Picture+4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_nhNEg19wGd0/SLXZFlMCN3I/AAAAAAAAADE/-w7WtWJ7DOU/s400/Picture+4.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5239332431420602226" /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Today I am releasing a &lt;a href="http://www.brightpointinc.com/flexdemos/chartslicer/chartslicersample.html"&gt;chart slicer&lt;/a&gt; component that behaves like the one seen on &lt;a href="http://finance.google.com/finance?q=INDEXDJX:.DJI%20INDEXNASDAQ:.IXIC%20INDEXSP:.INX"&gt;Google Finance&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I had several requests for the source code for my Google Finance &lt;a href="http://www.brightpointinc.com/flexdemos/googlefinance.html"&gt;sample&lt;/a&gt;, but regretfully the code is embarrassingly sloppy, and I am not sure when I will be getting back to cleaning it up.  One of the components within that example is this chart slicer control, which I have now created a simple example for, with source code included.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This control can target any Flex cartesian chart, although I have only tested it with a few, so I am sure people will find edge cases (or perhaps not so edge cases) that break the component.   It is easy enough to change the display in the control from an area chart to any of the MicroCharts included with a little customization.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This component has a liberal use of &lt;a href="http://www.degrafa.com"&gt;Degrafa&lt;/a&gt; to make all the magic work, from custom skins on the sliders, to the microcharts used to represent the data, to the tick marks within the slider track the reference the positioning of the items in the target chart.  You will also notice some extra logic that has the sliders snap into alignment with the actual item renderers of the target chart.   With larger data sets this is less noticeable, but with small ones it is very effective.   &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Many thanks to &lt;a href="http://www.dougmccune.com/blog/"&gt;Doug McCune&lt;/a&gt; for his HSlider control, and the efforts put forth by &lt;a href="http://www.meutzner.com/blog/index.cfm/Flex-Charting"&gt;Brandon Meutzner&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can see the example and download the code &lt;a href="http://www.brightpointinc.com/flexdemos/chartslicer/chartslicersample.html"&gt;here.&lt;/a&gt;   As usual all code is released under an MIT license.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-6758851839782008296?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/6758851839782008296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=6758851839782008296' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/6758851839782008296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/6758851839782008296'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/08/chart-slicer-component-released.html' title='Chart Slicer Component Released'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nhNEg19wGd0/SLXZFlMCN3I/AAAAAAAAADE/-w7WtWJ7DOU/s72-c/Picture+4.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-6095104324074758814</id><published>2008-08-23T12:59:00.000-07:00</published><updated>2008-08-23T13:27:13.406-07:00</updated><title type='text'>Processing is Amazing</title><content type='html'>&lt;span style="text-align:center; display: block;"&gt;&lt;br /&gt;&lt;object type="application/x-shockwave-flash" width="400" height="300" data="http://www.vimeo.com/moogaloop.swf?clip_id=1511115&amp;amp;server=www.vimeo.com&amp;amp;fullscreen=1&amp;amp;show_title=1&amp;amp;show_byline=0&amp;amp;show_portrait=0&amp;amp;color=01AAEA"&gt;&lt;br /&gt;&lt;param name="quality" value="best"&gt;&lt;br /&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;br /&gt;&lt;param name="scale" value="showAll"&gt;&lt;br /&gt;&lt;param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=1511115&amp;amp;server=www.vimeo.com&amp;amp;fullscreen=1&amp;amp;show_title=1&amp;amp;show_byline=0&amp;amp;show_portrait=0&amp;amp;color=01AAEA"&gt;&lt;br /&gt;&lt;/object&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I recently discovered &lt;a href="http://processing.org/"&gt;Processing&lt;/a&gt;, and I am still in awe of what can be created with it.   For those of you not familiar with Processing, it is a c syntax (pretty much java) language created at MIT's multi-media center designed to be used by artists and non-programmers to create visual/animated/physical works of art.   The &lt;a href="http://processing.org/learning/books/"&gt;primer&lt;/a&gt; written by two of Processing's creators walks a person with no prior programming experience through learning to program.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As someone who has been programming since I was 10 years old and close to 30 years now, I found their approach so simple, powerful, and very approachable.   Probably even more valuable to me was the plethora of examples that come with the simple IDE.   Full particle and physics systems encompassed in less than 100 lines of code!  OpenGL support, texture, uvt mapping, typography, and the list goes on.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I see some of what has been accomplished with Processing as the inspiration of what I think will be possible with &lt;a href="http://www.degrafa.com/"&gt;Degrafa&lt;/a&gt;, and I look forward to seeing how far I can push the boundaries of what is possible in Flex/Flash by adopting similar constructs within Degrafa.  The interesting twist Degrafa will bring is that we may be able to step away from procedural abstracts and work directly with declarative ones.   &lt;a href="http://samples.degrafa.com/"&gt;Degrafa repeaters&lt;/a&gt; is one example of how this might manifest.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The animation at the top of this entry was created by &lt;a href="http://www.butterfly.ie/"&gt;Glenn Marshall&lt;/a&gt;, who just started working with Processing, but obviously has an incredible amount of artistic talent.   What I find just mind blowing is that the animation he created is all done procedurally using sin/cos, looping, recursion and math.   There was no use of After Effects, 3DS, or any other tool that translates analog inputs (hand drawing) into something digital, this is purely abstract programming - which just adds a sublime level of beauty to the finished work.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note: Watch the video in its entirety it gets better, and better, and better ....&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/17704783-6095104324074758814?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/6095104324074758814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=6095104324074758814' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/6095104324074758814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/6095104324074758814'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/08/processing-is-amazing.html' title='Processing is Amazing'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-6721301173283365992</id><published>2008-08-16T11:08:00.000-07:00</published><updated>2008-08-19T20:26:30.858-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dashboards'/><category scheme='http://www.blogger.com/atom/ns#' term='Data Visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='Component Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>360 Flex Data Visualization Code Examples</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nhNEg19wGd0/SKcZP9EvDmI/AAAAAAAAAC8/Qh8YSaIzFs8/s1600-h/pastedGraphic.png"&gt;&lt;/a&gt;This is a pretty short post that I wanted to get out to the community.  Below are the links and source code (view source) for the presentation I gave today at 360 Flex in San Jose. &lt;br /&gt;&lt;br /&gt;GoogleFinance Example: (view source coming soon, still needs some refactoring and clean up.)&lt;div&gt;&lt;a href="http://www.brightpointinc.com/flexdemos/googlefinance.html"&gt;http://www.brightpointinc.com/flexdemos/googlefinance.html&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nhNEg19wGd0/SKcY8WuUUPI/AAAAAAAAAC0/JAXUS0QM9m0/s1600-h/pastedGraphic.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_nhNEg19wGd0/SKcY8WuUUPI/AAAAAAAAAC0/JAXUS0QM9m0/s400/pastedGraphic.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5235180517012558066" /&gt;&lt;/a&gt;&lt;br /&gt;DataSet Example: &lt;/div&gt;&lt;div&gt;&lt;a href="http://www.brightpointinc.com/flexdemos/360flex/DataSetExample.html"&gt;http://www.brightpointinc.com/flexdemos/360flex/DataSetExample.html&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_nhNEg19wGd0/SKcYr1RD2gI/AAAAAAAAACs/YunyHf1fXnI/s400/pastedGraphic.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5235180233153567234" /&gt;&lt;/div&gt;&lt;div&gt;Interactivity Example: &lt;a href="http://www.brightpointinc.com/flexdemos/360flex/InteractivityExample.html"&gt;http://www.brightpointinc.com/flexdemos/360flex/InteractivityExample.html&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_nhNEg19wGd0/SKcYQU2oAXI/AAAAAAAAACk/-H2KAQ-g8zk/s400/pastedGraphic.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5235179760596287858" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;MicroChart Example: &lt;a href="http://www.brightpointinc.com/flexdemos/360flex/MicroChartsSample.html"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.brightpointinc.com/flexdemos/360flex/MicroChartsSample.html"&gt;http://www.brightpointinc.com/flexdemos/360flex/MicroChartsSample.html&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); "&gt;&lt;img src="http://4.bp.blogspot.com/_nhNEg19wGd0/SKcZP9EvDmI/AAAAAAAAAC8/Qh8YSaIzFs8/s400/pastedGraphic.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5235180853724647010" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; " /&gt;&lt;/span&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/17704783-6721301173283365992?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/6721301173283365992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=6721301173283365992' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/6721301173283365992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/6721301173283365992'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/08/360-flex-data-visualization-code.html' title='360 Flex Data Visualization Code Examples'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_nhNEg19wGd0/SKcY8WuUUPI/AAAAAAAAAC0/JAXUS0QM9m0/s72-c/pastedGraphic.png' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-444982468693465368</id><published>2008-07-28T20:04:00.001-07:00</published><updated>2008-12-11T14:16:07.985-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Data Visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='Component Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Gauge Component - New Features - v04</title><content type='html'>&lt;a href="http://www.brightpointinc.com/flexdemos/gauge_v04/gauge_v04.html"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_nhNEg19wGd0/SI6JujkArcI/AAAAAAAAACc/yIr2lL1Y0yE/s400/Picture+5.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5228267650336992706" /&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First a thanks to everyone who has commented and used the previous versions of the gauge component seen here.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A few weeks ago a publicly traded company (that has asked to remain anonymous) hired me to make some improvements to the gauge to meet some of their specific needs.  Some of the improvements are things that other people had asked for, so I offered to give them a discounted rate if we could keep the improvements under the original open source license.   It was more important to me that I be able to share the enhancements with the community than the additional revenue I would have generated to lock up the intellectual property.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So here is a list of the latest enhancements.&lt;/div&gt;&lt;div&gt;1. Bounce Effect can now be set on/off by a boolean useBounceEffect. (code changes in control.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. Tick Mark Alignment Fixed - Tick marks for the gauge skin now use a best fit algorithm to align exactly with the min/max angles (before they sometimes would not cover the full range. (code changes in skin)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. A X-Offset style has been provided for the value label placement (code changes in skin and control)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4. Alert Levels: A popular request was the addition of alert levels, something that I had in the original gauge I built.  The gauge now supports contiguous alert levels by passing it an array of alertValues, alertColors, and alertAlphas.   The control expects that the alertColors and alertAlphas will have one element less than the alertValues, since the alertValues contains the additional min or max boundary element, and the colors/alphas apply to the range within the boundary described by the alertValue array. (code changes in skin and control)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5. Log AND Linear scale: This was by far the most complex enhancement.  The gauge now supports movement through a log scale as well as the original linear scale, and since my math skills seem to be stuck somewhere between 8th grade trig and 9th grade algebra it took me a while to figure out the algorithm to support not only programatic value assignments, but also when a user clicks along the  and sets the value directly - yes now I remember that, Math.pow(10,value) is the inverse of Math.log(value)/Math.LN10 :)   This log scale also gets applied with the alert ranges, and the skin leverages the now public caclulateAngleFromValue() function exposed by the control itself - which takes into account the min/max value range, the min/max angle range, AND the linear or log scale. (code changes in control)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have tried my best to run it through a bunch of tests and ferret out any bugs, but if anyone finds something I missed please post and comment, and I will try my best to fix or point you in the right direction.  Once again this code is posted under the every friendly MIT license.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Check out the sample&lt;a href="http://www.brightpointinc.com/flexdemos/gauge_v04/gauge_v04.html"&gt; here, with full source code&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Note:  This gauge uses the latest version of Degrafa Beta 3, please reference the included .swc - as older versions of degrafa will cause conflicts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-444982468693465368?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/444982468693465368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=444982468693465368' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/444982468693465368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/444982468693465368'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/07/gauge-component-new-features-v04.html' title='Gauge Component - New Features - v04'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_nhNEg19wGd0/SI6JujkArcI/AAAAAAAAACc/yIr2lL1Y0yE/s72-c/Picture+5.png' height='72' width='72'/><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-6803086748875152042</id><published>2008-07-23T17:36:00.000-07:00</published><updated>2008-12-11T14:16:08.290-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>Apple Numbers - More than a spreadsheet</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nhNEg19wGd0/SIfO3h2dmhI/AAAAAAAAACM/GtL7mv0jgrg/s1600-h/Picture+3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_nhNEg19wGd0/SIfO3h2dmhI/AAAAAAAAACM/GtL7mv0jgrg/s400/Picture+3.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5226373345961679378" /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For any designers or UX people out there, I don't know about you, but I have yet to find a wire-framing tool/software that beats a whiteboard or sketch-pad, but I think I have found something that comes pretty close.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Making wireframes is an essential part of the design process (at least for me) that allows me to quickly brainstorm layouts and different configurations for an overall application or dashboard UI.  Most illustration tools that I am familar with (like Illustrator or Flash Pro) are just too cumbersome and have way too many settings/details that are completely irrelevant to the wireframing process.  Tools like Visio (which I just can't stand) and SmartDraw come a little closer, but they have all sorts of awkward UI issues that at best, slow down the creative process and in some cases completely hinder it due to the way they expect you to create content.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, after many years, I think I have found a very good tool to make my wire frames in, and ironically the software was never explicitly designed to make drawings.  What I am referring to is Apple's Numbers - the supposed Excel replacement.  Well, as a replacement for Excel it doesn't even come close - for doing any type of semi-sophisticated numeric modeling it just doesn't cut it.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But, as a very easy to use, quick and easy, creative wireframe tool it is superb.  It has all the basic shapes I could ask for, sans all the detailed property controls that make things tedious in most other tools.  The inspector panel allows me to create sophisticated gradients, fills, strokes and best of all, it has auto-align/snapping capabilities built right into its WYSIWYG interface.  Most of my wire-frames are some form of nested rectangles, and this tool just lends itself to the task beautifully.  Because of the way they designed numbers, it is a layout tool first, and and a spreadsheet second.  So you don't even need to have a worksheet at all, you can just have a blank canvas and start dropping images, shapes, text, etc.   Add the fact that you have an automatic export to PDF and it makes it ideal for delivering to clients and end-users.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For me it has been very liberating, and one of the first times I felt a software tool actually accelerated my productivity for doing this type of work, versus just being a tedious step I needed to do to translate my whiteboard/paper sketches. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyone running on OS X and doing any type of wire-framing work should give it a try, I would be curious what other designers think.&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/17704783-6803086748875152042?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/6803086748875152042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=6803086748875152042' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/6803086748875152042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/6803086748875152042'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/07/apple-numbers-more-than-spreadsheet.html' title='Apple Numbers - More than a spreadsheet'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_nhNEg19wGd0/SIfO3h2dmhI/AAAAAAAAACM/GtL7mv0jgrg/s72-c/Picture+3.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-5787474036346553440</id><published>2008-07-11T10:22:00.000-07:00</published><updated>2008-07-23T17:40:06.584-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Data Visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='Adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>I will be speaking at MAX 2008</title><content type='html'>&lt;img src="http://max.adobe.com/adobemax2008content/images/MAX08_B125x125_speaker.jpg" width="125" height="125" longdesc="http://www.adobe.com/go/maxexplorer" /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Well, it looks like it is official.  I will be speaking at MAX 2008 this year on Data Visualization with Flex.  I am still working out the final details of the presentation.  When I spoke on the same topic in 2006, I did a detailed walkthrough of building a dashboard.  This year, I think I will change it up a bit and more do some highlights of what is possible with little code tidbits and how-to's.  I think this might appeal to a wider audience (and potentially shorter attention spans since my session is going to be at 3:30 on Wednesday November 19th, the last day.)&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;I would love to get some feedback from the community as to what level to target the session.  Should I stick with beginner level material (i.e. here are all the available components and what they do, or go to a more intermediate advanced level?)   Any comments very welcomed, as I still have a couple of weeks to flush out the preso.&lt;/div&gt;&lt;div style="text-align: left;"&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/17704783-5787474036346553440?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/5787474036346553440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=5787474036346553440' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/5787474036346553440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/5787474036346553440'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/07/i-will-be-speaking-at-max-2008.html' title='I will be speaking at MAX 2008'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-484081737873335005</id><published>2008-06-20T17:52:00.000-07:00</published><updated>2008-12-11T14:16:08.508-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flash Player Bug - Stroking a Corner</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nhNEg19wGd0/SFxSChZ4e_I/AAAAAAAAACE/D4BaHuXNbII/s1600-h/Picture+5.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_nhNEg19wGd0/SFxSChZ4e_I/AAAAAAAAACE/D4BaHuXNbII/s400/Picture+5.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5214132671868337138" /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It appears there is a known bug in the Flash Player that creates rendering artifacts and uneven results when trying to apply strokes to a corner radius.  Let me outline the situation by having you look at the attached image with three separate rectangles and the associated code for each.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So for the left rectangle we used the code below, and one would expect a nice pretty red rectangle with a smooth black stroke and 6 pixel corner radius, but what we get is a rectangle with 4 uneven corner and these weird rendering artifacts which extend beyond the boundary of the shape.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);"&gt;//Left Rectangle&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;graphics.lineStyle(1,0,1,false);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;graphics.beginFill(0xFF0000,1);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;graphics.drawRoundRectComplex(10,10,100,30,6,6,6,6)&lt;/span&gt;&lt;/span&gt;;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For the middle rectangle we set the "pixelHinting" property of the lineStyle to true, and this seems to remove the funky artifacts, but still leaves the different radius on the corners.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);"&gt;//Middle Rectangle&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;graphics.lineStyle(1,0,1,true);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;graphics.drawRoundRectComplex(150,10,100,30,6,6,6,6);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;graphics.endFill();&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For the right most rectangle it appears we have it drawn correctly, but we were only able to do this by NOT using any line style at all, and instead having to create two rectangles with one nested inside the other.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);"&gt;//Right Rectangle Outer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;graphics.lineStyle(0,0,0,false);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;graphics.beginFill(0,1);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;graphics.drawRoundRectComplex(300,10,100,30,6,6,6,6);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;graphics.endFill();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);"&gt;//Right Rectangle Inner&lt;/span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;graphics.beginFill(0xFFFFFF,1);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;graphics.drawRoundRectComplex(301,11,98,28,5,5,5,5);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;graphics.endFill();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So it is obvious to me that the Player is capable of rending this correctly, but it does NOT.  I am not sure if the cause is in some type of sub-pixel interpolation algorithm, or it lies within the "curveTo" code for line strokes where the player might be using some type of cubicBezier algorithm and the control points are too close together to get an accurate curve.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It appears that the Flex team is aware of this issue and thus renders all of its "cornerRadius" borders by applying the same technique I am using above by doing two separate compexRectangle fills.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So apparently Adobe is well aware of this issue, and from what I understand, through unnamed sources, this isn't even on the radar for the next major release (Flash Player 10.)  I think is a real shame since I believe it really undermines the quality of what can be produced with Flash when you want a high level of detail and your are forced to take a bunch of unnecessary hacks to work around it.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-484081737873335005?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/484081737873335005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=484081737873335005' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/484081737873335005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/484081737873335005'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/06/flash-player-bug-stroking-corner.html' title='Flash Player Bug - Stroking a Corner'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_nhNEg19wGd0/SFxSChZ4e_I/AAAAAAAAACE/D4BaHuXNbII/s72-c/Picture+5.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-7346560604451171107</id><published>2008-06-17T15:15:00.001-07:00</published><updated>2008-06-20T18:01:54.064-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Industry'/><title type='text'>What is wrong with the Business Intelligence Industry?</title><content type='html'>I just returned from a great summit meeting for BI hosted by &lt;a href="http://www.dashboardinsight.com/"&gt;Dashboard Insight&lt;/a&gt;, where I sat on a panel with other industry experts.  It was a small group of about a dozen of us, and it was a great two day meeting.  It was fantastic to have an opportunity to talk with other people who work with the same issues I face every day while working on BI stuff.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I was a bit concerned attending the event that I would not see eye-to-eye with some of these other experts, since I hold a relatively contrarian view when it comes to designing dashboard solutions.  I believe that ALL business intelligence systems need to be designed from the top (user) down, versus the bottom (data) up.   Pretty much all big BI vendors and industry experts have been preaching the bottom-up mantra for the past 20 years. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the flight back from the summit I wrote an article that (hopefully) more clearly articulates my position and the logic behind it.  You can read it &lt;a href="http://www.brightpointinc.com/Articles.asp?File=The%20Future%20of%20BI.htm"&gt;here.&lt;/a&gt;   In a nutshell I basically state that Big BI and current industry experts have a strong financial interest in not rocking the status quo, and are in fact hindering the efficacy of the very solutions they purport to be advancing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By any objective measure, BI is long way away from reaching its potential, especially in the eyes of business users and organizations who have implemented seven figure BI solutions.  My thesis is that because BI has its history rooted in the collection, transformation, aggregation and dissemination of data that the lions share of focus on any BI project revolves around the data and the not the end user.   Reports and dashboards end up being after-thoughts at the end of big BI initiatives.     &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The BI industry has created its wealth through the selling of these solutions and expertise and insist they are needed to provide an effective BI solution.   In my experience this is absolutely NOT the case.  You can create a very effective dashboard solution with a very minimal BI infrastructure, although in some cases having a robust BI back end is definitely going to make things easier.   As I mention in my article the BI leaders have painted themselves into a corner because even if they recognize the back end is not the place to start, they would end up undermining their primary revenue streams (not to mention customer confidence) if they openly acknowledged this state of affairs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What I suppose will begin happening, is that more and more start up companies will start to address this schism and we will see a slow movement to more user-centric BI solutions that focus on business and user requirements with online tools that allow integration of distributed and heterogenous data.  At the same time I still see a very valid place for traditional BI, as there are still thousands of companies with vast stores of transactional data that needs to be collected, processed, and aggregated into common structures that can be used to help feed the user-centric BI solutions.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-7346560604451171107?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/7346560604451171107/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=7346560604451171107' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/7346560604451171107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/7346560604451171107'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/06/what-is-wrong-with-business.html' title='What is wrong with the Business Intelligence Industry?'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-8011188935794615943</id><published>2008-06-16T17:22:00.001-07:00</published><updated>2008-12-11T14:16:08.893-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Component Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Degrafa'/><title type='text'>New Degrafa Repeaters</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nhNEg19wGd0/SFcE6FY1B-I/AAAAAAAAAB8/_hepmNJb7bE/s1600-h/Picture+1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_nhNEg19wGd0/SFcE6FY1B-I/AAAAAAAAAB8/_hepmNJb7bE/s400/Picture+1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5212640489629878242" /&gt;&lt;/a&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://www.brightpointinc.com/flexdemos/repeaterexample/degrafarepeaterexample.html"&gt;Sample Code Here&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the first areas of Degrafa I started working on was a revamp of the current Repeater objects.  Jason had some cool ideas on what we could do to make repeaters more concise, flexible, and powerful.   After a couple of IM chats I had a reasonably good idea of what we wanted to accomplish and I rolled up my sleeves to see what I could do.   You can see the most current rev in our &lt;a href="https://degrafa.googlecode.com/svn/branches/Origin/Degrafa/"&gt;Dev branch at Google Code&lt;/a&gt;, although I suspect we will end up cleaning up some of the name spacing and move the new GeometryRepeater class somewhere else.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the challenges the current Degrafa Beta 2 suffers from is that we have a myriad of specific geometry repeater classes like Line, Circle, Rectangle, etc...    Not only does this clutter up our core class libraries, but it is also much less flexible than it can be.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The new architecture we are developing takes a different approach, instead of creating gemoetry specific repeater classes we wanted to create an abstract repeater engine.   This is accomplished through our GeometryRepeater class which inherits from Geometry and implements the IRepeaterModifier interface via its modifiers array.  Okay, so what does this all mean?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1.  You define the geometry you want repeated with any number of Degrafa geometry objects, which can be separate objects or complex compositions.   You are no longer limited to the current repeater classes, but can easily repeat ANY Degrafa geometry you create.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. You define HOW the geometry repeats via one or more IRepeaterModifiers.   Initially we have created a PropertyModifier that allows you to target one or more geometry objects within your GeometryRepeater and an associated property you want to modify.  You can have as many RepeaterModifiers as you want to create composited repetitions.  Over time we may add additional core modifiers, or you can create your own by implementing the IRepeaterModifier interface.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Below you can see how one might implement a Circle repeater that repeats along a horizontal Axis:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;GeometryRepeater&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;Circle radius="30" centerX="10" centerY="10)"/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;modifiers&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;PropertyModifier property="centerX" offset="10" offsetOperator="add"/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/modifiers&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;/GeometryRepeater&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For a more complex example you can check out this demo that has view source enabled.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When you look at the demo you will see a simple circle geometry that is being repeated 30 times with multiple property modifiers being applied to it.  If you look at the code there are some interesting things to note here about the PropertyModifier class.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1.  We support targeting common properties across multiple targets via just one repeater like are doing here with the myCircle and myRect in the targets properties.  We also support not only direct object properties, but also descendent properties via a dot notation (look at the property="fill.alpha") setting for example:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;PropertyModifier targets="{[myCircle,myRect]}" property="fill.alpha" offset=".01" offsetOperator="add"/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. We support built in static operators as well as offset functions.&lt;/div&gt;&lt;div&gt;Not only can you provide static offset amounts (as in the example above) with fixed operators like add, subtract, or none you can also provide offsets as an array that will behave like a modulo function against the iteration number as in the radius modifier below.   Additionally you can also provide offsets as dynamic functions as in the fill.color modifier that uses the custom colorOffset function found in the sample source files.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;PropertyModifier targets="{[myCircle]}" property="radius" offset="[5,4,3,2,-2,-3,-4,-5]" offsetOperator="add"/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;PropertyModifier targets="{[myCircle,myRect]}" property="fill.color" offset="{colorOffset}" offsetOperator="add"/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are many more advanced features, but I will wait until we have pinned down the exact functionality for our Beta 3 release before delving into it further.  Please check out the sample, and use view source to get an idea of what is possible.&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/17704783-8011188935794615943?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/8011188935794615943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=8011188935794615943' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/8011188935794615943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/8011188935794615943'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/06/new-degrafa-repeaters.html' title='New Degrafa Repeaters'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_nhNEg19wGd0/SFcE6FY1B-I/AAAAAAAAAB8/_hepmNJb7bE/s72-c/Picture+1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-4787109354806585753</id><published>2008-06-09T20:52:00.000-07:00</published><updated>2008-06-15T20:32:25.629-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Degrafa'/><title type='text'>Officially Working on Degrafa Team</title><content type='html'>&lt;div&gt;Over the past couple of months I have become more deeply involved in the open source &lt;a href="http://www.degrafa.com/"&gt;Degrafa&lt;/a&gt; project that was started by &lt;a href="http://scalenine.com/blog/"&gt;Juan Sanchez&lt;/a&gt; and &lt;a href="http://www.degrafa.com/team/"&gt;Jason Hawryluk&lt;/a&gt; over 1 year ago.   Today the Degrafa team has grown quite substantially and I represent the 8th official team member.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There were three primary motivations for me joining the Degrafa team.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Reason 1.  Degrafa just plain ROCKS! &lt;/span&gt; &lt;/div&gt;&lt;div&gt;What I love most about Degrafa is that it represents an extremely expressive, yet compact markup syntax to produce amazing graphical assets.  Basically it allows me to do some really cool things with very little code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Degrafa leverages the low level flash drawing API's to implement sophisticated vector and raster rendering via MXML markup.   What does this mean to your average Flex developer?  It means that you no longer have to resort to working in Flash or other vector based tools to create complex vector assets, and you no longer have to struggle with using procedural API's to manually draw your graphics.   Degrafa piggy-backs off of the same metaphors that most XML based markup syntax does, in that the nested XML structures you use to define your page layout create a visual corollary to the actual physical layout of the code.   With XML markup you can easily see the primary relationships between objects due to their nesting structures.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When you combine XML Markup with Flash/Flex's powerful binding mechanism you get a very expressive, compact, and intuitive way to code graphical assets.     One example of this effect in action can be seen in some of the GeometryRepeater code I have been working on for Degrafa (to be covered in a later blog post.)  I was able to take a couple very simple base classes and in less than 15 lines of MXML and 10 lines of AS create a completely dynamic single series Column/Area/Point/Line chart.   That is 25 lines of total code, that is what I call powerful!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Reason 2.  I wanted to give back.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;When I started working with Flex in late 2005, I had never been directly exposed to the open source community and always regarded the open source movement with a detached fascination and certain level of disbelief that so many developers would volunteer their time for an apparently non-commercial effort.  Over the past couple of years, my eyes have been opened to the many advantages to open source on commercial, personal, and social level.   In learning Flex and watching the growth of the community I have repeatedly reaped the benefits of others efforts in many areas ranging from free (and excellent) components, blogs, and sharing of ideas.  &lt;/div&gt;&lt;div&gt;I think an individual can only "take" for so long before starting to feel an indebtedness and desire to give back to the community.  Probably most of all is the great level of personal satisfaction I receive when I contribute something to the community that others find great value in.   I probably receive more satisfaction from releasing a component I spent time working on and seeing many people positively respond to it in my blog than I do from landing a large consulting contract.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Reason 3.  Team Culture.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Both Jason and Juan (the two founders of degrafa) are so genuinely enthusiastic about the project and immanently accessible.  When I dove into Degrafa for the first time a couple of months back for work on my Gauge component I started trading e-mails with Juan, which quickly led to multiple chat sessions per day.  Juan was always available to answer questions and point me in the right direction, and then he connected me with Jason, who was equally accessible and helpful.   Once I started working with Jason and he showed me the guts of Degrafa I realized "wow, these are some truly bright people, creating a really amazing framework."  I was hooked.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Moving forward my role at Degrafa will probably have many facets, but I will most likely be focusing as a direct contributor to the core engine as well as helping to provide  some organizational support for Degrafa as an entity and open source project.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-4787109354806585753?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/4787109354806585753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=4787109354806585753' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/4787109354806585753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/4787109354806585753'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/06/officially-working-on-degrafa-team.html' title='Officially Working on Degrafa Team'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-6320194671859065634</id><published>2008-06-09T16:25:00.000-07:00</published><updated>2008-06-15T20:31:17.867-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><title type='text'>3G iPhone appears to be thicker not thinner.</title><content type='html'>Is it me, or Apple?  The recently (a few hours ago) announced 3G iPhone was stated to be thinner version of the current model.  But a close look at the tech specs on the Apple store site indicate that it is actually .48 inches (12.3mm) thick while the previous version was only .46 (11.6mm) thick.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The difference in the new iPhone design is that the edges appear to be more sculpted like a Mac Book Air, thus the phone probably "feels" thinner, when in reality it is thicker.&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;img src="http://images.apple.com/iphone/images/specs_dimensions20080609.jpg" alt="" width="260" height="264" /&gt;&lt;img src="http://images.apple.com/iphone/images/specs_connectors20080609.jpg" alt="" width="260" height="128" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-6320194671859065634?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/6320194671859065634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=6320194671859065634' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/6320194671859065634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/6320194671859065634'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/06/3g-iphone-appears-to-be-thicker-not.html' title='3G iPhone appears to be thicker not thinner.'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-5878158197786088401</id><published>2008-05-08T18:57:00.000-07:00</published><updated>2008-07-18T10:08:50.757-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex is MORE than just a pretty front-end</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the most powerful aspects of using Flex is not necessarily the language or IDE itself, but the design patterns that the combination of Flex and the Flash Player allow you as an software architect to implement.  For developers who are used to building large scale web applications, the traditional approach is to use some version of an n-tier architecture where your platform consists of a data persistence layer (fault tolerant DB's), web application layer such as .Net, Java, ColdFusion, etc (to maintain session state for stateless HTTP and enforce business logic), and your presentation layer  (HTML, Javascript, Flash, etc..)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is a topic that I have been thinking about quite a bit over the last couple of years since I started using flex, and the more I work with Flex the more I stand behind the conviction that packages like Flex/Flash offer us a new paradigm for web application development.  I realize this is a long post, but my hope is that others out there in reading this post will start to think about web application development in a new light and realize there is potentially a more powerful (and enjoyable) way to design web applications.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The traditional n-tier approach, while tried and true (and an architecture that I have implemented in more solutions than I care to remember) has several shortcomings that are primarily related to the limitations of web technologies at the time the n-tier approach came into vogue almost 10 years ago.  Below I list four fundamental shortcomings with this approach, although I am sure there are several more.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Shortcoming 1 - Multiple Languages/Environments:  &lt;/div&gt;&lt;div&gt;Taking this layered approach to building applications, requires the developer to code in several languages across several tiers and IDE's. Even in the most simplistic web application, the developer is going to have to be writing and debugging  some type of SQL via one IDE, then working on some application tier code with something like Java or .NET, and finally writing their presentation layer with some HTML/Javascript or Ajax Library.  All said, the developer is going to have to be pretty efficient at knowing at least 3-4 completely different languages as well as their associated tooling, or even worse, have to distribute that work across multiple team members.  Then, when it comes time to debug the application, even in the most integrated of environments, the developer will be debugging through several different debuggers, trying to track data structures and logic as they pass through each layer, all of which takes time and not a particularly efficient way to troubleshoot an application.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Shortcoming 2 - Brittleness:  &lt;/div&gt;&lt;div&gt;I don't care how "loosely" coupled or abstracted you have designed each layer, by its nature this approach tends to create brittle designs where each layer is written in its own language and has unique implementation details.  In my experience, no amount of planning for future functionality and abstraction fully covers you in your design, and more times than not, an innocuous feature request like "Gee, it would be nice if we can capture the users surname on our registration form" has the developer modifying the presentation layer, business/app layer, and data layer to accommodate a relatively simple request that ends up rippling through every layer of abstraction in unavoidable ways.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Shortcoming 3 - Maintaining Client State on the Server:&lt;/div&gt;&lt;div&gt;HTTP by its very nature is a stateless protocol, each time that browser loads a new page, all state is lost (cookies aside), sorry folks, but that is the way it was designed. For that reason, web application architects find themselves jumping through all sorts of hoops to maintain state on behalf of the client within their centralized web servers.  This problem becomes further exacerbated when we are designing a scalable web application with many web application servers.  You now have to deal with load balancing IP requests across multiple web servers and dynamic client IP pools. This makes the architecture required to build out a web farm a much more complex issue for your application design, testing, scaling and debugging.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Shortcoming 4 - Browser/Desktop Compatibility:&lt;/div&gt;&lt;div&gt;This is so obvious I don't need to hammer it further, but needless to say writing web applications (or even desktop ones) that behave nicely on a wide variety of clients and environments requires writing LOTS of code that deal with compatibility issues and adds zero additional functional value to your application.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So how does a technology like Flex address these issues?  To me, it wasn't immediately apparent, as I when I started using Flex I just thought of it as an easier way to build a more attractive and interactive presentation layer, but the more I used it and the more I saw how powerful the Flash Player, was I started to realize that there was a real opportunity to do things differently.  It was at about this time (a couple of years ago) that I was starting the initial architecture for our on-demand BI dashboard offering, which was the flagship product of the startup I had co-founded.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When evaluating architectures and design patterns I wanted an approach that was going to maximize developer productivity while giving us a consistent and maintainable code base.  I looked at frameworks like Cairngorm (which largely borrow from established Java design patterns) and ultimately with the help of my VP of Engineering ended up designing a custom framework and architecture over the course of about 6 weeks.  This framework allowed us to successfully go from a written spec to commercial product with two live Fortune 500 clients in just under 6 months with a team of three developers including myself who was only working on the product part time.  All in all, I was very proud of our effort and what we were able to accomplish in such a short amount of time, and outside of having a very dedicated team who worked extremely hard, I attribute that success to being able to leverage a completely new paradigm for web application development.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So what did we do that was all that different, what was our secret?  Well, obviously Flex was a big part of it, but more so it was what Flex allowed us to do from an architectural perspecitve. Fundamentally we still had all the basic pieces of an n-tier architecture in place with a DB on the back end, a web service bridging the client to the DB, and our client code within Flex.  But what was different was WHERE we put the code for those layers.  When you looked at the composition of our code which was spread across SQL in the form of creation scripts and stored procs, .NET for our C# web service and Flex for our client, 98% of our code was all written in Flex.  We had less than 3000 lines of code within SQL, less than 1000 lines of code in .NET and the rest was all Flex!   &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How did we do this?  Why did we do this?   Well, we essentially condensed all of our abstractions layers into one platform and language - Flex/ActionScript.   We still had a "presentation, business, data" layer but it all existed within our Flex classes via a MVC framework approach.   Our model classes would serialize themselves into XML which would then call our web service which primarily served as a secure pass through to our DB, and then the DB would digest the XML via associated stored procedures and update or retrieve data in the appropriate tables.  This meant when we had changes to the spec and had to add that a new data field we simply updated our Flex UI and underlying model class and the appropriate stored proc on the DB.   The separation of layers worked beautifully, all the UI code and underlying model code was in one environment and IDE, while all the code to maintain referential integrity of the persistence layer sat in the DB where it belonged.  The primary motivation for me to adopt this approach was to focus as much of our development energy on directly enhancing functionality versus working on plumbing and repetitive coding tasks that did not directly add to the feature set.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This approach afforded us huge advantages in our development.  The single biggest advantage was the speed of development, once our data tier and pass through web service were stabilized (with less than 4k lines of code total, that did not take too long) we could debug all of our code in one environment.  The whole architecture of the platform sat in one place, Flex, and while our .Net web service exposed some utility functions for us (like SMTP access, and some server side file manipulation) we rarely had to leave the Flex debugger for troubleshooting.   The second big advantage that we had was how we could scale our application on the web tier.   Since all of our complex client state existed within Flash (and thus on the client) the only load our web servers received was for the stateless pass through requests to/from the DB and for some utility work.  Thus, we did not have to maintain any session state on our servers and scaling out the web farm was simply a matter of adding more web servers behind a load balancer.  The back end DB still required clustering for fault tolerance and scalability, but we had a relatively simple DB schema that made this easy enough to achieve.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All in all, had we taken a more traditional approach to designing our application I can confidently say it would have taken us at least 50% longer to build with half of the interactivity and robustness that our application released with on version 1.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This approach worked for one primary reason, and that is the ubiquity and the power of the Flash Player in combination with the abstraction of ActionScript 3.  Yes, everyone knows that Flash has something like a 98% penetration rate, and that a .swf file is going to act pretty much the same regardless of the browser or OS it plays within.  But, when Adobe released Flash Player 9, it left the leagues of a neat way to show cool animated effects, and offered a true platform to deploy robust applications against.  The performance of the Flash Virtual machine is pretty amazing when you consider how compact it is. For instance I can manually filter row by row through thousands of database records using powerful regular expression match patterns within mili-seconds ON the client.  Flash is not without its warts, but all-in-all a very compact, and powerful platform to write code to.  I encourage other web application architects to look closely at the Flex/Flash combination for their next project and consider how they might benefit from this approach.&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/17704783-5878158197786088401?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/5878158197786088401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=5878158197786088401' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/5878158197786088401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/5878158197786088401'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/05/flex-is-not-just-pretty-front-end.html' title='Flex is MORE than just a pretty front-end'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-811376524897444987</id><published>2008-04-25T12:01:00.000-07:00</published><updated>2008-12-11T14:16:09.591-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><title type='text'>Steve Jobs would cringe - Apple Wireless Keyboard Add-On</title><content type='html'>When I purchased my Mac Pro, I had an option of which keyboard I wanted, I ordered the wireless keyboard, knowing how small it was, and thinking it would be next to useless for coding, but perfect for a family Mac-Mini.  Well, I actually kind of like the keyboard, the key-throw is good, I can type fast and it is really light/elegant.  BUT, it is pretty diminutive, and so light that when I use it in my regular seated position (feet elevated on desk, very reclined in my chair) with the keyboard on my lap, it kept slipping down.  I found myself unconsciously holding it in place with my left thumb so it wouldn't slide down.  Typically with large keyboards, the pad of my palm would rest against the bottom keeping it in place.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I devised a super high-tech holder custom designed for the Apple Wireless Keyboard. It is very lightweight fits perfectly and made from bio-degradable earth friendly materials.  See the photos below.  It works perfectly, the keyboard is now secure in my lap and very comfortable.   Perhaps when this one wears out I will create one out of a nice piece of lucite :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nhNEg19wGd0/SBIsiDEo__I/AAAAAAAAABI/HlzvcswLOTM/s1600-h/IMG_0017.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_nhNEg19wGd0/SBIsiDEo__I/AAAAAAAAABI/HlzvcswLOTM/s400/IMG_0017.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5193262283763548146" /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nhNEg19wGd0/SBIs0DEpAAI/AAAAAAAAABQ/URmiySgL8Fc/s1600-h/IMG_0019.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_nhNEg19wGd0/SBIs0DEpAAI/AAAAAAAAABQ/URmiySgL8Fc/s400/IMG_0019.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5193262593001193474" /&gt;&lt;/a&gt;&lt;br /&gt;Update:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My v1 keyboard holder ended up becoming a little "floppy" after 2 weeks of use, so I created a new one out of PVC/Sheet.  Other than a slight mishap with the router in my haste to replace the more organic version, it worked out fine.  A little hook-and-loop tape allows me to mount and remove the keyboard with ease.  The size is perfect for typing in my lap.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nhNEg19wGd0/SB-LNjEpABI/AAAAAAAAABY/pNkltt87PVo/s1600-h/IMG_0022.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_nhNEg19wGd0/SB-LNjEpABI/AAAAAAAAABY/pNkltt87PVo/s400/IMG_0022.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5197025559878107154" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nhNEg19wGd0/SB-LNzEpACI/AAAAAAAAABg/c5WXFKxQLEM/s1600-h/IMG_0023.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_nhNEg19wGd0/SB-LNzEpACI/AAAAAAAAABg/c5WXFKxQLEM/s400/IMG_0023.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5197025564173074466" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-811376524897444987?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/811376524897444987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=811376524897444987' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/811376524897444987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/811376524897444987'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/04/steve-jobs-would-cringe-apple-wireless.html' title='Steve Jobs would cringe - Apple Wireless Keyboard Add-On'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_nhNEg19wGd0/SBIsiDEo__I/AAAAAAAAABI/HlzvcswLOTM/s72-c/IMG_0017.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-6984571147456845160</id><published>2008-04-25T11:22:00.000-07:00</published><updated>2008-06-20T18:02:09.093-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Industry'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><title type='text'>Should Apple purchase Adobe?</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I am sure I am not the only one who has posed this question, I know there was lots of conjecture about this a couple of years ago.   But I think the argument is even stronger today.   It appears that Apple is really trying to take advantage of the fiasco that is Windows Vista and is pushing new PC buyers to make the jump to Apple (hey it worked on me)  But, Apple is going to have a tougher going with the developer crowd and the corporate culture.  If Apple ever hopes to jump the chasm and become an integral part of the enterprise they are going to have offer compelling reasons for developers to jump ship as well and write software for Apple.  Right now the only compelling reason for developers to make the switch and write software for Apple is because they become so enthralled with the Apple experience that they want to be part of it (once again, I am guilty as charged) or they are specifically targeting OS X or the iPhone for their offering.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But, as motivated as I am to develop the next great iPhone/OS X app, each and every time I put forth an earnest effort to do so I am struck by how antiquated the development tools, languages, and platforms feel to me.  For a corporate developer who just needs to get the job done and could care less about how sexy something looks/feels they will have even less impetus to make the jump.   One thing that Microsoft did extremely well, although not so much any more, was to practically spoon feed developers with their technologies. It was SOOO easy to pick up a MS technology, not necessarily because they were the best technologies, but because MS invested heavily in providing training materials, live events, practically giving away their software via MSDN, etc.   Now, I see the open source movements doing a better job of this with the robust communities and communication infrastructures that have developed as a result of the internet.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So here I sit at a cross-roads, do I invest the time to develop an application that is specific to Apple either via Objective-C/XCode or via proprietary AJAX for Safari extended WebKit?   Well, either choice seem like several steps backwards from where I am right now.  Currently I develop in Adobe Flex, and while the tooling can stand room for improvement, it is still far ahead of XCode.  But where Flex really shines is the combination of the language and the design patterns it easily supports in combination with the power and ubiquity of the Flash player.  Having to go back and write AJAX code and deal with browser compatibility issues and the lack of robust profiling/tracing tools is just painful.  Once you know how much better it can be, having to go back and use tooling/languages that you were using 8 years ago just hurts.  The XCode/Objective-C road does not appear any better.  Damn Flex and Adobe, if I never went down this path I wouldn't know any better, and I would be happily struggling with AJAX, &lt;a href="http://www.w3.org/html/wg/html5/"&gt;HTML5&lt;/a&gt;, and excited that I now have a &lt;a href="http://developer.apple.com/documentation/AppleApplications/Conceptual/SafariJSProgTopics/Tasks/Canvas.html"&gt;Canvas HTML element&lt;/a&gt; that has a &lt;a href="http://developer.mozilla.org/en/docs/Drawing_Graphics_with_Canvas"&gt;graphics contex&lt;/a&gt;t I could draw to. &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;Okay, back to my original theme for this post, why should Apple purchase Adobe?  If for nothing else, Flash and Flex.  If Apple controlled Flash they could easily put it on the iPhone and still force their lock-in for flash-enabled iPhone apps having to be distributed via their AppStore.  With ActionScript, Flash, and &lt;a href="http://www.adobe.com/products/air/"&gt;AIR&lt;/a&gt; in their back pocket, what they have is  universal development platform that would open the doors to a much wider developer audience. Because a developer knows when they are targeting Flash/AIR they are not only targeting Apple but pretty much any OS/Client.  In the words of &lt;a href="http://smoothspan.wordpress.com/"&gt;Bob Warfield&lt;/a&gt;, the friction is greatly reduced. It would also put Apple on practically EVERY desktop because Flash sits on every desktop.   Similar to the logic I used in purchasing a Mac Pro, where I knew worse case I could run Windows natively (but have yet to do so) I would be able to develop for the iPhone/Apple knowing that my application would also work anywhere elese.  Even better, instead of having to learn the ins-and-outs of a new language based on an old development paradigm I would either leverage the knowledge I already have (if I knew Flex) or be investing my time in learning something new, but more powerful and more efficient.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;But, wait, there is more to this argument outside of my myopic developer/engineer perspective.   Apple is really pushing to deliver software to creative folks, albeit more at the hobby level, but nonetheless what company has the best and most established creative software?  Adobe!!!  If Apple wants to position themselves as the company that creates the hardware, software and distribution channels for creative content (music, video, multi-media, etc.) why not also control and offer the tools to create such content... it would go a long way to reducing the friction in some of these marketplaces, where the creative authors can seamlessly distribute their works via the Apple channel.  This would allow them to target all strata of their verticals that they want to sell into, and these offerings create a self-reinforcing viral effect. This said, I am not sure how comfortable I am with a company like Apple holding such a dominant position in the market based on their historically closed nature.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And this is where I come to why I think it might not work, and that is due to cultural issues between the two companies.  Adobe has been making GREAT strides to become a much more transparent and open company, they are investing heavily in contributing &lt;a href="http://opensource.adobe.com/wiki/display/site/Home"&gt;open source code&lt;/a&gt; and really seem to be figuring out how to be a good corporate citizen while still turning a profit.  Apple, not so much.  They seem to still cling the old-school closed source mindset, where everything is shrouded in secrecy and tightly controlled.  This does have its advantages, but long term I don't think it will benefit them.  So what happens when a company like Apple acquires a company like Adobe with the differences in their respective cultures?  I don't think it would be a very pretty picture and could have the potential to destroy Adobe and the value they bring to the table.  But from a purely mercenary/capitalistic view I think it would still be in Apple's best interest to do so.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;From looking at the Yahoo finance stats today, here are some metrics for both companies.   It would seem with Apple's cash on hand they have enough resources to make something like this happen (they have almost as much cash on hand as Microsoft) if they were motivated to do so.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Apple:&lt;/div&gt;&lt;div&gt;Market Cap: $148B&lt;/div&gt;&lt;div&gt;Annual Sales (2007): $24B&lt;/div&gt;&lt;div&gt;Total Cash: $18B&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Adobe:&lt;/div&gt;&lt;div&gt;Market Cap: $19B&lt;/div&gt;&lt;div&gt;Annual Sales (2007): $3.1B&lt;/div&gt;&lt;div&gt;Total Cash: $1.57B&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/17704783-6984571147456845160?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/6984571147456845160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=6984571147456845160' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/6984571147456845160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/6984571147456845160'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/04/should-apple-purchase-adobe.html' title='Should Apple purchase Adobe?'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-914295059632990082</id><published>2008-04-24T07:18:00.000-07:00</published><updated>2008-06-15T20:27:22.649-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>I will be speaking at Flex 360</title><content type='html'>For those Flex developers out there who have not heard of the &lt;a href="http://www.360conferences.com/360flex/"&gt;Flex 360&lt;/a&gt; events, it is a GREAT opportunity to learn more about Flex, share information with other Flex devs and just generally have a great time.   I attended the event in Atlanta, and &lt;a href="http://lordbron.wordpress.com/"&gt;Tom&lt;/a&gt; &amp;amp; &lt;a href="http://johnwilker.com/j/"&gt;John&lt;/a&gt; put on a great show.  The sessions are really informative and pretty informal, which creates a great atmosphere for sharing and collaboration.   At this event I will be speaking about Data Visualization and Dashboards with Flex 3.   I did a similar talk at Adobe MAX back in 2006, but it was on Flex 2, and geared to a less advanced audience.   So for this preso, I am going to have to crank it up a notch and come up with some pretty slick examples that push the boundaries of Flex, and show people how I have been building and teaching dashboard development to other Flex devs over the past couple of years.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-914295059632990082?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/914295059632990082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=914295059632990082' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/914295059632990082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/914295059632990082'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/04/i-will-be-speaking-at-flex-360.html' title='I will be speaking at Flex 360'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-4678533899578057477</id><published>2008-04-23T08:11:00.000-07:00</published><updated>2008-06-15T20:29:21.266-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><title type='text'>Mac Pro 8-core and Leopard Week 1:</title><content type='html'>It has been almost a week now after my transition off a wintel machine onto my new heavily loaded Mac Pro.  Like so many others before me, and the millions who will follow after me, it has been an epiphany.&lt;br /&gt;&lt;br /&gt;I have been a hard-core windows guy for the past 15 years, just devouring everything Microsoft.  I am/was deeply intimate with almost all of Microsoft's software offerings from their (anti)productivity suites in their Office Tools to their back end server stacks like Exchange, SQL Server, Biz-Talk, Commerce Server, IIS, GreatPlains/Dynamics, Sharepoint and more.  I also exclusively developed in MS frameworks like VB (from years ago), C# etc..  all designing and developing business applications.    I was one of three Principals at a medium sized local MS Gold Partner consulting shop in charge of delivering multi-million dollar custom MS applications leveraging technologies in the above mentioned stacks.   A few years ago I slowly started to drift away from MS, the first material separation occurred when I adopted Adobe Flex as the primary development technology for my new startup and was just shocked with the refreshing change of the "open" community nature that Adobe adopted in its beta.&lt;br /&gt;&lt;br /&gt;Now a couple of years later, with Apple making it almost impossible to ignore their presence with their adoption on Intel chipsets and the ability to run Windows side-by-side with OS X I made the leap.  What is amazing, is that leap is a more like a short step, the effort involved to make the switch is getting smaller and smaller.   I can't say enough good things about the quality of the Apple hardware itself, the 8-core is a dream, and even more importantly OS X feels like what a computer is supposed to feel like in 2008.   Spotlight (OS X's universal search tool) is just so easy... you have a thought like "where is file XXX" and you just type "XXX" into spotlight and there it is.   No more waiting several minutes while Windows search agonizingly moves through your non-indexed files at a snails pace (although  I am not sure how fair that is since I was not using an 8-core processor with 14GB of RAM on my wintel box.)    Lots and lots of little things are just so much more seamless and intuitive with OS X.   &lt;br /&gt;&lt;br /&gt;This is not to say it is all roses, there are little things here and there that I miss from Windows, but overall the experience is such that you feel like you can forgive OS X for its shortcomings, while you want to blame Windows for theirs.  To Microsoft's credit they still have a few amazing products that I have mentioned before, like Visual Studio and SQL Server 2005.  Microsoft also has the very unenviable challenge of trying to support an OS that is 20+ years old and has successfully maintained backward compatibility on a ever shifting hardware platform that has to support billions of permutations of hardware configurations.   Apple on the other hand got a fresh start with OS X and they completely control the hardware platform, which is a much easier proposition.  It will be interesting to see how Apple is able to successfully avoid the bloat that will come with time as their adoption rates increase and the need to support backward compatibility becomes more prevalent.&lt;br /&gt;&lt;br /&gt;So my message to any windows users considering the switch to Apple is to go for it, you will not regret it in the slightest.  The only issues I have found thus far is that GoToMeeting requires Windows to host meetings, and QuickBooks online has tied themselves to ActiveX technology via Internet Explorer.  For both of these I simply run VMWare fusion, although I will probably migrate to Adobe Connect for meetings, and I am hopeful Inuit will release a Flex client for QuickBooks sometime in the near future with their QuickBase announcement.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-4678533899578057477?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/4678533899578057477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=4678533899578057477' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/4678533899578057477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/4678533899578057477'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/04/mac-pro-8-core-and-leopard-week-1.html' title='Mac Pro 8-core and Leopard Week 1:'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-7008620737299501711</id><published>2008-04-08T08:07:00.000-07:00</published><updated>2008-06-15T20:29:21.266-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><title type='text'>The Cult of Apple</title><content type='html'>Help, I think I have become addicted .... to Apple.&lt;br /&gt;&lt;br /&gt;This weekend, while out with my wife (sans the kids), I made my SECOND trip in 2 days to the local Apple Retail Store.   I left the store about $500 lighter after picking up a bright pink Nano for my wife and an Apple TV (at $229 how can you resist??)  At this point I can just feel myself getting inexorably sucked into the vortex of quality, attention to detail, and desire that Apple has come to embody in most of its products.   It started a couple of years ago with my MacBook purchase that was simply used to make it easier for me to test our website within safari.   This was followed up a few months ago with an iPhone purchase, under the auspices of keeping up to speed on current UI and usability trends in the industry.   Now my addiction to apple … I mean research … has me buying iPods like candy and buying devices I didn’t know I had a need for.   Next up is replacing my aging P4 with a brand new Mac Pro 8-core with some serious memory (12GB should do.)   After buying the iPhone I was truly hooked… there is something about the products Apple produces that creates this incredible emotional desire for “more of that” (at least for tech people like me.)  I commented to my wife that the desire I have for Apple products is quite similar to what I witnessed in her when we walked into the Louis Vuitton store and my wife was ogling a pair of $1,200 shoes.  It is really an admirable and amazing feat that Apple has pulled off, by focusing on quality and attention to detail at every level from product design, implementation, to even the jewel like packaging materials, they have created a desire for their products that I have not experienced with any other technology outside of the lust people feel for cars like BMW, etc.    Apple doesn’t get it right all the time though. On OS X I still can’t understand their fascination with spawning windows like rabbits in heat, and on a much more trivial note the shopping bag that the Apple Genius put my purchase into required an instruction book to figure out how to carry.  It was this weird contraption with two separate ropes going through a total of four riveted holes in the bag… I wasn’t sure if it wanted to be a knapsack, hammock, or some weird S&amp;amp;M device…   Walking through the mall I constantly found myself trying to figure out how to hold the damn thing properly…  I think they got a little too clever for themselves on that one.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Okay, back to my addiction….  Yesterday I plugged in the Apple TV to our widescreen HDTV in our bedroom, within 10 minutes I had our modest iTunes collection of about 3k songs and our photo library of about 2.5k pictures streaming from it.   So last night my wife and I sat down to “rent” a movie, I was a little disheartened to see that once we started watching it we only had 24 hours to finish it… I wrongly assumed it was “ours” for 30 days.  That issue aside, we never even got to the movie… We became so fascinated with watching the slideshow of our photos and listening to music.  It was an amazing experience for me… we had about 7 years of photos from before our wedding, various trips to Tahiti, Hawaii, coast of California, the birth of our two sons, etc…   It was just amazing to watch and recall.  It gave me a whole new appreciation for taking photos, as I was completely engrossed and entertained. It gave my wife and I an opportunity to reminiscence and connect at a level that so far eclipsed just watching a movie together.  After a couple of hours I ended up knocking off and going to sleep.   This morning I found out my wife stayed up past midnight watching our slide show..     Now I am not sure how entertaining this experience would be after seeing these photos for the umpteenth time, but I can tell you it was a real eye opener for me in terms of its intrinsic entertainment value.   When we finally get around to watching the movie we rented and delving into some of the other features of the Apple TV I will report back.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- Tom&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-7008620737299501711?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/7008620737299501711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=7008620737299501711' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/7008620737299501711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/7008620737299501711'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/04/cult-of-apple.html' title='The Cult of Apple'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-7458456691377269583</id><published>2008-04-04T18:05:00.000-07:00</published><updated>2008-12-11T14:16:09.924-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dashboards'/><category scheme='http://www.blogger.com/atom/ns#' term='Component Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Gauge Component v.02</title><content type='html'>After the response I received on the first release of the Gauge component I thought it was time for an overhaul of the code since this original code was written when I was learning Flex back on the alpha bits of Flex 2.0.  Since that time Flex has moved on, and I have learned quite a bit.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.brightpointinc.com/FlexDemos/degrafagauge/degrafagaugesample.html"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_nhNEg19wGd0/R_bXs536ROI/AAAAAAAAAAg/CW0ygdiCorA/s400/2gauges.jpg" alt="" id="BLOGGER_PHOTO_ID_5185569187413247202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This version of the component is a complete re-write of the code and is vastly simpler and easier to read/extend. First a thanks to &lt;a href="http://weblogs.macromedia.com/pent/archives/2006/07/writing_flex_2.cfm"&gt;Peter Ent, as his stab at a gauge&lt;/a&gt; was infinitely better thought out than mine and much more compact, the component code is very close to his, with a couple of modifications.   The other bigger, and what I consider very significant change for this component is how it leverages &lt;a href="http://www.degrafa.com/"&gt;Degrafa&lt;/a&gt;… which if you are not familiar with and you are doing any component development you are doing yourself a disservice by not taking a close look at it.   I used this little mini project as an excuse to really dig in and find out what &lt;a href="http://scalenine.com/blog/"&gt;Juan&lt;/a&gt;, &lt;a href="http://flexibleexperiments.wordpress.com/"&gt;Jason&lt;/a&gt; and the rest of the &lt;a href="http://www.degrafa.com/team/"&gt;Degrafa team&lt;/a&gt; had been working on since they seemed to be popping up everywhere.&lt;br /&gt;&lt;br /&gt;When I dug into Degrafa I was REALLY impressed at several levels.  Not only are the examples just plain sweet visually, but the framework itself is very elegant, compact, and infinitely extendable.   In this version of the gauge I built two skins completely in Degrafa and MXML markup, you can toggle the skins and they will still respect the color of the styles you choose.  BTW, the skins can be set via CSS, and you can have separate skins for each part of the gauge (bezel, face, pointer, center, indicators.)&lt;br /&gt;&lt;br /&gt;The beauty of this approach with Degrafa is three fold.   First I am using MXML to create complex geometric relationships which is infinitely easier to do in markup versus procedurally because the markup itself creates visual relationships through the inherent nesting and grouping structure of XML.  Second, Degrafa does a great job of leveraging Flex’s binding mechanism, which in my opinion is one of the most powerful things within Flex. Finally the workflow is vastly improved,  I can do everything from flex builder and not jump between Flash for building vector assets and exporting to symbol .swfs etc…&lt;br /&gt;&lt;br /&gt;On some later post I will probably dive into the framework itself, since I ended up having to extend it in a couple of areas and it only took me a few minutes to do so.  For example the “tick” marks you see on the gauge I ended up copying the &lt;a href="http://samples.degrafa.com/VerticalLine/VerticalLine.html"&gt;VerticalLineRepeater &lt;/a&gt;which extends the base Repeater class, and within 20 minutes after modifying a few methods and adding a couple trig functions, I had this arc of lines that I could declare in MXML… I remember the first time I did that in the original gauge component it took me hours to fine tune procedurally via the API.&lt;br /&gt;&lt;br /&gt;At Juan’s urging I wanted to get this up so it could be shared with the community, as such the code might stand a little clean up here and there, but overall it should be pretty easy to follow.   I am also going to be writing an article for &lt;a href="http://www.insideria.com/"&gt;InsideRIA&lt;/a&gt; that goes into all the gory details of building out this component with Degrafa, which was actually quite simple and very enjoyable.&lt;br /&gt;&lt;br /&gt;----------------------------------------------&lt;br /&gt;Caveat... The tweening of the pointer is a little flakey, as I threw it in at the last second, and I need to do a better job of handling the rotate effect and updateDisplayList collisions.&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Update:  The newest version of this component can be &lt;a href="http://form-function.blogspot.com/2008/07/gauge-component-new-features-v04.html"&gt;found here.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-7458456691377269583?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/7458456691377269583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=7458456691377269583' title='29 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/7458456691377269583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/7458456691377269583'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/04/gauge-component-v02.html' title='Gauge Component v.02'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_nhNEg19wGd0/R_bXs536ROI/AAAAAAAAAAg/CW0ygdiCorA/s72-c/2gauges.jpg' height='72' width='72'/><thr:total>29</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-8018318101166524725</id><published>2008-04-01T15:21:00.001-07:00</published><updated>2008-06-15T20:31:17.867-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><title type='text'>iPhone Developer Program Take 3</title><content type='html'>Well it looks like i have been accepted into the iPhone SDK beta developer program.. I must say that thus far the experience has been far more like a Microsoft Beta than anything else, where you are made to feel privileged to have been accepted after jumping through a corporate bureaucracy. &lt;br /&gt;&lt;br /&gt;I am not sure how widespread the program is now, potentially they are allowing everyone in. What was odd though, is that last week I got an email requesting faxed copies of my articles of incorporation for &lt;a href="http://www.brightpointinc.com/"&gt;BrightPoint Consulting&lt;/a&gt; (the company I registered under) which I faxed over. Just a few moments ago (a week later) I receive an email telling me that upon signing the license agreement and forking over my $99 I would be enrolled. I promptly did both, and now I am an "official" iPhone developer. I find it odd that it required such a manual process... I would assume this is pretty manually intensive if they are having humans read and correlate faxes to each developer account.&lt;br /&gt;&lt;br /&gt;Last week I downloaded the latest bits from the second release of the iPhone SDK beta.  I  see that Interface Builder is now included, which is supposed to be the "magic sauce" for creating UI' s in Cocoa applications.   But as I had thought, it still requires quite a bit of work to set up an application.  The good news is that it appears that there is finally some documentation on the JavasScript DOM api for touch/gesture events.   I planned on exploring that a bit further when I could carve out some time.&lt;br /&gt;&lt;br /&gt;I will post again when I receive the SDK if there are additional resources provided outside of what everyone else see, and if my sharing does not violate some license EULA.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-8018318101166524725?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/8018318101166524725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=8018318101166524725' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/8018318101166524725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/8018318101166524725'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/04/iphone-developer-program-take-3.html' title='iPhone Developer Program Take 3'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-4496155690459604913</id><published>2008-03-21T16:11:00.001-07:00</published><updated>2008-12-11T14:16:09.980-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Component Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Gauge Component  v.01</title><content type='html'>Well, the time has come for me to give back a little to the community from which I have learned and benefited so much.   People like &lt;a href="http://www.quietlyscheming.com/blog/"&gt;Ely&lt;/a&gt;, &lt;a href="http://www.dougmccune.com/blog/"&gt;Doug&lt;/a&gt;, and too many others to list have been a source of inspiration and a repository for useful components that I have used across many projects.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.brightpointinc.com/FlexDemos/GaugeSample/GaugeSample.html"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_nhNEg19wGd0/R-REp536RNI/AAAAAAAAAAU/ObJfIB4e76I/s400/GaugeSample.jpg" alt="" id="BLOGGER_PHOTO_ID_5180340958083564754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This gauge component actually stems from some of my first work with the beta bits of Flex 2.0 over two years ago.  For business and IP reasons I could not share this code, but now as conditions have changed I can offer this code to the community under an MIT license.   It is far from a polished component, but the foundation is there.   Follow this link to &lt;a href="http://www.brightpointinc.com/FlexDemos/GaugeSample/GaugeSample.html"&gt;BrightPoint Inc.&lt;/a&gt; to go see the gauge in action and right click for view source.&lt;br /&gt;&lt;br /&gt;Some of the things on the to do list will be the following, based on interest from the community and feedback.&lt;br /&gt;&lt;br /&gt;1. ASDocs (duh...)&lt;br /&gt;2. Exposing the .swc skin more easily so all the gauge parts can be swapped via MXML or at runtime.&lt;br /&gt;3. Cleaning up some of the min/max label stuff (try clicking on the radio buttons at 5 and 8 o'clock.)&lt;br /&gt;4. Providing the user a way to input values via scroll-wheel our mouse.&lt;br /&gt;&lt;br /&gt;At some point I might create a commercial version of this component, but everyone is free to use this code in whichever way they see fit.  &lt;br /&gt;&lt;br /&gt;Any suggestions/comments for improvement are welcome.&lt;br /&gt;&lt;br /&gt;Update: The newest version of this component can be &lt;a href="http://form-function.blogspot.com/2008/07/gauge-component-new-features-v04.html"&gt;found here.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-4496155690459604913?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/4496155690459604913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=4496155690459604913' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/4496155690459604913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/4496155690459604913'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/03/gauge-component-v01.html' title='Gauge Component  v.01'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nhNEg19wGd0/R-REp536RNI/AAAAAAAAAAU/ObJfIB4e76I/s72-c/GaugeSample.jpg' height='72' width='72'/><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-1791748656601627386</id><published>2008-03-18T17:45:00.000-07:00</published><updated>2008-06-15T20:29:48.125-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Removing items from an Array Collection</title><content type='html'>Today I was troubleshooting a bug where items weren't not being removed from a Flex DataGrid the way I expected them to.  What I discovered is that in this particular case my laziness in abusing the ArrayCollection was causing an unobvious (to me) bug.&lt;br /&gt;&lt;br /&gt;Here is the simplified code that looks for a match to remove items from an ArrayCollection (yes I could use a filter, but that doesn't TRULY remove items from the ArrayCollection.source, and I can never remember the 5 lines of code I need to create one correctly.)  So this was my first attempt at removing items from an ArrayCollection.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;  &lt;br /&gt; ac.addItem("foo1");&lt;br /&gt; ac.addItem("foo2");&lt;br /&gt; ac.addItem("foo3");&lt;br /&gt;&lt;br /&gt; for each (var foo:String in ac) {&lt;br /&gt;     if (foo.charAt(0)=="f")&lt;br /&gt;         ac.removeItemAt(ac.getItemIndex(foo));&lt;br /&gt; }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now, what would you expect that trace statement to output?  Personally I expected to see a big "0", but alas the ArrayCollection is not truly keeping proper indexes as iterates through its for each.   Realizing that this was probably an index issue with the iterator I wrote the following which works correctly as it backs down from the last element, thus not distrupting the index as it moves backwards.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;for (var i:int=ac.length-1; i&amp;gt;=0; i--)&lt;br /&gt;{&lt;br /&gt;  if (ac.source[i].charAt(0)=="f")&lt;br /&gt;  ac.removeItemAt(i);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;The above code does what I was intending, correctly.   I guess a lesson learned on thinking that Flex did EVERYTHING for me... guess I can't be a completely lazy programmer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-1791748656601627386?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/1791748656601627386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=1791748656601627386' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/1791748656601627386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/1791748656601627386'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/03/removing-items-from-array-collection.html' title='Removing items from an Array Collection'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-2969586539263521324</id><published>2008-03-18T08:42:00.001-07:00</published><updated>2008-06-15T20:31:32.619-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><title type='text'>Why I won't be writing native iPhone apps anytime soon.</title><content type='html'>Here is why I won't be writing native iPhone Applications: (at least not yet)&lt;br /&gt;&lt;br /&gt;&lt;object height="355" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/pReuTG_w-ME&amp;amp;hl=en"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/pReuTG_w-ME&amp;amp;hl=en" type="application/x-shockwave-flash" wmode="transparent" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;After spending about 40+ hours with the new iPhone SDK, getting up to speed on Objective-C (which is kinda cool) and modifying a few sample apps with XCode I have come to realize that while Apple makes amazing consumer products and interfaces, they fall completely short of the mark when it comes to developer tooling interfaces.   Perhaps it is because I do NOT come from the land of Unix (well okay I used Unix in University, but that was over 20 years ago) and I am not a huge proponent of the command line and I prefer nice comfortable IDE's like Visual Studio or Eclipse that I don't see the magic here.&lt;br /&gt;&lt;br /&gt;Just watch the video above to witness what kind of gyrations, both in code and UI, you need to go through to wire up a button to make a beeping noise. Windows popping up all over, connecting objects from one window to another with visual lines... opaque NIB files, etc.  I am sure compared to command line C++ development this might seem like a godsend, but for someone who has spent the last 2 years developing almost exclusively with Adobe Flex, this seems like a step back into the stone ages.  While I am not a huge fan of Microsoft, Visual Studio really sets the bar for a highly productive and functional IDE, Eclipse is getting better and almost there.   When it comes to programming languages to create expressive and immersive UI's there is no beating flex.&lt;br /&gt;&lt;br /&gt;I am so eager to develop immersive multi-touch applications on such an amazing device as the iPhone that I have seriously considered investing the 90 days or so I think it would take to develop a modicum of proficiency on new tooling (XCode) and language (Objective-C). But when I look at how pleasurable the experience of developing with these tools would be it looks like it would be trying to go surfing on a huge 100lb redwood board versus the 6lb epoxy short boards I prefer.  While I would still be catching waves, things would feel so ponderous and slow.  I thought that perhaps I am just missing it, and I needed to shift my mental paradigm to a different one so I would "get-it".  After watching the video above, I am not sure that I am missing anything.&lt;br /&gt;&lt;br /&gt;Obviously an ideal dev platform for me would be having the iPhone support Flash with Multi-touch so I could develop in flex, but I don't see that happening anytime soon.  Especially considering the restrictions in the SDK.   The one nuggets I did find in doing my research was that one of the SDK videos talked about the Javascript extensions they were building and the new CSS standards they were supporting.  Some of the glimpses I got were:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Gesture support via Javascript (gestureStart, gestureEnd...)&lt;/li&gt;&lt;li&gt;CSS Animations&lt;/li&gt;&lt;li&gt;Transitions&lt;/li&gt;&lt;li&gt;Full SVG support and drawing (although not sure if that is restricted to markup or can be dynamic.)&lt;/li&gt;&lt;li&gt;Javascript access to SQLite !!! (this is huge in my mind as it could really allow online/offline apps)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The challenge I have though is that I can't find ANY documentation to support those javascript API's.   I am thinking that perhaps creating web-apps with these javascript API's will afford me the ability to use more productive tooling and get the same great features.   I just need to figure out how/if the SDK will allow us to support web apps running in an offline state, and if it will be possible to sell web-apps via the AppStore.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-2969586539263521324?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/2969586539263521324/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=2969586539263521324' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/2969586539263521324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/2969586539263521324'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/03/iphone-native-apps-versus-web-apps.html' title='Why I won&apos;t be writing native iPhone apps anytime soon.'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-687285753257204399</id><published>2008-03-13T18:06:00.000-07:00</published><updated>2008-06-15T20:31:17.869-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><title type='text'>iPhone SDK first impressions</title><content type='html'>Well, I am pretty impressed with the level of effort that went into this SDK.  I am on day four of just looking around, and I have yet to write a single line of code, which is very uncharacteristic of me. &lt;br /&gt;&lt;br /&gt;The SDK is pretty polished, with custom graphics, and a deep set of well put together videos (available via Apple Developer Connection) free on iTunes.   The videos were a great way to get a lay of the land.&lt;br /&gt;&lt;br /&gt;Other than starting to get my mind around Objective C after spending the last two plus years immersed in Adobe Flex feels like a bit of a step backwards.   I am not super fond of the C/C++ structures and coding paradigms, as they feel like I am having to do a bunch of unnecessary work at lower levels of abstraction that is needed.   Having to deal with memory allocations and stuff like that is a bit of PIA, but perhaps it is just because I have been working in higher level languages for so long.&lt;br /&gt;&lt;br /&gt;One interesting bit I ran across in the videos is that they have extended the javascript API for Web Kit to support the handling of multi-touch getsure events like gesturestart, gestureend, and gesturechange.   But I have been unable to find any other documented API references to this, and in loading up Dashcode (their web IDE for the iPhone) I could not get any more info.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-687285753257204399?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/687285753257204399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=687285753257204399' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/687285753257204399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/687285753257204399'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/03/iphone-sdk-first-impressions.html' title='iPhone SDK first impressions'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-4133084786277647546</id><published>2008-03-09T10:41:00.000-07:00</published><updated>2008-06-15T20:29:21.268-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><title type='text'>Learning the iPhone SDK</title><content type='html'>&lt;div&gt;I thought it might be interesting to chronicle my learning of the iPhone SDK and building native apps for the iPhone.  I suspect that many engineers like myself will be coming from different development platforms and might find some value in learning from someone else's trials and tribulations of learning how do program for an iPhone.   &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Never having programmed for the MAC before this will be a completely new experience.   At this point I don't even own an iPhone, but I see it opening up new markets, distribution channels, and most of all a new way for humans to interact with computer (smart) devices.  For these reasons I wanted to try my hand at creating a native iPhone app.   &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Step 1 was downloading the SDK, which was a 2 day exercise in itself, due to glitches at the dev center site at Apple.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After downloading the SDK, I did something I rarely do, and this is start reading the docs.  Usually I just dive in, fire up an IDE and start trying to bang out an application.  In this case since, I have never programmed in objective C nor worked with the Xcode IDE I thought I would start at a higher level.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;More to come if my interest does not wane and it appears that these type of posts provide value to others.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-4133084786277647546?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/4133084786277647546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=4133084786277647546' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/4133084786277647546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/4133084786277647546'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/03/learning-iphone-sdk.html' title='Learning the iPhone SDK'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-2348317177759466885</id><published>2008-02-15T18:36:00.001-08:00</published><updated>2008-06-15T20:33:02.714-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Industry'/><title type='text'>Why I don't think Microsoft will ever "Get IT"</title><content type='html'>First a caveat, I come from a strong Microsoft background.  Since 1995 when the web really started to take off I have used MS technologies almost exclusively.  Prior to that, my experience in Pascal, C, Fortran, etc was all really on pre-PC systems.  Circa 2004, I found myself as a Principal of a well known San Diego based MS gold partner consulting firm.  I was responsible for delivering million dollar plus projects on the MS stack, and was a frequent speaker at MS events.  At the time I thought MS was the best thing since sliced bread.  They had phenomenal developer support, and went to great lengths to ramp people on their technology.&lt;br /&gt;&lt;br /&gt;Well a lot has changed in the last few years, least of which is my impression of MS technologies.  I always had a hard time understanding the prejudice I would see against MS technology, especially in the Fortune 1000 enterprise space, where even mentioning the name would get you a sour look from entrenched IT people.  I pretty much chalked it up to unsubstantiated emotional prejudice on the part of non MS people who liked to look down their nose at MS technologies and the people who used them.&lt;br /&gt;&lt;br /&gt;Now that I have departed from the MS stack and have been working almost exclusively with Adobe Flex and its related technologies for the past 2.5 years, I have been exposed to the other side of the coin.   I still do/manage some .Net development for our web services, file I/O and DB related stuff, but it only takes less than 5% of my engineering time.  The Flex community has a very open-source feel to it (I guess now it really is becoming open-source.)   When I first started working with Flex I was astonished to see that Macromedia (now Adobe) gave me as a developer direct access to the source code.  What joy!   I could see how things worked, tweak it, and learn from it.   Once I got involved with the Flex 2.0 beta, things got even better.  The team had a high level of transparency and I could actually talk with their engineers.&lt;br /&gt;&lt;br /&gt;What a stark contrast to my experience with MS.   Trying to talk to the real engineers in a MS beta was an impossibility.  The closest I ever got was a couple of product managers that were interested in what I was doing because I somehow managed to get a solution put together that integrated Active Directory, BizTalk, MS Great Plains, Commerce Server, E-Connect, and several other major MS server technologies.  Apparently, my team was the first in North America, or even the world that actually got all the technologies to play nice with each other (interestingly enough it would have been impossible if I had not leveraged VMWare.)  The attitude at MS on their betas, at least in my experience, was that it was a HUGE privilege to be invited, like getting to sit at the altar of some god.&lt;br /&gt;&lt;br /&gt;All in all, MS runs a very opaque shop. In light of how much traction open source is getting, and what a refreshingly cooperative and community feel it has to it, the MS approach leaves one with a bitter taste once they have experience life on the other side.&lt;br /&gt;&lt;br /&gt;What prompted me to write this post, is that just today I was working with one of our engineers, helping him to create a .Net setup project.   This was something I had done a few years ago, and I remembered it as being pretty trivial.   The challenge I was facing today, is that our engineer - who is a very bright guy, was struggling to put together the setup package.  The MS Docs were next to useless, and when I saw what the MSDN has devolved to I was shocked at how hard it was to find good information on how to do the most basic of things.&lt;br /&gt;&lt;br /&gt;What became clear to me today, and something I have been coming to understand over the past couple of years is this.  Microsoft will never "get-it", it is a cultural thing and it starts at the top and ripples down to permeate everything at MS.   What I mean by "get-it" is that MS just does NOT understand basics of human computer ( or anything for that matter) interaction.   Their applications all seem to have been designed with a bottom up approach, where usability is bolted on versus built upon, their documentation is obtuse and hard to follow in any practical way, their UI's suffer from some significant usability issues,  etc...   Overall, I just see MS falling behind quickly, at least when it comes to the relevance (versus the dominance) of their technology.&lt;br /&gt;&lt;br /&gt;I realize that is some pretty harsh criticism, and I am not saying I think MS is evil or puts out terrible software,  I just think they are having a hard time embracing the innovation that is occurring around them, and they are out of touch with the evolving paradigms of developing usable software and products.    The result is sub-optimal software and tooling.&lt;br /&gt;&lt;br /&gt;I would be remiss if I did not mention a few MS products that I hold in high esteem.  First, Excel, it is an amazing tool and incredibly powerful for what it is, it meets so many use cases and has a broad and varied user base.  Second, SQL Server 2005 - amazing set of tools that do pretty much anything you want with a DB, their ETL and OLAP has some really nice tooling.    Finally, Visual Studio, a GREAT IDE, that has yet to be matched by any other product I know of.  Eclipse has quite a ways to go before it matches the functionality and utility of Visual Studio.   I only wish I could build flex/air apps in Visual Studio!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-2348317177759466885?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/2348317177759466885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=2348317177759466885' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/2348317177759466885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/2348317177759466885'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/02/why-i-dont-think-microsoft-will-ever.html' title='Why I don&apos;t think Microsoft will ever &quot;Get IT&quot;'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-2545898326990269101</id><published>2008-01-23T09:46:00.000-08:00</published><updated>2008-07-23T17:41:07.586-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Component Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Commercial Components for Flex</title><content type='html'>I just recently became aware of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;ILOG&lt;/span&gt; &lt;a href="http://www.ilog.com/products/elixir/"&gt;Elixir&lt;/a&gt;, which is a set of advanced data visualization components for Flex (Gauges/Dials, Maps, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Treemaps&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Gantt&lt;/span&gt;, etc) that will be distributed and sold directly by Adobe for approximately $800.  Last night I downloaded the beta to check them out, as we have already built several of the less complex components internally.&lt;br /&gt;&lt;br /&gt;While I was impressed with the work that I know must have gone into building these components, I was less impressed with the end result on a couple of fronts. First, most of the components I looked at did not appear to be very extensible, at least on the surface.  For instance their Gauge component came in one color, BLACK...., with no obvious property to alter the primary color.   Admittedly I did not do a deep dive in the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;API&lt;/span&gt;, and I could be missing something here.   The second area of disappointment was the lack of a polished &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;UI&lt;/span&gt; and set of skins.  The components seemed to be highly functional, but lacked the polish we are all coming to expect of commercial level &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;UI&lt;/span&gt; that can be seen in most premier &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;RIA&lt;/span&gt; and commercial OS like Leopard and Vista.   Putting that polish on the components does not seem like it would be a lot of work normally, but when you take into account the lake of available properties in the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;API&lt;/span&gt; it could be a bit challenging.&lt;br /&gt;&lt;br /&gt;What I found really interesting is that just this morning I discovered an open source effort that builds one of the more complex components in Elixir.    It appears Josh &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Tynjala&lt;/span&gt; has released his own &lt;a href="http://www.zeuslabs.us/2008/01/21/flex-treemap-component-updates/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;TreeMap&lt;/span&gt;&lt;/a&gt; component.   On the surface this component looks every bit as good as the one offered by &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;ILOG&lt;/span&gt; AND it is open source.&lt;br /&gt;&lt;br /&gt;This begs the question:  "Will we see more third party components developed commercially or via the community?"    Coming from more of a closed source mindset (Microsoft) where there was a proliferation of commercial third party developer tools it is hard for me to evaluate.   My experiences over the past couple years working with Flex, the team at Adobe, and the growing community tells me that more and more developer tools and components will be created via the community.  Part of the reasoning here is that it is a cultural issue, the second part is that AS3 and Flex just make it &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;sooo&lt;/span&gt; easy to do. &lt;br /&gt;&lt;br /&gt;There are other complexities to this question, as it brings into question the viability of third party developer markets for Flex, which I think will be very strategic for Adobe to successfully penetrate the larger developer market.   Microsoft has been very good at this, but they did so with a completely different set of cultural values (closed source proprietary.)  I will be following this closely as the it could have a significant impact on the direction we take our business.&lt;cite&gt;&lt;/cite&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-2545898326990269101?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/2545898326990269101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=2545898326990269101' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/2545898326990269101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/2545898326990269101'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/01/commercial-components-for-flex.html' title='Commercial Components for Flex'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-2048679703593995094</id><published>2008-01-16T18:18:00.000-08:00</published><updated>2008-06-15T20:27:22.651-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex Community really taking off</title><content type='html'>I fell in love with flex when I first started using it back in October of 2005 with the Flex 2.0 alpha.  I loved it so much I started a business that used it is as its primary technology and based a big part of the business strategy on the assumption everyone would love it as much as I did and the developer community would grow quickly.   Well I was partly right, everyone DID love it, especially the end-users in our target market (BI dashboard consumers.)  What I didn't anticipate was that the DEMAND for flex talent would be so high that trying to find a flex developer was next to impossible.&lt;br /&gt;&lt;br /&gt;The wrinkle for me as a business owner was that I built a platform that was designed to host Flex dashboards, but it would require flex developers to build client specific content for the platform in the form of flex dashboard applications.   For a client to gain any value from our platform they would need content tailored to their unique needs (think of a typical intranet portal.) For our marquee (read Fortune 500) clients we would offer professional services to build their dashboards, but our whole goal was to sell recurring revenue via a SaaS business model, not via professional services.   We soon ran into roadblocks in the sales process when we would tell clients that in order to extend, or add dashboards they simply had to just "hire a flex developer.."  Well that was pretty much where the sales conversation ended, because we were asking them to find a resource, we ourselves couldn't even find (I ended up hiring good Java, and C++ developers and trained them on Flex myself.)   The demand for Flex had far outstripped the supply.  I was hearing rates of $250/hr + for Flex engineering work!&lt;br /&gt;&lt;br /&gt;What I didn't anticipate, or said more accurately "think-through",  is that there would be a lag between the demand generated for Flex and RIA, and the resources to fulfill the demand.  Well things are getting slightly better.  I see evidence (anecdotal) that the Flex developer community is really starting grow, with community sponsored events like &lt;a href="http://www.360conferences.com/360flex/"&gt;Flex 360&lt;/a&gt; we see a huge groundswell starting to manifest.&lt;br /&gt;&lt;br /&gt;I also am starting to see the community filling needs in regards to the flex code base/framework faster than Adobe can with projects like  &lt;a href="http://www.model-glue.com/flex.cfm"&gt;Model Glue&lt;/a&gt;, &lt;a href="http://www.degrafa.com/"&gt;Degrafa&lt;/a&gt;, and &lt;a href="http://code.google.com/p/flexmdi/"&gt;FlexMDI&lt;/a&gt;.  Projects like this are really exciting to see, and have huge implications in regards to the efficacy of open source and the implications it has with business strategy when it comes to running a software company.&lt;br /&gt;It seems now that the supply is starting to slowly catch up with the demand, and I realize one of the major accelerators that are filling the supply side of the equation is the open source community.   This realization is partly responsible for me taking a serious look at how we can contribute to the effort because it appears to be a true win-win.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-2048679703593995094?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/2048679703593995094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=2048679703593995094' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/2048679703593995094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/2048679703593995094'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/01/flex-community-really-taking-off.html' title='Flex Community really taking off'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-4780843636415802743</id><published>2008-01-13T14:36:00.001-08:00</published><updated>2008-06-15T20:28:31.814-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dashboards'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>What would be needed in a Flex Dashboard Framework?</title><content type='html'>Flex/AS3 does so many things well, and in my opinion is one of the most productive languages to create complex &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;MVC&lt;/span&gt;&lt;/span&gt; type &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;UI&lt;/span&gt;&lt;/span&gt; applications.   That being said, some work in Flex I can find to be very tedious.  While the class structures and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;OO&lt;/span&gt;&lt;/span&gt; all seem very elegant at the documentation/class level, the pragmatic use of some of the structures can create some &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;odious and repetitive&lt;/span&gt; coding.&lt;br /&gt;&lt;br /&gt;Take the charting for example.  I can't tell you how many times I had to hunt around to figure out how to "adjust" the color/thickness/alpha for the horizontal and vertical axis, while not terribly complicated you either need to go down down about three levels of property chains in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;MXML&lt;/span&gt; or AS to get to the correct properties.   When doing this for half a dozen charts in one application, it can get time consuming and verbose.&lt;br /&gt;&lt;br /&gt;The other challenge we run into, is having to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;munge&lt;/span&gt; source data into a format appropriate for the charts to consume.  Internally we have built some more hardwired models that allow us to point to a data structure and have it "transformed" into something the charts can read.  I think more ideally we could extend the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;ICollectionView&lt;/span&gt; to include some transforms so that not only can we see sorted/filtered data as &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;bindable&lt;/span&gt; properties, but also transformed (aka &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;OLAP&lt;/span&gt; pivot/slice/query) data that multiple charts could consume.&lt;br /&gt;&lt;br /&gt;Finally, the last main challenge we run into, which is not unique to dashboards, is &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;architecting&lt;/span&gt; a proper event driven &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;MVC&lt;/span&gt;.    Dashboards tend to bring the limits of a non &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;MVC&lt;/span&gt; approach to a head rather quickly (specifically highly interactive dashboards with drill up/down/across capabilities.)  What first starts off as an easy "hard-coded" approach shortly winds up with piles of spaghetti strewn across several &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;MXML&lt;/span&gt; components.    Most &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;MVC&lt;/span&gt; frameworks like &lt;a href="http://labs.adobe.com/wiki/index.php/Cairngorm"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;Cairngorm&lt;/span&gt;&lt;/a&gt; are way to heavy though for simple dashboards.   Frameworks (and I am probably using the term incorrectly here) like &lt;a href="http://www.model-glue.com/flex.cfm"&gt;Model Glue&lt;/a&gt; seem more appropriate, but I suspect we could develop something even lighter and more tightly geared for building Flex based dashboards.&lt;br /&gt;&lt;br /&gt;So as I see it the three primary areas to build a framework/convention/micro-architecture around would solve these three challenges.&lt;br /&gt;&lt;br /&gt;1. Easy way to set styles/properties of objects without having to traverse deep object trees.&lt;br /&gt;2. Easy way to load source data and transform it for charting.&lt;br /&gt;3. A ultra-lightweight &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;MVC&lt;/span&gt; framework geared for Dashboard &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;UI&lt;/span&gt; challenges.&lt;br /&gt;&lt;br /&gt;- Tom&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-4780843636415802743?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/4780843636415802743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=4780843636415802743' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/4780843636415802743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/4780843636415802743'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/01/what-would-be-needed-in-flex-dashboard.html' title='What would be needed in a Flex Dashboard Framework?'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-2911669747211804029</id><published>2008-01-12T08:36:00.000-08:00</published><updated>2008-06-15T20:27:22.652-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flash Player Update - Not so good</title><content type='html'>I am not sure how many other flex developers have experienced this, but the latest rev's of the Flash player break some existing Flex generated content.   I don't mean slightly annoying UI issues, the player downright stops the application from functioning.&lt;br /&gt;&lt;br /&gt;The two issues I have found when running Flex content that has been generated by the latest version of Flex Builder 2 (2.0.1) inside a flash player version higher than 9.0.4xx (mostly the player targeted for AIR and Flex 3) are the following:&lt;br /&gt;&lt;br /&gt;1. var myObj:SharedObject=new SharedObject();&lt;br /&gt;2. myObject.function = function dummyFunc():void { //do something }&lt;br /&gt;&lt;br /&gt;In the first case I suspect that statement was never valid in the first place, but we had code that was compiled in Flex 2 that had these statements and the compiler never complained.  Now if we try to run these .swf's within the latest player the application stops working after burping an error telling us we can not instantiate a SharedObject (i believe it is a static class)&lt;br /&gt;&lt;br /&gt;The second case is less obvious, but basically the new player will not allow anonymous NAMED functions.   So the statement must read like the below. &lt;br /&gt;&lt;br /&gt;myObject.function = function ():void { //do something }&lt;br /&gt;&lt;br /&gt;I remember reading another blog post that pointed me to this.&lt;br /&gt;&lt;br /&gt;Anyway, I am surprised Adobe is doing auto-updates with these types of changes and not making the developer community aware of the potential pitfalls.... The more Flex becomes prevalent on the web in public web sites the more things like this will become an issue.&lt;br /&gt;&lt;br /&gt;- Tom&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-2911669747211804029?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/2911669747211804029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=2911669747211804029' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/2911669747211804029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/2911669747211804029'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/01/flash-player-update-not-so-good.html' title='Flash Player Update - Not so good'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-4130054911262962134</id><published>2008-01-10T19:13:00.000-08:00</published><updated>2008-07-23T17:41:20.985-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dashboards'/><category scheme='http://www.blogger.com/atom/ns#' term='Component Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Open Source Dashboard Framwork for Flex</title><content type='html'>After spending the last two years building Flex based dashboard technologies primarily for our &lt;a href="http://www.dashboardcompany.com/"&gt;VFX Dashboard Platform&lt;/a&gt; we are ready to start contributing something to the community.  In the past couple years building flex based dashboards for our clients we have streamlined the process to go from requirements to final solution.  We have iterated over design patterns and frameworks, each time surprised at our ignorance from the iteration before as we found yet another nugget in Flex we were not leveraging.&lt;br /&gt;&lt;br /&gt;At this point I am interested in creating an open source dashboard framework for Flex that accelerates the development time to build a rich, complex dashboard bridged across many data sources and highly interconnected and interactive.  My goal is to create a framework powerful and compact enough to allow a new Flex developer to build a compelling solution purely in MXML.  I am not sure if that goal is attainable, but I think it is one worthy shooting for.&lt;br /&gt;&lt;br /&gt;Flex 3 has introduced many new features which we can take advantage of, both in the charting classes and the new OLAP classes.   One of the biggest struggles is the repetitive, but client specific code we have to write that takes source data and mungesit into an appropriate format that we can chart from.   I am interested in spending some time with the OLAP classes to see if we have some easier ways of transforming source data into usable charting data.&lt;br /&gt;&lt;br /&gt;Initially I will probably just release some sample code, and depnending on the audience it gets over time potentially creating an open source project.   Right now I am in a pure Proof of Concept state on putting together an appropriate set of samples that would sit outside, but work tightly with some of our more proprietary VFX platform code.&lt;br /&gt;&lt;br /&gt;- Tom&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-4130054911262962134?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/4130054911262962134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=4130054911262962134' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/4130054911262962134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/4130054911262962134'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2008/01/open-source-dashboard-framwork-for-flex.html' title='Open Source Dashboard Framwork for Flex'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-114013166020984947</id><published>2006-02-16T15:08:00.000-08:00</published><updated>2008-07-23T17:41:32.667-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Data Visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>The Purist and their Ivory Towers</title><content type='html'>There is a school of thought in the world of data visualization that I like to refer to as the "purist" approach. This outlook and view has been adopted by a few prominent individuals who specialize in data visualization, most of who are simply re-hashing or misinterpreting the work of &lt;a href="http://www.edwardtufte.com/tufte/"&gt;Edward Tufte&lt;/a&gt;. The reason why I felt the need to comment on this phenomena, is that these practitioners speak with such an air of authority and arrogance that a neophyte reading their material would come away with a very skewed perspective on how to apply data visualization best practices in a pragmatic manner, specifically when it comes to designing effective business performance dashboards..&lt;br /&gt;&lt;br /&gt;To help understand how to recognize this school of thought I have listed some of the more salient characteristics that can be seen over and over again when reading their materials.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The purist spends 80% of their time pointing out what is wrong in others work through diligent critiques while only showing brief examples of what they propose to be more optimized solutions.&lt;br /&gt;&lt;li&gt;The purist has a strong disdain for any aesthetic “decoration” or consideration within a dashboard design.&lt;br /&gt;&lt;li&gt;The purist favors “efficient’ but more obscure visualization metaphors that leave the typical information consumer confused.&lt;br /&gt;&lt;li&gt;The purist usually ignores the interactivity of the medium and usually reserve their critiques to static 2d analysis, as if the computer monitor where a piece of paper versus a device that the user can interact with (via the keyboard, mouse, etc..)&lt;br /&gt;&lt;li&gt;The purist is usually not a technologist, and as such offers advice that is more suited to float in the rarified air of academia than being grounded in the pragmatism of one who actually uses technology on a daily basis to accomplish business objectives.&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Let’s take a closer look at some of these characteristics and how they truly undermine the purported goal of improving the practice of data visualization&lt;br /&gt;&lt;br /&gt;Critique before Praise: I will give them this: the purist, if nothing else, is passionate. Unfortunately this passion seems to take the form of an almost evangelistic criticism of most software vendors and their dashboard visualization tools. In my experience when writing articles that are aimed at teaching best practices in data visualization, one of the easiest things to do is to point out bad examples of other peoples work. Unfortunately this approach does little to help readers quickly master the basics of good design; instead they are left with a catalogue of what not to do and no information on what should be done. The irony of this approach is that contrary to the visual “efficiency” the purist is trying to advocate, their literary approach is extremely inefficient as the big take away the reader has is all of the things that should NOT be done.&lt;br /&gt;&lt;br /&gt;Aesthetics have no place in Data Visualization: While it is true that “sex sells”, and most dashboard vendors spend a lot of time drawing attention to their hyper realistic gauges and dials, it is not true that these “decorations” are ineffective. When properly used, aesthetics can play a huge rule in the effectiveness of a dashboard. Studies have shown that aesthetics play an important role in the &lt;a href="http://www.ise.bgu.ac.il/faculty/noam/papers/04_tl_nt_ijhcs.pdf"&gt;perception&lt;/a&gt;, and &lt;a href="http://www.tu-darmstadt.de/fb/fb3/psy/soz/veroeffentlichungen_mh/vt_hassenzahl_final.pdf"&gt;ease of use.&lt;/a&gt; Dashboards have a unique set of requirements from a business and data visualization perspective, some of these requirements are quite a bit different from the requirements of doing data exploration or data analysis across large volumes of data. If a dashboard is being built to help monitor certain measures or operations that support a key business strategy or objective, I would think doing everything in your power to encourage end users to use and look at these measures would be a positive thing. The aesthetic appeal of the dashboard and the resulting emotional reaction to the visualization plays a large role in how easy users find the tool to use and how receptive they are in wanting to look deeper at what is being displayed. Using interactive and eye-catching features like realistic gauges, specular highlighting, and other visual cues helps to engage the end user and can also be used to emphasize the more important information within a dashboard. In some of my presentations and writing I talk about creating a visual hierarchy to your dashboard designs. This hierarchy is designed to reinforce the level of importance of each KPI or measure so that it reflects the importance of the business decisions that are being made from the particular metrics. Using these more engaging visualizations and contrasting with more subtle and flatter visualizations can be an ideal way to reinforce this visual hierarchy.&lt;br /&gt;&lt;br /&gt;Efficient but Obscure: One thing I am struck with immediately when looking at some of the more esoteric visualization approaches advocated by some of the purists is that the meaning of the data being showed is not immediately obvious. While many of these visualizations are extremely ingenious and very efficient in terms how much information that can be imparted in a small amount of space, the problem is that the user ends up struggling to understand what is being shown. The user ends up spending a significant amount of attention reading through explanations, digesting the visual relationships, and learning the new graphical metaphor. Once the visual representation is understood and assimilated through repeated use we can began to let our natural pattern recognition processes within our brains help us to quickly digest the data. But this misses the point, that the goal is not to teach end users some new and novel way to visualize information, but rely upon the current mechanisms they are used to in terms of visualizing data that allow for that “instant recognition” when seeing data. When a user is forced to invest intellectual thought into digesting the meaning of the spatial and visual representation of the data – they are no longer leveraging their powerful and native pattern recognition capabilities. Not that these novel approaches to visualization don’t have their place in data analysis, they just don’t belong on a business dashboard. The trick to doing great dashboard visualization work is to capitalize upon the visualizations and metaphors that users are accustomed to (and thus recognize naturally) to impart important business information that allows the user to make more efficient and timely decisions.&lt;br /&gt;&lt;br /&gt;Escaping Flatland: &lt;br /&gt;&lt;br /&gt;"We envision information in order to reason about, communicate, document, and preserve that knowledge -- activities nearly always carried out on two-dimensional paper and computer screen. Escaping this flatland and enriching the density of data displays are the essential tasks of information design." &lt;br /&gt;     - Edward R. Tufte, Envisioning Information. &lt;br /&gt;&lt;br /&gt;Tufte serves as the canonical figure most often quoted or referenced by the purists, and the sad irony is that the purists seem to miss some of his most fundamental points. This is no more obvious than in the critiques that show a screen shot of a particular vendor’s dashboard tool that is then dissected as if it were a static object. Very little (if any) analysis is given to the more dynamic and interactive features of these dashboards. When an designer capitalizes upon the more dynamic nature of the vendors toolset and is able to effectively leverage the technology to selectively drill, filter, magnify, and highlight relevant data, these screens come to life and provide a very rich and dynamic interface for the user to immerse themselves more cognitively with the information at hand.&lt;br /&gt;&lt;br /&gt;The Ivory Tower: In the real world we have users that don’t have the time to understand new and novel ways of visualizing data, customers who are impressed by the “sex and sizzle” and make purchase decisions accordingly, software tools that cant do everything perfectly, data that doesn’t meet clean and pre-defined notions. Real world solution providers have experience creating businesses and successful solutions while dealing with all of these variables and more. The purists on the other hand climb up into their Ivory Towers (usually a self-promoting column they have secured in one of the plethora of industry trade publications) and pontificate upon the finer points of data visualization expecting business users to change the way they think to meet their strict views on how to best present information. If the purist truly wants to change the way business people perceive data, they would develop a product that does that, market it, sell it, and implement it. Or at the very minimum, provide pragmatic and real world examples of how to do that with common software found in today’s market place. But then again that might actually force the purist to climb down from their tower and get their hands dirty in the work of solving real world problems with real world technology.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-114013166020984947?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/114013166020984947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=114013166020984947' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/114013166020984947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/114013166020984947'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2006/02/purist-and-their-ivory-towers.html' title='The Purist and their Ivory Towers'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-113203315684278322</id><published>2005-11-14T21:38:00.000-08:00</published><updated>2008-07-23T17:41:32.667-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Data Visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>A Picture is worth 3 billion words</title><content type='html'>One of the phenomenal aspects of the human brain is its ability to behave like a massively parallel set of processors, being able to simultaneously digest multiple streams of information at speeds that would stymie some of the most advanced super computers.&lt;br /&gt;&lt;br /&gt;While traditional x86 computer processors can only process one instruction set at a time, albeit at amazing speeds, they can not process information in parallel. While a human might be able to make 1 or 2 mathematical calculations per second, and a computer is capable of billions, a human can still instantly recognize a smile, while a computer can not. All of the computers power comes from its ability to do calculations in serial, one after another, at amazing speeds; at its core all a computer is doing is performing simple Boolean equations between bits that either have a 1 or 0 value. It is just doing billions of them in fractions of a second.&lt;br /&gt;&lt;br /&gt;But, when you apply the computers incredible serial processing capabilities to very complex mathematical problems (like using multivariate analysis to discern the meaning of a facial expression) you hit a brick wall very quickly. Using a brute force linear approach to solve these problems will bring some of the most powerful computers to its knees. So if you ask a computer to search gigabytes of text data for the word “flower” it will do an amazingly quick job of finding it (relatively easy mathematical calculations using powerful sort algorithms), but if you scan a picture of your front yard in the spring time and ask the computer to identify a blooming flower, it will have a much more difficult time.&lt;br /&gt;&lt;br /&gt;Humans have an amazing ability to process certain types of information in a more instantaneous way, this is most evident in the way we process visual information. A very real example is the way we can analyze numbers represented as visual patterns exponentially quicker than we can analyze a set of numbers in their native form. If you were to look at a spreadsheet filled with hundreds of weekly sales numbers across product lines, versus looking at a simple bar chart with the same data, which would you prefer to determine which products sold more than others?&lt;br /&gt;&lt;br /&gt;Lets look at this example more closely. When we look at the bar chart we can “instantly” see each bar in relationship to its neighbor and “instantly” see which ones are higher than others. This analysis and understanding happen in an instant, it isn’t even a conscious thought. It is the same as you identifying what color something is, you simply know it. Conversely, if we were looking at the numbers in a spreadsheet we need to do many more mental gymnastics. First we need to read the number which is a visual pattern in itself, and a combination of visual symbols usually consisting of one or more digits like: “123,456.” We then have to consciously make a mental comparison of each number against the others. This is a conscious and thus linear process, in which we are much slower than a computer.&lt;br /&gt;&lt;br /&gt;So if you look at a visual representation of data you are able to process information almost instantly, but if you need to look at a raw data itself, you will be forced to consciously digest it in a linear fashion.&lt;br /&gt;&lt;br /&gt;One of the fundamental areas we focus on in our information visualization work at BrightPoint Consulting, is to figure out ways to leverage humans naturally given pattern processing engines. To the degree we can present relevant information in visual patterns that users can take advantage of, we succeed in creating a more effective and efficient interface between the user and the data they interact with.&lt;br /&gt;&lt;br /&gt;In the face of the exponential growth of data and information that 21st century humans need to deal with on a daily basis, technologies that allow people to more effectively process that information is not only a great opportunity for new business, but it is something that helps society as a whole. We are relieved of the tedium of repetitive information processing tasks and freed up to focus on higher level functional tasks that result from the understanding of the underlying patterns.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-113203315684278322?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/113203315684278322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=113203315684278322' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/113203315684278322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/113203315684278322'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2005/11/picture-is-worth-3-billion-words.html' title='A Picture is worth 3 billion words'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-112933851373671830</id><published>2005-10-14T17:55:00.000-07:00</published><updated>2008-06-15T20:33:02.715-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Industry'/><title type='text'>There Has to be a Better Way.</title><content type='html'>&lt;p&gt;&lt;strong&gt;Problem Domain:&lt;/strong&gt;&lt;br /&gt;During the course of the day I probably work with and open 75-100 files, all organized into the dozens of client folders that I have. Each client might have mulitple projects etc, so repeatedly getting to files requires this endless drilling through the directory structures. I find this task repetitive, tedious, and annoying. Each time I search for a file I have to consciously read each directory label since they each look the same visually, once a directory unfolds I then have to repeat the process. I estimate that I spend probably about 4-6 seconds to find a file on average. I probably repeat this task 100 times a day. The cost to me is anywhere between 400-600 seconds a day... multipy that out over the year (assuming 250 work days) and you are talking conservatively over 25 hours of my year spent searching for and opening files !!!! Now I am not sure what your time is worth to you, but I certainly have better things to do than spend what could amount to a 3 day vacation opening and closing files.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;A Potential Solution:&lt;/strong&gt;&lt;br /&gt;During the course of the day, there are some files I use over and over again, whether it is particular to a client or project I am working on, or a certain technology or package. Most of these are located in the same proximity to each other on the file system as I organize my files by related subject areas. &lt;/p&gt;&lt;p&gt;What if the File Explorer (Windows) remembered which files I openend most recently, and how often I opened them? It could remember this over the course of minutes, hours, days, weeks. Now, if the File Explorer knew what I had openend most recently, and how many times I opened it, it could use some deductive logic and mark these directories and files for me visually. What if the directory or file was a different color/size/shape based on how recently I had been there, or how many times I opened it? This would allow me to use my naturally given parallel processor (visual cortex) to instantly see these patterns and guide me to the most likely navigation path without me to have to constantly read directory and file names. Even if I just shaved 2 seconds off my time, that would amount to 100 hours in my pocket :)&lt;/p&gt;&lt;p&gt;I have done googles across the web to try and locate such a tool, because to me it would seem that someone smarter and more adept would probably have already built one. But alas, I could find none. This is a product waiting to happen!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-112933851373671830?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/112933851373671830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=112933851373671830' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/112933851373671830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/112933851373671830'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2005/10/there-has-to-be-better-way.html' title='There Has to be a Better Way.'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-112900924962000120</id><published>2005-10-10T19:24:00.000-07:00</published><updated>2008-06-20T18:02:24.494-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Industry'/><title type='text'>Macromedia/Adobe versus Microsoft</title><content type='html'>My software development experience dates back over 20 years, but in the past 8 years I have worked almost exclusively on the Microsoft platform. One thing that I thought Microsoft did that was absolutely ingenious (and viral) was to practically spoon feed its development community. With their MSDN subscriptions and robust API documentation you could practically teach yourself to do anything with their technology. They also made it a primary focus to improve their development environments to make things as easy as possible. This is not to say their technologies are not without their problems and flaws, only that compared to any other platform I have tried, MS really got it right about catering to the development community.&lt;br /&gt;&lt;br /&gt;Lately I have been exploring new technologies to use for data visualization applications and have been looking into the wave of technology around Rich Internert Applications. After setting up OpenLazlso, Microsoft Atlas, and Macromedia Flex in a lab, It started to dawn on me that Microsoft has a good chance of loosing the desktop completely.&lt;br /&gt;&lt;br /&gt;It appears that Microsoft is betting the technological farm on Vista. All of the new and interesting desktop development efforts all will require Vista to support them, specfically Avalon or the Win FX platform. The challenge I have as business person and software architecture with that approach is that it would require me to develop applications around a platform that does not exist, and would require a user or company to upgrade their whole OS to take advantage of those new and importan features. In the best case scenario, if Vista ships on time, I could realistically expect only 50% of my target market to actually have it installed in about 3 years from now. That is quite a gamble for developing cutting edge client apps today.&lt;br /&gt;&lt;br /&gt;Then comes along Flash. As a programmer at heart, I always considered flash and action script to be a bit of a toy versus a real development platform, but you can't argue with some of the incredible things people are doing with flash. After a couple of aborted attempts to trying to program within timelines and layers I pretty much set it aside as I found the programming paradigm to cumbersome and akward to be productive in. But, I kept on getting drawn back to the fact that I was seeing amazing things being done. Specifically, amazing visual things, that could really open doors from a data visualization perspective.&lt;br /&gt;&lt;br /&gt;Along comes Zorn, Macromedia's merging of the open source Eclipse IDE with Flex, their flash based development platform. Now were talking.... When I found out the Macromedia hired away one of the guys who started and ran the Microsoft .NET product team, I really started to get interested. When I started poking around and realized that Flash has a 98% install base, across ALL types of devices (desktops, mobiles, even cameras) it really got my attention. Then when Macormedia announced last week they were dropping the price point of Flex from the enterprise level down to a price that pretty much any developer could afford AND they were going to release alpha bits to engage the developer community I realized they were going for the jugular at Microsoft. If Macromedia succeeds in winning over the development community they have a very strong chance of obviating the desktop, or at least the Windows one.&lt;br /&gt;&lt;br /&gt;The new flash player 8.5 that is planned on being released by Q2 2006, has a complete virtual machine encoded into it, allowing run-time debugging, exception handling, and support for an ECMA standard OO language. While a majority of the people who run flash are running off a windows desktop, it does not require one, and since the flash player footprint is so small the deployment concerns usually faced when you pair up your application with a development platform are pretty much mitigated. Try leveraging MS .Net with a desktop or server app, and you basically force your user into a 30MB download of the .net framework, if they don't already have it installed, or if they don't have the correct version.&lt;br /&gt;&lt;br /&gt;All in all, I will be very interested to see how much traction Macromedia can get with the developer community around Flex and Flash, because if they succeed and are able to leverage their amazing market penetration with their Flash player, it could really change the way we approach client application development, and the way users view their desktop.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-112900924962000120?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/112900924962000120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=112900924962000120' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/112900924962000120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/112900924962000120'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2005/10/macromediaadobe-versus-microsoft.html' title='Macromedia/Adobe versus Microsoft'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17704783.post-112899710263358680</id><published>2005-10-10T19:12:00.000-07:00</published><updated>2005-10-10T22:44:20.216-07:00</updated><title type='text'>Welcome</title><content type='html'>My name is Tom Gonzalez and I am the managing director of a software development firm that specializes in a very small niche of the business intelligence community, dashboards and data visualization. In the course of delivering projects for clients and creating unique software products, I spend a major portion of my time working with new technologies and trying to predict what turns the industry will take and how different technologies will fit together.&lt;br /&gt;&lt;br /&gt;I have been skeptically sitting on the sidelines for the last several months, pondering the benefits of blogging. After reading the article in Business Week a few months back I realized that this medium is here to stay. What has prompted me to start my own blog, is that over the past several months I have gotten some very valuable information and insight from reading other blogs.&lt;br /&gt;&lt;br /&gt;I have a background in computer science and visual arts and one of my primary interests is to create technologies that make life easier for people and improve the aesthetics of their environment in a way that brings them more pleasure and satisfaction with their surroundings.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17704783-112899710263358680?l=form-function.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://form-function.blogspot.com/feeds/112899710263358680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17704783&amp;postID=112899710263358680' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/112899710263358680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17704783/posts/default/112899710263358680'/><link rel='alternate' type='text/html' href='http://form-function.blogspot.com/2005/10/welcome.html' title='Welcome'/><author><name>Thomas Gonzalez</name><uri>http://www.blogger.com/profile/05229292282425882395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
