One Month of No Fast Food or Drive Thru

by Bruce Abernethy 10. March 2010 08:45

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.  I “went public” with this achievement and goal for a couple reasons.  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.  The other reason is kind of like the old joke: “Why did the chicken cross the road?  To prove to the possum that is was possible.”  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.

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.  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 supersizeme “Super Size Me”.  As I was basically a captive audience at this point I watched the whole show.  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.

“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.  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.  Simple enough.

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.

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. 

  • The quality of fast food can not compare to that of food prepared at home
  • 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
  • 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.

My Favorite Foods

wendysbaconatorMy “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.  But even before I broke my arm I had some bad feelings building about Wendy’s.

In the last six months I have been troubled by their new “Baconator” line of sandwiches.  There was a huge sign by the drive thru basically taunting you to get a huge double cheese burger with multiple layers of bacon.  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.

drivethrudiet The other thing I had noticed is from my #2 Fast Food destination – Taco Bell.  They started a new thing this year called the “Drive-Thru Diet Menu”.  I never saw any commercials or explanations of this, but my first gut reaction to it was “this has to be a joke.”

I would never have put together Taco Bell and being on a diet.  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.  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.  But it really wouldn’t fall into a diet that someone could follow.  I could buy a “lighter side” menu or even a “more veggies” icon, but I couldn’t imagine someone eating nothing but Taco Bell.

Local Shopping and Local Growing

Local-FirstThe 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.  There are many reasons to shop locally and eat locally-grown foods.  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.

Another big reason is potentially significant health benefits.  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).  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.  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.

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.  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.  What kind of chickens are they (yes there are different breeds)?  You can even, sometimes, go and visit the farms for educational purposes and peace of mind.  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.

Is It Working?

If I thought about this more I might actually journal my health, feelings and weight loss along the way this year.  One month is not really enough to become a spokesperson or expert for this lifestyle.  But that being said I will say this.  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.  Some people talk about the “food coma” you can feel after a large meal or a meal high in sugar, carbs and fat.  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.  A smaller and lighter meal does not have the same impact – in fact, much the opposite.  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.

The other amazing thing I have noticed is that my recovery from my broken arm has been miraculously fast.  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.  Only one week ago I got my stapes out and my sling taken away.  The amount of healing my body has done in this short time shocks and confuses a lot of people, and even myself.  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.  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.  I can’t directly correlate my rapid healing to eating differently, but I do believe it has been a big part of it.

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.  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.

I’ll post again in a month or so, and do ask me about it if you see me.  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.  This is probably more of a failing in myself than anything else.  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.  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.

Tags:

What is hypervideo anyway?

by Bruce Abernethy 10. March 2010 00:29

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.  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.  I am talking about “hypervideo”, though in 2010 we are now doing it with streaming high-definition video instead of laserdisc recorders.

What did “hypertext” do for “text” with HTML?

samplehtml 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”.  The hypertext-markup language (HTML) is the coding behind the world-wide web.  It is used to take the raw text and put a structure around the text and within the text.  What started as a simple text file now gains things like:

  • a “title”,
  • “headings”,
  • “hyperlinks”,
  • navigation,
  • sections/anchors,
  • a unique identifier (uniform resource identifier (URI)),
  • and data-about-the-data or “metadata”.

Users of these pages never really see any of this information, but they do appreciate it and use it all the time.  They can enter an address like www.nbcolympics.com 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.  Users can “bookmark” or “favorite” particular pages and get back to them whenever they want to.  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.  Search engines use the titles, headings, and metadata in the page in their search routines to find these pages.  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.

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.”  With words you can often tell what they mean from the context of the words that precede it or follow it; so this helps.  Today, images can contain an “alt” attribute where you can describe the picture in words.  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.

What if we could do similar things for video?

But what about video?  Sites like YouTube, Facebook, and Vimeo enabling the upload of tens of thousands of hours of video.  Each video contains a title and description which helps enable search to find the video.  But what about what is inside the video.  A single video may have many distinct sections or chapters where information is presented logically.  In each section there could be textual information describing what is going on in the video (think closed captioning or even the Descriptive Video Service).  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)?  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?

Well, we can.

TUVA

My favorite current example of hypervideo ideas is Project TUVA .  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).  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.

tuva1

At the core of the player you will see something that looks very common for videos on the internet.  There are the standard “VCR” controls, volume, and full-screen buttons – nothing really special so far.

tuvadetails

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.

Chapters.

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).  Each of the seven videos in Feynman’s lecture series are broken up into logical “chapters” with chapter titles like “Newton” and “Electricity”.  This provides much the same functionality of HTML headings and anchor tags.  You can quickly see the structure of the video and jump to any chapter from this navigation bar.

Notes / Expert Commentary

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.  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.  In addition to this, you can load other people’s notes files and see what they were thinking during the video.  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.  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.

Closed Captioning / Transcript

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.

tuvatranscript

The “Tuva” interface takes closed-captioning one step further and turns it into a full transcript of the talk being given.  You can literally read through all the different close captioning entries in a scrollable textbox.  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.

But wait.  If we have all this text now, linked to the video, can’t we search this too?  Yes.

Search

tuvasearch

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.  Then all of the “hits” can be displayed, and yes, they are clickable hyperlinks.

Links / Extras

The other notable feature of this interface is the “Extras” which are shown at the very bottom of the screen.  Embedded into the video are bits of metadata which enable the inclusion of “notes” and “links” within the video itself.  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.  For a “note” type extra, this can pop-over a panel that includes extra information about a particular topic being discussed.  The viewer can click on the icon to read this note, which pauses the video until they are done.  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.  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.  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.  When they are ready, the viewer can close the page and return to the video which can then proceed from where they left off.

NBC Olympics

But how might this technology look in a less “academic” and non-research or prototype situation – how about the 2010 Winter Olympics?

nbco1

NBC created an online player that would stream live and pre-recorded events to viewers everywhere.  They created a nice “blue-ice” themed player with all the functions you would expect from a modern player.  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.

But if you look a little closer you will see some components are are not, yet, very typical of video players online.

nbc02

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.  So that if I scroll through the list and  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.

nbco3

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.  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.

nbco4

One more interesting use of “metadata” here is the “Play By Play” pane that you can also call up on the player.  This allows for you to see interesting details about each event as it occurs.  For example here, we can see that the skier has achieved 54.7mph on the ramp before taking off – crazy.

How is it Done?

So, great, this is a cool technology and I’ve got a bunch of ideas on how it could be used.  What tools do I need to start building my own hypervideo projects?  Stay tuned for a near future post on this question and some tips to get you started.

Tags:

How I broke my arm and will now set off every metal detector

by Bruce Abernethy 14. February 2010 03:10

This will be brief, it is my first attempt at typing in 4 days or so, but I wanted to get 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.

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.  We had gotten about an inch or two of new snow, but that is pretty normal.  Unfortunately at the end of the driveway the snow was on top of some ice - but also, not that strange.  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.  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.  I was now laying in the snow on my back "snow angel" style.  I decided to try to roll over and pick myself up.

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.  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".  Trying to move my arm was pointless as it was going whatever way it wanted to and hurt more than anything  I can remember.

This is a photo from Flickr - not mine - I don't have any but I will try to get some.  This is also a woman's arm, but it comes closest on a short search to what I remember them showing me.

 

So the problem was my humerus bone was basically sheered in two and one of the broken sides was jabbed into my bicep muscle.

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.

Good news is my wrist and fingers are working very well considering.  The break was within a half-inch of where the nerves attach to operate the upper arm - that could have been much worse.  My tricep muscle is progressing and I can move my arm back and forth.

Unfortunately my bicep will need some therapy and it may be months before it is back to function.  I can't lift my arm right now and need a splint or a strap to move it around.

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. I will be going in in 10 days to have a follow up appointment and make plans for further therapy.

There are more details, but they aren't as relevant (and kind of gross) and I am done with this first typing practice.

Thanks for all the prayers, notes and e-mails - they are a great encouragement.

Tags:

Mouse Mischief: Multiple Mouse Support in PowerPoint with the MultiPoint Mouse SDK

by Bruce Abernethy 6. February 2010 04:15

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).  If it seems interesting enough, I’ll blog it.  This was fun.  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.  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.

Back on January 18th, Scott Hansleman tweeted about the new Windows MultiPoint Mouse SDK by teasing “Want your application to support TWO mice at a time?”  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.  Now we can do this again, in code wit, and with a cool PowerPoint plugin called “Mouse Mischief”. 

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?  For just such an experiment.

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.  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.

The Mouse Micschief PowerPoint 2007 plugin can be found on Microsoft Connect.  You will need a Microsoft Live ID and register with Microsoft Connect.  This is a great place to stay current on Microsoft technology and participate in beta programs.  But, again, it is not for everyone.

Once installed, “Mouse Mischief” will show up as a PowerPoint ribbon control.

mm1

There will be a new item up in the tabs, which reveals the “Mouse Mischief” ribbon.  Also note the “pptPlex” tab that is still up there.  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.

mm2

The ribbon adds some new slide types “Yes/No” and “Multiple Choice” and an important button “Play”.  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.  If you launch the slides using the play button in the ribbon you will get the multi-mouse functionality.

