<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>computers should be less friendly &#187; UI</title>
	<atom:link href="http://blog.danmcweeney.com/category/ui/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.danmcweeney.com</link>
	<description></description>
	<lastBuildDate>Mon, 10 Aug 2009 20:38:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>TechEd US 2007</title>
		<link>http://blog.danmcweeney.com/45</link>
		<comments>http://blog.danmcweeney.com/45#comments</comments>
		<pubDate>Thu, 04 Oct 2007 17:53:56 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[innovation]]></category>
		<category><![CDATA[SAP]]></category>
		<category><![CDATA[SDN blogger]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://blog.danmcweeney.com/45</guid>
		<description><![CDATA[So far the highlight of TechEd for me has been people&#8217;s reaction to Majority Desk.&#160; I said to&#160;a number of people before the demo that everyone&#8217;s reactions would be the same, &#8220;Oh my god&#8230;&#8221;&#160; The problem is that that reaction would come because of two very different reasons, &#8220;Oh my god&#8230; what is wrong with [...]]]></description>
			<content:encoded><![CDATA[<p>So far the highlight of TechEd for me has been people&#8217;s reaction to <a href="http://www.majoritydesk.com" target="_blank">Majority Desk</a>.&nbsp; I said to&nbsp;a number of people before the demo that everyone&#8217;s reactions would be the same, &#8220;Oh my god&#8230;&#8221;&nbsp; The problem is that that reaction would come because of two very different reasons, &#8220;Oh my god&#8230; what is wrong with you people that has no business value!&#8221; or &#8220;Oh my god&#8230; that is the coolest thing I&#8217;ve seen in a long time.&#8221;&nbsp; </p>
<p>It seems that most people fall in the latter category.&nbsp; I&#8217;ve already spoke to a number SDNers from all different industries who see how they can use this type of interface in a broad range of applications.&nbsp; A airplane manufacturer navigating large engineering drawings to business people visualizing data sets in 3d to see patterns.&nbsp; This was the reaction we were hoping to create in the community a true sense of innovation and possibility.&nbsp; It&#8217;s also been a blast watching people mess around with the interface.</p>
<p>Here are some great photos from hacker night with Mark Finnern and Marilyn Pratt messing around with Majority Desk.</p>
<p><a title="Photo Sharing" href="http://www.zooomr.com/photos/danmcweeney/3430359/"><img height="333" alt="IMG_1673" src="http://static.zooomr.com/images/3430359_904aa39586.jpg" width="445"></a></p>
<p><a title="Photo Sharing" href="http://www.zooomr.com/photos/danmcweeney/3430334/"><img height="500" alt="IMG_1682" src="http://static.zooomr.com/images/3430334_0d806761ed.jpg" width="375"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danmcweeney.com/45/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone Applications</title>
		<link>http://blog.danmcweeney.com/38</link>
		<comments>http://blog.danmcweeney.com/38#comments</comments>
		<pubDate>Thu, 26 Jul 2007 23:58:23 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[innovation]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://blog.danmcweeney.com/38</guid>
		<description><![CDATA[So, I came upon an iPhone to play with for a few days and decided I should try to learn about how the user applications run on it.&#160; There has been a lot of great work already by the guys on the iPhone Dev Wiki around getting SSH and such on the iPhone, needless to [...]]]></description>
			<content:encoded><![CDATA[<p>So, I came upon an iPhone to play with for a few days and decided I should try to learn about how the user applications run on it.&nbsp; There has been a lot of great work already by the guys on the <a href="http://iphone.fiveforty.net/wiki/index.php/Main_Page" target="_blank">iPhone Dev Wiki</a> around getting SSH and such on the iPhone, needless to say without their work this discovery would not have happened.</p>
<p>The point was to learn how the applications are structured and then see if I could add an existing application back to the iPhone with a different name and icon and have it run.&nbsp;Today Fred and I set out to see if we could get this to happen.</p>
<p>&nbsp;</p>
<p>iPhone applications look very similar to applications for OSX, makes sense as they both run some version of OSX.&nbsp; The file structure of the iPhone Calculator is this:</p>
<p><embed src="http://www.youtube.com/v/Xc5cVEqSAMY" width="425" height="350" type="application/x-shockwave-flash"> </embed></p>
<div class="wlWriterEditableSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:00f7a134-c0ca-4def-b4a5-4ac5745942a8" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color: white">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #000000">[</span><span style="color: #000000">/</span><span style="color: #000000">Applications]
    [</span><span style="color: #000000">/</span><span style="color: #000000">Calculator.app]
        Calculator
        CalculatorBackground.png
        Default.png
        [</span><span style="color: #000000">/</span><span style="color: #000000">English.lproj]
            InfoPlist.strings
            Localizable.strings
        Info.plist
        LCDBackground.png
        PkgInfo
        icon.png
        ring.png</span></div>
</pre>
</div>
<p>[ source: <a href="http://iphone.fiveforty.net/wiki/index.php/SystemFileAndDirectoryList#Applications" target="_blank">iPhone Directory listing</a> ]</p>
<p>For this example we will be trying to change the calculator app into some a touch more fun looking.&nbsp; First step is simple ( if you already have <a href="http://iphone.natetrue.com/" target="_blank">SSH on the iPhone</a> and the binkit on your iPhone)&nbsp; tar up the Calculator app and copy it to&nbsp;a Mac.</p>
<p><strong><font face="Trebuchet MS"></font></strong></p>
<h3>Executable [Calculator]</h3>
<p>The Calculator file is a compiled binary for the ARM platform running it from OSX produces the error message: &#8220;Bad CPU type in executable.&#8221;&nbsp;&nbsp;We assume that this has something to with the Universal application concept in OSX.&nbsp; It is opening that executable and looking to see if it has the ability it talk to an Intel/PPC processor it of course doesn&#8217;t so it craps out.&nbsp; First thing we did was to rename this file to foobar.</p>
<h3><font face="Verdana">Info.plist</font></h3>
<p>This is the file that has all the information about what to execute when a user clicks on the icon in the home screen.&nbsp; File is a regular plist file from normal OSX applications.&nbsp; The node to concern yourself with is CFBundleExecutable.&nbsp; This points at the binary you want to execute.&nbsp; So, in our case we need to point this node at our renamed executable.</p>
<h3><font face="Verdana">icon.png</font></h3>
<p>A few sites have already figured out you can change these around so, I won&#8217;t go into anymore detail then pointing you at the <a href="http://www.modmyiphone.com/" target="_blank">ModMyiPhone</a> wiki that describes the structure of <a href="http://www.modmyiphone.com/wiki/index.php/Iphone_PNG_images" target="_blank">iPhone pngs</a>.&nbsp; You don&#8217;t actually need to &#8220;optimize&#8221; your pngs for your iPhone.&nbsp; It can render regular ones just fine.&nbsp; We threw a &#8220;festive&#8221; graphic into our package.</p>
<h3><font face="Verdana">&#8220;Deploy&#8221;</font></h3>
<p>The final step is to move all these files over to the iPhone.&nbsp; Make sure you get the directory structure right:&nbsp; /Applications/foobar.app/ .&nbsp; Reboot the phone and you should see your newly renamed and functioning Calc application on the home page.</p>
<p><a title="Photo Sharing" href="http://www.flickr.com/photos/43234315@N00/909697083/"><img height="328" alt="IMG_1550" src="http://farm2.static.flickr.com/1373/909697083_7b7d320a24_m.jpg" width="437"></a></p>
<p>One other interesting that came of this is that the iPhone can&#8217;t have more then 16 applications on it.&nbsp; The home screen does not have the ability to scroll.&nbsp; We loaded 4 more&nbsp;copies of the calculator onto the phone and were unable to scroll down to see them.&nbsp; Maybe there is a simple change to the launcher application to allow the scrolling to happen or maybe Apple has to change the application to allow it.</p>
<p><a title="Photo Sharing" href="http://www.flickr.com/photos/43234315@N00/909697157/"><img height="362" alt="IMG_1551" src="http://farm2.static.flickr.com/1381/909697157_98f7d6c778_m.jpg" width="271"></a></p>
<p>You can see the little Handbrake icon peeking out from under the Buttonbar, but you can&#8217;t scroll down to see it.&nbsp; Sad.</p>
<p>No, this isn&#8217;t a new native application but, it gets us one step closer to deploying applications onto the iPhone once we can compile them, which is still a long way off.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danmcweeney.com/38/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Amateur Professionals</title>
		<link>http://blog.danmcweeney.com/32</link>
		<comments>http://blog.danmcweeney.com/32#comments</comments>
		<pubDate>Wed, 04 Jul 2007 20:46:55 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[SAP]]></category>
		<category><![CDATA[SDN blogger]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://blog.danmcweeney.com/32</guid>
		<description><![CDATA[Thomas Otter has a really great post talking about how enterprise UIs need to be more like &#8220;consumer&#8221; applications and that lumping business applications into a separate pile allows us to torture people needless in the name of &#8220;enterprise complexity.&#8221;&#160; While I agree with a lot of Thomas says &#8212; deep in there I think [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://theotherthomasotter.wordpress.com/" target="_blank">Thomas Otter</a> has a really great post talking about how <a href="http://theotherthomasotter.wordpress.com/2007/07/04/i-dislike-the-term-business-user/" target="_blank">enterprise UIs need to be more like &#8220;consumer&#8221; applications</a> and that lumping business applications into a separate pile allows us to torture people needless in the name of &#8220;enterprise complexity.&#8221;&nbsp; While I agree with a lot of Thomas says &#8212; deep in there I think he may have unknowingly hit upon an important topic.</p>
<blockquote><p>Labelling things enterprise, business or even professional enables a defence of complexity that shouldnâ€™t be tolerated without a challenge.
<p>People log on to consumer tools because they want to, but often they log on to enterprise applications because they have to. I donâ€™t think this should be an excuse to expose them to any more complexity than absolutely necessary</p>
</blockquote>
<p>I wondered when I read this if making the tool simpler is the correct path.&nbsp; Maybe we can learn a lot from a company like Adobe &#8212; they have never made Photoshop any easier to use.&nbsp; It is incredibly powerful and incredibly hard to use, just do a Google search for &#8220;<a href="http://www.google.com/search?hl=en&amp;q=%22photoshop+training%22" target="_blank">photoshop training</a>&#8221; and &#8220;<a href="http://www.google.com/search?hl=en&amp;safe=off&amp;q=%22sap+training%22" target="_blank">SAP training</a>&#8221; and you may start to see the correlation &#8212; approximately&nbsp;265k and 270k respectively (obviously wholly unscientific but,&nbsp;with a research budget of zero, that&#8217;s what you get).&nbsp;</p>
<h3><font face="Verdana">&#8220;Use(full|less) Intro&#8221;</font></h3>
<p>Lots of video games have totally useless and uneventful intro levels.&nbsp; Learning how to jump, run and fire your weapon, etc.&nbsp; Could it be possible that Adobe has done a good job of introducing the Photoshop tool set to it&#8217;s customers before they actually decide to go and spend the large amount of money on the big software package?&nbsp; I can honestly say that I don&#8217;t know if Adobe does this, do you slowly work into the larger Photoshop toolset from the other available Adobe applications?&nbsp; Is there some really great indoctrination path for Adobe tools?&nbsp; Maybe they have some brainwashing secret sauce that SAP could get.</p>
<h3>Casual Users = Consumer Users</h3>
<p>If you are at all interested in UI you should go buy <a href="http://www.amazon.com/Design-Everyday-Things-Donald-Norman/dp/0465067107/ref=pd_bbs_sr_1/105-6846769-9734812?ie=UTF8&amp;s=books&amp;qid=1183580681&amp;sr=8-1" target="_blank">Design of Everyday Things</a>&nbsp;by Donald Norman.&nbsp; In it Norman&nbsp;talks about putting information into the world so that occasional users can have visual and physical clues about how to make your system work.&nbsp; If you keep up with Seth Godin, he mentions a <a href="http://sethgodin.typepad.com/seths_blog/2007/07/you-can-ask-fir.html" target="_blank">similar concept in marketing</a>, &#8220;Be obvious about it. A sign that says First Time Here in three or four languages is a fine place to start. You can explain that while you serve minestrone, the locals come for the gumbo.&#8221;&nbsp; This all combines into making the system usable for the people who only use it occasionally.&nbsp; Norman also, talks about how you have to have an understanding of what people are going to use your object for before you set on the task of designing it.&nbsp; Again, however, Seth has an interesting real world comparison.&nbsp; Why <a href="http://sethgodin.typepad.com/seths_blog/2007/07/reorganizing-fo.html" target="_blank">aren&#8217;t stores organized to help us shop and help us buy things</a>:&nbsp; </p>
<blockquote><p>So, all the Armani blue suits are next to each other, then by size.
<p>So, all the boxer shorts at the Gap are on a wall, organized by style first (checks over here, stripes over there,) then by size.
<p>So, all the power tools at Home Depot are together, sometimes by brand, sometimes by function (saw) and then by type of material to be cut (wood).
<p>This is dumb, and the web makes it obvious why it&#8217;s dumb. It&#8217;s dumb because it makes it easier for the clerk, not for the customer. And dumb because it plays to the label&#8217;s ego, not to ours.
<p>Does anyone say, &#8220;okay, even though my son wears size large boxers, these striped ones are really nice, I&#8217;ll buy the small instead.&#8221; Of course not.
<p>So why not put all the large boxers right next to each other, regardless of designer and style?</p>
</blockquote>
<p>Amazon and Google are designed with both these concepts in mind.&nbsp; Google has 1 box and 1 button.&nbsp; When you are searching you have something in your mind to type.&nbsp; Well, that goes in the box.&nbsp; With only one button on the screen, well human nature just forces you to push it.&nbsp; Amazon does a stellar job with the latter case, you just bought a pair of shoes, other people who bought that pair of shoes bought these socks.&nbsp; Simple?&nbsp; Yes.&nbsp; Easy to do?&nbsp; No.</p>
<h3>Who are &#8220;they&#8221;</h3>
<p>Photoshop is made for people who already understand Photo editing &#8212; it uses terms they understand and have used for years in moving from the ranks of Amateur to Professional.&nbsp; It puts those terms and arranges those buttons to support those Professionals&#8217; normal mode of working.</p>
<p>This may force us to rethink how we target Business applications.&nbsp; Are &#8220;<a href="http://theotherthomasotter.wordpress.com/2007/07/04/i-dislike-the-term-business-user/" target="_blank">business users</a>&#8221; (thanks for the cringe Thomas) true professionals, like our Photoshop fans or are they people who move between jobs being novices in lots of areas.&nbsp; Should be be designing tools to indoctrinate people into our toolset and transform them into a professional?&nbsp; Or are they always going to be casual users of the business tools simply consuming them as they flow through our enterprises?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danmcweeney.com/32/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Flex / Twitter App Take 2</title>
		<link>http://blog.danmcweeney.com/29</link>
		<comments>http://blog.danmcweeney.com/29#comments</comments>
		<pubDate>Thu, 14 Jun 2007 18:44:08 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://blog.danmcweeney.com/29</guid>
		<description><![CDATA[If you think this looks like any fun and don&#8217;t know anything about WPF go check out Kurt Brockett&#8217;s blog for an interesting challenge. Thanks to a great tip from Matt Chotin, from Adobe, in the comments of my previous post I take a massive step forward in the UI department.&#160; Again, the Open Source [...]]]></description>
			<content:encoded><![CDATA[<p>If you think this looks like any fun and don&#8217;t know anything about WPF go check out <a href="http://www.brockett.net/?p=187">Kurt Brockett&#8217;s blog</a> for an interesting challenge.</p>
<p>Thanks to a great tip from <a href="http://weblogs.macromedia.com/mchotin" target="_blank">Matt Chotin</a>, from Adobe, in the <a href="http://blog.danmcweeney.com/28#comment-2223">comments of my previous post</a> I take a massive step forward in the UI department.&nbsp; Again, the Open Source gods ( is this open source? ) work their magic to give me an even more useful component:&nbsp; <a href="http://mark-shepherd.com/blog/2006/11/17/a-flex-component-for-graph-visualization/" target="_blank">SpringGraph</a>&nbsp;from another Adobe Engineer ( seeing a pattern are we ) named <a href="http://mark-shepherd.com/" target="_blank">Mark Shepard</a>.&nbsp; He hasn&#8217;t blogged in some time, so I&#8217;m not sure he is still doing stuff with Adobe/Flex or blogging but, his component totally rules and fits my needs pretty closely.&nbsp; Here is the original <a href="http://mark-shepherd.com/SpringGraph/AmazonDemo/bin/AmazonDemo.html" target="_blank">SpringGraph Demo</a>&nbsp;and the <a href="http://mark-shepherd.com/SpringGraph/RoamerDemo/bin/RoamerDemo.html" target="_blank">Roamer Demo</a> which is like the SpringGraph just with nodes hidden or collapsed ( which may be the final component I use ).&nbsp; Well onto, what I&#8217;m trying to do:</p>
<h3>Shiny New Object</h3>
<p>First things first, time to see what makes the SpringGraph tick.&nbsp; Given my limited knowledge of all things Flash, I had to piece together how the main body of his MXML file even worked.&nbsp; </p>
</p>
<div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:f2860ffb-4598-48ef-b718-7d79559e5abc" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:White;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">fc:SpringGraph </span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">=&quot;s&quot;</span><span style="color: #FF0000; "> backgroundColor</span><span style="color: #0000FF; ">=&quot;#ffffff&quot;</span><span style="color: #FF0000; ">
    lineColor</span><span style="color: #0000FF; ">=&quot;#333388&quot;</span><span style="color: #FF0000; "> left</span><span style="color: #0000FF; ">=&quot;0&quot;</span><span style="color: #FF0000; "> right</span><span style="color: #0000FF; ">=&quot;0&quot;</span><span style="color: #FF0000; "> top</span><span style="color: #0000FF; ">=&quot;0&quot;</span><span style="color: #FF0000; ">
                    bottom</span><span style="color: #0000FF; ">=&quot;0&quot;</span><span style="color: #FF0000; ">
                    itemRenderer</span><span style="color: #0000FF; ">=&quot;AmazonItemView&quot;</span><span style="color: #FF0000; ">
                    repulsionFactor</span><span style="color: #0000FF; ">=&quot;{rep.value}&quot;</span><span style="color: #FF0000; ">
    </span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">fc:SpringGraph</span><span style="color: #0000FF; ">&gt;</span></div>
</pre>
</div>
<p>It took me a few minutes to understand the beauty of the itemRenderer system built into Flex.&nbsp; If you check out the other source objects in Mark&#8217;s project you will notice AmazonItem.as and AmazonItemView.as.&nbsp; Think of this as a mini MVC subsystem.&nbsp; With a collection of AmazonItem-s being the model, the SpringGraph control being the controller and the AmazonItemView obviously being the view.&nbsp;&nbsp; This is made clearer when you add the following AS3 snippet to the mix</p>
</p>
<div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:ab9f536d-8534-42df-b63d-218d9bcdc4d0" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; width: 478px; padding-top: 0px">
<pre style="background-color:White;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #0000FF; ">private</span><span style="color: #000000; "> var items: Graph;
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> function addItem(id: String, name: String,
               linkTo: AmazonItem): AmazonItem {
    var newItem: AmazonItem </span><span style="color: #000000; ">=</span><span style="color: #000000; ">
               </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> AmazonItem(id, name);
    items.add(newItem);
    </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(linkTo </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)
        items.link(newItem, linkTo);
    s.dataProvider </span><span style="color: #000000; ">=</span><span style="color: #000000; "> items;
    </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> newItem;
}</span></div>
</pre>
</div>
<p>What is happening here?&nbsp; Well as you call the addItem function an instance of the model, AmazonItem is created and added to collection.&nbsp; This collection is then bound to the dataProvider of the SpringGraph.&nbsp; When SpringGraph is drawn on the stage it loops at this dataProvider and instantiates a view object named itemRenderer for each item in the dataProvider.&nbsp; So this allows you to completely change what the SpringGrid is rendering on your behalf &#8212; pretty cool, huh?</p>
<h3>My &#8220;Model&#8221;</h3>
<p>Now that I think I understand how that component works I need a place to store some data about a Twitter user.&nbsp; Normally, you could just create a basic class and use that but, in the case of this component it seems you need to subclass the delivered Item class.&nbsp; Once again, no big deal.&nbsp; Created a new class called TwitterPerson.&nbsp; That class has a few attributes:</p>
</p>
<div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:355efea0-f088-4157-8f5d-d910d8276d5e" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:White;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> TwitterPerson extends Item
{
    [Bindable]</span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> var screenName:String;
    [Bindable]</span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> var name:String;
    [Bindable]</span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> var profile_image:String;</span></div>
</pre>
</div>
<p>These will store the data returned from the API, I&#8217;ve named the attributes nearly the same as the API to make it easier to follow.&nbsp; The attributes are bindable so that as I fill in the information the &#8220;view&#8221; will update automatically.&nbsp; The constructor is uber-simple:</p>
</p>
<div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:18822d05-8883-487b-a455-41a5b79435f2" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:White;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #0000FF; ">public</span><span style="color: #000000; "> function TwitterPerson(xml:XML){
    screenName </span><span style="color: #000000; ">=</span><span style="color: #000000; "> xml.screen_name;
    name </span><span style="color: #000000; ">=</span><span style="color: #000000; "> xml.name;
    profile_image </span><span style="color: #000000; ">=</span><span style="color: #000000; "> xml.profile_image_url;
}</span></div>
</pre>
</div>
<p>To make it as easy as possible to construct the TwitterPerson I just pass in an XML node and map the parameters myself.&nbsp; If you check out the API you will see that the two services I use &#8220;statuses/friends/&#8221; and &nbsp;&#8221;users/show/&#8221; return different data but have the same information about each person with the same attribute names ( thanks for the consistency Twitter guys! ).</p>
<h3>My &#8220;View&#8221;</h3>
<p>The other piece I need to construct is the view that the SpringGraph will call to render the data stored in the model.&nbsp; For right now all I want to do is put the picture of the person being rendered up there and give a tool tip for their name.&nbsp; Flex makes something like this so easy it&#8217;s barely worth mentioning but for completeness:</p>
<div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:d57cfa28-e656-4f16-8755-00cd16f0a2b8" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:White;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">mx:VBox </span><span style="color: #FF0000; ">xmlns:mx</span><span style="color: #0000FF; ">=&quot;http://www.adobe.com/2006/mxml&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">mx:Image </span><span style="color: #FF0000; ">source</span><span style="color: #0000FF; ">=&quot;{data.profile_image}&quot;</span><span style="color: #FF0000; ">
        scaleX</span><span style="color: #0000FF; ">=&quot;1&quot;</span><span style="color: #FF0000; "> scaleY</span><span style="color: #0000FF; ">=&quot;1&quot;</span><span style="color: #FF0000; ">
        toolTip</span><span style="color: #0000FF; ">=&quot;{data.name}&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">mx:VBox</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
</span></div>
</pre>
</div>
<h3><font face="Verdana"></font></h3>
<h3>Two Heads are better then one but One&#8217;s a start</h3>
<p>Back in the main MXML of our application things have changed a bit:</p>
</p>
<div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:17b0f049-a2e5-44c1-8915-a9dde70ca429" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:White;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">mx:HTTPService </span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">=&quot;myInfoService&quot;</span><span style="color: #FF0000; ">
    url</span><span style="color: #0000FF; ">=&quot;http://twitter.com/users/show/dan_mcweeney.xml&quot;</span><span style="color: #FF0000; ">
    resultFormat</span><span style="color: #0000FF; ">=&quot;e4x&quot;</span><span style="color: #FF0000; ">
    result</span><span style="color: #0000FF; ">=&quot;onMyInfoServiceResult(event)&quot;</span><span style="color: #FF0000; ">
    fault</span><span style="color: #0000FF; ">=&quot;onMyInfoServiceFailed(event)&quot;</span><span style="color: #FF0000; ">
</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">

</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">fc:SpringGraph </span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">=&quot;springLayout&quot;</span><span style="color: #FF0000; ">
    backgroundColor</span><span style="color: #0000FF; ">=&quot;#ffffff&quot;</span><span style="color: #FF0000; "> lineColor</span><span style="color: #0000FF; ">=&quot;#333388&quot;</span><span style="color: #FF0000; "> left</span><span style="color: #0000FF; ">=&quot;0&quot;</span><span style="color: #FF0000; ">
    right</span><span style="color: #0000FF; ">=&quot;0&quot;</span><span style="color: #FF0000; "> top</span><span style="color: #0000FF; ">=&quot;0&quot;</span><span style="color: #FF0000; "> bottom</span><span style="color: #0000FF; ">=&quot;0&quot;</span><span style="color: #FF0000; ">
    itemRenderer</span><span style="color: #0000FF; ">=&quot;TwitterPersonView&quot;</span><span style="color: #FF0000; ">
    repulsionFactor</span><span style="color: #0000FF; ">=&quot;.80&quot;</span><span style="color: #FF0000; "> canDragNodes</span><span style="color: #0000FF; ">=&quot;false&quot;</span><span style="color: #FF0000; ">
</span><span style="color: #0000FF; ">/&gt;</span></div>
</pre>
</div>
<p>You can see how nice and clean the SpringGraph is to use it was basically a one for one swap of other component.&nbsp; Another change here is method used to fetch the data.&nbsp; As you will see in the next section I leave it up to the Model class itself to determine how their friends are, hopefully this will be a good decision architecturally, so the start of the application is to just call the send method of the myInfoService HTTPService.&nbsp; The result event is then triggered and that&#8217;s where everything gets stuck back together again.</p>
<p><p>At this point if you are following along, which I&#8217;m fairly certain no one is, you should get one head floating in the middle of a big white background, yay!&nbsp; Although the astute observer will notice that I snuck a new method into that last&nbsp;snippet of code: &#8220;person.getFriends()&#8221;.&nbsp;</p>
<p>&nbsp;<a href='http://blog.danmcweeney.com/wp-content/uploads/2007/06/onehead.PNG' title='One head'><img src='http://blog.danmcweeney.com/wp-content/uploads/2007/06/onehead.thumbnail.PNG' alt='One head' /></a></p>
<p>&nbsp;</p>
</p>
<h3><strike>Model^2</strike> Math.pow(Model,2)</h3>
<p>As I mentioned eariler I have now moved the getting of friends into the Model.&nbsp; I did this to hopefully make it easier for some ideas I have in the long run but also to see how to make a HTTPService entirely in AS.&nbsp; All this method does is ask the Twitter API to for the user&#8217;s list of friends:</p>
</p>
<div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:d450f8e8-6182-4a8e-a895-f4a6d70eb251" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:White;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #008080; "> 1</span> <span style="color: #0000FF; ">public</span><span style="color: #000000; "> function getFriends():</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">{
</span><span style="color: #008080; "> 2</span> <span style="color: #000000; ">    var friendsService:HTTPService </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> HTTPService();
</span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">    var friends:Array </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Array();
</span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">    friendsService.url </span><span style="color: #000000; ">=</span><span style="color: #000000; ">
</span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">       </span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">http://twitter.com/statuses/friends/</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">  </span><span style="color: #000000; ">+</span><span style="color: #000000; ">
</span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">       screenName </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">.xml</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">;
</span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">    friendsService.resultFormat </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">e4x</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">;
</span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">    friendsService.addEventListener(FaultEvent.FAULT,
</span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">        friendsFault);
</span><span style="color: #008080; ">10</span> <span style="color: #000000; ">    friendsService.addEventListener(</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">result</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">,
</span><span style="color: #008080; ">11</span> <span style="color: #000000; ">        friendsResult);
</span><span style="color: #008080; ">12</span> <span style="color: #000000; ">    friendsService.send();
</span><span style="color: #008080; ">13</span> <span style="color: #000000; ">}</span></div>
</pre>
</div>
<p>The only remaining mystery is what happens in the friendsResult method which gets bound to the &#8220;result&#8221; event on line 10-11.&nbsp; </p>
<div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:f5ffe17f-bbbc-4b34-b090-bebc395f0b64" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:White;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #0000FF; ">private</span><span style="color: #000000; "> function friendsResult(result:ResultEvent):</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">{
    var friendsArray:Array </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Array();
    </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> each (var userEntry:XML </span><span style="color: #0000FF; ">in</span><span style="color: #000000; "> result.result.user){
        friendsArray.push(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> TwitterPerson(userEntry));
    }
    sevenDegress_2(Application.application).
          onAddFriends(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">, friendsArray);
}</span></div>
</pre>
</div>
<p>When the friends HTTPService returns it has a list of all the user&#8217;s friends and their current status.&nbsp; The method just pushes these newly minted TwitterPerson(s) into an array and then calls another mysterious method from the application that contains it.&nbsp; I don&#8217;t know if this is the best way to do this or not &#8212; seems like a bad case of statically linking these two objects but it seemed like the easiest way at the time.&nbsp; This line of code gets the root Application object&#8217;s attribute called application and invokes a method on it.&nbsp; For this to work at compile time though you need to cast that application attribute over to to the specific type of your application hence that funky, sevenDegrees_2&nbsp;thing you see there.&nbsp; The source code to that one extra method is also pretty straightforward thanks once again to Mark&#8217;s Graph class:</p>
<div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:31c7b480-2259-4d26-af28-cdb0b42dc5c0" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:White;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #0000FF; ">public</span><span style="color: #000000; "> function onAddFriends(node:TwitterPerson,
        friendsList:Array):</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">{
    </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> each (var person:TwitterPerson </span><span style="color: #0000FF; ">in</span><span style="color: #000000; "> friendsList){
        people.add(person);
        people.link(person, node);
    }
}</span></div>
</pre>
</div>
<p><strong><font face="Trebuchet MS"></font></strong></p>
<p>When the friends HTTPService gets a result it passes it back up to the application which in turn modifies the data provider by adding the new nodes ( via the add() method ) and then linking them to each other ( via the link() method ).&nbsp; This should now produce the pretty little Poof ball like below:</p>
<p><a href='http://blog.danmcweeney.com/wp-content/uploads/2007/06/poof.PNG' title='Poof'><img src='http://blog.danmcweeney.com/wp-content/uploads/2007/06/poof.thumbnail.PNG' alt='Poof' /></a></p>
<p>&nbsp;</p>
<h3>Hatchet Attack</h3>
<p>This control is actually a little <em>too</em> useful for my needs, I don&#8217;t really want anyone to be able to drag folks around once they have been placed on the screen so, I have to delve into Mark&#8217;s control and get rid of that functionality.&nbsp; This turned out to be a fairly straightforward:</p>
</p>
<div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:11683dd4-f095-41f9-a55b-c5318350d4c0" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; width: 531px; padding-top: 0px">
<pre style="background-color:White;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #008080; "> 1</span> <span style="color: #0000FF; ">private</span><span style="color: #000000; "> function mouseDownEvent
</span><span style="color: #008080; "> 2</span> <span style="color: #000000; ">       (</span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">: MouseEvent):</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">  {
</span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">    var now: </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> </span><span style="color: #000000; ">=</span><span style="color: #000000; "> getTimer();
</span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">((now </span><span style="color: #000000; ">-</span><span style="color: #000000; "> lastMouseDownTime) </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; "> </span><span style="color: #000000; ">300</span><span style="color: #000000; ">) {
</span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">        </span><span style="color: #008000; ">//</span><span style="color: #008000; "> it's a double-click</span><span style="color: #008000; ">
</span><span style="color: #008080; "> 6</span> <span style="color: #008000; "></span><span style="color: #000000; ">        var node: GraphNode </span><span style="color: #000000; ">=</span><span style="color: #000000; "> _dataProvider.findNode(
</span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">                UIComponent(</span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">.currentTarget));
</span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(node </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {
</span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">            dragEnd(</span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">);
</span><span style="color: #008080; ">10</span> <span style="color: #000000; ">            </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(Object(node.view).
</span><span style="color: #008080; ">11</span> <span style="color: #000000; ">                hasOwnProperty(</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">doubleClick</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">))
</span><span style="color: #008080; ">12</span> <span style="color: #000000; ">            Object(node.view).doubleClick(</span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">);
</span><span style="color: #008080; ">13</span> <span style="color: #000000; ">        }
</span><span style="color: #008080; ">14</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;
</span><span style="color: #008080; ">15</span> <span style="color: #000000; ">    }
</span><span style="color: #008080; ">16</span> <span style="color: #000000; ">    lastMouseDownTime </span><span style="color: #000000; ">=</span><span style="color: #000000; "> now;
</span><span style="color: #008080; ">17</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (_canDragNodes)
</span><span style="color: #008080; ">18</span> <span style="color: #000000; ">        dragBegin(</span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">);
</span><span style="color: #008080; ">19</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">.stopImmediatePropagation();
</span><span style="color: #008080; ">20</span> <span style="color: #000000; ">}</span></div>
</pre>
</div>
<p>Beyond the addition of line 17, the only other thing I needed to add was one parameter _canDragNodes ( and its&#8217; getter and setter methods ).&nbsp; Although it is truly tons of fun to drag the seed member of the graph around and watch all their Twitter Friends fly after them &#8212; it&#8217;s not really useful.</p>
<p>If you want to see it running live, meaning you really think I&#8217;m a liar, here is&nbsp;a link to the Current Version of <a href="http://www.danmcweeney.com/static/7degrees/sevenDegress_2.html">7DegreesOfTwitter</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danmcweeney.com/29/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Extreme Programming to the Max</title>
		<link>http://blog.danmcweeney.com/28</link>
		<comments>http://blog.danmcweeney.com/28#comments</comments>
		<pubDate>Wed, 13 Jun 2007 04:45:56 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://blog.danmcweeney.com/28</guid>
		<description><![CDATA[I&#8217;ve always thought it would be interesting for people to see what a programmer goes through when creating a new system.&#160; Telling the world where you are getting stuck so others can learn from and/or laugh at your mistakes.&#160; It might also be interesting for people who create languages or frameworks to see a blow [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve always thought it would be interesting for people to see what a programmer goes through when creating a new system.&nbsp; Telling the world where you are getting stuck so others can learn from and/or laugh at your mistakes.&nbsp; It might also be interesting for people who create languages or frameworks to see a blow by blow of someone learning a new programming language / toolkit &#8212; how many times do you get to see that!</p>
<p>I also have wanted to build a Twitter ( hanger-on ) application that shows you your web friends and&nbsp;their friends and their friends and so on&nbsp;&#8212; think <a href="http://www.geocities.com/theeac/bacon.html">6 Degrees of Kevin Bacon</a> but, for Twitter.&nbsp; I&#8217;ve thought about the visualizations for this and feel that Flex/Flash is the only way to go, which I luckily no nothing about!&nbsp; So, tonight is the first episode of stuff I wish I knew about Flex while building 7DegreesOfTwitter.</p>
<p>I will only be working on this at night and on the weekends so, progress will be slow and sometimes painful.&nbsp; I may even try and post nightly &#8220;builds&#8221; somewhere so people can see what I&#8217;m up to help give me pointers where required.</p>
<h3>A Plan</h3>
<p>Here is what i think the visualization should look like ( yes this was done in MS Paint,&nbsp;hopefully I am a better programmer then artist ):</p>
<p>&nbsp;<img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="240" alt="7degrees" src="http://blog.danmcweeney.com/wp-content/uploads/2007/06/7degrees-thumb.png" width="222" align="left" border="0"></p>
<p>Basically, you should see all your friends circled around your portrait then as you click on a friend it will shift the view so that your friend is now the focus on the screen, and you can&nbsp;move along your web of friends exploring other people&#8217;s connection.&nbsp; Obviously, this whole&nbsp;visualization is rife with opportunity.&nbsp;&nbsp;Adding some cool like the Mac doc magnify feature would be&nbsp;pretty cool, or even maybe have&nbsp;the whole thing look like a horizon instead of a flat&nbsp;web of people.</p>
<h3>First Day&nbsp;</h3>
<p>First thing to do&nbsp;is&nbsp;get two chunks of data out of Twitter using the <a href="http://groups.google.com/group/twitter-development-talk/web/api-documentation" target="_blank">Twitter API</a>.&nbsp; The first bit is your list of friends:</p>
</p>
<div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:77b2a885-13bc-4a22-bae0-37ce2891eecc" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; width: 436px; padding-top: 0px">
<pre style="background-color:White;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #000000; ">    </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">mx:Script</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
        </span><span style="color: #0000FF; ">&lt;![CDATA[</span><span style="color: #808080; ">
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
            public var myInfo:XML;
            public var friends:XML;
            private function onFriendsResult(result:ResultEvent):void{
                friends = XML(result.result);
            }
            private function onFriendsFault(result:FaultEvent):void{
                var error:XML;
                error = XML(result.fault);
            }

        </span><span style="color: #0000FF; ">]]&gt;</span><span style="color: #000000; ">

    </span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">mx:Script</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">

    </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">mx:HTTPService </span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">=&quot;friendsService&quot;</span><span style="color: #FF0000; ">
        url</span><span style="color: #0000FF; ">=&quot;http://twitter.com/statuses/friends/dan_mcweeney.xml&quot;</span><span style="color: #FF0000; ">
        resultFormat</span><span style="color: #0000FF; ">=&quot;e4x&quot;</span><span style="color: #FF0000; ">
        result</span><span style="color: #0000FF; ">=&quot;onFriendsResult(event)&quot;</span><span style="color: #FF0000; ">
        fault</span><span style="color: #0000FF; ">=&quot;onFriendsFault(event)&quot;</span><span style="color: #0000FF; ">/&gt;</span></div>
</pre>
</div>
<p>So basically, this is all it takes in Flex to get data from a web service and parse it into an XML document that is easily traversable.&nbsp; If you don&#8217;t know what E4X is neither did I &#8212; go read the <a href="http://en.wikipedia.org/wiki/E4X" target="_blank">Wikipedia entry about E4X</a>&nbsp;then have a look at the <a href="www.w3schools.com/e4x/default.asp" target="_blank">W3Schools Tutorial on E4X</a>.&nbsp; Just remember it&#8217;s actually a lot easier then you think, no big scary XSLTs here.&nbsp; The next thing to do was the other piece of data I need, in this case it&#8217;s your mug shot associated with your Twitter account:</p>
<p>&nbsp; </p>
<div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:d8d8981c-b463-4869-adef-845d433b2ef0" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:White;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">mx:Application xmlns:mx</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">http://www.adobe.com/2006/mxml</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; "> layout</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">absolute</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">
creationComplete</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">friendsService.send()</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">
    </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">mx:Script</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">
        </span><span style="color: #000000; ">&lt;!</span><span style="color: #000000; ">[CDATA[
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
            </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> var myInfo:XML;
            </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> var friends:XML;
            </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> function onFriendsResult(result:ResultEvent):</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">{
                friends </span><span style="color: #000000; ">=</span><span style="color: #000000; "> XML(result.result);
                myInfoService.send();
            }
            </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> function onFriendsFault(result:FaultEvent):</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">{
                var error:XML;
                error </span><span style="color: #000000; ">=</span><span style="color: #000000; "> XML(result.fault);
            }

            </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> function onMyInfoServiceResult(result:ResultEvent):</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">{
                myInfo </span><span style="color: #000000; ">=</span><span style="color: #000000; "> XML(result.result);
                myMug.source </span><span style="color: #000000; ">=</span><span style="color: #000000; "> myInfo.profile_image_url;
            }
            </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> function onMyInfoServiceFailed(result:FaultEvent):</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">{
                var error:XML;
                error </span><span style="color: #000000; ">=</span><span style="color: #000000; "> XML(result.fault);
            }
        ]]</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">

    </span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">mx:Script</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">
    </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">mx:HTTPService id</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">friendsService</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">
                    url</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">http://twitter.com/statuses/friends/dan_mcweeney.xml</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">
                    resultFormat</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">e4x</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">
                    result</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">onFriendsResult(event)</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">
                    fault</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">onFriendsFault(event)</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; ">
    </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">mx:HTTPService id</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">myInfoService</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">
                    url</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">http://twitter.com/users/show/dan_mcweeney.xml</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">
                    resultFormat</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">e4x</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">
                    result</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">onMyInfoServiceResult(event)</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">
                    fault</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">onMyInfoServiceFailed(event)</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; ">
    </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">mx:Image id</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">myMug</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; "> source</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&quot;&quot;</span><span style="color: #000000; "> horizontalCenter</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; "> verticalCenter</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">
                     width</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">48</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; "> height</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">48</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; ">

</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">mx:Application</span><span style="color: #000000; ">&gt;</span></div>
</pre>
</div>
<p>Major additions here are a a new HTTPService to grab my information and also a small slight of hand to keep the two asynchronous services at least somewhat in sync.&nbsp; In the onFriendsResult function I call the next HTTPService.&nbsp; This is an easy way to create simple dependencies among asynchronous requests.</p>
<h3><font face="Verdana">The Layout</font></h3>
<p>I started tonight to try and write this myself &#8212; and I soon realized I was probably in over my head.&nbsp; I got up to the point where I am able to calculate the correct radius for a circle to easily hold all of the objects and then where their positions should be in radians around the circle.&nbsp; The thought of having to write this in Flex made me want to jump out a window, so I thought to myself &#8212; maybe someone has already done this. Just then the Red Sea was parted and the open source gods smiled upon me.&nbsp; Circle Layout was created by <a href="http://kuwamoto.org/" target="_blank">Sho Kuwamoto</a>, an Adobe Engineer, it does exactly what I want in terms of layout and some other snazzy stuff with drag and drop.&nbsp;&nbsp;Here is a&nbsp;<a href="http://examples.kuwamoto.org/DragTile/DragTile_step3/DragDrop.html" target="_blank">demo of the Circle Layout for Flex</a>&nbsp;just press the &#8220;Change to Circle&#8221; button to see what I am talking about.&nbsp; It&#8217;s a pretty impressive bit of code for my needs though I need to get rid of the drag and drop bits but, for right now I will leave all that in.</p>
<p>So here is the the running code for <a href="http://danmcweeney.com/static/7degrees/one/sevenDegress_1.html" target="_blank">Iteration 1 of the 7DegreesOfTwitter</a>.&nbsp; If you want the source just right-click the movie and use the &#8220;View Source&#8221; menu option.&nbsp; When asked for a username and password just use your Twitter Log-in info.</p>
<p>Current issues:</p>
<ul>
<li>Only works for me!
<li>No clue what will happen when you have lots of friends</li>
</ul>
<p>Next time?</p>
<ul>
<li>Create a hover over for the images to at least show the name
<li>Come up with a way of Clicking on a person then moving to their &#8220;circle&#8221;</li>
</ul>
<p>If you find more issues in the code just post a comment &#8212; if I&#8217;m doing something totally silly please tell me that too!</p>
<h5>Once again big thanks to <a href="http://kuwamoto.org/" target="_blank">Sho Kuwamoto</a>&nbsp;for saving me having to do any real programming <img src='http://blog.danmcweeney.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </h5>
]]></content:encoded>
			<wfw:commentRss>http://blog.danmcweeney.com/28/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>SAPTube</title>
		<link>http://blog.danmcweeney.com/24</link>
		<comments>http://blog.danmcweeney.com/24#comments</comments>
		<pubDate>Tue, 24 Apr 2007 19:58:19 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[SAP]]></category>
		<category><![CDATA[SDN blogger]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://blog.danmcweeney.com/24</guid>
		<description><![CDATA[View from the cheap seats If you believe SAPâ€™s vision of the future, the next version of the enterprise will be most certainly be YouTubed. Yesterday, Hasso worked off a set of great blackboard styled slides (anyone have that font?) and even brought one of his classes to the keynote. In his usual way, Hasso [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/43234315@N00/471582249/" title="Photo Sharing"><img style="float:left" src="http://farm1.static.flickr.com/221/471582249_530b6be79e.jpg" width="500" height="375" alt="Hasso Keynote" /></a><br />
<em>View from the cheap seats <img src='http://blog.danmcweeney.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </em></p>
<p>If you believe SAPâ€™s vision of the future, the next version of the enterprise will be most certainly be YouTubed.  Yesterday, Hasso worked off a set of great blackboard styled slides (anyone have that font?) and even brought one of his classes to the keynote.  In his usual way, Hasso cut to the chase about the shifts occurring in enterprise software due to technology and the advent of the social web.  Building off <a href="http://theotherthomasotter.wordpress.com/2007/04/23/live-blogging-hasso-plattner/">Thomas Otterâ€™s live notes</a> and <a href="http://www.redmonk.com/cote/2007/04/24/sapphire-07-stable-agility-web-20-everywhere/">Coteâ€™s mind map</a> here are some thoughts about the keynotes viewed as a whole.  </p>
<p><strong>New Idea</strong></p>
<p>His solution to these shifts is his â€œNew Ideaâ€ an architectural change focused more on â€œcloudsâ€ that could be used as raw computing power and potentially house enterprise services.  The new architecture needs to be event based, must focus on the end user of the application, should be model based and expose little to no code.  Probably, the most interesting point here is the idea of event driven thinking.</p>
<p>The â€œinformation workerâ€ does not do the same transition repeatedly.  They seek out exceptions they look for trends.  Part of refocusing on the user will have to allow these users to more affectively locate these fringe events and resolve them.  I would also love to see SAP start tracking the root cause of the error &#8212; what series of events occurred prior to this issue?  Next time could we prevent it?  We of course first have to come up with a way of attaching all these systems and getting them talking.</p>
<p>The answer of course is SOA!  Hasso does add another interesting spin to this through higher degrees of abstraction allowing a fully model based architecture to enable user to model everything.  Obviously, all this is probably still only on the blackboard but, one can see a time with these standardized clouds of services available at will and the ability to have a crowd sourced documentation scheme maybe capable business users could really start to remodel their own enterprise.</p>
<p><strong>Community</strong></p>
<p>Around the community topic Hasso said, â€œWithout a community there is no product,â€ which is a great hat tip to the folks on SDN /BPX and certainly an important focus for the company moving forward.  The idea of using this community to create feature requests is an obvious next step.  SAP is only just starting to use their BPX communities to create ES, imagine a time where the users were modeling processes and even changing UI constructs to suit a particular need or usage pattern.  This is sort of the holy grail of adaptive UI but uses a crowd sourced to determine the layout and functionality, no need for complex coding!</p>
<p>SAP software generally overlooks the casual users.  Hasso argues that these people need to have the UI adapt to their needs as they progress from casual to expert.  Iâ€™m not sure what this interaction model would look like certainly the hidden menu items in MS Office(before Vista) is not the best way.  The idea is great if you can come up with a way to have the UI flex to the user based upon their own knowledge level. </p>
<p><strong>UI</strong></p>
<p>Not all of this appears to be blackboard magic; during Henningâ€™s keynote he â€œdemoedâ€ a prototype of a Web 2.0-ey workspace for business users.  This was also shown on the floor also, it has many more features, such as connections to mobile users via Blackberry and having them email into the space to contribute to the project.  The general idea of the UI is to allow users to bring people in the space to solve a particular problem.  You can add a user to the space, assign users to a task, and use a wiki to help organize the new ad hoc team.  The framework supports the notion of templating so you can branch off to do a repetitive transactional type task injecting a good flavor of â€œbest-practice.â€</p>
<p>Finding others to help in these new ad hoc teams is easy with Harmony.  Harmony is a mySpace/LinkedIn kind of application for the enterprise.  It is already running at SAP and Iâ€™ve already had some hands on time with it.  The interface is very good, has a consistent UI and well done graphics â€“ the whole package looks highly, well unSAPish.  The current version only has the mySpace component but I hope they plans to add the other components, wikis, blogs, social bookmarking, etc.  This is SAPâ€™s first foray into the social computing side of web 2.0 so no surprise the offer is limited.  On the live SAP site you already have started to see interesting groups form like Basketball leagues and Live Music Lovers, not a huge value to the enterpriseâ€™s bottom line but happy workers are more productive workers.</p>
<p><img src="http://farm1.static.flickr.com/204/471597778_aa7491343e.jpg"/><em>Harmony UI</em></p>
<p>With the addition of a social computing slant, you really start to see the underlying strategy of the user-generated enterprise, at least that was my take on the whole thing.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danmcweeney.com/24/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Google&#8217;s next step an OS? Probably not.</title>
		<link>http://blog.danmcweeney.com/18</link>
		<comments>http://blog.danmcweeney.com/18#comments</comments>
		<pubDate>Thu, 22 Feb 2007 20:31:47 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[et alii]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://blog.danmcweeney.com/18</guid>
		<description><![CDATA[Jason Calacanis recently reveled in his accurate prediction that Google they will release an office suite in 2006. Kudos on the call but, I don&#8217;t think he is right about their next move &#8212; that Google will build an OS but, that also depends on the definition of an Operating System. I think Google&#8217;s next [...]]]></description>
			<content:encoded><![CDATA[<p>Jason Calacanis recently reveled in his accurate prediction that <a href="http://www.calacanis.com/2007/02/22/i-called-it/">Google they will release an office suite in 2006</a>.   Kudos on the call but, I don&#8217;t think he is right about their next move &#8212; that Google will build an OS but, that also depends on the definition of an Operating System.  </p>
<p>I think Google&#8217;s next move as Jason, astutely observes is to create &#8220;reoccurring revenue&#8221; for PC makers like Dell/HP by getting them to install something that isn&#8217;t MS Windows, however that something won&#8217;t be a Google OS.  It will more likely be an Open source OS like, Ubuntu with a revived <a href="http://pack.google.com/intl/en/pack_installer.html">Google Pack</a> installed on it.  I think the simple reason for this is Google has been involved in Linux development for a long time but, in the area of the kernel not on the front end.  Why should Google do any work when they can just piggy back on another great initiative.</p>
<p>The pack will have to have some interesting additions to really put the squeeze on MS.  I think the obvious choice is &#8220;your desktop PC anywhere you are&#8221; &#8212; the current notion of &#8220;your&#8221; PC will become irrelevant, meaning, having everything on one piece of hardware you own won&#8217;t matter.  You can see Google starting to do this now with <a href="http://www.google.com/a/">Google Applications</a>.  With the addition of the elusive G-Drive mounted as a &#8220;virtual HD&#8221; sprinkled into the &#8220;Pack&#8221; you have a very flexible totally portable desktop environment.  Imagine going to any machine in a business and signing in and getting all your preferences, all your documents, installed programs, right there for you!  The great part about this it wouldn&#8217;t cost Google much, as they would be using currently available OS solutions, FF, Linux, etc.  As more people buy PCs with the â€œGoogle OS/Packâ€ on them, more people will reap the benefits of the â€œanywhere desktop,â€ creating a runaway snowball effect.</p>
<p>So, I donâ€™t think Google will build an OS in the strictest sense, I think they will extend existing technologies, the Linux desktop out to a their servers and their incredibly powerful data centers down to the desktop.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danmcweeney.com/18/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SAP&#8217;s users of Tomorrow</title>
		<link>http://blog.danmcweeney.com/14</link>
		<comments>http://blog.danmcweeney.com/14#comments</comments>
		<pubDate>Thu, 28 Dec 2006 17:51:06 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[SAP]]></category>
		<category><![CDATA[SDN blogger]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://blog.danmcweeney.com/14</guid>
		<description><![CDATA[If you work with me you have already heard this rant, so might as well just skip this blog post and go back to work playing with your new tech toys. SAP user&#8217;s of today are people that can remember a time when computers were the size of small city blocks and the idea of [...]]]></description>
			<content:encoded><![CDATA[<p>If you work with me you have already heard this rant, so might as well just skip this blog post and go back to <strike>work</strike> playing with your new tech toys.</p>
<p>SAP user&#8217;s of today  are people that can remember a time when computers were the size of small city blocks and the idea of having one on your desk was laughable<a href="#footnote_1">[1]</a>.  Most of them are happy enough to have a computer on their desk to run Excel and mess with their own spreadsheets.  These people today control the purse strings of IT spending and are &#8220;leading&#8221; the relationship with SAP.  This is bad&#8230;. why? I&#8217;ll talk about that later.<br />
If you have a child who is less then 30 years old and you work in an IT shop that runs SAP software, you should be scared.  Talking from my personal experience ( I am 27 years old ) my family got their <a href="http://www.zimmers.net/cbmpics/c128s.html" target="_blank">first computer</a> when i was 6 or 7, I can just barely remember a time Before Computers, what this means to me and everyone in my age bracket is that we have used computers forever, our expectations are different.  How different can be quickly mapped as you go down generations, the younger you start to use computers the higher your expectations are.  I can&#8217;t stand when Ctrl-C doesn&#8217;t work or when I can&#8217;t turn on and off toolbars or when the screen is so full of information I don&#8217;t need all I can see is a box 200px by 150px.  When this happens I go find another tool &#8212; this is why you should be scared.</p>
<p>Thomas Otter<a href="http://theotherthomasotter.wordpress.com/feed/"><img src="http://www.danmcweeney.com/images/feed-icon16x16.png" alt="chicklet" title="chicklet" /></a> points out that at <a href="http://theotherthomasotter.wordpress.com/2006/12/28/thinking-about-the-user-sap-zen/">SAP they are good at process</a> &#8212; it sounds almost like a core value,</p>
<blockquote><p>&#8220;at SAP we think a lot about processes.  I hear it all the time in the corridors and meeting rooms in Walldorf.  It is one of the main reasons for SAPâ€™s success. It is goodness, and it is very tough to emulate&#8230; It is a significant competitive advantage.&#8221;</p></blockquote>
<p>This is all quite true they do have that &#8220;special sauce&#8221; down to a &#8216;T&#8217; however, it won&#8217;t help when folks in my generation start to take control of the purse strings.</p>
<p>If someone gives me a piece of software I &#8220;must use&#8221; and it is horrible, the first thing I do before using it is to see if there is another tool I can quickly use the way I want and then just plug the numbers into the horrible tool.  This is a huge problem for SAP as that all the wonder process focus Thomas talks about goes out the window when people don&#8217;t use the tool in the manner it was designed.  I would argue that for the next generation of people who will soon ( &lt; 10 years ) start to get into decision making positions at Fortune 1000s UI ease and flexibility will be nearly as important as all the process stuff already boiled into SAP software.</p>
<p>As campy as <a href="http://www.time.com/time/magazine/article/0%2C9171%2C1569514%2C00.html" target="_blank">Time&#8217;s person of the year</a> was, it was about a change of focus on the internet.  From just a push of information and goods out, to a true conversation.  People creating content to be consumed by others, the internet as just another conduit for people to carry out conversations.  This change of focus needs to be felt in the Enterprise too and I am concerned we might not be able to move fast enough.</p>
<p><a title="footnote_1" name="footnote_1"></a>[1] &#8220;There is no reason for any individual to have a computer in his home.&#8221; &#8212;  Ken Olson, president of Digital Equipment Corp. 1977  ( <a href="http://www.snopes.com/quotes/kenolsen.asp" target="_blank">Snopes</a> )</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danmcweeney.com/14/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Innovation in IT</title>
		<link>http://blog.danmcweeney.com/7</link>
		<comments>http://blog.danmcweeney.com/7#comments</comments>
		<pubDate>Sun, 12 Nov 2006 00:59:35 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[innovation]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://blog.danmcweeney.com/?p=7</guid>
		<description><![CDATA[If your IT department is even the smallest bit like mine it may seem that is almost totally impossible to create a place where you can safely try out new technology. In my IT shop though we have carved out a small niche where we have a hand full of folks with a small percentage [...]]]></description>
			<content:encoded><![CDATA[<p>If your IT department is even the smallest bit like mine it may seem that is almost totally impossible to create a place where you can safely try out new technology.  In my IT shop though we have carved out a small niche where we have a hand full of folks with a small percentage of their time to really seek out impossible problems and help solve them.  At first this seemed like an impossible sell to senior management, however using the following logic we were able to get the time we needed to see if some of any new technology could help our business.</p>
<ol>
<li>Agile Development</li>
<ul>
<li>Im totally guessing here, but in most IT shops I assume you probably use some locally bastardized version of the Waterfall method.  In our R&#038;D team we use an over simplified version of Scrum, the idea is to remove all the unnecessary artifacts from the process and &#8220;Shutup and make it work,&#8221; to use one of our teams mantras.  The basic idea is get testable code in another team&#8217;s hands as frequently as possible; this could mean every night or every week.</li>
<li>The reason this is number one is that it will allow you ( and/or your team ) to prove value instantly.  People go nuts when you deliver the 1st version of working code before other teams have even decided who writes the spec</li>
<li>Using this type of process automatically distinguishes you from your colleagues, it allows you to move fluidly with the ever changing IT landscape, it is a huge win over your normal process and a big key to my team&#8217;s success</li>
</ul>
<li>Flatten your Team</li>
<ul>
<li>This may seem like a no brainer but odds are there are lots of people between you and your user community.  To be successful at delivering code as fast as you will need to justify your spent time you <strong>must </strong>be as close as possible to your user base.  This means you can&#8217;t have a rigid structure the person who knows the most about the area needs to make the decisions.  Suck up your pride and let them run the show.</li>
</ul>
<li>Get smart people</li>
<ul>
<li>I have a really hard time phrasing this statement but, suffice to say, you have to get the cream of your organization.  If you want someone to go decide if Ruby on Rails is a good idea you better trust that person&#8217;s ability to learn and their ability to judge technologies.  In the end it&#8217;s better to have fewer people then an army of people you have to micro-manage.</li>
</ul>
<li>Research is failure</li>
<ul>
<li>This is one of the hardest concepts for an IT shop to grasp &#8212; they mostly deal with uptime and throughput but when experimenting with new ways of doing things you have to be able to deal with a certain amount of risk and this finally brings me to the reason for this blog, <a target="_blank" href="http://www.slowleadership.org/2006/11/you-cant-be-innovative-and-risk-averse.html">a recent post</a> ( really go read it ) by <span class="entry-author-name">Carmine Coyote at Slow Leadership<a target="_blank" href="http://feeds.feedburner.com/SlowLeadership"><img src="http://www.danmcweeney.com/images/feed-icon16x16.png" /></a>, really a great job about the fear that makes these teams fail.  Which brings me to my last point<br />
</span></li>
</ul>
<li><span class="entry-author-name">Fear Nothing</span></li>
<ul>
<li><span class="entry-author-name">You can&#8217;t be a &#8220;disruptive innovator&#8221; ( thanks Shai ) without risking something every once in awhile</span></li>
<li><span class="entry-author-name">Make your management understand that fear is costing them $</span></li>
<li><span class="entry-author-name">&#8220;Thrill your users&#8221; ( thanks again Shai ) any fears your management has will go away</span></li>
</ul>
</ol>
<p><span class="entry-author-name">Good luck, if IT in the US is to stay we must stop being a commodity and start delivering really measurable value to our businesses again.  The simplest way to do this in the enterprise space is to simply make those ugly back end systems usable.</span></p>
<p>btw &#8212; this blog was written somewhere south of Greenland at about 33k feet.  On board internet is great.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danmcweeney.com/7/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

