﻿<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
  <channel>
    <title>Bruce's Blog</title>
    <description>Ideas, thoughts, and findings</description>
    <link>http://blog.bruceabernethy.com/blog/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.5.0.9</generator>
    <language>en-US</language>
    <blogChannel:blogRoll>http://blog.bruceabernethy.com/blog/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd?format=rss</blogChannel:blink>
    <dc:creator>Bruce Abernethy</dc:creator>
    <dc:title>Bruce's Blog</dc:title>
    <geo:lat>43.023000</geo:lat>
    <geo:long>-85.617000</geo:long>
    <item>
      <title>Difference in experience with Garmin GPS and iPod Touch illustrate Open vs Proprietary</title>
      <description>&lt;p&gt;So we’ve been getting back into &lt;a href="http://www.geocaching.com"&gt;geocaching&lt;/a&gt; over the last few weeks, and things have really come a long way in the last five years or so.&amp;#160; Today there are a number of great online resources and applications to really make the tasks of finding caches and getting them into your GPS very easy – but a this isn’t a post on geocaching (though that would be fun too).&lt;/p&gt;  &lt;p&gt;Over the last week I have been updating software and maps on our Garmin GPS and learning about the cool new ways of adding geocache data to the device.&amp;#160; When updating files and applications on the GPS it was easy to make the comparison to updating files and apps on my iPod Touch, and the differences were quite revealing.&lt;/p&gt;  &lt;p&gt;Apple is famous/notorious for their interest in “controlling the experience” for their users.&amp;#160; This means that the only way to get files and applications onto their devices is through their custom iTunes application.&amp;#160; While this does enable Apple to standardize and homogenize all their users’ experience, it also severely limits and prohibits what anyone outside Apple can do with their devices.&lt;/p&gt;  &lt;p&gt;Garmin, on the other hand, has created an amazingly open platform.&amp;#160; This enables their users to also have a great experience with their custom software (e.g. &lt;a href="http://www.garmin.com/garmin/cms/us/onthetrail/basecamp"&gt;BaseCamp&lt;/a&gt;) and purchase maps and features through their software and web site.&amp;#160; But open interfaces allow web sites such as geocaching.com directly access and add data to Garmin GPS devices.&amp;#160; Likewise, open access allows authors to write their own software, such as &lt;a href="http://www.easygps.com/default.asp"&gt;EasyGPS&lt;/a&gt; as one example, which can add functionality and data, also directly to the device.&lt;/p&gt;  &lt;p&gt;Here are a few notable differences between how Apple allows interaction with the iPod Touch and how Garmin enables interaction with their GPS devices. &lt;/p&gt;  &lt;h2&gt;1) Multiple computers without pain&lt;/h2&gt;  &lt;p&gt;I connected the Garmin to my home PC, a laptop and my machine at work.&amp;#160; All I needed was a USB cable and the device came up fine on all the machines without installing any extra software on the local machines.&amp;#160; At home I installed Garmin BaseCamp to do some of the cool things that it enables, but the other devices just accessed the Garmin as a storage device and copied data to and from the device.&lt;/p&gt;  &lt;p&gt;With Apple iTunes you really can only sync one computer with one device.&amp;#160; If you want to add music or apps from a second or third computer you really can’t – if you do then everything added from the first computer is removed first. &lt;/p&gt;  &lt;h2&gt;2) Add features/files without custom software&lt;/h2&gt;  &lt;p&gt;As mentioned above, I didn’t need any custom software to install data onto the Garmin – just drag and drop the files (nice).&lt;/p&gt;  &lt;h2&gt;&lt;a href="http://blog.bruceabernethy.com/blog/image.axd?picture=easygps.png"&gt;&lt;img style="border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="easygps" border="0" alt="easygps" align="right" src="http://blog.bruceabernethy.com/blog/image.axd?picture=easygps_thumb.png" width="215" height="244" /&gt;&lt;/a&gt;3) Software from multiple authors can be written and work with hundreds or thousands of different devices&lt;/h2&gt;  &lt;p&gt;Using EasyGPS as an example, software developers can create their own software that can communicate with Garmin GPS devices (without being approved by Garmin).&amp;#160; &lt;/p&gt;  &lt;p&gt;Also, and this is important, software developers can also allow their software to connect and integrate with non-Garmin devices.&amp;#160; If the screen capture is any indication, not only can EasyGPS connect with over 300 Garmin devices, but also with 26 other companies GPS devices. &lt;/p&gt;  &lt;p&gt;Interesting as well, you will see phone manufacturers on their like Blackberry and Nokia, but this software will never (and could never) integrate with an Apple iPhone.&lt;/p&gt;  &lt;h2&gt;4) Easy expansion or storage using standard media&lt;/h2&gt;  &lt;p&gt;Ok, so I went a little overboard loading up the GPS when I found out all the cool things I could start doing with it and maxed out the internal storage available on the device – but I wanted more.&amp;#160; Turns out that the GPS has a standard SD-card slot built in.&amp;#160; I went to Meijer and looked at their selection of cards.&amp;#160; I found a SanDisk 4Gb SD-card for $17 dollars and was ready to get it, but then the helpful Meijer guy showed me the “off-brand” 4Gb card they had on sale for $12.&amp;#160; It turns out there were three different 4Gb SD-card choices that would have worked for me – all under $20 out-the-door.&lt;/p&gt;  &lt;p&gt;In the case of my iPod I have 8Gb of storage – will never have more or less than this – no expansion in the iPod (can’t even open it up – more below).&lt;/p&gt;  &lt;h2&gt;5) AA batteries or rechargeable battery pack&lt;/h2&gt;  &lt;p&gt;Seems like a simple thing, but the Garmin works with standard AA batteries, a rechargeable battery pack, or on a car-adapter/USB style power connection.&amp;#160; After two years of using the iPod Touch my battery life is about 3-4 hours now (sometimes less).&amp;#160; It’ll cost me $75 dollars to get a new battery installed, and it must be at the Apple store – rechargeable AA batteries (with charger) are about $10 and available anywhere.&lt;/p&gt;  &lt;h2&gt;6) Both have model to sell add-ons and protect intellectual property&lt;/h2&gt;  &lt;p&gt;Finally, it is important to note that Garmin doesn’t lose money by making their devices open.&amp;#160; I still spent money using their web site to enable satellite imagery through BaseCamp and can add topographical maps and other tourist-type data if I desire.&lt;/p&gt;  &lt;p&gt;After the iPod/iTunes experience, I almost felt like a “hacker” having all this power and potential with the Garmin devices.&amp;#160; To do anything similar with an iPod Touch or iPhone you’d have to literally “hack” them using one of the “jailbreak” distributions – and then everything else could go haywire or eventually blocked by Apple.&lt;/p&gt;  &lt;p&gt;I really like the trend with non-Apple phones from RIM/Blackberry, Nokia, and Android and I hope the Windows Phone 7 devices this fall will allow for end-user customization without an “iTunes-equivalent”.&amp;#160; The experience with the Garmin device was quite revealing, so that’s why I wanted to share it here.&lt;/p&gt;</description>
      <link>http://blog.bruceabernethy.com/blog/post/GarminVsiPod.aspx</link>
      <author>Bruce</author>
      <comments>http://blog.bruceabernethy.com/blog/post/GarminVsiPod.aspx#comment</comments>
      <guid>http://blog.bruceabernethy.com/blog/post.aspx?id=22ac258b-3c7a-4fc3-9328-9ca959dd2227</guid>
      <pubDate>Wed, 30 Jun 2010 06:08:53 -0900</pubDate>
      <dc:publisher>Bruce</dc:publisher>
      <pingback:server>http://blog.bruceabernethy.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://blog.bruceabernethy.com/blog/post.aspx?id=22ac258b-3c7a-4fc3-9328-9ca959dd2227</pingback:target>
      <slash:comments>85</slash:comments>
      <trackback:ping>http://blog.bruceabernethy.com/blog/trackback.axd?id=22ac258b-3c7a-4fc3-9328-9ca959dd2227</trackback:ping>
      <wfw:comment>http://blog.bruceabernethy.com/blog/post/GarminVsiPod.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.bruceabernethy.com/blog/syndication.axd?post=22ac258b-3c7a-4fc3-9328-9ca959dd2227</wfw:commentRss>
    </item>
    <item>
      <title>Santa doesn’t believe in the Easter Bunny</title>
      <description>&lt;p&gt;A funny thing happened on my way to work this morning, which has so messed with my head that I had to write and talk about it a little to try to get over it.&lt;/p&gt;  &lt;p&gt;Monday mornings I usually stop off at Big Apple bagels on Plainfield on my way to work in the morning. I've done this for so many years now that it is basically a habit for me. So I parked my car, got out, opened the door, made eye-contact with the &amp;quot;bagel lady&amp;quot; and she turned and grabbed an everything bagel which is my &amp;quot;usual&amp;quot; bagel. So everything was going according to the usual &amp;quot;Monday-morning script.&amp;quot; &lt;/p&gt;  &lt;p&gt;But then something happened that threw a wrench into the rest of the morning. My attention briefly went to a table with by a woman and a young boy at one of the tables. They were wrapping up their meal, and I guess also a heated conversation. The only part of the discussion I caught was her response to her son that was something like &amp;quot;No, Santa Claus doesn't even believe in the Easter Bunny&amp;quot;. &lt;/p&gt;  &lt;p&gt;This single statement took me from a peace of mind, where I thought the day was starting out &amp;quot;as normal&amp;quot; to more of a stunned state where I nearly bumped into the counter. To make things worse, the mom and her son put their trash in the bin and left the building, so I could not hear any of the follow-on conversation - not that I was snooping in the first place, it was just an innocent overhearing of two people talking in a public place. But without context my mind tried to process what it had heard without any further help from context or additional input.&lt;/p&gt;  &lt;p&gt;So I was left to wonder what could have led up to that worldview-bending statement, and what came from it. Was the boy questioning the reality of Santa and that brought up the &amp;quot;Easter Bunny&amp;quot; - which is &amp;quot;clearly make believe&amp;quot;. Was the lady really pushing to keep the belief in Santa - so much that she further revealed her personal discussions and knowledge of Santa to understand his beliefs about other &amp;quot;Fairy Tale&amp;quot; figures. What about the Tooth Fairy? Does Santa believe in the Tooth Fairy? Does the Tooth Fairy believe in the Easter Bunny? Or, perhaps she was one of the rare few adults that hold on to a belief in Santa Claus and who extends that belief into complex worldview of &amp;quot;what Santa believes&amp;quot; - kind of a &amp;quot;Santaism&amp;quot; (which just sounds bad).&lt;/p&gt;  &lt;p&gt;My brain just started hurting at that point and I drove to work with my bagel which had somehow become much less important to me.&lt;/p&gt;  &lt;p&gt;So, in the end, I was reminded of something my mother told me about not being nosey and listening in on other people's conversations. I guess this morning's incident is just one more reason that this is wise advice.&lt;/p&gt;</description>
      <link>http://blog.bruceabernethy.com/blog/post/Santa-doesne28099t-believe-in-the-Easter-Bunny.aspx</link>
      <author>Bruce</author>
      <comments>http://blog.bruceabernethy.com/blog/post/Santa-doesne28099t-believe-in-the-Easter-Bunny.aspx#comment</comments>
      <guid>http://blog.bruceabernethy.com/blog/post.aspx?id=ee43e872-a06c-4378-a200-cbeedde771f2</guid>
      <pubDate>Mon, 07 Jun 2010 10:32:46 -0900</pubDate>
      <dc:publisher>Bruce</dc:publisher>
      <pingback:server>http://blog.bruceabernethy.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://blog.bruceabernethy.com/blog/post.aspx?id=ee43e872-a06c-4378-a200-cbeedde771f2</pingback:target>
      <slash:comments>31</slash:comments>
      <trackback:ping>http://blog.bruceabernethy.com/blog/trackback.axd?id=ee43e872-a06c-4378-a200-cbeedde771f2</trackback:ping>
      <wfw:comment>http://blog.bruceabernethy.com/blog/post/Santa-doesne28099t-believe-in-the-Easter-Bunny.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.bruceabernethy.com/blog/syndication.axd?post=ee43e872-a06c-4378-a200-cbeedde771f2</wfw:commentRss>
    </item>
    <item>
      <title>Thoughts on Steve Job’s Thoughts on Flash</title>
      <description>&lt;p&gt;First, I think it is quite helpful and open for &lt;a href="http://www.apple.com/hotnews/thoughts-on-flash/"&gt;Steve Job’s to post his Thoughts on Flash&lt;/a&gt;.&amp;#160; He didn’t have to do this.&amp;#160; He could have just left it out there.&amp;#160; But since Apple is generally in the doghouse in the Public Relations area (blocking Flash, prosecuting Gizmodo for the iPhone scoop, etc.) it was probably time for something like this.&lt;/p&gt;  &lt;p&gt;If you care about this issue then you should read the original article, and maybe a little further – if not, thanks for reading this far and have a nice day.&lt;/p&gt;  &lt;p&gt;So I don’t know if Jobs is being intentionally misleading or just trying to confuse or convince the less informed buyers of their stuff, but his post is really full of dishonest and hypocritical statements.&lt;/p&gt;  &lt;h2&gt;It’s Not About Protecting the App Store&lt;/h2&gt;  &lt;p&gt;Early on he says that Adobe believes “they say we want to protect our App Store – but in reality it is based on technology issues.”.&amp;#160; To say that Apple isn’t trying to “protect” iTunes and the App Store is just plain lying.&amp;#160; This is how they make a huge amount of their money.&amp;#160; To allow users to only use iTunes to get music on to their iPhones, and only allow a single source of applications for the iPhones, is how they operate.&amp;#160; This legal monopoly means millions and millions of dollars for Apple and it is something they want to fiercely protect.&lt;/p&gt;  &lt;h2&gt;It’s About Being “Open”&lt;/h2&gt;  &lt;p&gt;The bad thing about Flash is that it is “100% proprietary”. Um, Steve what about iTunes.&amp;#160; What about the App Store.&amp;#160; What about only allowing development for the iPhone to be on Macs, and only with Apple’s 100% proprietary tools.&amp;#160; To make this claim as the reason they block Flash is so obviously false that I don’t even need to say anything more about it.&amp;#160; But I will.&amp;#160; Steve further says that “Rather than use Flash, Apple has adopted HTML5, CSS and JavaScript – all open standards.” For web browsing.&amp;#160; What about application development (which is what Flash, Silverlight, etc.) are for – there Apple is “100% proprietary” and “100% blocking” of other options.&lt;/p&gt;  &lt;h2&gt;Flash is Only Used for Video&lt;/h2&gt;  &lt;p&gt;Apple, and others, have repeatedly said that the main use of Flash is for viewing videos and that today “video is also available in a more modern format, H.264” which works on iPhones.&amp;#160; This is true, but this assumes that the video is not interactive and that all video players must be identical.&amp;#160; Since I am working on a custom video player at the moment, I can tell you that customers want a lot more that just play, pause, and fast-forward today and the customization and integration/analytics are very desired from a branding and functionality perspective.&amp;#160; Plus, features like smooth-streaming (i.e. making sure you have a good experience with video whether it is on a small cell phone over wireless or high-definition and high-bandwidth set up at home) will not work without a modern player.&lt;/p&gt;  &lt;h2&gt;Flash Games Should be Ported into the App Store&lt;/h2&gt;  &lt;p&gt;At least here Jobs is being honest.&amp;#160; I’ll paraphrase “Since we block Flash, many of the Flash game authors have been forced to create a proprietary App Store version of their game to get on our platform”.&amp;#160; But then he lies again saying “There are more games and entertainment titles available for iPhone, iPod and iPad than for any other platform in the world”, um sorry, my netbook has access to far more games, entertainment, and educational titles (i.e. Flash, Silverlight, etc.).&amp;#160; And anyone anywhere on Earth can write one over the weekend and publish it to the web where anyone can run them – not having to buy a Mac, get into the Developer Program, and get it through the App Store approval process.&lt;/p&gt;  &lt;h2&gt;Let’s Play on Users Fears of Security&lt;/h2&gt;  &lt;p&gt;Since we can’t be honest about all of the above, let’s tell people that their phones will crash and be unsecure if they try to run Flash on them.&amp;#160; This way when Flash and Silverlight come out for the Android and Windows Phone 7 platforms, they will think twice about using them.&amp;#160; Next, we’ll tell them that Flash uses more battery life because it is all “software” instead of “hardware”.&amp;#160; This is no longer true with new versions of Flash and Silverlight, but putting this FUD out there (fear, uncertainty and doubt) will scare uniformed people into trusting only iPhones.&lt;/p&gt;  &lt;h2&gt;Flash Works with Mice not Fingers&lt;/h2&gt;  &lt;p&gt;This lie goes along with the false theme of “Flash is old technology, but iPhone is new technology”.&amp;#160; Jobs states it as “Flash was created during the PC era – for PCs and mice” which, again is partially true (as most good lies are).&amp;#160; What he doesn’t tell you is that Objective C (what iPhone apps are developed in) was also designed originally for writing programs for the Macintosh computer (and even NeXT machine before that).&amp;#160; With the development of the iPhone they added functionality to enable touch-based applications.&amp;#160; Would it surprise anyone to know that Flash and Silverlight have also added functionality for touch in current versions.&amp;#160; He supports this lie with another half-truth saying “For example, many Flash websites rely on “rollovers”, which pop up menus or other elements when the mouse arrow hovers over a specific spot.”&amp;#160; Again, shocking I know, but many Macintosh programs (using the same programming language as iPhone apps) also have (gasp) menus that can be clicked on and buttons (no) that have roll-over and click effects.&amp;#160; This ongoing set of double-standards and half-truths make the rest of what Jobs says very suspect.&lt;/p&gt;  &lt;h2&gt;Apple is Best at Determining What Should Run on iPhones and iPads&lt;/h2&gt;  &lt;p&gt;Job’s last and “most important” reason is actually the most grave and most dangerous and actually why I decided to write this post.&amp;#160; Jobs claims that “letting a third party layer of software come between the platform and the developer ultimately results in sub-standard apps” being written and executed on Apple devices.&amp;#160; Wow. That is bold.&amp;#160; Apple not only wants to be the sole entity that can determine who can develop, how they develop, and where they can distribute, but they also want to be the ones who determine which applications are “worthy” of running on their devices.&amp;#160; Applications that are not, in Apple’s eyes, “the best apps the world has ever seen” will not be allowed to be written or to run on Apple hardware.&lt;/p&gt;  &lt;p&gt;One of the &lt;a href="http://en.wikipedia.org/wiki/1984_(advertisement)"&gt;greatest commercials of all time&lt;/a&gt; was the &lt;a href="http://www.youtube.com/watch?v=OYecfV3ubP8"&gt;Macintosh 1984 commercial&lt;/a&gt;.&amp;#160; It depicted a scene where a runner in white with a sledge hammer ran past all the guards and huddled masses who in the end hurls the hammer through the screen of a draconian speaker, implying an end to the control of Big Brother in the technology arena.&amp;#160; The quote of the background speaker is worth repeating here.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Today, we celebrate the first glorious anniversary of the Information Purification Directives. We have created for the first time in all history, a garden of pure ideology. Where each worker may bloom secure from the pests of contradictory and confusing truths. Our Unification of Thoughts is more powerful a weapon than any fleet or army on earth. We are one people, with one will, one resolve, one cause. Our enemies shall talk themselves to death and we will bury them with their own confusion. We shall prevail!&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;What Jobs is defending in this post is that Apple is now trying to create is “a garden of pure ideology” where iPhone users can be “secure from the pests of contradictory and confusing truths” from outside developers – that their developers will be “one people, with one will, one resolve, one cause”.&amp;#160; Jobs has become the man on the screen and iPhone/iPad users will become the drones in the audience – happy with the perfect Apple-cleansed devices and Apple-created development tools that have all passed by the Apple thought-police.&lt;/p&gt;  &lt;p&gt;So while “1984 won’t be like 1984” it may be that “2014 is just like 1984” if Apple has their way.&lt;/p&gt;</description>
      <link>http://blog.bruceabernethy.com/blog/post/Thoughts-on-Steve-Jobe28099s-Thoughts-on-Flash.aspx</link>
      <author>Bruce</author>
      <comments>http://blog.bruceabernethy.com/blog/post/Thoughts-on-Steve-Jobe28099s-Thoughts-on-Flash.aspx#comment</comments>
      <guid>http://blog.bruceabernethy.com/blog/post.aspx?id=bea2a7ca-250d-4bcb-883e-f4c90388f07f</guid>
      <pubDate>Thu, 29 Apr 2010 03:13:00 -0900</pubDate>
      <dc:publisher>Bruce</dc:publisher>
      <pingback:server>http://blog.bruceabernethy.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://blog.bruceabernethy.com/blog/post.aspx?id=bea2a7ca-250d-4bcb-883e-f4c90388f07f</pingback:target>
      <slash:comments>7</slash:comments>
      <trackback:ping>http://blog.bruceabernethy.com/blog/trackback.axd?id=bea2a7ca-250d-4bcb-883e-f4c90388f07f</trackback:ping>
      <wfw:comment>http://blog.bruceabernethy.com/blog/post/Thoughts-on-Steve-Jobe28099s-Thoughts-on-Flash.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.bruceabernethy.com/blog/syndication.axd?post=bea2a7ca-250d-4bcb-883e-f4c90388f07f</wfw:commentRss>
    </item>
    <item>
      <title>Lessons Learned: Craftsmen and artists of all types have a lot in common</title>
      <description>&lt;p&gt;I spent last Thursday, Friday and Saturday at the &lt;a href="http://www.calvin.edu/academic/engl/festival/"&gt;Festival of Faith and Writing&lt;/a&gt; which is a conference for authors, playwrights, publishers, readers, teachers, etc.&amp;#160; I’ve been going to the conference since 1996, which was three years after I wrote my last/only book, but was right in the middle of the nine years I was writing monthly articles on technology in education.&amp;#160; So if it has been four years now since I have written anything (for money), why keep going to the conference?&lt;/p&gt;  &lt;p&gt;The short answer is that I always learn something new, and always am reminded of things I had learned before but have forgotten (or stopped paying attention to).&amp;#160; I think all creative people who are working in their chosen craft share a lot of the same struggles.&amp;#160; These craftsmen can learn a lot from each other, whether they be authors, film makers, musicians, artists, or even people trying to create a good user interface or user experience using web sites and computer software.&lt;/p&gt;  &lt;p&gt;So briefly below is my “Top 10+” list of things I learned or relearned this year.&amp;#160; Each of these items is probably a blog post or book in itself, but I don’t have time for that right now – perhaps I’ll expand on some of these in the near future.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Nothing replaces experience when conceiving and starting a project&lt;/li&gt;    &lt;li&gt;No craftsman (or woman) is an island&lt;/li&gt;    &lt;li&gt;A picture is still worth a thousand words&lt;/li&gt;    &lt;li&gt;Nothing is more inspiring than a talented craftsman with passion&lt;/li&gt;    &lt;li&gt;Give your audience something that they recognize, even/especially in brand new creations&lt;/li&gt;    &lt;li&gt;The best way to learn how to create something yourself is to regularly view/review other people’s creations&lt;/li&gt;    &lt;li&gt;Another great way to learn to to create something is to just get started creating something&lt;/li&gt;    &lt;li&gt;Spending only time with the “latest stuff” makes you “a mile wide, but an inch deep”&lt;/li&gt;    &lt;li&gt;Even the “masters” of any craft, if they are honest, will tell you of their daily struggles and fears&lt;/li&gt;    &lt;li&gt;“Process Versus Product” is a key concern for every craftsman&lt;/li&gt;    &lt;li&gt;“Picturing the Invisible” is another difficult and important skill to learn&lt;/li&gt;    &lt;li&gt;A true craftsman will be satisfied with a work well done, no matter if the audience is 2, 10, 100 or thousands of people&lt;/li&gt;    &lt;li&gt;A large motivation of craftsmen of all kinds is the puzzle, mystery or problem to be solved&lt;/li&gt; &lt;/ul&gt;</description>
      <link>http://blog.bruceabernethy.com/blog/post/Lessons-Learned-Craftsmen-of-all-types-have-a-lot-in-common.aspx</link>
      <author>Bruce</author>
      <comments>http://blog.bruceabernethy.com/blog/post/Lessons-Learned-Craftsmen-of-all-types-have-a-lot-in-common.aspx#comment</comments>
      <guid>http://blog.bruceabernethy.com/blog/post.aspx?id=92e83cd4-e8f3-4097-bf82-cd93631a9e5f</guid>
      <pubDate>Mon, 19 Apr 2010 01:41:44 -0900</pubDate>
      <dc:publisher>Bruce</dc:publisher>
      <pingback:server>http://blog.bruceabernethy.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://blog.bruceabernethy.com/blog/post.aspx?id=92e83cd4-e8f3-4097-bf82-cd93631a9e5f</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://blog.bruceabernethy.com/blog/trackback.axd?id=92e83cd4-e8f3-4097-bf82-cd93631a9e5f</trackback:ping>
      <wfw:comment>http://blog.bruceabernethy.com/blog/post/Lessons-Learned-Craftsmen-of-all-types-have-a-lot-in-common.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.bruceabernethy.com/blog/syndication.axd?post=92e83cd4-e8f3-4097-bf82-cd93631a9e5f</wfw:commentRss>
    </item>
    <item>
      <title>Why I make a fuss over the release of Visual Studio 2010</title>
      <description>&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 5px 10px; display: inline; border-top: 0px; border-right: 0px" title="visual_studio_logo" border="0" alt="visual_studio_logo" align="right" src="http://blog.bruceabernethy.com/image.axd?picture=visual_studio_logo.jpg" width="214" height="32" /&gt; It is no secret that most of my friends and family are non-programmers.&amp;#160; When a group of us get together “in real life” and I do find someone to talk technology with, we usually get the look of “oh they’ve gone off into the fantasy world of acronyms again, give them some space.”&amp;#160; I even slipped with my kids this weekend and mentioned something like “oooh, this week Visual Studio 2010 and Silverlight 4 come out!!”, and they politely asked what that was and why I was acting something like a kid at Christmas. So here is the short answer.&lt;/p&gt;  &lt;p&gt;Every so often, programmers get an update of either their programming language, or their programming tools, or in this case BOTH.&amp;#160; While programming can be quite technical, it is still largely a creative process.&amp;#160; When writing new code you are creating something that did not exist before.&amp;#160; Usually you are creating this new thing for a customer or a group of people who need it or want it to improve their business or organization.&amp;#160; Software people sometimes use roles and titles from other crafts to describe what they do; some of us are “architects” or “engineers”.&amp;#160; When working with Silverlight we use all kinds of terms from artists like Canvas, Pens, Brushes, Strokes, etc.&lt;/p&gt;  &lt;p&gt;So imagine you were in another creative craft such as painting.&amp;#160; And every so often you not only got a fresh set of brushes, but you also got some new brushes that you never had before, that enabled new strokes and techniques on your new canvases.&amp;#160; And a little less often you actually get new paints and even new colors that you never had before.&amp;#160; When the perfect storm happens and you get new tools, canvases, paint, colors, and more, this is a very exciting time.&amp;#160; This is a bit dramatic, but close to how I feel, especially when I am involved with a new project that actually needs some of these new tools and colors for what we are trying to do.&lt;/p&gt;  &lt;h3&gt;What are some of the new “tools and colors” in VS2010?&lt;/h3&gt;  &lt;p&gt;Well two big things are the ability to develop custom applications for both Windows 7 and Windows Phone 7 – Windows 7 has been out for a while and now programmers can take full advantage of a lot of the new features of Windows 7.&amp;#160; Windows Phone 7 will be out this fall and it basically a re-launch of the mobile phone platform for Microsoft.&amp;#160; No one knows how well Windows Phone 7 will compete with the iPhone and the Android phones, but the new features are very compelling and it should be fun to see what we can build for the new phones.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 5px 10px; display: inline; border-top: 0px; border-right: 0px" title="silverlight-logo" border="0" alt="silverlight-logo" align="right" src="http://blog.bruceabernethy.com/image.axd?picture=silverlight-logo.jpg" width="123" height="123" /&gt; But the main thing that I’ve been looking forward to is Silverlight 4 and its integration with VS2010. Developing in Silverlight with Visual Studio 2008 has been possible and productive, but going along with the painting analogy here, it has kind of been like “fingerpainting” compared to other kinds of development.&amp;#160; Now in VS2010, there is a full designer built in so you can preview and edit how Silverlight applications look and function right in the tool – this is nice.&amp;#160; It is also now much easier to change the style of an entire application so all the text, graphics, data input, etc. all look and work the same.&amp;#160; A big thing for me is enhancements to how animations and digital video can be streamed and manipulated in Silverlight.&amp;#160; Far beyond a simple video player with “VCR” controls, we can now do things with video that could never be done before. There are a ton more new features and possibilities coming out, but you get the picture.&lt;/p&gt;  &lt;p&gt;So, in a nutshell, by Wednesday I will be actively using a bunch of new tools, brushes, and colors that I don’t have today (for production use) and be able to release applications that anyone on the Internet can use, which is why I am a little excited right now.&lt;/p&gt;</description>
      <link>http://blog.bruceabernethy.com/blog/post/Why-I-make-a-fuss-over-the-release-of-Visual-Studio-2010.aspx</link>
      <author>Bruce</author>
      <comments>http://blog.bruceabernethy.com/blog/post/Why-I-make-a-fuss-over-the-release-of-Visual-Studio-2010.aspx#comment</comments>
      <guid>http://blog.bruceabernethy.com/blog/post.aspx?id=2c81b5b7-6a68-4fbc-87d4-510dbf340f52</guid>
      <pubDate>Mon, 12 Apr 2010 00:33:17 -0900</pubDate>
      <dc:publisher>Bruce</dc:publisher>
      <pingback:server>http://blog.bruceabernethy.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://blog.bruceabernethy.com/blog/post.aspx?id=2c81b5b7-6a68-4fbc-87d4-510dbf340f52</pingback:target>
      <slash:comments>16</slash:comments>
      <trackback:ping>http://blog.bruceabernethy.com/blog/trackback.axd?id=2c81b5b7-6a68-4fbc-87d4-510dbf340f52</trackback:ping>
      <wfw:comment>http://blog.bruceabernethy.com/blog/post/Why-I-make-a-fuss-over-the-release-of-Visual-Studio-2010.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.bruceabernethy.com/blog/syndication.axd?post=2c81b5b7-6a68-4fbc-87d4-510dbf340f52</wfw:commentRss>
    </item>
    <item>
      <title>iPad Hands-On Impressions</title>
      <description>&lt;p&gt;I headed over to the Apple Store over lunch to see the new iPad, and I was really happy they had about 12 of them out for people to try out.&amp;#160; I did not become an iPad owner, though it would be very tempting if I didn’t have to pay off my surgery (could actually buy one for the entire family for that deductible) – the point is, it is a very nice device.&amp;#160; For Apple to further be able to put all of this functionality into a $499 starting price, is a nothing short of a milestone.&lt;/p&gt;  &lt;p&gt;The iPad looks great from a short distance – the cool glass edge-to-edge cover over black with the shiny silver undercarriage.&amp;#160; I got to try out the only open device as people were really swarming around them, even at 11:20am a few days after launch.&amp;#160; It really did remind me of my iPod Touch, though it made that device seem quite inadequate in a number of ways.&amp;#160; The screen is much bigger, the processor is noticeably quicker, and the colors seem brighter (though that might have been just the size of the screen again).&lt;/p&gt;  &lt;p&gt;So every application on your iPod Touch or iPhone that you ever wanted to be “bigger” works so much better.&amp;#160; Reading is so much better on the big screen, especially if you are needing bigger type sizes these days.&amp;#160; Watching a movie on the screen is quite impressive.&amp;#160; I fired up the “Plants vs. Zombies” game, and the detail is much better and the interface makes it actually easier and more enjoyable to play.&amp;#160; And games like Scrabble – where you want to play with a friend – is much easier for both to view on the larger screen.&lt;/p&gt;  &lt;h2&gt;Things that were just too hard to reasonably do on a small screen:&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;Reading books or magazines (i.e. more than a few pages at a time)&lt;/li&gt;    &lt;li&gt;Games of any complexity (e.g. board/war games, real-time strategy games, etc.) &lt;/li&gt;    &lt;li&gt;Productivity Apps (e.g. word processing, spreadsheets, etc.) &lt;/li&gt;    &lt;li&gt;Watching a full-length movie (and really enjoying it) &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Things that are still just fine on a small screen&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;Music &lt;/li&gt;    &lt;li&gt;E-mail (reading, writing short messages). &lt;/li&gt;    &lt;li&gt;Handheld games – e.g. Gameboy / Nintendo DS class games &lt;/li&gt;    &lt;li&gt;Mapping / GPS &lt;/li&gt;    &lt;li&gt;Twitter / Facebook &lt;/li&gt;    &lt;li&gt;News &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;New classes of apps made possible by the iPad / Tablets&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;Multimedia/Interactive publications – not just moving print and pictures to the web, but interlacing video and interactive components into the publications as well (Flash and Silverlight would sure be nice here – see below).&amp;#160; This would include “textbooks” that are so much more than textbooks; Imagine the ability to watch a key scene from a Shakespeare drama included within the text itself, or a live physics simulation embedded in the chapter on Newtonian forces.&lt;/li&gt;    &lt;li&gt;Mobile sales/presentations – this is the perfect type of device for sales people and others that do presentations to take on the road.&amp;#160; It works well in 1-on-1 or small group situations to host the content itself, and can be hooked up to a projector for larger audiences.&lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;The iPad’s issues to resolve&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;Even with the iPad’s ancestors in the iPhone and iPod Touch, it is still a “1.0” device.&amp;#160; There are &lt;a href="http://www.pcworld.com/article/193434/ipad_fail_users_experiencing_issues.html"&gt;already reports&lt;/a&gt; of issues with WiFi reception and charging via the USB connection.&amp;#160; Apple has been very good in the past at working with people to resolve issues and updating the hardware in future releases.&amp;#160; And with 3/4 of a million of these devices already out there, I am sure they will get a lot of feedback.&lt;/li&gt;    &lt;li&gt;While the 9.7” beautiful glass screen is its #1 feature it is also potentially the iPad’s #1 problem.&amp;#160; How do you keep it from scratching when there is no cover?&amp;#160; If it is in a backpack or bag with other things it’ll get scratchy pretty quickly.&amp;#160; Along with added size is added mass.&amp;#160; If this thing falls off a table and hits one of the edges (even on carpet) I think you will start to see some cracked or shattered devices.&amp;#160; I don’t know if this is repairable or if it needs to be replaced.&amp;#160; In my mind I see some kind of leather flap or cover (like an executive leather folder) with perhaps a clasp or zipper to protect the device in transit.&amp;#160; The iPhone still fits nicely in a pocket or holster and I think that becomes a selling point now over the iPad. &lt;strong&gt;UPDATE&lt;/strong&gt;: Search found that they have thought of this &lt;a href="http://store.apple.com/us/product/MC361ZM/A"&gt;$40 case with some protection here&lt;/a&gt;.&amp;#160; This will be available in Late April.&amp;#160; Good.&lt;/li&gt;    &lt;li&gt;Battery life.&amp;#160; I know my iPod Touch after a couple years of solid use now needs to be recharged at least once a day.&amp;#160; I don’t know how long the 9-10 hours of battery life will be true for the iPad.&lt;/li&gt;    &lt;li&gt;Customer choice for applications and content.&amp;#160; &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;The irony of how nice the version of the “Plants vs. Zombies” game is on the iPad, is that it was finally getting back some of the functionality of the “original” Flash version – yes, this is a game that started on the web with Flash but was simplified for the smaller iPhone screen, and is now “enhanced” by bringing back some of the features of the Flash version.&amp;#160; PvZ is one of thousands of popular Flash games that are out on the web that are inaccessible to all iPad users.&amp;#160; Most interactive educational materials were developed in Director/Authorware/Flash and are also inaccessible on the iPad.&amp;#160; &lt;/li&gt;      &lt;li&gt;Further I can’t pick something as basic as a browser on the iPad.&amp;#160; In daily use I use Chrome and Internet Explorer as my two main browsers – neither of these (nor Firefox, Opera, etc.) are allowed on the iPad because they would compete with the Safari browser from Apple.&amp;#160; I am sure they will do the same thing to “protect” the profits from their productivity software and other utilities.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;No built-in camera?&amp;#160; Need to figure that one out – maybe it put them over that $499 target price?&lt;/li&gt;    &lt;li&gt;No GPS in the WiFi models?&amp;#160; Must be some weird contractual thing (or the $499 target price)&amp;#160; This could have been the perfect “travel companion” if the travel guides would have GPS-enabled maps included.&lt;/li&gt;    &lt;li&gt;No phone calling/receiving capabilities in the 3G models?&amp;#160; It is already on the network why not allow calls for those with a plan?&lt;/li&gt;    &lt;li&gt;No ports for camera or video out?&amp;#160; They have helped with &lt;a href="http://store.apple.com/us/product/MC531ZM/A"&gt;adapters for cameras now for USB or SD cards&lt;/a&gt;.&amp;#160; Now they’ll just need to come out with an HDMI out adapter.&lt;/li&gt; &lt;/ul&gt;</description>
      <link>http://blog.bruceabernethy.com/blog/post/iPad-Hands-On-Impressions.aspx</link>
      <author>Bruce</author>
      <comments>http://blog.bruceabernethy.com/blog/post/iPad-Hands-On-Impressions.aspx#comment</comments>
      <guid>http://blog.bruceabernethy.com/blog/post.aspx?id=ec69920c-90b6-4eb1-9c1a-c8481148bd32</guid>
      <pubDate>Mon, 05 Apr 2010 05:11:56 -0900</pubDate>
      <dc:publisher>Bruce</dc:publisher>
      <pingback:server>http://blog.bruceabernethy.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://blog.bruceabernethy.com/blog/post.aspx?id=ec69920c-90b6-4eb1-9c1a-c8481148bd32</pingback:target>
      <slash:comments>29</slash:comments>
      <trackback:ping>http://blog.bruceabernethy.com/blog/trackback.axd?id=ec69920c-90b6-4eb1-9c1a-c8481148bd32</trackback:ping>
      <wfw:comment>http://blog.bruceabernethy.com/blog/post/iPad-Hands-On-Impressions.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.bruceabernethy.com/blog/syndication.axd?post=ec69920c-90b6-4eb1-9c1a-c8481148bd32</wfw:commentRss>
    </item>
    <item>
      <title>Toastmasters for Techies</title>
      <description>&lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=Toastmasters.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="Toastmasters" border="0" alt="Toastmasters" align="right" src="http://blog.bruceabernethy.com/image.axd?picture=Toastmasters_thumb.png" width="150" height="216" /&gt;&lt;/a&gt;About a month ago I started attending a new group forming now in Grand Rapids called “ &lt;a href="http://tmfortechies.freetoasthost.org/"&gt;Toastmasters for Techies&lt;/a&gt;”.&amp;#160; I had heard of “Toastmasters” many times in the past as a group that had been around for a long long time to help people get better at speaking in public.&amp;#160; Today in 2010, Toastmasters has served over four million people and is growing all the time – case in point being this “Toastmasters for Techies” group.&lt;/p&gt;  &lt;p&gt;What drew me to this group was that is was: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;just getting started (didn’t want to be “behind”)&lt;/li&gt;    &lt;li&gt;“unbranded” (some groups are part of businesses or organizations that I am not a part of)&lt;/li&gt;    &lt;li&gt;local / close (meets downtown at Wealthy/Diamond at &lt;a href="http://www.atomicobject.com/pages/Find+Us"&gt;Atomic Object&lt;/a&gt;)&lt;/li&gt;    &lt;li&gt;focused on techies (not just “nerds” getting together and giving speeches, but better yet “geeks” getting together and giving speeches)&lt;/li&gt;    &lt;li&gt;and I knew a few of the people who were already going and knew they were good people&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;If you know me you know I like to talk – probably too much, and probably too often.&amp;#160; I gave professional presentations seven times last year, and five times each of the previous two years.&amp;#160; I’ve also led a Robotics club with a bunch of kids and parents, been a Den Leader in Cub Scouts, taught classes at church, and spend quite a bit of time at work talking/discussing/debating ideas and projects with clients and team members.&amp;#160; And all of this just means I am really part of the problem that Toastmasters is trying to solve.&lt;/p&gt;  &lt;p&gt;If we are being honest right now, there are a lot of just-plain-bad-presentations out there in the computer field.&amp;#160; Either a presenter is just too smart for the audience and loses them in the first five minutes, or they get caught up in a failed demo that was the basis of their entire session, or they are a good speaker but it is clear that “someone else” prepared the slides and the demos for them, or some unfortunate combination of these which we won’t talk about. I have even seen some speakers that seem to be just speaking for themselves and do not seem to be aware or care that there are any other people in the room.&amp;#160; I am not alone in these observations.&lt;/p&gt;  &lt;p&gt;Also, I’ll stop short of saying that “PowerPoint is Evil!” but I will say that it is a tool that has been used much more often as a crutch for bad speech preparation, or as a smoke screen for a clear lack of content, than to support presentations of substance.&amp;#160; Even people that have gotten the whole “&lt;a href="http://www.presentationzen.com/"&gt;Presentation Zen&lt;/a&gt;” idea seem to work harder on trying to find the right catchy picture for their content (or worse yet, catchy content for a cool picture they found).&lt;/p&gt;  &lt;p&gt;Even if you have had similar experiences with such presentations, I need to say that the audience is also somewhat at fault.&amp;#160; I have reviewed many evaluation forms from people at the events we have held or my own talks. The feedback always seems to be quite minimal and almost always “4-5 stars.”&amp;#160; I don’t know if this is because most of the talks are free or given by volunteers, or if the bar has been set fairly low.&amp;#160; There is an occasional “gem” of an evaluation, with some constructive criticism or suggestions for additions/improvement, and those are really “gold” to someone who takes their speaking seriously. One of the biggest things I have learned in my first month in Toastmasters is really how to evaluate and give feedback to speakers that they can use and work with.&lt;/p&gt;  &lt;p&gt;I’ll be the first to stand up and testify that I need help being a better speaker.&amp;#160; I have always gone over on time in my recent presentations – or at least cut out content that I had “intended” to get to.&amp;#160; I always thought it was better to have a lot of content that covered a variety of areas.&amp;#160; I have used and abused PowerPoint.&amp;#160; Because I try to squeeze an over-abundance of content into talks I tend to talk very quickly, which can be entertaining and engaging, but is not optimal for learning.&amp;#160; I admit I have sometimes finished or “tweaked” demos for a talk while setting up in the very room for the talk – again, keeps things “current” and “exciting” but doesn’t always show a concern for the content or audience.&amp;#160; I want to improve.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=ti_logo1.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="ti_logo1" border="0" alt="ti_logo1" align="right" src="http://blog.bruceabernethy.com/image.axd?picture=ti_logo1_thumb.jpg" width="150" height="133" /&gt;&lt;/a&gt; So I enter into this Toastmasters experience with the intent to become more precise and concise in my speaking.&amp;#160; When I was first writing a monthly column I would write 1,200 or even 1,400 word articles only to have my ever-patient editor send them back and say to cut them down to 400-600 words but still “tell the same story.”&amp;#160;&amp;#160; Over the years I got better at writing within the boundaries of a print publication and even avoided many edits in my last few years of writing.&amp;#160; I need to do the same thing with speaking – say less words but tell the same story.&lt;/p&gt;  &lt;p&gt;Each Toastmasters Club needs to recruit 20 members to be formally established, and the group is almost half way there.&amp;#160; I hope if you are a local “techie” that you are interested in improving your speaking skills, that you would consider stopping by on Monday over lunch as an “honored guest” at one of our meetings.&lt;/p&gt;  &lt;p&gt;Feel free to check out our &lt;a href="http://tmfortechies.freetoasthost.org/"&gt;web site&lt;/a&gt; or our &lt;a href="http://twitter.com/toast4tech"&gt;Twitter account&lt;/a&gt; for more info.&lt;/p&gt;</description>
      <link>http://blog.bruceabernethy.com/blog/post/Toastmasters-for-Techies.aspx</link>
      <author>Bruce</author>
      <comments>http://blog.bruceabernethy.com/blog/post/Toastmasters-for-Techies.aspx#comment</comments>
      <guid>http://blog.bruceabernethy.com/blog/post.aspx?id=064a0461-ca36-41ab-af20-c1b99c64f1b4</guid>
      <pubDate>Tue, 30 Mar 2010 08:52:28 -0900</pubDate>
      <dc:publisher>Bruce</dc:publisher>
      <pingback:server>http://blog.bruceabernethy.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://blog.bruceabernethy.com/blog/post.aspx?id=064a0461-ca36-41ab-af20-c1b99c64f1b4</pingback:target>
      <slash:comments>40</slash:comments>
      <trackback:ping>http://blog.bruceabernethy.com/blog/trackback.axd?id=064a0461-ca36-41ab-af20-c1b99c64f1b4</trackback:ping>
      <wfw:comment>http://blog.bruceabernethy.com/blog/post/Toastmasters-for-Techies.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.bruceabernethy.com/blog/syndication.axd?post=064a0461-ca36-41ab-af20-c1b99c64f1b4</wfw:commentRss>
    </item>
    <item>
      <title>Candyland, LCR, and Warstorm</title>
      <description>&lt;p&gt;If “Candyland, LCR, and Warstorm” was a Jeopardy answer, my question of the day would be “Name three games that seem really fun when you start playing them, but quickly fade when you start thinking about them.”&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="candylandpic" border="0" alt="candylandpic" align="right" src="http://blog.bruceabernethy.com/image.axd?picture=candylandpic.png" width="240" height="185" /&gt; Candyland is a game that probably everyone has heard of.&amp;#160; Now 60 years old, it is probably the first board game that children start playing. A child really only need to know their colors and a few shapes to play; this is both a good and a bad thing.&lt;/p&gt;  &lt;p&gt;It is good that parents and kids play Candyland together because it is a way to spend time interacting and having fun together.&amp;#160; But Candyland is not a great game to get kids started on because it really needs no thought, creativity or strategy whatsoever. If you think about it, once you pick a game piece and shuffle the deck, the entire game is already determined.&amp;#160; No matter how “good” you are at Candyland it doesn’t matter – you will will the same amount of games (over time).&amp;#160; There are no “Candyland Tournaments” or “Candyland World Championships.”&amp;#160; There are no books or web sites you can visit to discuss Candyland “strategy” with other players.&amp;#160; You can never been any “better” at playing Candyland, and you can certainly never get any worse. Candyland is a colorful and fun “game” you can play with pre-school kids and have a great time, but it quickly loses its appeal once you realize that it is basically a “coin flip” and that even “rock-paper-scissors” has far more strategic value.&amp;#160; Still don’t believe me.&amp;#160; Imagine playing “solitaire Candyland” with two teddy bears and realize you now have a 66% chance of losing to a stuffed animal.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=LCR.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="LCR" border="0" alt="LCR" align="right" src="http://blog.bruceabernethy.com/image.axd?picture=LCR_thumb.jpg" width="240" height="71" /&gt;&lt;/a&gt;Jump ahead a bunch of years and we got the “wildly popular and exciting LCR” game that “everyone is playing&amp;quot; – and yes I was one of the suckers that dropped ~$5 on this “game in a tube.”&amp;#160; If you haven’t played this game, it is pretty simple.&amp;#160; You have 3 dice and a bunch of mini poker chips which are divided up among all the players.&amp;#160; You roll the dice and will get either an “L” a “C” an “R” or a “*” (dot).&amp;#160; If you get a dot (there are three per dice) then you do nothing.&amp;#160; An “L” means pass a chip to the person on your left, an “R” means pass a chip to the person on your right, and a “C” means pass a chip to the center “pot” which grows as the game progresses.&amp;#160; Once everyone is out of chips except one person, then the game is over.&amp;#160; As you probably have figured out already, this is basically Candyland with dice.&amp;#160; Sit down with the same two teddy bears as above and you will lose far more than you win.&amp;#160; This isn’t to say you can’t have fun playing LCR – I’ve had a lot of fun playing Candyland and LCR – but the fun is more about the people you are spending the time with than the “game” itself.&amp;#160; Some of the recommendations I have read for making LCR more fun often include substituting money or M&amp;amp;Ms for the chips or adding a drinking component.&amp;#160; By the way, if you don’t tell anyone else you can play “LCR” right now at home with three 6-sided dice and some pretzels: 1=L, 2=C, 3=R, 4-6 do nothing – saving you $5 and some frustration.&lt;/p&gt;  &lt;p&gt;There was a posting on Board Game Geek called the &lt;a href="http://www.boardgamegeek.com/thread/433105/comprehensive-lcr-strategy-guide"&gt;“Comprehensive LCR Strategy Guide”&lt;/a&gt; which is a very creative and funny read.&amp;#160; Some “strategies” for playing LCR include “Throwing Off Your Opponents” and even “Cheating”.&amp;#160; And beyond the humor this got me to thinking.&amp;#160; When people get into what they consider to be a “no win” situation or even one where their “fate has already been determined” many are not content to just sit by and watch.&amp;#160; If the rules aren’t fair – change the rules (bonus points if your just thought &lt;a href="http://memory-alpha.org/en/wiki/Kobayashi_Maru_scenario"&gt;Kobayashi Maru&lt;/a&gt;).&amp;#160; If you can’t change the rules – make your own rules (i.e. cheat).&amp;#160; What if you could take a game like Candyland and LCR and find a way to give a particular player a better chance of winning than other players – say in a game with four players, what if the players had these chances to win: 20% 20% 20% 40% (i.e. the last person is twice as likely to win as any of the other players).&amp;#160; This, clearly, wouldn’t be fair and most people would call this cheating.&amp;#160; What if it wasn’t cheating, but right in the rules and what if all you had to do to get a better chance of winning was to pay some extra money.&amp;#160; If you pay $20 extra dollars then you get to play with a different deck when you play Candyland – a deck that has better cards, no traps, and more doubles.&amp;#160; What if LCR had a more expensive “expert” version that let certain players use dice that had better odds than other people – again not fair. But this is exactly how most games on Facebook work.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=warstorm.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="warstorm" border="0" alt="warstorm" align="right" src="http://blog.bruceabernethy.com/image.axd?picture=warstorm_thumb.png" width="244" height="78" /&gt;&lt;/a&gt; Enter Warstorm.&amp;#160; I’ve spent several hours over the last week playing Warstorm on Facebook, or more accurately watching Warstorm play itself in front of me. A couple family and friends started playing it and were talking about it, and you know I like a good game.&amp;#160; On the surface Warstorm is very compelling and well designed.&amp;#160; The application itself is visually stunning, the art is professional, the application programming and design is cutting-edge, and there are a great number of people playing it.&amp;#160; But, if you really break it down, it is really a beautifully drawn, interactive, action-packed, implementation of “Candyland” but with “cheating” built in if you want to pay for it.&lt;/p&gt;  &lt;p&gt;Without going too deep into the game itself, suffice it to say that all players of Warstrom start with the same limited collection of cards that they build up squads or armies of infantry, cavalry, archers, and many others to fight against one another.&amp;#160; Each card takes a certain number of turns to come into the battle (bigger/more powerful cards take longer) and have different strengths and weaknesses.&amp;#160; This initially sounds like Pokemon or Magic The Gathering – but it really isn’t, for a couple of really important reasons.&amp;#160; In Pokemon and MTG the players actually get to play the game – in Warstrom you take your squad(s) and the computer plays the game in front of you.&amp;#160; In fact, when you press “Ready” it could just tell you who won without all of the fancy battle graphics and animations; the computer already knows who won.&amp;#160; As soon as the cards are “shuffled” the outcome of the game is set – just like Candyland.&lt;/p&gt;  &lt;p&gt;However, unlike Candyland you can improve your odds of winning if you have some money to spend (or a whole lot of time on your hands).&amp;#160; Here is a quick example – two different versions of two different cards.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=wsCards.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="wsCards" border="0" alt="wsCards" src="http://blog.bruceabernethy.com/image.axd?picture=wsCards_thumb.png" width="550" height="174" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The important thing to notice in this example is that these cards are identical except for the little number in the bottom left-hand corner – this is the number of turns it takes for these cards to come into play.&amp;#160; So the first “Barbarian Warrior” will come in after 8 turns, but his otherwise-identical counterpart will come in 2 turns earlier.&amp;#160; In Warstrom timing is everything.&amp;#160; If two people built decks where one used the “8” cards and one used the “6” cards they would have a 25% better chance of winning each battle.&amp;#160; The second two cards are even more extreme as the one card has a 50% speed advantage over the other one.&amp;#160; And how do you get the “better” version of the cards, pay real cash money for them, or play a lot (seriously a lot).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=wsBeast.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px auto 10px; display: block; float: none; border-top: 0px; border-right: 0px" title="wsBeast" border="0" alt="wsBeast" src="http://blog.bruceabernethy.com/image.axd?picture=wsBeast_thumb.png" width="400" height="177" /&gt;&lt;/a&gt;One more example to show how far this can go – in the bottom right of these cards there is the attack power and toughness (how much damage they can take).&amp;#160; The power/attack is what is important to beat the opponents army.&amp;#160; You want powerful cards out quickly.&amp;#160; The first card in this example is a 3/1 that comes out in 1 turn – so on the second turn this one is already attacking for 3 damage.&amp;#160; This is an “Expert” card which means each pack of cards “costs” you 12500 silver (3-4 days of playing) or 5 gold ($1 cash = 4 gold).&amp;#160; And this only gives you one chance of getting this card – there are many hundreds of different cards.&amp;#160; The best an “average” can do to get a 3 power card is to hope for an “Aanden Silverback”.&amp;#160; They are more common, but take 8 turns to come out – so the Golem that came out on turn 2 can kill the Silverback that comes out on turn 9 (or turn 7 if you pay more money).&amp;#160; If this isn’t bad enough, the Golem is “Animated” which means that even if your turn 9 Silverback kills the Golem he has a 50% chance of coming back into play one turn later.&amp;#160; Crazy.&lt;/p&gt;  &lt;p&gt;Any game where the person who spends the most money wins just isn’t fair, and any game that just “plays itself” gets frustrating or boring very quickly.&amp;#160; So, while it took me a good week to realize that Warstrom was unfair and frustrating, at least I did and I am out.&amp;#160; Sorry guys.&lt;/p&gt;  &lt;p&gt;But I won’t leave this on a down note.&amp;#160; Instead of Candyland, LCR, and Warstrom let me recommend three real games that fit the same need but are fun, use your creativity, and have a good combination of luck and strategy. &lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="conclusion" border="0" alt="conclusion" src="http://blog.bruceabernethy.com/image.axd?picture=conclusion.png" width="550" height="132" /&gt; &lt;/p&gt;  &lt;p&gt;With kids, instead of Candyland, try Checkers – with friends, play a simple card game like Rummy instead of LCR – and if you like the collectible card construction type of game, you can’t go wrong with Dominion.&amp;#160; Remember, after playing a good game will have you thinking about what you could have done differently, and what you want to try the next time you play, these three will do that.&lt;/p&gt;</description>
      <link>http://blog.bruceabernethy.com/blog/post/Candyland-LCR-and-Warstorm.aspx</link>
      <author>Bruce</author>
      <comments>http://blog.bruceabernethy.com/blog/post/Candyland-LCR-and-Warstorm.aspx#comment</comments>
      <guid>http://blog.bruceabernethy.com/blog/post.aspx?id=4b86b18e-d584-4c74-bd2d-4ca71bc14d20</guid>
      <pubDate>Fri, 19 Mar 2010 06:10:58 -0900</pubDate>
      <dc:publisher>Bruce</dc:publisher>
      <pingback:server>http://blog.bruceabernethy.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://blog.bruceabernethy.com/blog/post.aspx?id=4b86b18e-d584-4c74-bd2d-4ca71bc14d20</pingback:target>
      <slash:comments>35</slash:comments>
      <trackback:ping>http://blog.bruceabernethy.com/blog/trackback.axd?id=4b86b18e-d584-4c74-bd2d-4ca71bc14d20</trackback:ping>
      <wfw:comment>http://blog.bruceabernethy.com/blog/post/Candyland-LCR-and-Warstorm.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.bruceabernethy.com/blog/syndication.axd?post=4b86b18e-d584-4c74-bd2d-4ca71bc14d20</wfw:commentRss>
    </item>
    <item>
      <title>Book Review: Think and Make It Happen</title>
      <description>&lt;p&gt;&lt;img style="border-right-width: 0px; margin: 0px 0px 5px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="thinkbook" border="0" alt="thinkbook" align="right" src="http://blog.bruceabernethy.com/image.axd?picture=thinkbook.jpg" width="179" height="260" /&gt; &lt;a href="http://www.thomasnelson.com/consumer/product_detail.asp?sku=0785227814"&gt;Think and Make it Happen&lt;/a&gt;, by Dr. Augsto Cury, caught my eye because of the catchy title, interesting premise, and seemingly lofty claims. Who doesn't want to eliminate their fears, master emotions, release creativity and even &amp;quot;reinvent your entire life&amp;quot;. What follows in the book are some interesting ideas and tools for dealing with your inner self, but unfortunately it falls short of being that one book that will solve all the problems of life.&amp;#160; Overall I’d give it 2-3 stars, and while some chapters were quite good and helpful to many, I would not make it a general recommendation to friends.&lt;/p&gt;  &lt;p&gt;The book goes through Cury's twelve principles for &amp;quot;thinking correctly&amp;quot; most of which are very helpful and reflect time-tested practices like setting goals, making good choices, knowing your limits, working through failure, taking personal control of your own life, staying positive, focusing on the present, and not acting rashly by letting emotions control your life.&lt;/p&gt;  &lt;p&gt;The first chapter &amp;quot;Being the author of your own story I really liked because it does take a different tack on looking at your life from the outside and realizing that you are the author and director of what is going on in your life and inasmuch as you are willing to act to write the script and make the necessary changes in your life, you can radically impact the action and the plot in your story.&lt;/p&gt;  &lt;p&gt;In the second chapter, Cury introduces his &amp;quot;DCD&amp;quot; technique for managing thoughts - that is, Doubt, Criticize, and Determine which will be mentioned throughout the book. In a nutshell this is the idea of monitoring your thoughts and picking off those that are negative or disturbing. Those negative thoughts should be challenged an analyzed critically and used for positive change or turned into something more helpful.&lt;/p&gt;  &lt;p&gt;Where things started getting murky for me was later when Curry talked about &amp;quot;Protecting Your Memory&amp;quot; and even altering your memory. Curry continues to attempt to draw examples from the life of Jesus to support his principles. And in the memory chapter goes as far as to say that &amp;quot;Judas's biggest mistake wasn't the betrayal of Jesus but his failure to learn transparency and realize that his greatest problems were within him.&amp;quot; This does sound like what I might expect to hear from a psychologist, but statements like this led me to be more critical and guarded about the rest of the book.&lt;/p&gt;  &lt;p&gt;Curry continues with guidance on being a better listener and being open to dialogue - and I am a big fan of dialogue versus debate. He continues these ideas, which do build on each other, to working on listening to and responding to the dialogue within you own mind. True listening and productive dialogue are very important and are something people work a lifetime to do well, so spending time thinking and practicing these skills in really key. &lt;/p&gt;  &lt;p&gt;But then we move into &amp;quot;contemplating beauty&amp;quot; and are urged to &amp;quot;allow everyday moments to become magical experiences&amp;quot; which can occasionally be true, but not in many of my everyday moments. Curry encourages the reader to use &amp;quot;Psycho-adaptation&amp;quot; to turn ugly things into beautiful things, like turning the pain of the loss of a loved to a focus on &amp;quot;new interests&amp;quot;. Having been through some painful times, there is a time for mourning and grief where just &amp;quot;thinking happy thoughts&amp;quot; will not turn the loss into &amp;quot;magical experiences&amp;quot;. It is the inconsistency of Cury's ideas, from insightful to questionable, which prevent me from rating this book higher.&lt;/p&gt;  &lt;p&gt;The chapter on Creativity seems rushed and out of sync with some of the others - there are much better coverage of Creativity in other entire books - and the chapter on being &amp;quot;Restored in Your Sleep&amp;quot; makes good points which would be key if a lack of sleep or troubled sleep were an issue in someone's life.&lt;/p&gt;  &lt;p&gt;From my view Cury gets back on track with his chapter on living an &amp;quot;Enterprising Lifestyle&amp;quot; by outlining how to be looking for change, willingness to act on change and take a risk, accepting failure as well as success, and living live as an exciting adventure.&lt;/p&gt;  &lt;p&gt;But he then goes off on a tangent with a very &amp;quot;heady&amp;quot; chapter on &amp;quot;Thinking Existentially&amp;quot; where he tries to tie together all ideas of identity, cosmology, and religion - with a stress that &amp;quot;this book respects any form of belief, including atheism&amp;quot; - but at the same time making a case for a &amp;quot;God&amp;quot;. The chapter floats between psychology, philosophy, theology, and never really &amp;quot;lands&amp;quot; in a way that makes it helpful to the reader. Again, this treatment of the topic further clouded my view of the chapters that really did seem to make sense and be helpful to me. &lt;/p&gt;  &lt;p&gt;Overall the book was one that made me think and had some good insights, but it also caused doubts and made me critical of the content and author. &lt;/p&gt; &lt;a href="http://www.booksneeze.com/reviews/blogger/1386?ref=badge"&gt;&lt;img border="0" alt="I review for BookSneeze" src="http://www.booksneeze.com/images/booksneeze_badge.png" width="200" height="150" /&gt;&lt;/a&gt;</description>
      <link>http://blog.bruceabernethy.com/blog/post/Book-Review-Think-and-Make-It-Happen.aspx</link>
      <author>Bruce</author>
      <comments>http://blog.bruceabernethy.com/blog/post/Book-Review-Think-and-Make-It-Happen.aspx#comment</comments>
      <guid>http://blog.bruceabernethy.com/blog/post.aspx?id=2a0557fc-1ef1-4268-9417-6ea7a8df4db2</guid>
      <pubDate>Fri, 12 Mar 2010 03:38:37 -0900</pubDate>
      <dc:publisher>Bruce</dc:publisher>
      <pingback:server>http://blog.bruceabernethy.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://blog.bruceabernethy.com/blog/post.aspx?id=2a0557fc-1ef1-4268-9417-6ea7a8df4db2</pingback:target>
      <slash:comments>36</slash:comments>
      <trackback:ping>http://blog.bruceabernethy.com/blog/trackback.axd?id=2a0557fc-1ef1-4268-9417-6ea7a8df4db2</trackback:ping>
      <wfw:comment>http://blog.bruceabernethy.com/blog/post/Book-Review-Think-and-Make-It-Happen.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.bruceabernethy.com/blog/syndication.axd?post=2a0557fc-1ef1-4268-9417-6ea7a8df4db2</wfw:commentRss>
    </item>
    <item>
      <title>One Month of No Fast Food or Drive Thru</title>
      <description>&lt;p&gt;I tweeted earlier that I had now officially gone one month without fast food or drive thru, and that my goal is to keep this up.&amp;#160; I “went public” with this achievement and goal for a couple reasons.&amp;#160; The first is the most obvious, and selfish, reason – I need to put it out there so other people can hold me accountable for doing this and give me some well deserved ridicule should I slip back into the deep fryer.&amp;#160; The other reason is kind of like the old joke: “Why did the chicken cross the road?&amp;#160; To prove to the possum that is was possible.”&amp;#160; That is to say, hopefully I can be an encouragement to others that it is possible to avoid the fast food traps and let people know that other people are trying to do this as well.&lt;/p&gt;  &lt;p&gt;To be completely honest, while the “one month” statement is accurate it’ll be at least another week until this was a month of “conscious choice” on my part.&amp;#160; You see three days of that month were in the hospital with a broken arm and three or four more days of that were at home recuperating. It was during these days at home, when I had my arm propped up on pillows on the big chair, that my wife just happened to turn on Netflix for me and choose to watch &lt;img style="border-bottom: 0px; border-left: 0px; margin: 5px 0px 10px 10px; display: inline; border-top: 0px; border-right: 0px" title="supersizeme" border="0" alt="supersizeme" align="right" src="http://blog.bruceabernethy.com/image.axd?picture=supersizeme.jpg" width="170" height="231" /&gt; “Super Size Me”.&amp;#160; As I was basically a captive audience at this point I watched the whole show.&amp;#160; I had watched part of it before – maybe even most of it – but it was really not at a “teachable moment” in my life as I was during this recovery period.&lt;/p&gt;  &lt;p&gt;“Super Size Me”, if you haven’t seen it, is an irreverent review of the fast food industry and really the food industry as a whole.&amp;#160; The premise is that Morgan Spurlock would eat only McDonalds food for breakfast, lunch and dinner for 30 days and see what impact this has on his health, mood, and life in general.&amp;#160; Simple enough.&lt;/p&gt;  &lt;p&gt;The “side plots” include vignettes on where the food comes from, how it is processed, what it is made out of, how the same food is now in many school cafeterias, and even in some hospitals.&lt;/p&gt;  &lt;p&gt;While the methods of Spurlock would never be classified as “true science”, and there are many valid criticisms of his process and how he chose to carry it out, there are some plain facts that really can’t be refuted.&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The quality of fast food can not compare to that of food prepared at home&lt;/li&gt;    &lt;li&gt;Fast food offers a quick burst of energy from sugar, other carbs, and fat, but at the price of a huge let down later on with even cravings for more of the same kind of food &lt;/li&gt;    &lt;li&gt;The portion sizes at fast food restaurants vastly exceed the calories needed for a single meal – just look at the history of what a “large” pop/soda has been over the last 20 years as well as what a portion of french fries has been in the same time period.&lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;My Favorite Foods&lt;/h2&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="wendysbaconator" border="0" alt="wendysbaconator" align="right" src="http://blog.bruceabernethy.com/image.axd?picture=wendysbaconator.jpg" width="260" height="179" /&gt;My “fast food drug” of choice has often been Wendy’s because it is directly across the street from work, and I worked at Wendy’s in high school and learned to like their food.&amp;#160; But even before I broke my arm I had some bad feelings building about Wendy’s.&lt;/p&gt;  &lt;p&gt;In the last six months I have been troubled by their new “Baconator” line of sandwiches.&amp;#160; There was a huge sign by the drive thru basically taunting you to get a huge double cheese burger with multiple layers of bacon.&amp;#160; I never did try it – mainly because I really prefer their chicken sandwiches (having prepared the burgers at the aforementioned job) – but the idea that they were enlarging their burgers and adding multiple layers of bacon seemed to me that they were really headed in the wrong direction.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="drivethrudiet" border="0" alt="drivethrudiet" align="right" src="http://blog.bruceabernethy.com/image.axd?picture=drivethrudiet.png" width="270" height="117" /&gt; The other thing I had noticed is from my #2 Fast Food destination – Taco Bell.&amp;#160; They started a new thing this year called the “Drive-Thru Diet Menu”.&amp;#160; I never saw any commercials or explanations of this, but my first gut reaction to it was “this has to be a joke.”&lt;/p&gt;  &lt;p&gt;I would never have put together Taco Bell and being on a diet.&amp;#160; I guess they were trying to pull of something like Subway did with Jared several years ago, but that just doesn’t seem to work in my mind with Taco Bell.&amp;#160; Taco Bell is cheap, tasty, and filling food – red meat, refried beans, and some token veggies inside an amazing variety of hard and soft shells.&amp;#160; But it really wouldn’t fall into a diet that someone could follow.&amp;#160; I could buy a “lighter side” menu or even a “more veggies” icon, but I couldn’t imagine someone eating nothing but Taco Bell.&lt;/p&gt;  &lt;h2&gt;Local Shopping and Local Growing&lt;/h2&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="Local-First" border="0" alt="Local-First" align="right" src="http://blog.bruceabernethy.com/image.axd?picture=Local-First.jpg" width="175" height="93" /&gt;The final reason I think I was ready to step away from fast food was something that has really become important to me lately, and that is supporting local businesses and eating local foods.&amp;#160; There are many reasons to shop locally and eat locally-grown foods.&amp;#160; An obvious one is a financial reality in today’s Michigan economy – if I buy from a store owned by local owners and employing local workers, then much (even most) of the money circulates back into the local economy as they do business with other local businesses and contribute to local charities and non-profits, they employ local workers, and even profits go to local owners to invest in more local businesses.&lt;/p&gt;  &lt;p&gt;Another big reason is potentially significant health benefits.&amp;#160; When local restaurants buy their food from local farmers (and yes there are great local greenhouses in our area that grow produce all year long) then the food can be much more fresh than if it had to be imported from Southern America (or even South America).&amp;#160; Big chains like fast food restaurants often centralize their distribution of food and even have a lot of it pre-processed before coming to the location (e.g. shredding lettuce, making meat patties, even pre-cooking some food) – as a test, just ask someone where their produce or meat comes from, if they don’t know then that should tell you something.&amp;#160; It’s also much better for the environment for food to travel 10, 20, or 50 miles to your destination instead of crossing the globe.&lt;/p&gt;  &lt;p&gt;Another thing you can do if you know where your food actually comes from is you can know what the growers and farmers actually do when they are growing the food or raising the chickens.&amp;#160; Even if you aren’t looking for the food to be organic, it is nice to be able to know what fertilizers and pesticides are used.&amp;#160; What kind of chickens are they (yes there are different breeds)?&amp;#160; You can even, sometimes, go and visit the farms for educational purposes and peace of mind.&amp;#160; You will also notice that some of the “staples” that you have used in the past just don’t grow anywhere locally, but that there are alternatives and different things that you should probably try. I am really looking forward to the local Farmer’s Markets to start up again this spring to see what else I might be missing.&lt;/p&gt;  &lt;h3&gt;&lt;/h3&gt;  &lt;h2&gt;Is It Working?&lt;/h2&gt;  &lt;p&gt;If I thought about this more I might actually journal my health, feelings and weight loss along the way this year.&amp;#160; One month is not really enough to become a spokesperson or expert for this lifestyle.&amp;#160; But that being said I will say this.&amp;#160; I do generally feel much better while eating the lunch I brought with me, a home cooked meal, or even a soup and salad at Olive Garden instead of a sandwich and fries.&amp;#160; Some people talk about the “food coma” you can feel after a large meal or a meal high in sugar, carbs and fat.&amp;#160; These foods can hit your blood stream so quickly and your body reacts and tries to process (or store) the energy and you can get this feeling of just wanting to crash after eating.&amp;#160; A smaller and lighter meal does not have the same impact – in fact, much the opposite.&amp;#160; I don’t miss the food coma feeling and don’t miss any of the intestinal distress that I don’t need to really explain.&lt;/p&gt;  &lt;p&gt;The other amazing thing I have noticed is that my recovery from my broken arm has been miraculously fast.&amp;#160; I am only three weeks from major surgery with a big metal plate being put in my arm and my bicep muscle being torn and cut.&amp;#160; Only one week ago I got my stapes out and my sling taken away.&amp;#160; The amount of healing my body has done in this short time shocks and confuses a lot of people, and even myself.&amp;#160; I have been taking some supplements of Calcium and Vitamin D and D3, but I have also been consuming many more vitamin rich vegetables, mostly raw, than I am used to and drastically reduced my meat and fat intake.&amp;#160; And this is not because I am “on a diet” it is really because I am preparing and bringing my lunch and not visiting fast food establishments.&amp;#160; I can’t directly correlate my rapid healing to eating differently, but I do believe it has been a big part of it.&lt;/p&gt;  &lt;p&gt;This next month will be quite different as I expect to be mostly “back to normal” with my arm in a few weeks and the spring melt is enabling us to get outside a lot more.&amp;#160; I still have 3-5 more months until the bone in my arm is healed, but the metal plate, while a drastic and significant surgery, has the benefit of enabling me to use the arm much sooner.&lt;/p&gt;  &lt;p&gt;I’ll post again in a month or so, and do ask me about it if you see me.&amp;#160; Some have asked if I could make healthy choices at a fast food place or eat the food in moderation – I don’t think so.&amp;#160; This is probably more of a failing in myself than anything else.&amp;#160; I am going to stick with the “zero fast food pledge” as it is easier for me to accomplish and easier for me to assess and be accountable for.&amp;#160; I’ll need to add some activity and exercise measures in there as well at some point – let’s shoot for that a month from now.&lt;/p&gt;</description>
      <link>http://blog.bruceabernethy.com/blog/post/One-Month-of-No-Fast-Food-or-Drive-Thru.aspx</link>
      <author>Bruce</author>
      <comments>http://blog.bruceabernethy.com/blog/post/One-Month-of-No-Fast-Food-or-Drive-Thru.aspx#comment</comments>
      <guid>http://blog.bruceabernethy.com/blog/post.aspx?id=8e087c15-092d-49e8-b572-a19dfb23785c</guid>
      <pubDate>Wed, 10 Mar 2010 08:45:22 -0900</pubDate>
      <dc:publisher>Bruce</dc:publisher>
      <pingback:server>http://blog.bruceabernethy.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://blog.bruceabernethy.com/blog/post.aspx?id=8e087c15-092d-49e8-b572-a19dfb23785c</pingback:target>
      <slash:comments>35</slash:comments>
      <trackback:ping>http://blog.bruceabernethy.com/blog/trackback.axd?id=8e087c15-092d-49e8-b572-a19dfb23785c</trackback:ping>
      <wfw:comment>http://blog.bruceabernethy.com/blog/post/One-Month-of-No-Fast-Food-or-Drive-Thru.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.bruceabernethy.com/blog/syndication.axd?post=8e087c15-092d-49e8-b572-a19dfb23785c</wfw:commentRss>
    </item>
    <item>
      <title>What is hypervideo anyway?</title>
      <description>&lt;p&gt;If you know me or follow this blog at all you will probably know a few things about me: 1) I really like working with the latest technology and 2) I have a long history with Education and Learning.&amp;#160; It just so happens that a project I am working on now, that is using some “cutting edge” technology, takes me back about 18 years to a project I worked on in the summer of 1992.&amp;#160; I am talking about “hypervideo”, though in 2010 we are now doing it with streaming high-definition video instead of laserdisc recorders.&lt;/p&gt;  &lt;h2&gt;What did “hypertext” do for “text” with HTML?&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=samplehtml.png"&gt;&lt;img style="border-right-width: 0px; margin: 10px 0px 5px 15px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="samplehtml" border="0" alt="samplehtml" align="right" src="http://blog.bruceabernethy.com/image.axd?picture=samplehtml_thumb.png" width="504" height="156" /&gt;&lt;/a&gt; We are so used to hypertext and the world-wide web, that we really don’t think about the technology and features behind it any more, but let’s take a second to “review the obvious”.&amp;#160; The hypertext-markup language (HTML) is the coding behind the world-wide web.&amp;#160; It is used to take the raw text and put a structure around the text and within the text.&amp;#160; What started as a simple text file now gains things like:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt; a “title”, &lt;/li&gt;    &lt;li&gt;“headings”, &lt;/li&gt;    &lt;li&gt;“hyperlinks”,&lt;/li&gt;    &lt;li&gt; navigation, &lt;/li&gt;    &lt;li&gt;sections/anchors, &lt;/li&gt;    &lt;li&gt;a unique identifier (uniform resource identifier (URI)), &lt;/li&gt;    &lt;li&gt;and data-about-the-data or “metadata”.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Users of these pages never really see any of this information, but they do appreciate it and use it all the time.&amp;#160; They can enter an address like &lt;a href="http://www.nbcolympics.com"&gt;www.nbcolympics.com&lt;/a&gt; and be taken directly to the online Olympic coverage from NBC (and how little most people appreciate how easy this is for them to do now.&amp;#160; Users can “bookmark” or “favorite” particular pages and get back to them whenever they want to.&amp;#160; Better yet, they can use Google or Bing to type in a few words or a phrase and often find exactly what they are looking for.&amp;#160; Search engines use the titles, headings, and metadata in the page in their search routines to find these pages.&amp;#160; And let’s not forget those wonderful underlined blue hyperlinks and linked buttons on pages that allow us to jump from page to page, and often find great resources and pages that we never knew that we were even interested in.&lt;/p&gt;  &lt;p&gt;The problem with non-text items on web pages is that it is hard for computers to figure out what they are – if you put a picture of your dog on a web page it is still very hard for a browser or search engine to “look” at the picture and file it under “dog.”&amp;#160; With words you can often tell what they mean from the context of the words that precede it or follow it; so this helps.&amp;#160; Today, images can contain an “alt” attribute where you can describe the picture in words.&amp;#160; This was originally though to be for browsers that did not support images or for screen readers for visually impaired users of the web, but now serves very well to help identify images to search engines.&lt;/p&gt;  &lt;h2&gt;What if we could do similar things for video?&lt;/h2&gt;  &lt;p&gt;But what about video?&amp;#160; Sites like YouTube, Facebook, and Vimeo enabling the upload of tens of thousands of hours of video.&amp;#160; Each video contains a title and description which helps enable search to find the video.&amp;#160; But what about what is inside the video.&amp;#160; A single video may have many distinct sections or chapters where information is presented logically.&amp;#160; In each section there could be textual information describing what is going on in the video (think closed captioning or even the &lt;a href="http://en.wikipedia.org/wiki/Descriptive_Video_Service"&gt;Descriptive Video Service&lt;/a&gt;).&amp;#160; What if you could not only search to find the video, but also find a particular time-code within the video (e.g. where the bit of text you searched for occurred in the video)?&amp;#160; What if you could embed hyperlinks to other videos, other timecodes, other pages or notes, etc. within the video itself, so that they would appear or become available at a particular time when the video was playing?&lt;/p&gt;  &lt;p&gt;Well, we can.&lt;/p&gt;  &lt;h2&gt;TUVA&lt;/h2&gt;  &lt;p&gt;My favorite current example of hypervideo ideas is &lt;a href="http://research.microsoft.com/apps/tools/tuva/"&gt;Project TUVA&lt;/a&gt; .&amp;#160; For one, the main content is Dr. Richard Feynman’s wonderful physics lecture series at Cornell in the ‘60s (and who doesn’t like some good physics every so often).&amp;#160; But, for me, it is also nice to know that it is built with Silverlight, which is a toolset that I am very aware of, so I know I could use many of these features myself down the road.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=tuva1.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="tuva1" border="0" alt="tuva1" src="http://blog.bruceabernethy.com/image.axd?picture=tuva1_thumb.png" width="420" height="344" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;At the core of the player you will see something that looks very common for videos on the internet.&amp;#160; There are the standard “VCR” controls, volume, and full-screen buttons – nothing really special so far.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=tuvadetails.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="tuvadetails" border="0" alt="tuvadetails" src="http://blog.bruceabernethy.com/image.axd?picture=tuvadetails_thumb.png" width="550" height="339" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;But it doesn’t take long to see just how much else can be added to the video player when you start thinking about hypervideo concepts of linking, navigation, chapters, notes, and more.&lt;/p&gt;  &lt;h3&gt;Chapters.&lt;/h3&gt;  &lt;p&gt;The first thing I noticed about the player was the expanded navigation and information timeline on the very bottom (I would really encourage you to open this site if possible because experiencing this live will help you understand this much more than a few static images and my attempt to describe the interactions with words).&amp;#160; Each of the seven videos in Feynman’s lecture series are broken up into logical “chapters” with chapter titles like “Newton” and “Electricity”.&amp;#160; This provides much the same functionality of HTML headings and anchor tags.&amp;#160; You can quickly see the structure of the video and jump to any chapter from this navigation bar.&lt;/p&gt;  &lt;h3&gt;Notes / Expert Commentary&lt;/h3&gt;  &lt;p&gt;Since this player was designed for an educational setting, the ability for the viewer to add their own notes in a left-side panel was added.&amp;#160; This allows for anyone watching the video to add a note at a particular time in the video which they will be able to review later.&amp;#160; In addition to this, you can load other people’s notes files and see what they were thinking during the video.&amp;#160; This feature allows for the addition of “expert commentary” within the video frame – kind of like on a DVD where some allow you to turn on an audio track that includes the director and/or other people involved with the movie.&amp;#160; This would also allow a teacher to include their own comments and instructions for students watching the video – and yes, these are also time-stamped so they can become clickable as well to add another layer of navigation.&lt;/p&gt;  &lt;h3&gt;Closed Captioning / Transcript&lt;/h3&gt;  &lt;p&gt;We’ve all seen closed-captioning on television shows where what is being said in a particular show is displayed on the screen for those who are hearing impaired or for situations where the ambient noise in a room is such that the television can’t be heard.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=tuvatranscript.png"&gt;&lt;img style="display: inline" title="tuvatranscript" alt="tuvatranscript" src="http://blog.bruceabernethy.com/image.axd?picture=tuvatranscript_thumb.png" width="400" height="483" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The “Tuva” interface takes closed-captioning one step further and turns it into a full transcript of the talk being given.&amp;#160; You can literally read through all the different close captioning entries in a scrollable textbox.&amp;#160; Not only can you read through the captioning, but each of the captions itself is now a hyperlink that will take you to the time in the video where that caption was on screen.&lt;/p&gt;  &lt;p&gt;But wait.&amp;#160; If we have all this text now, linked to the video, can’t we search this too?&amp;#160; Yes.&lt;/p&gt;  &lt;h3&gt;Search&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=tuvasearch.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="tuvasearch" border="0" alt="tuvasearch" src="http://blog.bruceabernethy.com/image.axd?picture=tuvasearch_thumb.png" width="554" height="456" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The interactive search box in the “Tuva” interface will allow the user to search the transcripts of all of the chapters of all of the videos for a keyword or phrase.&amp;#160; Then all of the “hits” can be displayed, and yes, they are clickable hyperlinks.&lt;/p&gt;  &lt;h3&gt;Links / Extras&lt;/h3&gt;  &lt;p&gt;The other notable feature of this interface is the “Extras” which are shown at the very bottom of the screen.&amp;#160; Embedded into the video are bits of metadata which enable the inclusion of “notes” and “links” within the video itself.&amp;#160; Each extra can have an associated icon or image which becomes visible in the “Extras” pane on the right at the appropriate time in the video.&amp;#160; For a “note” type extra, this can pop-over a panel that includes extra information about a particular topic being discussed.&amp;#160; The viewer can click on the icon to read this note, which pauses the video until they are done.&amp;#160; Similarly clicking on a “link” extra will take the user to another part of the site or even off of the site to a page that explains a topic in more detail.&amp;#160; For example, if Feynman is discussing Albert Einstein, and the viewer knows a lot about Einstein, then they can ignore the picture of Einstein in the Extras panel.&amp;#160; If they are less familiar with Einstein, they can click on the icon and be taken to a new page that discusses the works and life of Einstein in detail.&amp;#160; When they are ready, the viewer can close the page and return to the video which can then proceed from where they left off.&lt;/p&gt;  &lt;h2&gt;NBC Olympics&lt;/h2&gt;  &lt;p&gt;But how might this technology look in a less “academic” and non-research or prototype situation – how about the 2010 Winter Olympics?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=nbco1.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="nbco1" border="0" alt="nbco1" src="http://blog.bruceabernethy.com/image.axd?picture=nbco1_thumb.png" width="550" height="364" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;NBC created an online player that would stream live and pre-recorded events to viewers everywhere.&amp;#160; They created a nice “blue-ice” themed player with all the functions you would expect from a modern player.&amp;#160; A Play/Pause button, Fast Forward, Rewind, Jump Back, Volume, Full-Screen, and even a humorous “Boss” button that filled your screen with a Windows 7 desktop with an open Excel spreadsheet – cute.&lt;/p&gt;  &lt;p&gt;But if you look a little closer you will see some components are are not, yet, very typical of video players online.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=nbc02.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="nbc02" border="0" alt="nbc02" src="http://blog.bruceabernethy.com/image.axd?picture=nbc02_thumb.png" width="300" height="385" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Clicking on the “Key Events” button for this Snowboarding video pops-up a scrollable list of all of the heats within this pre-recorded event.&amp;#160; So that if I scroll through the list and&amp;#160; want to find the round with Nick Baumgartner from the USA, I can find him in Heat 8 – clicking on this item takes me directly to that time in the video.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=nbco3.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="nbco3" border="0" alt="nbco3" src="http://blog.bruceabernethy.com/image.axd?picture=nbco3_thumb.png" width="550" height="151" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Similarly, the time bar at the bottom of the player has small lines at particular times, that you might not even see if you weren’t looking for them.&amp;#160; In this example I was trying to find the quarter-final with Wescott and Holland from the USA – clicking on that bookmark took me directly to that point.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=nbco4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="nbco4" border="0" alt="nbco4" src="http://blog.bruceabernethy.com/image.axd?picture=nbco4_thumb.png" width="550" height="243" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;One more interesting use of “metadata” here is the “Play By Play” pane that you can also call up on the player.&amp;#160; This allows for you to see interesting details about each event as it occurs.&amp;#160; For example here, we can see that the skier has achieved 54.7mph on the ramp before taking off – crazy.&lt;/p&gt;  &lt;h3&gt;How is it Done?&lt;/h3&gt;  &lt;p&gt;So, great, this is a cool technology and I’ve got a bunch of ideas on how it could be used.&amp;#160; What tools do I need to start building my own hypervideo projects?&amp;#160; Stay tuned for a near future post on this question and some tips to get you started.&lt;/p&gt;</description>
      <link>http://blog.bruceabernethy.com/blog/post/What-is-hypervideo-anyway.aspx</link>
      <author>Bruce</author>
      <comments>http://blog.bruceabernethy.com/blog/post/What-is-hypervideo-anyway.aspx#comment</comments>
      <guid>http://blog.bruceabernethy.com/blog/post.aspx?id=c1ccd1b2-4b5e-421c-95f7-9c72619ccccb</guid>
      <pubDate>Wed, 10 Mar 2010 00:29:01 -0900</pubDate>
      <dc:publisher>Bruce</dc:publisher>
      <pingback:server>http://blog.bruceabernethy.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://blog.bruceabernethy.com/blog/post.aspx?id=c1ccd1b2-4b5e-421c-95f7-9c72619ccccb</pingback:target>
      <slash:comments>35</slash:comments>
      <trackback:ping>http://blog.bruceabernethy.com/blog/trackback.axd?id=c1ccd1b2-4b5e-421c-95f7-9c72619ccccb</trackback:ping>
      <wfw:comment>http://blog.bruceabernethy.com/blog/post/What-is-hypervideo-anyway.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.bruceabernethy.com/blog/syndication.axd?post=c1ccd1b2-4b5e-421c-95f7-9c72619ccccb</wfw:commentRss>
    </item>
    <item>
      <title>How I broke my arm and will now set off every metal detector</title>
      <description>&lt;p&gt;This will be brief, it is my first attempt at typing in 4 days or so, but I wanted to get&amp;nbsp;a quick post out to give anyone who wanted more details on my "adventure" some info, and to practice using my left hand more because that will be key to me getting back to a normal day's work.&lt;/p&gt;