mm3

When you first start your “Mischievous” presentation you will notice a slide you didn’t add yourself.  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).  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.

mm4

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).

mm5

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.  When everyone has answered, or the teacher/presenter chooses to move on, we get a summary screen.

mm6 

This provides instant feedback for presenters and/or checks for comprehension from the audience.  The multiple choice slide has other options.

mm7

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.  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.

mm9

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.

mm8

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.

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 MultiPoint Mouse SDK Developer Info page.

Tags:

Silverlight Kata: IFS Fractals: Full Solution

by Bruce Abernethy 5. February 2010 09:23

If you have been following along with Part 1, Part 2, and Part 3, 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.

Complete Code Solution

So we are ready to put it all together: [ Download Source Code (if desired) IFSContentControl.zip (1.4Mb) ]

And, since you’ve been so patient, here is a live demo of the application.

Live Demo (Requires Silverlight 3)

 

Get Microsoft Silverlight

Pulling it Together

So, once we had the idea, the IFSContentControl, and the MessageBus wired up, pulling the rest of the Solution together is pretty straightforward.  You will see the typical Silverlight Solution structure of a Silverlight project and the hosting Web Application project.

In “polishing” this up a little I did add a few more Messages.

public class SetStartupIFSControl : CompositePresentationEvent<IFSControl> { }
public class SelfDestruct : CompositePresentationEvent<DateTime> { }

Adding SetStartupIFSControl let me add the ability to have the three buttons at the bottom with different “starter” IFS Objects.

The “Serpinski Triangle / Gasket” that I’ve been showing since Part 1 was defined like this …

public static IFSControl StarterSerpinski()
{
  var starter = new IFSControl
                    {
                        IsProbabalistic = false,
                        Background = new SolidColorBrush(Colors.LightGray),
                        XOffset = 25,
                        Age = 1
                    };

  starter.Content = starter.MyRootControl;

  starter.IFSTransforms.Transforms.Add(new IFSTransform(.5, .5, 0, 0, 0, 1));
  starter.IFSTransforms.Transforms.Add(new IFSTransform(.5, .5, 0, 200, 0, 1));
  starter.IFSTransforms.Transforms.Add(new IFSTransform(.5, .5, 0, 100, 200, 1));

  return starter;
}

The more complex “Barnsley Fern” looks like this …

public static IFSControl BarnsleyFern()
{

  var starter = new IFSControl
                    {
                        IsProbabalistic = false,
                        Background = new SolidColorBrush(Colors.Black),
                        XOffset = 100,
                        Age = 1
                    };

  starter.RectangleTemplate = new Rectangle
                                  {
                                      Height = 400,
                                      Width = 200,
                                      Stroke = new SolidColorBrush(Colors.Green),
                                      Fill = new SolidColorBrush(Color.FromArgb(200, 128, 255, 128)),
                                      StrokeThickness = 8
                                  };

  starter.Content = starter.MyRootControl;

  starter.IFSTransforms.Transforms.Add(new IFSTransform(.01, .16, 0, 0, 0, 1));
  starter.IFSTransforms.Transforms.Add(new IFSTransform(.34, .3, -50, 2, 50, 7));
  starter.IFSTransforms.Transforms.Add(new IFSTransform(.36, .28, 40, -2, 50, 7));
  starter.IFSTransforms.Transforms.Add(new IFSTransform(.85, .85, -3, -0, 50, 75));



  return starter;
}

These are both in the StarterIFSObjects static class.

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.  I added “Age” so I could tell how many iterations each object had gone through (surfaces as a ToolTip).

How well does it work?

For the Serpinski Triangle / Gasket, I was very pleased:

triangle8it

After 8 iterations, we have a fine (nearly textbook) example of what we were looking for.

For the “Checkered ‘X’”, also very nice:

cross5it

More predictable, in my opinion, than the triangle, but after only 5 iterations we have the multi-layered self-similar “X”

But for the Barnsley Fern:

fern7it

Not what I was hoping for.  Even after 7 iterations (creating 16384 IFSContentControls), this is only starting to look like what I was hoping for.  Iterating one more time left the browser “Not Responding” and was not generally a good idea.

The fern has many intricate details that do not surface well with this algorithm.  There are “bitmap” algorithms that create very nice ferns in a short amount of time (“classic” GDI+ routines) …

bitmapfern