&lt;p&gt;On Tuesday after work, I drove home and parked in the driveway as usual, but then I decided to get the garbage can at the end of the driveway.&amp;nbsp; We had gotten about an inch or two of new snow, but that is pretty normal.&amp;nbsp; Unfortunately at the end of the driveway the snow was on top of some ice - but also, not that strange.&amp;nbsp; With ice under snow, I got close to the garbage can when both feet flew out from under me at the same time, so I was going down - fast.&amp;nbsp; I think I instinctually threw out my arm to catch myself and not land on my head and I heard a pop and felt some pain, but really didn't know exactly what had happened.&amp;nbsp; I was now laying in the snow on my back "snow angel" style.&amp;nbsp; I decided to try to roll over and pick myself up.&lt;/p&gt;
&lt;p&gt;In my mind, both of my arms were above my head, but as I rolled over I saw my left arm sitting beside me - this is probably one of the weirdest sensations I have ever felt.&amp;nbsp; My arm was were it was not "supposed to be" and when I told the hand to open and shut, it did, but it was very "wrong" and my arm was "waggling".&amp;nbsp; Trying to move my arm was pointless as it was going whatever way it wanted to and hurt more than anything&amp;nbsp; I can remember.&lt;/p&gt;
&lt;p&gt;This is a photo from Flickr - not mine - I don't have any but I will try to get some.&amp;nbsp; This is also a woman's arm, but it comes closest on a short search to what I remember them showing me.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="/image.axd?picture=2010%2f2%2fhumerus_break.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;So the problem was my humerus bone was basically sheered in two and one of the broken sides was jabbed into my bicep muscle.&lt;/p&gt;
&lt;p&gt;Long story short; got to ER, x-rays, can't cast a transverse break, 24 hours later, 10" steel plate attached with 7 screws on the bone having to tear some more muscle to attach the plate (but this should heal). Day and a half of recovery in the hospital and now I am home.&lt;/p&gt;
&lt;p&gt;Good news is my wrist and fingers are working very well considering.&amp;nbsp; The break was within a half-inch of where the nerves attach to operate the upper arm - that could have been much worse.&amp;nbsp; My tricep muscle is progressing and I can move my arm back and forth.&lt;/p&gt;
&lt;p&gt;Unfortunately my bicep will need some therapy and it may be months before it is back to function.&amp;nbsp; I can't lift my arm right now and need a splint or a strap to move it around.&lt;/p&gt;
&lt;p&gt;I have a cool scar - about 10 inches long with 40 or so staples right now - looks like a bicep zipper without the zipper part.&amp;nbsp;I will be going in in 10 days to have a follow up appointment and make plans for further therapy.&lt;/p&gt;
&lt;p&gt;There are more details, but they aren't as relevant (and kind of gross) and I am done with this first typing practice.&lt;/p&gt;
&lt;p&gt;Thanks for all the prayers, notes and e-mails - they are a great encouragement.&lt;/p&gt;</description>
      <link>http://blog.bruceabernethy.com/blog/post/My.aspx</link>
      <author>Bruce</author>
      <comments>http://blog.bruceabernethy.com/blog/post/My.aspx#comment</comments>
      <guid>http://blog.bruceabernethy.com/blog/post.aspx?id=c03d6069-8bd3-4036-89fc-3083483c1fda</guid>
      <pubDate>Sun, 14 Feb 2010 03:10:00 -0900</pubDate>
      <dc:publisher>Bruce</dc:publisher>
      <pingback:server>http://blog.bruceabernethy.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://blog.bruceabernethy.com/blog/post.aspx?id=c03d6069-8bd3-4036-89fc-3083483c1fda</pingback:target>
      <slash:comments>22</slash:comments>
      <trackback:ping>http://blog.bruceabernethy.com/blog/trackback.axd?id=c03d6069-8bd3-4036-89fc-3083483c1fda</trackback:ping>
      <wfw:comment>http://blog.bruceabernethy.com/blog/post/My.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.bruceabernethy.com/blog/syndication.axd?post=c03d6069-8bd3-4036-89fc-3083483c1fda</wfw:commentRss>
    </item>
    <item>
      <title>Mouse Mischief: Multiple Mouse Support in PowerPoint with the MultiPoint Mouse SDK</title>
      <description>&lt;p&gt;I am trying to spend the early hours of Saturday morning experimenting and learning about something that interests me, with the only requirement being that is has no immediate practical value other than learning (i.e. it is not linked to work or other side projects).&amp;#160; If it seems interesting enough, I’ll blog it.&amp;#160; This was fun.&amp;#160; Also, this post will be much less technical than the last set, no programming needed for this one, in fact anyone with PowerPoint will be able to take advantage and use the tools here.&amp;#160; There may be a follow on post that will be more technical, but I wanted to alternate between tech anyone can use, and tech that really only developers could appreciate.&lt;/p&gt;  &lt;p&gt;Back on January 18th, &lt;a href="http://twitter.com/shanselman"&gt;Scott Hansleman&lt;/a&gt; tweeted about the new &lt;a href="http://www.microsoft.com/multipoint/mouse-sdk/default.aspx"&gt;Windows MultiPoint Mouse SDK&lt;/a&gt; by teasing “Want your application to support TWO mice at a time?”&amp;#160; This is something I remember doing waaay back with the early Macintosh computers having multiple students with different mice interacting with a single HyperCard stack.&amp;#160; Now we can do this again, in code wit, and with a cool PowerPoint plugin called “Mouse Mischief”.&amp;#160; &lt;/p&gt;  &lt;p&gt;Then on January 26th woot.com had $.99 refurbished mice for sale on a Woot-Off – why would anyone buy three mice that had been returned and refurbished?&amp;#160; For just such an experiment.&lt;/p&gt;  &lt;p&gt;Disclaimer: This is beta technology and should only be used by people who aren’t easily frustrated and don’t expect a final/polished result.&amp;#160; This technology will be final soon – if you want it to be more tested and full-functioned, come back in a few months and try this out.&lt;/p&gt;  &lt;p&gt;The Mouse Micschief PowerPoint 2007 plugin can be found on &lt;a href="http://connect.microsoft.com"&gt;Microsoft Connect&lt;/a&gt;.&amp;#160; You will need a Microsoft Live ID and register with Microsoft Connect.&amp;#160; This is a great place to stay current on Microsoft technology and participate in beta programs.&amp;#160; But, again, it is not for everyone.&lt;/p&gt;  &lt;p&gt;Once installed, “Mouse Mischief” will show up as a PowerPoint ribbon control.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=mm1.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="mm1" border="0" alt="mm1" src="http://blog.bruceabernethy.com/image.axd?picture=mm1_thumb.png" width="504" height="375" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;There will be a new item up in the tabs, which reveals the “Mouse Mischief” ribbon.&amp;#160; Also note the “pptPlex” tab that is still up there.&amp;#160; This is another cool PowerPoint plugin that makes your presentations use a “DeepZoom” look and feel which makes the very “Silverlighty”, but that is/was another post.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=mm2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="mm2" border="0" alt="mm2" src="http://blog.bruceabernethy.com/image.axd?picture=mm2_thumb.png" width="447" height="97" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The ribbon adds some new slide types “Yes/No” and “Multiple Choice” and an important button “Play”.&amp;#160; If you insert the new slide types and play the slides the “normal” way in PowerPoint, there will be no new functionality in the slides.&amp;#160; If you launch the slides using the play button in the ribbon you will get the multi-mouse functionality.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="mm3" border="0" alt="mm3" src="http://blog.bruceabernethy.com/image.axd?picture=mm3.png" width="500" height="298" /&gt; &lt;/p&gt;  &lt;p&gt;When you first start your “Mischievous” presentation you will notice a slide you didn’t add yourself.&amp;#160; This allows for one (or more) mice to “register” itself as the presenter/teacher (this specific tool is education oriented, but has many uses outside of education as well).&amp;#160; If you move other mice at this point you will see multiple mice moving independently on the screen – very cool. Previous to this, if the different mice had been moved, they would all have controlled the single cursor on the screen.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="mm4" border="0" alt="mm4" src="http://blog.bruceabernethy.com/image.axd?picture=mm4.png" width="500" height="365" /&gt; &lt;/p&gt;  &lt;p&gt;This next screen show that the designers of this are expecting a massive number of different mice – perhaps a classroom full – we only have four (teacher/presenter and three for feedback).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=mm5.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="mm5" border="0" alt="mm5" src="http://blog.bruceabernethy.com/image.axd?picture=mm5_thumb.png" width="500" height="321" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;When we get to a screen that has one of the Yes/No or Multiple Choice questions, then the different mice become active and they get to pick one of the answers.&amp;#160; When everyone has answered, or the teacher/presenter chooses to move on, we get a summary screen.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="mm6" border="0" alt="mm6" src="http://blog.bruceabernethy.com/image.axd?picture=mm6.png" width="500" height="312" /&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;This provides instant feedback for presenters and/or checks for comprehension from the audience.&amp;#160; The multiple choice slide has other options.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=mm7.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="mm7" border="0" alt="mm7" src="http://blog.bruceabernethy.com/image.axd?picture=mm7_thumb.png" width="500" height="325" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Notice that only the presenter/teacher mouse has the ability at the bottom to move the presentation to the next or previous slide, or to end the interaction early.&amp;#160; In addition to giving feedback on open-ended questions like this one, you can also pre-pick the “correct” answer on the slide and show how many had the correct answer, and who was first to respond.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=mm9.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="mm9" border="0" alt="mm9" src="http://blog.bruceabernethy.com/image.axd?picture=mm9_thumb.png" width="238" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;When the presentation is complete, you need to end the presentation with the presenter/teacher mouse (i.e. audience/class members can’t end or control the flow of the presentation.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="mm8" border="0" alt="mm8" src="http://blog.bruceabernethy.com/image.axd?picture=mm8.png" width="500" height="368" /&gt; &lt;/p&gt;  &lt;p&gt;The ability to use multiple mice on once screen is great – and this “Mouse Mischief” plug-in tool for PowerPoint gets you started right away.&lt;/p&gt;  &lt;p&gt;In Part 2 of this series, I will show how a developer can add multi-mouse support to their own applications using the MultiPoint Mouse SDK – if you want to get started early, check out the &lt;a href="http://www.microsoft.com/multipoint/mouse-sdk/developer.aspx"&gt;MultiPoint Mouse SDK Developer&lt;/a&gt; Info page.&lt;/p&gt;</description>
      <link>http://blog.bruceabernethy.com/blog/post/Mouse-Mischief-Multiple-Mouse-Support-in-PowerPoint-with-the-MultiPoint-Mouse-SDK.aspx</link>
      <author>Bruce</author>
      <comments>http://blog.bruceabernethy.com/blog/post/Mouse-Mischief-Multiple-Mouse-Support-in-PowerPoint-with-the-MultiPoint-Mouse-SDK.aspx#comment</comments>
      <guid>http://blog.bruceabernethy.com/blog/post.aspx?id=bd011899-4f46-4e33-a9c0-e3309ae2493f</guid>
      <pubDate>Sat, 06 Feb 2010 04:15:05 -0900</pubDate>
      <dc:publisher>Bruce</dc:publisher>
      <pingback:server>http://blog.bruceabernethy.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://blog.bruceabernethy.com/blog/post.aspx?id=bd011899-4f46-4e33-a9c0-e3309ae2493f</pingback:target>
      <slash:comments>8</slash:comments>
      <trackback:ping>http://blog.bruceabernethy.com/blog/trackback.axd?id=bd011899-4f46-4e33-a9c0-e3309ae2493f</trackback:ping>
      <wfw:comment>http://blog.bruceabernethy.com/blog/post/Mouse-Mischief-Multiple-Mouse-Support-in-PowerPoint-with-the-MultiPoint-Mouse-SDK.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.bruceabernethy.com/blog/syndication.axd?post=bd011899-4f46-4e33-a9c0-e3309ae2493f</wfw:commentRss>
    </item>
    <item>
      <title>Silverlight Kata: IFS Fractals: Full Solution</title>
      <description>&lt;p&gt;If you have been following along with &lt;a href="http://blog.bruceabernethy.com/post/Silverlight-Kata-IFS-Fractals-with-TransformGroup-and-MessageBus.aspx"&gt;Part 1&lt;/a&gt;, &lt;a href="http://blog.bruceabernethy.com/post/Silverlight-Kata-IFS-Fractals-Automating-the-Transforms.aspx"&gt;Part 2&lt;/a&gt;, and &lt;a href="http://blog.bruceabernethy.com/post/Silverlight-Kata-IFS-Fractals-The-MessageBus.aspx"&gt;Part 3&lt;/a&gt;, then you know we have described basically what the IFS Fractal “quest” is, how we did the rotatation/translation/scale transforms, and how we wired up the MessageBus to send our messages.&lt;/p&gt;  &lt;h2&gt;Complete Code Solution&lt;/h2&gt;  &lt;p&gt;So we are ready to put it all together: [ &lt;a href="http://blog.bruceabernethy.com/mirror/IFSContentControl.zip"&gt;Download Source Code (if desired) IFSContentControl.zip (1.4Mb)&lt;/a&gt; ]&lt;/p&gt;  &lt;p&gt;And, since you’ve been so patient, here is a live demo of the application.&lt;/p&gt;  &lt;h2&gt;Live Demo (Requires Silverlight 3)&lt;/h2&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="475" height="600"&gt; 		  &lt;param name="source" value="http://blog.bruceabernethy.com/ClientBin/SerpinskiMessage.xap" /&gt; 		  &lt;param name="onError" value="onSilverlightError" /&gt; 		  &lt;param name="background" value="white" /&gt; 		  &lt;param name="minRuntimeVersion" value="3.0.40624.0" /&gt; 		  &lt;param name="autoUpgrade" value="true" /&gt; 		  &lt;a href="http://go.microsoft.com/fwlink/?LinkID=149156&amp;amp;v=3.0.40624.0" style="text-decoration:none"&gt;  		&lt;img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style:none" /&gt; 		  &lt;/a&gt; &lt;/object&gt;  &lt;h2&gt;Pulling it Together&lt;/h2&gt;  &lt;p&gt;So, once we had the idea, the IFSContentControl, and the MessageBus wired up, pulling the rest of the Solution together is pretty straightforward.&amp;#160; You will see the typical Silverlight Solution structure of a Silverlight project and the hosting Web Application project.&lt;/p&gt;  &lt;p&gt;In “polishing” this up a little I did add a few more Messages.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:e98a13a2-7119-41fe-8b01-5b5258ffb613" class="wlWriterEditableSmartContent"&gt;&lt;pre style="background-color:#FFFFFF;overflow: auto;"&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; SetStartupIFSControl : CompositePresentationEvent&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IFSControl&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; { }
&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; SelfDestruct : CompositePresentationEvent&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;DateTime&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; { }&lt;/span&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;Adding SetStartupIFSControl let me add the ability to have the three buttons at the bottom with different “starter” IFS Objects.&lt;/p&gt;

&lt;p&gt;The “Serpinski Triangle / Gasket” that I’ve been showing since Part 1 was defined like this …&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:b7514783-b11c-4935-954b-34de72decb7a" class="wlWriterEditableSmartContent"&gt;&lt;pre style="background-color:#FFFFFF;overflow: auto;"&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; IFSControl StarterSerpinski()
{
  var starter &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; IFSControl
                    {
                        IsProbabalistic &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;,
                        Background &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; SolidColorBrush(Colors.LightGray),
                        XOffset &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;25&lt;/span&gt;&lt;span style="color: #000000;"&gt;,
                        Age &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;
                    };

  starter.Content &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; starter.MyRootControl;

  starter.IFSTransforms.Transforms.Add(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; IFSTransform(.&lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;, .&lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;));
  starter.IFSTransforms.Transforms.Add(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; IFSTransform(.&lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;, .&lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;200&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;));
  starter.IFSTransforms.Transforms.Add(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; IFSTransform(.&lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;, .&lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;200&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;));

  &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; starter;
}&lt;/span&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;The more complex “Barnsley Fern” looks like this …&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:15709a58-47eb-4a94-9d1d-c343f5c2cfa3" class="wlWriterEditableSmartContent"&gt;&lt;pre style="background-color:#FFFFFF;overflow: auto;"&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; IFSControl BarnsleyFern()
{

  var starter &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; IFSControl
                    {
                        IsProbabalistic &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;,
                        Background &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; SolidColorBrush(Colors.Black),
                        XOffset &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;,
                        Age &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;
                    };

  starter.RectangleTemplate &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Rectangle
                                  {
                                      Height &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;400&lt;/span&gt;&lt;span style="color: #000000;"&gt;,
                                      Width &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;200&lt;/span&gt;&lt;span style="color: #000000;"&gt;,
                                      Stroke &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; SolidColorBrush(Colors.Green),
                                      Fill &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; SolidColorBrush(Color.FromArgb(&lt;/span&gt;&lt;span style="color: #800080;"&gt;200&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;128&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;255&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;128&lt;/span&gt;&lt;span style="color: #000000;"&gt;)),
                                      StrokeThickness &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;8&lt;/span&gt;&lt;span style="color: #000000;"&gt;
                                  };

  starter.Content &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; starter.MyRootControl;

  starter.IFSTransforms.Transforms.Add(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; IFSTransform(.&lt;/span&gt;&lt;span style="color: #800080;"&gt;01&lt;/span&gt;&lt;span style="color: #000000;"&gt;, .&lt;/span&gt;&lt;span style="color: #800080;"&gt;16&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;));
  starter.IFSTransforms.Transforms.Add(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; IFSTransform(.&lt;/span&gt;&lt;span style="color: #800080;"&gt;34&lt;/span&gt;&lt;span style="color: #000000;"&gt;, .&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;50&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;50&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;7&lt;/span&gt;&lt;span style="color: #000000;"&gt;));
  starter.IFSTransforms.Transforms.Add(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; IFSTransform(.&lt;/span&gt;&lt;span style="color: #800080;"&gt;36&lt;/span&gt;&lt;span style="color: #000000;"&gt;, .&lt;/span&gt;&lt;span style="color: #800080;"&gt;28&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;40&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;50&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;7&lt;/span&gt;&lt;span style="color: #000000;"&gt;));
  starter.IFSTransforms.Transforms.Add(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; IFSTransform(.&lt;/span&gt;&lt;span style="color: #800080;"&gt;85&lt;/span&gt;&lt;span style="color: #000000;"&gt;, .&lt;/span&gt;&lt;span style="color: #800080;"&gt;85&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;50&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;75&lt;/span&gt;&lt;span style="color: #000000;"&gt;));



  &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; starter;
}&lt;/span&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;These are both in the StarterIFSObjects static class.&lt;/p&gt;