But these do not track each translation and each message going out, which was what I was hoping to learn about from this.

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.  More about that in the last installment.

  • Part 1 – Fractals with TransformGroup and MessageBus
  • Part 2 – Automating transformations by creating an IFS Content Control
  • Part 3 – Wiring up the Iterations using a basic MessageBus implementation.
  • Part 4 – But will it work for a fractal Fern?
  • Part 5 – Lessons Learned (aka limitations of the MessageBus and recursion in Silverlight)

  • Tags:

    Silverlight Kata: IFS Fractals: The MessageBus

    by Bruce Abernethy 5. February 2010 03:20

    We are almost done with this application.  What started with Part 1 (intro to Fractals and the Silverlight experiment) and continued with Part 2 (creating the IFSContentControl) now gets a MessageBus to help communicate to and from the different controls

    The EventAggregator and MessageBus patterns have been described as a pattern and  discussed for a while and recently implemented by several different frameworks within Silverlight.  The basic idea is to decouple messages for common functions from specific classes.  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.

    A more detailed description of this particular implementation as described by the Microsoft Patterns & Practices group implemented as EventAggregator.   We will use the EventAggregator for our MessageBus and CompositePresentationEvent from the Microsoft.Practices namespace described here.

    Which Messages?

    So, then, what are the messages that we will want to have in this application?

    “Iterate” is the big and obvious one.  We may, for example, want to press a Button and have it Publish the “Iterate” Message to the MessageBus.  Then, we’ll want our IFSContentControls to Subscribe to the “Iterate” message and have them generate the next generation of the fractal.

    So to start out we’d have this …

    messagebus1

    The IFSContentControl would clone itself and apply each transform (3 in this example).  These new controls would then also Subscribe to the “Iterate” Message.

    messagebus2

    So the next click of the button that publishes the message will now be “heard” by three different objects ….

    messagebus3

    And so on … and so on …

    To fully make this work though, we’ll need to (1) get the new controls onto our Container/Canvas.  And, in the case of these fractals, the original control does not “survive” the iteration and only “lives” through one generation.

    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).

    messagebus4

    So our messages end up looking like this …

    using Microsoft.Practices.Composite.Presentation.Events;
    
    public class Messages
    {
       public class Iterate : CompositePresentationEvent<bool> { }
       public class AddIFSControl : CompositePresentationEvent<IFSControl> { }
       public class RemoveIFSControl : CompositePresentationEvent<IFSControl> { }
    }

    The CompositePresentationEvent is a generic class that takes a strongly typed object.  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).  In the case of the AddIFSControl and RemoveIFSControl messages, we will send along the IFSControls themselves in order to be processed.

    Where is the MessageBus?

    For this application, it is easiest to implement the MessageBus at the highest point possible in the Application itself.  So in our App.xaml.cs file we just add this …

    using Microsoft.Practices.Composite.Events;
    
    public partial class App : Application
    {
       public static IEventAggregator MessageBus = new EventAggregator();

    Really that is all it takes to set up the MessageBus.

    Publishing the Messages

    So, now how do we wire up the Button to publish the iterate event.  In the codebehind of the MainPage (or ViewModel if you’ve wired it up) we can add code something like this.

    private void Button_Click(object sender, RoutedEventArgs e)
    {
      App.MessageBus.GetEvent<Messages.Iterate>().Publish(true);
    }

    It is important to notice that there is nothing special

    about the “Button” itself – we aren’t using any of its events or properties to do this work or propagate this message.  You could just as easily set up a DispatherTimer and have it call “Iterate” every 60 seconds or so …

    void IterateMe_Tick(object sender, EventArgs e)
    {
      App.MessageBus.GetEvent<Messages.Iterate>().Publish(true);
    }

    Subscribing to the Messages

    So now we need to add code to the IFSContentControls to Subscribe to the Iterate Message.

    public IFSControl()
    {
      App.MessageBus.GetEvent<Messages.Iterate>().Subscribe(DoIteration, true);

    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.  So we need a public method that takes a boolean.

    private void DoIteration(bool isTrue)
    {
      foreach (var ifst in IFSTransforms.Transforms)
      {
          var newControl = new IFSControl
          {
              Content = Copy(this),
              IFSTransforms = this.IFSTransforms,
              RenderTransform = ifst.IFSTransformGroup
          };
          App.MessageBus.GetEvent<Messages.AddIFSControl>().Publish(newControl);
      }
      App.MessageBus.GetEvent<Messages.Iterate>().Unsubscribe(DoIteration);
      App.MessageBus.GetEvent<Messages.RemoveIFSControl>().Publish(this);
    }

    So IFSControl is now set up to Subscribe to the Iterate event – it will then call DoIteration() when it receives the message.  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.  In our example this will happen three times for each iteration, so three new controls will be sent in messages.

    The last two lines are interesting as well.  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.  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.

    Container Messages

    In this example the DataContext of our MainPage will be a class called the IFSStageViewModel.  This class encapsulates all the information and logic that will be needed for the user interface of our application.

    public class IFSStageViewModel : INotifyPropertyChanged
    {
       public Canvas Stage {get;set;}
    
       public int NumStageItems
       {
           get { return Stage != null ? Stage.Children.Count : 0;  }
       }
    
       public IFSStageViewModel()
       {
           App.MessageBus.GetEvent<Messages.AddIFSControl>().Subscribe(AddIFSControl, true);
           App.MessageBus.GetEvent<Messages.RemoveIFSControl>().Subscribe(RemoveIFSControl, true);
           App.MessageBus.GetEvent<Messages.Iterate>().Subscribe(Iterate, true);
       }
    
       public void Iterate(bool isIteration)
       {
           OnPropertyChanged("NumStageItems");
       }
    
       public void AddIFSControl(IFSControl newIFS)
       {
           Stage.Children.Add(newIFS);
       }
    
       public void RemoveIFSControl(IFSControl oldIFS)
       {
           Stage.Children.Remove(oldIFS);
       }
    
       protected virtual void OnPropertyChanged(string propertyName)
       {
           if (string.IsNullOrEmpty(propertyName)) return;
    
           if (PropertyChanged != null)
           {
               PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
           }
       }
    
       public event PropertyChangedEventHandler PropertyChanged;
    }

    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.  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”.

    In the constructor you will see that three different Messages are subscribed to – that is, all three Messages that we have defined.

    For AddIFSControl the ViewModel will simply add the sent control to the Canvas.  Likewise for RemoveIFSControl the sent control will be removed from the Stage.

    For Iterate all we end up doing is calling OnPropertyChanged for NumStageItems.  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.

    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.

  • Part 1 – Fractals with TransformGroup and MessageBus
  • Part 2 – Automating transformations by creating an IFS Content Control
  • Part 3 – Wiring up the Iterations using a basic MessageBus implementation.
  • Part 4 – But will it work for a fractal Fern?
  • Part 5 – Lessons Learned (aka limitations of the MessageBus and recursion in Silverlight)
  • Tags:

    Silverlight Kata: IFS Fractals: Automating the Transforms

    by Bruce Abernethy 2. February 2010 00:53

    Now that we have the idea of what IFS Fractals are from Part 1, we can move on to automating these iterations via code.  Our first step is to encapsulate what an IFS Transform is.

    public class IFSTransform
    {
       public double ScaleX { get; set; }
       public double ScaleY { get; set; }
       public double Angle { get; set; }
       public double TransformX { get; set; }
       public double TransformY { get; set; }
       public double Probability { get; set; }
    }

    As detailed before, an IFS Transform will typically scale the previous iteration (bigger or smaller, and one or both axes), rotate the object, transform/move the object on one or both axes, and will add a probability.  The probability is for when the different transformations need to happen more or less often in order to create the desired shape. For example a tree may have many leaves, but less branches; a person may grow more hair than they grow in height.  Many of the transforms will be “uniform” and have all the same probability.

    It is nice that we can enter our transforms in this concise class, but it would also be nice if we could translate these numbers into a XAML TransformGroup like the ones we manually created in the last post.  To do this we’ll add a public method to the IFSTransform to accomplish this.

    public TransformGroup IFSTransformGroup {
    
      get {
    
          var sc = new ScaleTransform { ScaleX = ScaleX, ScaleY = ScaleY };
          var rt = new RotateTransform { Angle = Angle };
          var tt = new TranslateTransform { X = TransformX, Y = TransformY };
    
          var tg = new TransformGroup();
          tg.Children.Add(sc);
          tg.Children.Add(rt);
          tg.Children.Add(tt);
    
          return tg;
      }
    }

    That will do nicely, and will help us get started on the XAML IFS Control itself.

    IFSContentControl

    In order to handle multiple iterations, what we’d really like is a control that contains the object that we are copying, then applies a series of transforms from all the previous iterations. 

    At the top level we need a control that also has the “smarts” to perform the next iteration.  To do this it needs two key things.

    First it needs to know all the rules for the iteration.  Next it needs to be able to clone/copy itself and apply the next iteration.

    We already have a class that represents an individual transform.  What would a group of transformations look like.  We could just use a generic list of transforms, but the group also needs to be able to return a random transform if the group is probabilistic (i.e. has a need to generate transforms in a non-uniform fashion).

    So how can we return a random item from a generic list of transforms based on their individual probabilities (which are represented a a decimal, adding up to 1.0 (hopefully))?

    Unfortunately, the C# Random object does not have a “NextDouble” method with a range of values – only the integer method has that ability.  We’ll have to turn the doubles into integers for this calculation.

    public class IFSTransformGroup
    {
       public IFSTransformGroup()...
    
       public List<IFSTransform> Transforms { get; set; }
    
       public IFSTransform GetRandomTransform
       {
           get {
    
               var totalProbaility = 0;
               foreach (var t in Transforms) totalProbaility += t.ProbabilityEstimate;
               var rand = new Random();
               var nextIteration = rand.Next(totalProbaility);
    
               var probablilitySum = 0;
               foreach (var t in Transforms)
               {
                   probablilitySum += t.ProbabilityEstimate;
                   if (probablilitySum > nextIteration) return t;
               }
    
               throw new InvalidOperationException("Random number exceeded Probability Total");
           }
       }
    }

    Now we can make our IFSContentControl.

    public class IFSControl : ContentControl
    {
       public IFSTransformGroup IFSTransforms { get; set; }
       public bool IsProbabalistic { get; set; }
       
       public void DoIteration()...
       
       private object Copy(ContentControl original)...
    }

    We really just want a “smart” ContentControl, so let’s inherit from that.  We can add an IFSTransformGroup, decide if it is probabilistic or not, and add a method to Do the next Iteration, which will need to be able to have a private method that will clone/copy the existing control (most likely several times).

    What would need to happen for each iteration?

    private void DoUniformIteration()
    {
      foreach (var ifst in IFSTransforms.Transforms)
      {
          var newControl = new IFSControl
          {
              Content = Copy(this),
              IFSTransforms = this.IFSTransforms,
              RenderTransform = ifst.IFSTransformGroup
          };
       }
     }

    Let’s look at just the “uniform” iteration first (where all transforms are applied equally).  We will need to go through each transform and create a new control that is the existing control with the specific transform applied on “top”.  This will create a number of different copies of the existing object which are each different now based on their specific transformation.

    What do we do with these new controls?  What to we do with the existing controls?  That’ll happen in Part 3 when we get into the Messages and the MessageBus.

    To finish out today, we need to be able to make a clone/copy of each object, to enable the “Copy” method.

    private object Copy(ContentControl orig)
    {
      if (!(orig.Content is IFSControl || orig.Content is ContentControl))
      {
          var rootControl = new ContentControl 
            {
                RenderTransform = orig.RenderTransform,
                Content = new Rectangle[...]
            };
          return rootControl;
      }
    
      var newControl = new ContentControl
            {
                RenderTransform = orig.RenderTransform,
                Content = Copy((ContentControl) orig.Content)
            };
      return newControl;
    }

    It is always fun to end with a little recursion.  We’ll end up walking the control tree down through the previous iterations.  So long as we see an IFSControl or ContentControl we’ll add a ContentControl to our new object, carrying over the existing RenderTransform (i.e. TransformGroup) to the new control.  When we find something that is not an IFSControl or ContentControl, then we know we’ve reached the source object – in this case a Rectangle.

    Coming next, let’s create Messages we can send off to all the wired-up controls to tell them it is time to do the next iteration.

  • Part 1 – Fractals with TransformGroup and MessageBus
  • Part 2 – Automating transformations by creating an IFS Content Control
  • Part 3 – Wiring up the Iterations using a basic MessageBus implementation.
  • Part 4 – But will it work for a fractal Fern?
  • Part 5 – Lessons Learned (aka limitations of the MessageBus and recursion in Silverlight)
  • Tags:

    Silverlight Kata: IFS Fractals with TransformGroup and MessageBus

    by Bruce Abernethy 1. February 2010 02:36

    At the CodeMash conference this year many things stuck with me, and two have been bugging me enough to do something about them this last weekend.  One was the idea that programmers need to practice and refine their skills, which was probably best described in the ideas of “Code Katas” ala Dave Thomas in the Pragmatic Programmer.  The other was my recent concentration on all-things-Silverlight, specifically looking at the power of the platform and the emerging patters (e.g. MVVM).

    So if I can find an hour or two to “practice my craft” without expecting this will ever result in production code - just for learning – what should I tackle?  It hit me - “Fractals!!!”.  It seems like every computer system and programming environment that I’ve gotten since the late 80s I have seen what I could do with some of the now-classic fractal algorithms. Inspiration for this also came from Corey Hanes great feature summary of another classic, the “Game of Life”.

    This post isn’t intended to be a detailed primer on fractals, and specifically fractals resulting from an “iterated function system” or IFS, but here are the basics.  Many systems in nature exhibit features that look very similar to each other.  That is, leaves on a tree, mountains, crystal structures, cells, snowflakes, etc.  How can we try to simulate these patterns in a simple system to generate complex results.  The IFS routines in these systems are kind of like DNA in a cell.  Each element in the current generation of a system doesn’t know where it came from, but does know how to create the next generation in the system.  How about an example.

    Start with a square. 

    fractal_it1

    The shape you start with really doesn’t matter.  What you end up with is making a “collage” of whatever shape you start with, a square is simple and fills the space nicely (which will be important later).

    Now we need to add some simple transformation rules.  We’ll do a “classic” Serpinski triangle or “gasket”.

    A transformation rule generally has four parts: Scale, Rotation, Translation, and Probability.

    In this case each of the three translations will scale 50% on both axes and have no rotation (0 degrees).

    1. The first will not move at all (i.e. translate (0,0)).
    2. The second will be a full width horizontally away (width, 0). 
    3. The third will be a full width vertically away and a half-width horizontally away (width/2, width)

    fractal_it2

    These then are the simple rules that this system will run by.  Each square in the system will know these rules and know how to apply them to themselves.  So when told to “iterate” each square should execute each rule by creating a clone of itself, and applying the rule to it.  After the iteration, the original square(s) should self-destruct as their short life is now over.

    So what would happen with the next iteration?

    fractal_it3

    And so on and so on.  What if we did this 7 times?

    fractal_it7

    Starts looking far different that you might have expected.

    So how might we start to tackle this in Silverlight?

    Actually, this should be far easier to do in Silverlight than in previous platforms because graphics and transformations are built in to Silverlight “out-of-the-box”.

    So “Iteration 0” will be easy (just a Rectangle).

     <Rectangle Fill="Red" Height="400" Width="400"/>

    Now we could  create a rectangle with half the height, width, and translate it in XAML, but we want to be able to automate this, so perhaps there is a better way.

    <Rectangle Fill="Blue" Height="400" Width="400">
     <Rectangle.RenderTransform>
         <TransformGroup>
             <ScaleTransform ScaleX=".5" ScaleY=".5"/>
             <RotateTransform Angle="0"/>
             <TranslateTransform X="0" Y="0"/>
         </TransformGroup>
     </Rectangle.RenderTransform>
    </Rectangle>

    We can take the original Rectangle and use the RenderTransform to handle all of the scaling, rotating, and translating of the Rectangle.  This works pretty well and is starting to get promising.  What would the other two “rules” look like?

    <Rectangle Fill="LightBlue" Height="400" Width="400">
     <Rectangle.RenderTransform>
         <TransformGroup>
             <ScaleTransform ScaleX=".5" ScaleY=".5"/>
             <RotateTransform Angle="0"/>
             <TranslateTransform X="200" Y="0"/>
         </TransformGroup>
     </Rectangle.RenderTransform>
    </Rectangle>
    
    <Rectangle Fill="AliceBlue"  Height="400" Width="400">
     <Rectangle.RenderTransform>
         <TransformGroup>
             <ScaleTransform ScaleX=".5" ScaleY=".5"/>
             <RotateTransform Angle="0"/>
             <TranslateTransform X="100" Y="200" />
         </TransformGroup>
     </Rectangle.RenderTransform>
    </Rectangle>

    But now we have a problem.  This works well for Iteration 1, but not for subsequent Iterations.  We need to be able to do transformations on top of existing transformations (on top of other existing transformations, etc.).  Rectangle alone will not get us there.

    What is a very simple XAML object that can contain another object? The ContentControl is just such a basic object.  Its basic job is to contain one other object (which itself could contain other objects), and it just so happens to also inherit from UIElement, which means it has RenderTransform as well.  What does this mean.

    It means that we can do something like this …

    <ContentControl>
     <ContentControl.RenderTransform>
         <TransformGroup>
             <ScaleTransform ScaleX=".5" ScaleY=".5"/>
             <RotateTransform Angle="0"/>
             <TranslateTransform X="0" Y="0"/>
         </TransformGroup>
     </ContentControl.RenderTransform>
     <Rectangle Fill="Green" Height="400" Width="400">
         <Rectangle.RenderTransform>
             <TransformGroup>
                 <ScaleTransform ScaleX=".5" ScaleY=".5"/>
                 <RotateTransform Angle="0"/>
                 <TranslateTransform X="0" Y="0"/>
             </TransformGroup>
         </Rectangle.RenderTransform>
     </Rectangle>
    </ContentControl>

    … which, if you look at it, is the first rule in Iteration 2.  That is, apply the first rule to an object that already had the first rule already applied to it.  Now we’ll get a rectangle that is half the size of a half-sized rectangle (25%) and hasn’t rotated or moved from the origin at (0,0).

    [End of Part 1]

    Two more parts to this coming in the next few days:

    Ironically(?) It will end up taking 3-4 times as long to blog this as it actually took to code it, but there is learning in the blogging as well, so more coming soon.

    Evaluating the iPad: Consumer vs. Creator vs. Cross Platform

    by Bruce Abernethy 29. January 2010 05:14

    ipad So there have been a few days since the iPad announcement and it is a lot of what people are talking about right now.  Several people are wanting to be first in line to get one of the new iPads.  Others have a lot of questions and criticisms of the unit that was announced. I looked at my own comments and critiques and I think I know why I was personally underwhelmed.

    First, I am a life-long Apple fan.  I’ve had and Apple ][+, Apple IIe, Apple IIc, Mac SE/30, IIsi, Quadra 610, PowerBook 100 & 170, G3, G4 etc.  I still have a Newton MessagePad 110 at home that I fire up every few years (fooled a few folks that it was a prototype iPhone a while back) and may be one of the few people anywhere that used an eMate 300. I’ve also had one (or more) of the iPods since Generation 2.

    Since the day I got my first Apple][+ I have been programming on computers – you had to back then, there was very little commercial software available for purchase (and no downloads).  I only mention this, because whenever I get a new piece of technology I want to see how I can customize it or extend it by writing some code or “hacking” the unit a little bit (and sometimes have to buy a second unit after irreversibly removing or changing one too many things).  I want my technology to be adaptable and open for me to use in ways perhaps not even intended by the creators.

    Health Care, Education & E-Commerce

    My three biggest types of customers right now are health care, education and e-commerce.  The iPad is great for commerce – perhaps too great.  If you want to sell audio, video, books, or iPad-specific apps, the iPad is a mini-mall full of shopping opportunities from anywhere with connectivity.  The iPad may be  the device with the most potential for generating ongoing revenue of any device in history.  But for health care and education there are some non-trivial issues. 

    First, there are 10+ years worth of software written for health care and education that run on Macintosh and Windows platforms.  None of this software will run on the iPad.  Some educational games like Oregon Trail have updated and rewritten their titles to run on the iPhone, but 99% of the software ever written will not run on the iPad.  This is disappointing.

    I have also not heard of any way to get software on to these devices other than the App Store.  That is a school or hospital IT department can not stage a standard device and replicate it across many units, and I don’t see the ability to enable/restrict the stock iPad software that comes with the unit.  These are important tasks for tech people in both schools and medical facilities.

    Small Macintosh or Large iPod?

    I think my confusion and disappointment with the iPad came because I didn’t know if Apple’s tablet offering was going to be a “Macintosh” or an “iPod”.  That is, would it run the full OS X kernel that would allow Macintosh software to run, or would it be the more limited sub-set that enabled the iPhone.  If it was a tablet Macintosh then I could hack/code it with technologies ranging from the unix tools, Macintosh-specific SDKs, Java, Flash and even Silverlight.  Plus, I could use the tablet itself to create software for the tablet – how cool would that be. 

    Consumer vs. Creator

    But I am not the “average user” intended for this device, which I can understand.  The sad thing is that the apparent target user for the iPad is focused 95% on being a consumer and maybe 5% on being a creator.  If you want to buy music on the iPad you are fine.  If you want to compose or record music then you’ll need another device.  If you want to read a book or magazine you are fine, if you want to write a non-trivial amount of text you will need another device or an awkward docking station.  If you want to use a bunch of other people’s applications that are accepted through the App Store vetting process, then you are fine.  If you want to write your own applications you will need another device.

    Selling to Paying Clients

    My other problem now is explaining these issues to clients who want to create rich applications for their users.  A very typical request from clients is that they want a great user experience and application that will run on Macs, Windows and mobile devices.  It appears that Apple’s philosophy in this area is that there should be a custom version for the iPhone, one for the iPad, one for the Macintosh and (if necessary) one for Windows (and maybe even one for Linux). iPhone apps will run on the iPad in either “mini-mode” or “pixel doubling” neither of which is very compelling. iPad specific apps (e.g. iWork) will probably never run on the iPhone.  If I wrote a great iPhone app, that won’t run on the Mac or Windows.

    So if I want my application to work in multiple environments that is 3-5 completely different applications in almost as many different programming environments and languages.  That is a tough sell to a client – this will take a lot more money and require a lot of different talent on the same project (and don’t get me started on code coverage for testing this variety of solutions).

    Coding Cross-Platform

    I want to be able to code something once, and have it be portable to as many different environments as possible.  In a nutshell, this is why there are many people clamoring for including Flash and Silverlight on the iPhone and iPad.  These are established platforms with tens of thousands of designers and developers who must now create multiple applications in different environments if they want to support the iPad.  There are finally two ways to create rich applications for Mac, Windows and Linux but only one way to create applications for the iPad.  This is why I’d really love to see support for Flash and Silverlight in the future.  Even if Flash and Silverlight were stand-alone applications that you had to get from the App Store, but allowed you to run cross-platform software within them.  By the way I could care less if Safari on the iPad ever supported either as a plugin.

    Unfortunate Choices, But Not “Wrong”

    Finally I want to clear one more thing up. Some people have said that Apple should not be “forced” to open up their iPad operating system to alternate programming platforms – legally or otherwise - and I totally disagree.  People can vote on this with their purchases; if they want to consume their content and entertainment on an iPad, and create it on a separate device, then that is perfectly fine.  That is, Apple’s decisions about the iPad are not “wrong” they are just “unfortunate” for me and the people I am trying to serve and support.

    Tags:

    CodeMash Apps for iPhone

    by Bruce Abernethy 7. January 2010 03:35

    The CodeMash conference is next week – it is a regional “software developer smörgåsbord” covering topics on a wide variety of technologies, patterns and processes.  There are times when all 650ish attendees are together for keynotes and meals, but at other times there are 5-6+ different sessions going on throughout the conference center.

    Traditional methods for getting information to attendees at conferences such as this is a printed program with all the tracks, sessions, speaker info, and location maps with all the rooms that sessions are taking place.  This year, the organizers of CodeMash made available a set of web services using industry standard protocols that included all of this information.  Then they left it up to the CodeMash community to come up with creating great applications to use this data.

    At this time there are apps using many different platforms and technologies, but I wanted to focus on the iPod/iPhone apps (because that is the mobile device that I have) – see the CodeMash main site for more info http://www.codemash.org

    Our team is taking five members to CodeMash this year, so we are getting together today to go over the schedule and decide which sessions we should try to all get to together and which ones we could “divide and conquer”, so I added the 3 iPod applications that I could find today to my Touch.

    threeicons

    The three apps I could find for the iPhone were iCodeMash, MobiMash, and a “CodeMash 2010 Scheduler”.  The first is a web offline HTML application, and the other two are available in the AppStore (search on CodeMash). I was wondering if the offline HTML application would be able to have the same functionality as a “full iPhone application” and I have to say that I was really impressed with how much can be done using the tools available.

    This will really not be a review/recommendation for these applications – they are all free of charge and I will have all of them on my iPod for the conference.  Rather, I wanted to review how the different authors and teams implemented features and see how many things were the same, but some features were innovative and even surprising.  I won’t go application-by-application then, but feature by feature and show how all three were implemented.

    Splash Screen

    IMG_0042 IMG_0043 IMG_0051

    I only mention this “feature” because it was interesting how similar things were, using the same source material.

    Home / Start Screen

    IMG_0035 IMG_0044 IMG_0052

    Other than the obvious different color palettes, this is where the applications (with the same back-end data) start to diverge. 

    The iCodeMash application is very conscious of the “above the fold” region of the different areas of the app.  It is also seems to be written to be used “at” the conference as well as “before” the conference.  It automatically highlights the next session and has a quick-link to your favorites.  Because this is not a full iPhone application, the button bar at the bottom is not used.  iCodeMash approaches the schedule from primarily a day/time standpoint.  The “next step” from this start screen would be to go view the next session, list of favorites, or review the schedule by day/time.

    MobiMash starts with a news feed from CodeMash which is updated regularly.  This may be updated during the conference as well, so this would be a good way to get late-breaking news at the top-level of the application.  From this screen, you can view a list of all of the sessions, review those you have tagged as favorites, see a map of the venue.  The More button reveals access to Speaker info, a Twitter feed of the #CodeMash hashtag (nice feature) as well as a “Right Now” and “Next” functionality which will be functional in the future.

    The Scheduler application starts with a menu featuring links to sessions, but adds the ability to filter by Level and Track which may be helpful in finding topics that are attendee-appropriate.  The button bar provides a “My Sessions” button that displays sessions that have been added to your favorites, and a News button which shows the CodeMash news feed.

    Pick Sessions

    IMG_0036 IMG_0037 IMG_0038

    iCodeMash approaches the sessions from a day/time standpoint.  You need to pick a day (Thursday or Friday) and then you will see a list of all the titles of sessions at that time.  If you pick a session title, then you will see the details for that session.  If you select the “star” symbol on the description then this one will become a selection/favorite (very much like many Google apps use).  Also in the description is a link to the room that this session is taking place in, with the specific room highlighted with a blue dot.  This is a nice feature for when moving between sessions at the conference.  I could not find a way to filter by level or track or access the speaker/bio information.

    IMG_0045 IMG_0046

    MobiMash provides a complete list of all the sessions.  The session abstract is included as well as the location and level of the session.  The speaker’s name is a hyperlink to the speaker/bio information.  A hyperlink by the session title enables you to add/remove the session from your list of favorites.  This screen feels and works much like a web page.  At the bottom of the session description is a unique feature to rate the session if you have attended it.  I am not sure where this information surfaces, but it takes the application into the feedback/recap part of the process

    IMG_0053 IMG_0056

    Scheduler provides either a complete list or a filtered list (level/track) of the sessions.  From the formatted description you can access the speaker/bio information or Add the session to your My Sessions list.

    Review / Track Your Selections

    Viewing the list of sessions and their descriptions is a great feature (and would really be “enough” for any of these to be useful at the conference), but all add the ability to tag sessions you are interested in attending and review those selections later.

    IMG_0040 IMG_0047 IMG_0057

    iCodeMash continues to provide data in a day/time format in reviewing your session Favorites.  This is most helpful in this view as this is probably how you will be using the data at the conference.

    MobiMash and Scheduler provide a list of those items you have selected; MobiMash gives them to you, I believe, in the order you selected them, while Scheduler sorts them by day/time ascending and includes the times in the list.

    Additional Features

    All three apps do a good job of implementing the “big 3” for conference sessions: finding, tagging, and reviewing.  I would expect anyone at CodeMash with an iPhone/Touch to take advantage of one or more of these.  Beyond these features were a few unexpected bonuses.

    IMG_0039 IMG_0048

    Maps – iCodeMash and MobiMash both a venue map of the Kalahari conference center.  MobiMash enables this on the button bar at the bottom. iCodeMash includes a link from the session description.  iCodeMash goes one step more and includes a little blue dot highlighting the room that the selected session which is very thoughtful.

    IMG_0050

    Twitter – MobiMash includes a current sampling of Twitter postings using the #CodeMash hashtag.  This is also quite cool and may be the way to find the most current info from the cloud at the Conference

    Ideas While Reviewing

    This is the first year that CodeMash has made the conference data available for public consumption as web services.  I have to say that all of these developers and groups have done a real service in pulling these applications together.  I hope this is the first of many years that CodeMash, and other conferences, will offer information like this for applications.

    I couldn’t help but think of what the next-generation applications might try to take on in future releases – what might be the most useful and interesting things to add?

    Additional Mashups – Twitter, Blog, LinkedIn, Google Group, Facebook, etc.

    I liked what MobiMash started with the integration of Twitter feeds with the #CodeMash hashtag.  Why not extend this and include links from the speaker/bio information to their personal Twitter feeds (can learn a lot about someone from their feed).  Why stop there?  Integrate an RSS/Atom feed from their blog into the application as well.  Basic information from LinkedIn might also be useful.  In addition to bringing in the news feed from CodeMash, why not also include a summary feed from the Google Group where interesting conversations and threads are taking place.

    Backchannel – During the Sessions/Conference

    The Twitter feeds are a good start of this, but wouldn’t it be nice if there was a place where people could post comments, ideas, questions, etc. that were session-specific?  Speakers could get an idea of how their audience is responding, and people outside the session could get an idea of what happened in the session or even if they should gracefully exit their session and join an ongoing discussion.

    Followup – After

    Many/most speakers who have PowerPoint decks or code samples as part of their session will create a blog post and attach these resources to the post.  Comments on these posts can serve to give the speaker feedback and continue the conversation.  MobiMash had the idea of a 5-star rating system for sessions that you attended – this is a start.  But if the applications could contain access to follow-up posts and comments from the session then they would have value even after the conference was over.

    Framework

    And then you end up saying “If this can be done for CodeMash, couldn’t there be a framework or platform that could be used at the 1000s of conferences that go on every year?”  Wouldn’t it be cool if a standard schema could be agreed on for sessions, speakers, venues, news, etc. that the major conferences, even just technology conferences, could all use so that all the work these developers have put into these apps could “pay if forward” and be used beneficially in the future.

    In summary, great job to all the developers – Jonathan Penn (http://wavethenavel.com) for iCodeMash, SRT Solutions with Jay Wren (http://jrwren.wrenfam.com/blog/ http://mobimash.org ) for MobiMash, and QuickSolutions (http://www.quicksolutions.com) for CodeMash iPhone Scheduler.  Thanks for creating great resources and inspiring others with your implementations.

    Connected / Disconnected

    All applications were tested online and offline – all worked well offline which is key since WiFi is iffy at big conferences.

    UPDATE: updated some details, MobiMash author Jay Wren

    Tags:

    What I Learned at the Silverlight Partner Summit 2009

    by Bruce Abernethy 16. December 2009 07:24

    Last Thursday and Friday I attended the Microsoft Silverlight Partner Summit.  This is our second year as a Silverlight Partner, but our first time attending the summit, and it was well worth the trip to Redmond.  I am still really processing all that was announced for Silverlight 4 this month, and the additional content from the summit, but I wanted to get a few things down here while it is current.  There are some things learned at the conference that I can’t post here quite yet, but the vast majority of important details have been recently announced publically, and more is coming very soon.

    1) Community is Critical for Continuous Growth and Progress

    Events like the summit just reinforce my belief that the only real and lasting way to learn new skills or technologies is within a community of people who are also learning and creating new projects. The ability to toss ideas off of other people, make discoveries and solve problems together – this is huge. It was great to be in a group where you could hear something and look at another attendee and say something like “That is about as useful as an ‘AG_E_UNKNOWN_ERROR’” and have a quick laugh without the other person looking at you like you are out of your mind (and if you don’t understand the Silverlight reference, insert your own “private joke” here and move on).

    The community I’ve had while learning Silverlight has really just been the handful of people on our development team and those Twitter contacts who are working on similar things.  I got to talk to a bunch of people who are also “in the boat” at the summit and made a few lasting contacts that I look forward to staying in touch with.  I am also trying to get a group together in our area who are doing Silverlight (or starting to) – if you are interested let me know.  Even a small group meeting informally would be really nice to get started.

    2) Silverlight Video is Something I Have Underutilized – This Needs to Change

    Video was the premiere feature of Silverlight 1 and has only grown in features and power since then.  I have spent the majority of my time developing for Silverlight creating business line-of-business (LOB) applications (e.g. data forms, grids, charts, etc.) and not “entertainment” applications (e.g. audio, video, animation).

    Seeing what some of the partners have done with the Olympics, NFL, Netflix, etc. is amazing, and on a scale that our customers and applications do not approach.  But I also talked with people who’s companies are working with corporate and educational video management and distribution software for learning and training.  This just makes sense, and is so easy to do now with Silverlight.  If you are going to include a “help” or “about” section in a LOB application, why not include a short video and/or screencast illustrating the point instead of just describing it in text and maybe a few screenshots.  Something to think about and implement as soon as I can.

    3) Scott Gu is the Real Deal

    There were, of course, many people from Microsoft at the summit. I was really impressed with the attitude and approachability of all of them that I listened to and interacted with.  There was a lot of interest and excitement from the attendees of the summit, but what surprised me was the interest and excitement from the Microsoft staff as well.  As interested as we were in hearing about upcoming technologies, strategies, best practices and key projects using Silverlight, the Microsoft people were very interested to hear what people were using the tools for and what we needed and wanted from the platform going forward.  So in the same way that we were reenergized by what we were hearing and seeing, the Microsoft folks seem reenergized to hear about all the cool, innovative and unexpected things were doing with the tools they were creating.

    I guess I have been to so many canned and half-hearted presentations in my life, that I had really lowered my expectations in a way.  I highlighted Scott Guthrie in the title of this section, but this really goes for all of the Microsoft people who we interacted with.  Scott, though, had a few aspects that were, in my mind, even over top of all the rest.  First, he missed the first day of the summit and the keynote because his plane from Paris was stopped, held and searched by authorities which caused connection problems down the line.  But the point is he not only came back from a whirlwind tour of European countries, but scheduled a “Scott Gu Unplugged” session at the beginning of the second day moving our agenda start up an hour.  In this session he opened Notepad and took any and all questions from the group, and answered every one of them – several that I didn’t expect him to answer – and was open and honest about issues and plans going forward.

    4) Silverlight 4 and SharePoint 2010 Will Be a LOB Powerhouse

    I was really surprised when Silverlight 4 was not only demoed at the Professional Developers Conference (PDC) a few weeks ago, but a full-blown beta was released.  This followed the beta release of SharePoint 2010 and Office 2010 in November.  If you haven’t read about the new features in Silverlight 4, go read through one of the great write-ups (like Tim Heuer’s and samples from Karen Corby) and then come back – ok, now consider some of the back-end enterprise power of SharePoint 2010.  Both Silverlight 4 and SharePoint 2010 will be powerful alone – taken together they combine to provide unprecedented power for Rich Enterprise Applications (REAs?).  All the rich user interface tools and potential combined with security, workflow, services, and Office integration will enable some really useful applications – especially if you leverage the Silverlight 4 COM support.

    One thing I took away from the first day of the summit was something I guess I knew but really didn’t “get”.  In talking to some of the “big name” customers/developers at the summit, I realized that these big companies had teams using every conceivable technology platform out there including Flash/Flex/AIR, Java FX, and even a few others.  They were not using Silverlight just because it was from Microsoft - they were using Silverlight for new projects because it was simply the best platform currently available for what they need to get done.  For one of them they evaluated Silverlight 2 and decided quickly against it.  Silverlight 3 was significantly improved and they started some initial prototypes and projects with it.  Now with the feature set of Silverlight 4 in preview, and soon to be released to the public, there is a platform that is a generation ahead in many areas.  Beyond this, it sounds like the development team isn’t slowing down with implementing key features even after Silverlight 4 and the mobile/device announcement coming at MIX’10.

    5) Great Tools Make Great Things Possible

    It is one thing to have a great platform with a lot of power and features.  It is quite another thing to have a full-featured set of tools that enable teams to build and test complex applications.  Visual Studio has been the industry standard for developer productivity for years.  With Visual Studio 2010 and Blend 3 (with SketchFlow) the bar has been raised again.  If you spend days in Visual Studio now doing development, you should try out some other toolsets sometime to just realize how lucky you really are – if you don’t use Visual Studio you might not want to check it out unless you are able to switch.  I know that I have grown to rely on a unified toolset that lets me develop everything from the browser, through the services to the database and back again – in one tool.  Those who are working in other environments face a daunting task of development and testing.

    Tags:

    Post Interesting Links to Blog 12/08/2009

    by Bruce Abernethy 7. December 2009 17:30

    Tags:

    General

    Confusion and FUD around Silverlight PDC Announcements

    by Bruce Abernethy 1. December 2009 04:49

    Anytime I answer a question from three or more different sources, I want to write it up and refer the next people to this (and update as necessary).

    There are two myths/exaggerations/tall tales surrounding announcements related to Silverlight last week at the PDC.

    1) Silverlight is running on the iPhone with Apple’s help.

    2) Silverlight 4 is breaking cross-platform compatibility and focusing on Windows over Mac and Linux.

    As most good rumors/lies do, these both contain a smidgeon of truth (<1%) and a whole lot of speculation, “analysis” and FUD (fear, uncertainty, and doubt).

    Silverlight on the iPhone

    The “truth part” of this is the Silverlight Smooth Streaming technology that enables smooth high-definition video to play in Silverlight has been made compatible for streaming video to the iPod.  This is a server-side technology that is integrated with IIS server.  This does not mean that Silverlight applications run on the iPhone.  If and when this happens this will be a big deal.  For now, what this means for video content providers is that they can have a single solution to provide high-quality streaming video to both the desktop computer and the iPhone.  Why the confusion here?  I think a few poorly titled “news” articles/releases and blog posts and a bunch of trolls latching on to it.

    Silverlight Ending Cross-Platform Development

    The Silverlight runtime is becoming available on a number of new platfroms from desktops (Win/Mac & Linux with Moonlight), to hand-held devices, to TV-top and game consoles.  Across all of these platforms there is a core Silverlight that runs 100% the same in each environment.  But with each environment also comes some critical and desired functionality that is unique to that environment.  On the XBOX you’ll want to be able to access game controllers (perhaps multiple), for touch screens you’ll want to be able to support touch and multi-touch capability, on a phone you will want to be able to dial the phone, if there is a GPS or accelerometer in the device you’ll be want to access that as well.  These are all unique to specific devices and don’t exist on the other devices.  Supporting one or more of these would not mean that Silverlight was not “cross-platform”, just that it enabled high-value specialized capability where it exists.

    The “truth part” of this false accusation is the announced support for COM interaction in Silverlight on the Windows platform.  What this means is that Silverlight will be able to call out to certain external code on machines if they exist.  This means that a datagrid on the Silverlight screen could be easily sent to Excel, or an appointment could be sent to Outlook, a chart could be exported as a report to Word, etc.  The grid, appointment and chart will exist cross-platform for all environments.  The only difference is, if you happen to be on Windows with the right software installed there is additional functionality that can be quite useful.  This is an example of a request from developers who are creating Silverlight applications for Enterprise Business customers who are requesting these types of features.

    Why the confusion here?  I think there is a small group of people who believe that cross-platform has to mean “least common denominator” – that is, if a feature/function can’t be used in 100% of the places where the software runs, then it isn’t “cross-platform”.  In the iPhone world this would mean that applications couldn’t use the GPS or dialer because the apps might be used on the iPod Touch (where these don’t exist), or applications couldn’t support touch-screens because most people don’t have them.  It will be up to the developers to make sure that their applications work well in all situations, but this shouldn’t prevent them from taking advantage of added features where they exist.

    Tags:

    Post Interesting Links to Blog 11/27/2009

    by Bruce Abernethy 26. November 2009 17:30

    Posted from Diigo. The rest of my favorite links are here.

    Tags:

    General

    Continuous Learning Lessons from Leaf Blowing

    by Bruce Abernethy 13. November 2009 08:02

    Funny how something as simple as teaching your daughter to use a leaf blower can reinforce and confirm ideas about learning any new skill.  This last week my daughter saw me “playing” with a leaf blower and showed some real interest in trying it out herself.  What happened next would drive some classic/corporate staff development / training people crazy, or more accurately what we didn’t do. We …

    • Didn’t go get my daughter leaf blower manual and have her read through it (and have a written test for her afterwards).
    • Didn’t tell her to go Google “Leaf Blowing” and see what other people trying to leaf-blow had done
    • Didn’t sign her up for the two-day “Leaf Blowing 101” class, or get us plane tickets to Vegas for the latest “Leaf Blowing Futures 2009" Conference.”
    • Didn’t start her on a fake project in the “Leaf Lab” where she blows artificial leaves through a series of increasingly complicated leaf-blowing scenarios
    • and I Didn’t buy her the latest “Leaf Blowing for Dummies”  or “Leaf Blowing Mastery in 24 hours or Less”.

    What we did do was what I imagine

    • Did work on it together / take turns on actual leaf blowing
    • Did share the work / joint “leaf ownership”
    • Talked very briefly about the strategies for moving a large number of leaves to a central location
    • Got started by modeling some basic leaf blowing techniques
    • In under 5 minutes had her actually leaf blowing on real-world leaves on an “active project”
    • As we worked together I never even considered if we could increase productivity by getting a second leaf blower – then we could split up the leaf blowing tasks and work in isolation.

    Why is it when, as professionals, we get a new member of a team or a new project, we don’t do what comes so naturally when we work with our kids on a new skill.  All the basic strategies still work, and still work well.  Once we get the idea that learning can only come from a book or a class, or worse yet – that our training or learning is the responsibility of anyone but ourselves, we really lose sight of the most natural and powerful models for learning.  Learning is a continuous process of people working together, as a community, and sharing the knowledge and the load.

    Tags:

    Where does all the money for schools go?

    by Bruce Abernethy 27. October 2009 05:02

    I occasionally break down and have to write about something off-topic that is wearing on my mind.  One such thing is school funding, and that is all over the news lately.  So, quick post – click the back-button now if you were hoping for something more typical on my blog.

    So the Michigan budget woes have brought up the issue of school funding again – the Governor wants to cut $100-$200 from the per student payout to try to balance the budget.  This would bring the minimum per-student payout down to ~$7,300 with the average per-student rate in the state going down to between $8,000-$9,500.  Some in the state are worried that this will not be enough to provide an adequate education for the kids in the state.  Everyone seems to be ready to say what they would cut first if money got tight – usually hot-button areas like bus transportation, after-school programs, or even football!  But I haven’t seen anyone explain what it is they do with the money they do get.  Someone has got to know this – please help me out here.

    Let me break this down to start the discussion.  In order to do this math I am going to try to use approximate numbers – I’ll try to use a lower/fair number to keep the discussion fair.  Let’s say that students in Michigan get $8,000 each per year for school.

    8kperstudent

    That’s sounds like a decent amount to get an education.  It isn’t a fortune but it has potential.  Especially if you match it with some other students in a classroom.  When I was in school we had about 30 kids in a classroom 5x6 grid of desks – this is too many.  Let’s say you had a classroom of 28 students in it, how much money would we have then?

    224kperclassroom

    Nice jump – up to $224,000 – nearing a quarter million dollars for a classroom of students.  Now we are talking.  Let’s say we had a school then with two classrooms per grade K-6.  This is a nice sized school, but not overly big – again, like I remember from growing up.  How much money would we have then?  Well that is 14 classrooms so ……

    3milperschool

    OK, now we are talking - $3.126 million dollars.  Almost took out my computer copying and pasting that many virtual $1000 bills.

    So our hypothetical school with 392 kids has a nice budget to work with for the year (each year).  So what do we do with this money – that is what I am trying to figure out.

    Let’s pay the staff first – they are the ones that do the work (and many/most do a great job – that is totally not the point of this post).

    Staff

    Let’s build a nice staff

    • 14 Teachers
    • 1 Principal
    • 1 Secretary
    • 1 Maintenance Person
    • 1 Nurse
    • 1 Librarian
    • 1 Computer Guy

    Again, I said they do a great job – let’s give them a $100,000 package every year for salary and benefits.  Anyone who tells you teachers work a short day and a short year have probably never known any real teachers.  I can tell you from experience that they put in as many hours or more as people who are on the clock year-round.

    So that is $2,000,000 just in salaries.

    That takes our budget down to 1.126 million dollars.

    School Building

    We also want a great building.  Let’s build a $4,000,000 building with a 30-year mortgage.  That is about $20,000/month for the loan or $240,000/year.  If you argue that this is too little or miscalculated, also please realize that school districts typically pass a millage (additional taxes) to pay for facilities which are over-and-above the per-student payout every year.

    Budget now at $886,000

    Utilities

    We have to heat and light the place and keep the computers running.  Let’s budget $5,000/month or $60,000 a year for electricity.  The nice thing about schools is that they do get a nice rate on public utilities so this money will go a long way.

    Budget down to $826,000

    What’s Left – Stuff for the Students

    So here then is my problem.  We are left with $826,000 per school or about $2,100 per student after we’ve built the school, kept it lit and heated, and paid all the paid staff (lots of volunteers in there as well).

    Even if you bought every kid a netbook computer every year ($400) and bought all new textbooks every year ($600) you would still have $1,100 per student left.  That buys a lot of paper, pencils, science experiments, sports equipment, etc.

    The Point

    My main point here is that we are struggling as a state with unemployment and the economy – less people paying taxes on less salaries.  Everyone is cutting back.  All other government programs are cutting budgets.  Schools should be able to do the same without that big of a deal.

    To get right down to it – Charter schools have 50% the budget of public schools, private schools 15-30%, and homeschools are on their own – and all of these options continue to produce results.

    Let’s ride this economic crisis out together and wait for the day when things swing back upward, without bemoaning the small sacrifices that everyone needs to make right now.

    Tags:

    Success in drying out waterlogged Laptop

    by Bruce Abernethy 14. October 2009 03:32

    Here’s a not-so-hypothetical situation – one night when 15 or so kids are running around the house you happen to leave your laptop in a very public location near where the Wii games are underway.  Inevitably the laptop gets used as a coaster and soon after the cup empties over the laptop.  The top of the laptop gets wiped clean (according to alleged eye-witness testimony), but, hours later, when you pick up the laptop unknowingly, water literally pours from the openings for the fan.  Taking out the battery and DVD drive confirms the worst – everything is at least damp – probably as wet as you could get without submersion.

    Don’t Panic.  I’ve been using Windows 7 Hibernate mode lately instead of Sleep so the machine should be powered down. Damage from water/coffee/liquid is usually from an electrical short being caused in the system – no power, no short. Remove the battery so no power is supplied to the unit.  Take the (dripping) laptop into the laundry room and put it on a towel to sop up as much as possible.  Then proceed to remove all of the user-serviceable panels and parts as possible.  I didn’t say this would be easy.

    Removed the panels for the hard drive, memory, wireless card (all with water drops on them), then removed the components (i.e. hard drive, memory, card, etc.).  I Also removed the keyboard, which pretty much concludes all the parts that are designed for regular humans to add/update/replace.  Lastly, I did pull out the little “watch battery” on the main board which was exposed to further let air get in there and remove another source of power. Looks like the screen is sealed really well and isn’t showing any fog or moisture – hope for the best.

    Put all the bits and pieces on a new dry towel and put a fan on the lot for a full 48 hours.

    Time of Reckoning: reassemble all the pieces (only 3 lose screws from the keyboard).  Attach the battery, and start it up (mentally remembering the fire extinguisher is about 6 feet away).  It makes the typical sounds on start up, but has a weird error I haven’t seen.  The CMOS/BIOS values are “corrupted” (doesn’t sound good) but [F5] will enable the default values if I would like – sure.  Windows 7 hibernate/resume starts and I am starting to be cautiously optimistic.  Machine thinks it is January 2001 but a quick settings change corrects that.

    Success.

    One other thing worth noting is that my initial lack of panic, even though I had a user group presentation scheduled for the next day and all my stuff was on the laptop, was because I had live copies of everything “in the cloud” using Dropbox and Live Mesh (trying them both out for now – like the Dropbox iPhone app feature).

    Final note, from past dry-outs of cell phones, if the laptop screen was foggy/wet a way to remove water from a mostly-sealed system is difficult, but not impossible.  If you can carefully package the laptop and introduce it into an environment with some ultra-absorbent material (e.g. instant rice, cat litter) and seal it up, the resulting dry air will pull moisture quite effectively out of just about anything.

    Tags:

    Why I am voting for Nessie

    by Bruce Abernethy 5. October 2009 03:37

    My family has had a great time at ArtPrize these last few weeks visiting as many of the different venues and artists as possible. The final vote is upon us this week and I feel strongly enough about one of the top 10 that I am going to make my intended vote public and let others know why.

    First, full disclosure, I am a full 50% Scottish, have been to Loch Ness, and have seriously considered the matter of whether there is or has been a Plesiosaurish orphan in the deep waters (not fully decided either way). Beyond this heritage, I have no other connections with the artists themselves or any of the others or the contest.

    Let me list my Top 5 reasons that I think "Nessie on the Grand" tops the Top 10 for ArtPrize.

    Let me start by saying my enthusiasm for Nessie in no way minimizes my respect for the other artists in the contest. In my mind, anyone why was able to pull a piece together and find a venue to show it off, is already a winner. Of the amazing artists in the Top 10, I have seen all but 2 and feel badly that I did not have more time planned to see them all.

    The first reason I think Nessie should win is the quality and creativity of the piece - it is very well done. My first thought when seeing the water worm for the first time was that it looked like an Egyptian styled version or something out of Stargate. It is described as "art deco" style, but I just thought it was a nice fresh take on the Loch Ness monster that was updated and very striking.

    Second, the sheer size of Nessie is impressive - she is huge! Would the Calder or Da Vinci's Horse be as spectacular if they weren't bigger than life? When ArtPrize was announced I wondered if anyone would create a piece that would not be restricted by the downtown venues, but actually take advantage of one of the venues downtown. Many artists did this, but Nessie uses one of the greatest features of downtown - the river itself - and makes that part of the art. Brilliant.

    Third, I like the fact that Nessie's installation is in a venue that is fully public, and would necessarily be public if it were permanently installed. One of the greatest aspects of ArtPrize is that is brought art to the public. Many of the pieces at ArtPrize will go behind closed doors after the competition. If Nessie were to find a permanent home it would need to be outdoors in a river/lake somewhere for people to enjoy. I also like the fact that the artists and team blogged and collected video of key moments of the process, and also added social media like Facebook to add a public community aspect to the project.

    Fourth, there is no doubt that Nessie has broad audience appeal across ages and cultures. A big part of my excitement over the piece was the response from my children when they saw it. It is impressive, fun, exciting, and doesn't depend on a particular age, culture, or background to appreciate.

    Lastly, Nessie was implemented by a group of people who are local to the area. The top four of my reasons would be reasons enough for me, but the fact that the artists responsible are local, outgoing, and very community focused just seals the deal in my mind. I wouldn't want artists to think that you had to be from the area to win this wonderful contest. But I would want people to know that, all other things being equal, ties goes to the person or group that can take the prize and encourage others in the area to get out, be creative, and bring their best works forward.

    Tags:

    Brother Color Laser Printer HL-4040CDN

    by Bruce Abernethy 20. September 2009 23:43

    So I have been looking at printers for home since my old HP multifunction printer died in the spring, and used some birthday money and a great sale at OfficeMax to get a new one.  I decided on a color laser printer, the Brother HL-4040CDN.

    Picture 1

    Now you might be thinking “color laser printer” isn’t that overkill and/or really expensive.  I first used a color laser printer in the mid-90s – the HP Color Laser Printer.  It was terribly slow, needed a lot of maintenance, cost a ton to buy (close to $10,000) and the supplies were prohibitively expensive (~1.50/page).  Needless to say this was not for home/personal use. Today this color laser printer is $279 and costs far less than an ink jet printer to operate, oh and it prints about 20 pages per minute.

    I’ve had it less than a week now, so this is more about first impressions than a review/recommendation.

    My requirements

    What I need is something that I can print to every day, and that my family can print to every day, without having to worry about the correct paper being installed, the expensive photo ink being installed, and with less concern about the cost per page to print.

    I am teaching some classes now, so I may need to print 20-40 pages on the way out the door, and copies of web pages and articles on the fly.  The kids are writing a number of reports each week and similarly need to be able to print before taking off for the day or night.

    In this, color is actually not a requirement, but is very nice to have.  The problem with ink jet printers and color is that they are so expensive to run, and if you print a big enough image, they still come out wet and need to set a while before using.

    Pros

    • XP, Vista and Windows 7 drivers – local and network:  This is very important for us because the kids have XP netbook computers, we have one Vista laptop, and my main machine is now Windows 7.  XP and Vista drivers came on the disk, and Windows Update found Windows 7 drivers immediately (which was very nice).  So now everyone is set up to print to the printer from wherever they are on the network.
    • Speed – 20 ppm, black and white or color.  It might be just me, but I end up printing things right as I exit the door going somewhere.  It is nice to know that I can do this and have the printouts ready by the time I get my shoes on.
    • High duty cycle – this is a workgroup/office class machine and is duty rated for thousands of pages per month. This is well more than we will use, but it is good to know.
    • Large sheet capacity (250).  The bottom third of this unit is just a paper tray that can hold 250 pages – this is nice for big print jobs or just not to have to worry about it.
    • Long print life.  The standard toner cartridges last from 2,500-1,500 pages, and the high capacity carts last 4,000-5,000 pages.  Again, it seems like with the ink jet I am always changing carts and paper.
    • Duplex – this was not a requirement, but is very nice.  Duplex means that I can print on both sides of a sheet of paper automatically. This saves paper, and is great for printing workbooks on 3-hole paper.  Then I can take the sheets and bind them directly with the facing pages set up correctly.

    Cons

    • Size, weight – huge.  Even when the Office Max guy de-boxed the thing with me it barely fit in my car.  This thing is a monster and the box it comes in could be a kids play house.  In case you think I am exaggerating, the carton size is 22.4" x 24.6" x 22.2" and weighs 74lbs.  The unit alone is 16.5" x 18.7" x 12.5" and weighs 65lbs.

     Picture 2

    • Ethernet, but no wifi.  Fortunately where I was going to put the printer was next to a network hub, but others may need to put it somewhere unwired.  It should be a feature that could be added, but I don’t see that anywhere.
    • Features I won’t use, like direct USB printing of PDF, Jpeg, PictBridge.  For the price and added tech to support these rather useless features I would have rather had WiFi.
    • Brother is not a known brand to me. Nothing really good or bad here, it is just a brand I have never dealt with.

    Impressions

    Overall I am really happy with the printer so far and will follow up in a few months with a longer term review.  The kids used it over the weekend for different research projects and I am ready for class this week already.  So far so good.

    Tags:

    Fearless by Max Lucado

    by Bruce Abernethy 10. September 2009 01:13

    The last book on the Summer 2009 reading list was Fearless by Max Lucado. This book was very timely for me and was a nice break from technical and fiction books. Fearless is a book by author and pastor Max Lucado out of San Antonio which attempts (and succeeds in my opinion) to counter all the negativity and spirit of fear in seemingly all the headlines today.

    What's to be afraid of? This week kids are going back to school (scary to start with), and they'll have to face H1N1 swine flu. There is political controversy on the first day with a live speech being presented by the president. Michigan has 15% unemployment so one or two kids at the bus stop has a parent that is looking for a job. A look at the headlines just for today will show issues on Health Care, Wars in Afghanistan and Iraq, Recession, Bankruptcy, Climate Change, Car Accidents, Nuclear Power, Infidelity, Death, Fallen Leaders, Vaccine Issues, Truck Bomb, Texas Execution, Plane Hijacked in Mexico, and more - but there is a cool new iPod nano (sigh).

    I started reading Fearless with high expectations, having really enjoyed past books by Lucado, and was really surprised - in a good way. This is one of the rare books that I read, and then want to read again with someone else or with a group of people and discuss over coffee and maybe a donut. It may be one of the best books he has written, and I already know a few people who I want to get a copy of the book.

    Fearless is really a book about overcoming fear. Fear is not the spirit that we are supposed to have, but instead one of power, love and self-control. Lucado explains that fear comes about as we perceive a loss of control in our lives. It is faith, not fear, that should be our reaction when these challenges come.

    Lucado uses an amazing variety of styles in the book to illustrate very common fears among us - fears like not mattering to people, protecting your kids, challenges, violence, death, and others. In one chapter he uses a "Dr. Seussian" style poem to tell the story of the people of "Stiltsville". In another chapter he will tell the true story, with detail and insight that few authors can accomplish, of his experience flying in an F-16 on maneuvers. Some of the ideas are common sense such as focusing on today, not worrying about yesterday or tomorrow - do the next thing. He takes an amusing tour through "Worst Case Scenarios" (i.e. surviving an Octopus attack) but brings the reader back to focusing on faith, peace and hope instead of falling into fear and doubt.

    Overall I was very pleased by reading Fearless and recommend checking it out or picking up a copy for a friend who needs a lift.

    Tags:

    RecentComments

    Comment RSS
    Disclaimer
    The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

    © Copyright 2010 Bruce's Blog