&lt;p&gt;The RectangleTemplate allowed for different shape Rectangles (which the “fern” required”) and also gave me a place to put the foreground and background colors – which is nice.&amp;#160; I added “Age” so I could tell how many iterations each object had gone through (surfaces as a ToolTip).&lt;/p&gt;

&lt;h2&gt;How well does it work?&lt;/h2&gt;

&lt;p&gt;For the Serpinski Triangle / Gasket, I was very pleased:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=triangle8it.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="triangle8it" border="0" alt="triangle8it" src="http://blog.bruceabernethy.com/image.axd?picture=triangle8it_thumb.png" width="422" height="431" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;After 8 iterations, we have a fine (nearly textbook) example of what we were looking for.&lt;/p&gt;

&lt;p&gt;For the “Checkered ‘X’”, also very nice:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=cross5it.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="cross5it" border="0" alt="cross5it" src="http://blog.bruceabernethy.com/image.axd?picture=cross5it_thumb.png" width="420" height="423" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;More predictable, in my opinion, than the triangle, but after only 5 iterations we have the multi-layered self-similar “X”&lt;/p&gt;

&lt;p&gt;But for the Barnsley Fern:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=fern7it.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="fern7it" border="0" alt="fern7it" src="http://blog.bruceabernethy.com/image.axd?picture=fern7it_thumb.png" width="260" height="401" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Not what I was hoping for.&amp;#160; Even after 7 iterations (creating 16384 IFSContentControls), this is only starting to look like what I was hoping for.&amp;#160; Iterating one more time left the browser “Not Responding” and was not generally a good idea.&lt;/p&gt;

&lt;p&gt;The fern has many intricate details that do not surface well with this algorithm.&amp;#160; There are “bitmap” algorithms that create very nice ferns in a short amount of time (“classic” GDI+ routines) …&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=bitmapfern.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="bitmapfern" border="0" alt="bitmapfern" src="http://blog.bruceabernethy.com/image.axd?picture=bitmapfern_thumb.png" width="268" height="504" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;But these do not track each translation and each message going out, which was what I was hoping to learn about from this.&lt;/p&gt;

&lt;p&gt;So, the goal last weekend (which turned in to a goal to blog about it before “next” weekend (i.e. tomorrow)) was to learn more about TransformGroups and to see how much I could stress the EventAggregator/MessageBus without it caving.&amp;#160; More about that in the last installment.&lt;/p&gt;

&lt;li&gt;&lt;a href="http://blog.bruceabernethy.com/post/Silverlight-Kata-IFS-Fractals-with-TransformGroup-and-MessageBus.aspx"&gt;Part 1 – Fractals with TransformGroup and MessageBus&lt;/a&gt; &lt;/li&gt;

&lt;li&gt;&lt;a href="http://blog.bruceabernethy.com/post/Silverlight-Kata-IFS-Fractals-Automating-the-Transforms.aspx"&gt;Part 2 – Automating transformations by creating an IFS Content Control&lt;/a&gt; &lt;/li&gt;

&lt;li&gt;&lt;a href="http://blog.bruceabernethy.com/post/Silverlight-Kata-IFS-Fractals-The-MessageBus.aspx"&gt;Part 3 – Wiring up the Iterations using a basic MessageBus implementation.&lt;/a&gt; &lt;/li&gt;

&lt;li&gt;Part 4 – But will it work for a fractal Fern? &lt;/li&gt;

&lt;li&gt;Part 5 – Lessons Learned (aka limitations of the MessageBus and recursion in Silverlight) 
  &lt;p&gt;&lt;/p&gt;
&lt;/li&gt;</description>
      <link>http://blog.bruceabernethy.com/blog/post/Silverlight-Kata-IFS-Fractals-Full-Solution.aspx</link>
      <author>Bruce</author>
      <comments>http://blog.bruceabernethy.com/blog/post/Silverlight-Kata-IFS-Fractals-Full-Solution.aspx#comment</comments>
      <guid>http://blog.bruceabernethy.com/blog/post.aspx?id=f7e9ea57-c8a5-4f15-82f4-0dd1e9cbf495</guid>
      <pubDate>Fri, 05 Feb 2010 09:23:28 -0900</pubDate>
      <dc:publisher>Bruce</dc:publisher>
      <pingback:server>http://blog.bruceabernethy.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://blog.bruceabernethy.com/blog/post.aspx?id=f7e9ea57-c8a5-4f15-82f4-0dd1e9cbf495</pingback:target>
      <slash:comments>11</slash:comments>
      <trackback:ping>http://blog.bruceabernethy.com/blog/trackback.axd?id=f7e9ea57-c8a5-4f15-82f4-0dd1e9cbf495</trackback:ping>
      <wfw:comment>http://blog.bruceabernethy.com/blog/post/Silverlight-Kata-IFS-Fractals-Full-Solution.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.bruceabernethy.com/blog/syndication.axd?post=f7e9ea57-c8a5-4f15-82f4-0dd1e9cbf495</wfw:commentRss>
    </item>
    <item>
      <title>Silverlight Kata: IFS Fractals: The MessageBus</title>
      <description>&lt;p&gt;We are almost done with this application.&amp;#160; What started with &lt;a href="http://blog.bruceabernethy.com/post/Silverlight-Kata-IFS-Fractals-with-TransformGroup-and-MessageBus.aspx"&gt;Part 1 &lt;/a&gt;(intro to Fractals and the Silverlight experiment) and continued with &lt;a href="http://blog.bruceabernethy.com/post/Silverlight-Kata-IFS-Fractals-Automating-the-Transforms.aspx"&gt;Part 2&lt;/a&gt; (creating the IFSContentControl) now gets a MessageBus to help communicate to and from the different controls&lt;/p&gt;  &lt;p&gt;The EventAggregator and MessageBus patterns have been &lt;a href="http://martinfowler.com/eaaDev/EventAggregator.html"&gt;described as a pattern&lt;/a&gt; and&amp;#160; &lt;a href="http://www.enterpriseintegrationpatterns.com/MessageBus.html"&gt;discussed for a while&lt;/a&gt; and recently implemented by several different frameworks within Silverlight.&amp;#160; The basic idea is to decouple messages for common functions from specific classes.&amp;#160; If there is a common set of Messages, and a shared MessageBus, then objects with access to the bus and messages can “subscribe” to the messages that they want to “hear” and “publish” messages that they want to send out.&lt;/p&gt;  &lt;p&gt;A more detailed description of this particular implementation &lt;a href="http://msdn.microsoft.com/en-us/library/ms978583.aspx"&gt;as described by the Microsoft Patterns &amp;amp; Practices&lt;/a&gt; group implemented as &lt;a href="http://msdn.microsoft.com/en-us/library/dd458918.aspx"&gt;EventAggregator&lt;/a&gt;.&amp;#160;&amp;#160; We will use the EventAggregator for our MessageBus and CompositePresentationEvent from the Microsoft.Practices namespace described here.&lt;/p&gt;  &lt;h2&gt;Which Messages?&lt;/h2&gt;  &lt;p&gt;So, then, what are the messages that we will want to have in this application?&lt;/p&gt;  &lt;p&gt;“Iterate” is the big and obvious one.&amp;#160; We may, for example, want to press a Button and have it Publish the “Iterate” Message to the MessageBus.&amp;#160; Then, we’ll want our IFSContentControls to Subscribe to the “Iterate” message and have them generate the next generation of the fractal.&lt;/p&gt;  &lt;p&gt;So to start out we’d have this …&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=messagebus1.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="messagebus1" border="0" alt="messagebus1" src="http://blog.bruceabernethy.com/image.axd?picture=messagebus1_thumb.png" width="450" height="122" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The IFSContentControl would clone itself and apply each transform (3 in this example).&amp;#160; These new controls would then also Subscribe to the “Iterate” Message. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=messagebus2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="messagebus2" border="0" alt="messagebus2" src="http://blog.bruceabernethy.com/image.axd?picture=messagebus2_thumb.png" width="450" height="178" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;So the next click of the button that publishes the message will now be “heard” by three different objects ….&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=messagebus3.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="messagebus3" border="0" alt="messagebus3" src="http://blog.bruceabernethy.com/image.axd?picture=messagebus3_thumb.png" width="450" height="308" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;And so on … and so on …&lt;/p&gt;  &lt;p&gt;To fully make this work though, we’ll need to (1) get the new controls onto our Container/Canvas.&amp;#160; And, in the case of these fractals, the original control does not “survive” the iteration and only “lives” through one generation.&lt;/p&gt;  &lt;p&gt;So we’ll add two more Messages: (1) AddIFSControl (to add the new IFSControls to the Container) and (2) RemoveIFSControl (to remove the current control from the Container once the Iteration is complete).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.bruceabernethy.com/image.axd?picture=messagebus4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="messagebus4" border="0" alt="messagebus4" src="http://blog.bruceabernethy.com/image.axd?picture=messagebus4_thumb.png" width="450" height="204" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So our messages end up looking like this …&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:82471b43-0e86-481b-b65c-f91d35aef3bc" class="wlWriterEditableSmartContent"&gt;&lt;pre style="background-color:#FFFFFF;overflow: auto;"&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; Microsoft.Practices.Composite.Presentation.Events;

&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Messages
{
   &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Iterate : CompositePresentationEvent&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; { }
   &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; AddIFSControl : CompositePresentationEvent&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IFSControl&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; { }
   &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; RemoveIFSControl : CompositePresentationEvent&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IFSControl&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; { }
}&lt;/span&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;The CompositePresentationEvent is a generic class that takes a strongly typed object.&amp;#160; In the case of the “Iterate” message, there really isn’t a type we need to send up (there is no data payload that is needed to process the “Iterate” message).&amp;#160; In the case of the AddIFSControl and RemoveIFSControl messages, we will send along the IFSControls themselves in order to be processed.&lt;/p&gt;

&lt;h2&gt;Where is the MessageBus?&lt;/h2&gt;

&lt;p&gt;For this application, it is easiest to implement the MessageBus at the highest point possible in the Application itself.&amp;#160; So in our App.xaml.cs file we just add this …&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:65584126-c1d4-4361-a9a9-6b93442bcc4b" class="wlWriterEditableSmartContent"&gt;&lt;pre style="background-color:#FFFFFF;overflow: auto;"&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; Microsoft.Practices.Composite.Events;

&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;partial&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; App : Application
{
   &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; IEventAggregator MessageBus &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; EventAggregator();&lt;/span&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Really that is all it takes to set up the MessageBus.&lt;/p&gt;

&lt;h2&gt;Publishing the Messages&lt;/h2&gt;

&lt;p&gt;So, now how do we wire up the Button to publish the iterate event.&amp;#160; In the codebehind of the MainPage (or ViewModel if you’ve wired it up) we can add code something like this.&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:d2a7e539-e085-4d33-8c6d-37c67e1ba746" class="wlWriterEditableSmartContent"&gt;&lt;pre style="background-color:#FFFFFF;overflow: auto;"&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Button_Click(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, RoutedEventArgs e)
{
  App.MessageBus.GetEvent&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Messages.Iterate&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;().Publish(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;);
}&lt;/span&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;It is important to notice that there is nothing special &lt;/p&gt;

&lt;p&gt;about the “Button” itself – we aren’t using any of its events or properties to do this work or propagate this message.&amp;#160; You could just as easily set up a DispatherTimer and have it call “Iterate” every 60 seconds or so …&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:be4ba3f2-1f25-4d7a-83d9-ddf92c449350" class="wlWriterEditableSmartContent"&gt;&lt;pre style="background-color:#FFFFFF;overflow: auto;"&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; IterateMe_Tick(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, EventArgs e)
{
  App.MessageBus.GetEvent&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Messages.Iterate&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;().Publish(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;);
}&lt;/span&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;Subscribing to the Messages&lt;/h2&gt;

&lt;p&gt;So now we need to add code to the IFSContentControls to Subscribe to the Iterate Message.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:16d1743b-bd7c-47dc-a037-7958344a813e" class="wlWriterEditableSmartContent"&gt;&lt;pre style="background-color:#FFFFFF;overflow: auto;"&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; IFSControl()
{
  App.MessageBus.GetEvent&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Messages.Iterate&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;().Subscribe(DoIteration, &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;To wire this up we need to create a public method that takes the same payload as the message itself – in this case, Iterate sends a boolean.&amp;#160; So we need a public method that takes a boolean.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:838eb017-78f4-40a7-8e50-d9496400cf94" class="wlWriterEditableSmartContent"&gt;&lt;pre style="background-color:#FFFFFF;overflow: auto;"&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; DoIteration(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; isTrue)
{
  &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (var ifst &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; IFSTransforms.Transforms)
  {
      var newControl &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; IFSControl
      {
          Content &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Copy(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;),
          IFSTransforms &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.IFSTransforms,
          RenderTransform &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ifst.IFSTransformGroup
      };
      App.MessageBus.GetEvent&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Messages.AddIFSControl&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;().Publish(newControl);
  }
  App.MessageBus.GetEvent&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Messages.Iterate&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;().Unsubscribe(DoIteration);
  App.MessageBus.GetEvent&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Messages.RemoveIFSControl&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;().Publish(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;);
}&lt;/span&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;So IFSControl is now set up to Subscribe to the Iterate event – it will then call DoIteration() when it receives the message.&amp;#160; DoIteration() will iterate through all the different transforms, create a new IFSControl which is a clone/copy of the current control, and then Publish the AddIFSControl message with the new control as the payload.&amp;#160; In our example this will happen three times for each iteration, so three new controls will be sent in messages.&lt;/p&gt;

&lt;p&gt;The last two lines are interesting as well.&amp;#160; Once the new controls are created it is time for the current control to request that it be removed from the container – it has done its work and it is time to move on.&amp;#160; First we Unsubscribe from the DoIteration Message (always good to not leave loose ends) and then Publish the RemoveIFSControl message with “this” as the payload (i.e., the current control). It is thus requesting to be removed from the container.&lt;/p&gt;

&lt;h2&gt;Container Messages&lt;/h2&gt;

&lt;p&gt;In this example the DataContext of our MainPage will be a class called the IFSStageViewModel.&amp;#160; This class encapsulates all the information and logic that will be needed for the user interface of our application.&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:2d53ebce-4a6e-4a98-82fc-79386831ffac" class="wlWriterEditableSmartContent"&gt;&lt;pre style="background-color:#FFFFFF;overflow: auto;"&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; IFSStageViewModel : INotifyPropertyChanged
{
   &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Canvas Stage {&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;;}

   &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; NumStageItems
   {
       &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt; { &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; Stage &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;?&lt;/span&gt;&lt;span style="color: #000000;"&gt; Stage.Children.Count : &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;  }
   }

   &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; IFSStageViewModel()
   {
       App.MessageBus.GetEvent&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Messages.AddIFSControl&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;().Subscribe(AddIFSControl, &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;);
       App.MessageBus.GetEvent&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Messages.RemoveIFSControl&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;().Subscribe(RemoveIFSControl, &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;);
       App.MessageBus.GetEvent&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Messages.Iterate&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;().Subscribe(Iterate, &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;);
   }

   &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Iterate(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; isIteration)
   {
       OnPropertyChanged(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;NumStageItems&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);
   }

   &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; AddIFSControl(IFSControl newIFS)
   {
       Stage.Children.Add(newIFS);
   }

   &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; RemoveIFSControl(IFSControl oldIFS)
   {
       Stage.Children.Remove(oldIFS);
   }

   &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;protected&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; OnPropertyChanged(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; propertyName)
   {
       &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.IsNullOrEmpty(propertyName)) &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;;

       &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (PropertyChanged &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)
       {
           PropertyChanged(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; PropertyChangedEventArgs(propertyName));
       }
   }

   &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;event&lt;/span&gt;&lt;span style="color: #000000;"&gt; PropertyChangedEventHandler PropertyChanged;
}&lt;/span&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;It starts with a XAML Canvas called “Stage” which will be assigned to the Canvas on the MainPage where we want the fractal to appear.&amp;#160; There is also an integer called NumStageItems – this will be bound to a TextBlock to simply display the current number of IFSContentControls are currently contained in the “Stage”.&lt;/p&gt;

&lt;p&gt;In the constructor you will see that three different Messages are subscribed to – that is, all three Messages that we have defined.&lt;/p&gt;

&lt;p&gt;For AddIFSControl the ViewModel will simply add the sent control to the Canvas.&amp;#160; Likewise for RemoveIFSControl the sent control will be removed from the Stage.&lt;/p&gt;

&lt;p&gt;For Iterate all we end up doing is calling OnPropertyChanged for NumStageItems.&amp;#160; Because of the binding in Silverlight, and because our ViewModel implements INotifyPropertyChanged, this will cause the TextBlock in our View/MainPage to be refreshed with the new “get” value, which is simply the number of children in the “Stage” Canvas.&lt;/p&gt;

&lt;p&gt;Next we will see how this works for the Serpinski Triangle / Gasket – and see if it will work for a more complex set of iterations a Barnsley Fern. &lt;/p&gt;

&lt;li&gt;&lt;a href="http://blog.bruceabernethy.com/post/Silverlight-Kata-IFS-Fractals-with-TransformGroup-and-MessageBus.aspx"&gt;Part 1 – Fractals with TransformGroup and MessageBus&lt;/a&gt; &lt;/li&gt;

&lt;li&gt;&lt;a href="http://blog.bruceabernethy.com/post/Silverlight-Kata-IFS-Fractals-Automating-the-Transforms.aspx"&gt;Part 2 – Automating transformations by creating an IFS Content Control&lt;/a&gt; &lt;/li&gt;

&lt;li&gt;Part 3 – Wiring up the Iterations using a basic MessageBus implementation. &lt;/li&gt;

&lt;li&gt;Part 4 – But will it work for a fractal Fern? &lt;/li&gt;

&lt;li&gt;Part 5 – Lessons Learned (aka limitations of the MessageBus and recursion in Silverlight) &lt;/li&gt;</description>
      <link>http://blog.bruceabernethy.com/blog/post/Silverlight-Kata-IFS-Fractals-The-MessageBus.aspx</link>
      <author>Bruce</author>
      <comments>http://blog.bruceabernethy.com/blog/post/Silverlight-Kata-IFS-Fractals-The-MessageBus.aspx#comment</comments>
      <guid>http://blog.bruceabernethy.com/blog/post.aspx?id=dcaed7ce-e2b0-4059-9352-e1f1e12f4545</guid>
      <pubDate>Fri, 05 Feb 2010 03:20:13 -0900</pubDate>
      <dc:publisher>Bruce</dc:publisher>
      <pingback:server>http://blog.bruceabernethy.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://blog.bruceabernethy.com/blog/post.aspx?id=dcaed7ce-e2b0-4059-9352-e1f1e12f4545</pingback:target>
      <slash:comments>7</slash:comments>
      <trackback:ping>http://blog.bruceabernethy.com/blog/trackback.axd?id=dcaed7ce-e2b0-4059-9352-e1f1e12f4545</trackback:ping>
      <wfw:comment>http://blog.bruceabernethy.com/blog/post/Silverlight-Kata-IFS-Fractals-The-MessageBus.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.bruceabernethy.com/blog/syndication.axd?post=dcaed7ce-e2b0-4059-9352-e1f1e12f4545</wfw:commentRss>
    </item>
  </channel>
</rss>