Friday, July 22, 2005

Main Entry: vis·ta
Pronunciation: 'vis-t&
Function: noun
Etymology: Italian, sight, from visto, past participle of vedere to see, from Latin vidEre -- more at WIT
1 : a distant view through or along an avenue or opening : PROSPECT
2 : an extensive mental view (as over a stretch of time or a series of events)

Sorry, I think its a lame name.  I think WindowsExtreme or Windows++  would have been better choices, but I am a technical guy, not a marketer.

Friday, July 22, 2005 9:21:23 AM (Central Standard Time, UTC-06:00)  #    Disclaimer  |  Comments [1]  |  Trackback
 Wednesday, July 20, 2005

So, I hear there are a lot of programs out there that check for newer versions when you run them.  As an end user I find this feature annoying more often than not: how many Windows Media updates are there per week anyway?  As a writer of software it is very nice to have an update feature built into anything you wish to distribute to more than 2 people.  There is a nice Updater Application Block, extensible and easy, and I think there are some partial ports to the compact framework or MSDN CAB-downloader examples out there.  From what I've seen these either don't suit my needs or would require some serious shoe-horning to make them fit my needs.  One of my favorite clients, with their non-Microsoft backend systems now needs Updater functionality, so I set out to design something flexible.

  • There is a custom sync process that runs while the system is connected, so I want to query a backend system for what updates might be available for the unit
  • I want to be able to download CAB files containing new versions of the main system (of course)
  • Download arbitrary files for that matter
  • I want to be able to Execute these CABs, and any other arbitrary shell executable
  • I want to be able to modify the local databases, they are huge so just rebuilding is not an option
  • I want to be able to have the unit upload arbitrary files

The reasons for these should be apparent but I'll explain anyway.  Suppose you have a change you need to make to a system that 100 people in the field are using:

  1. A new user enterable field is added to a table
  2. New software is needed to collect this data
  3. You need to alter the local data sources to contain this field

Based on this idea and others, I came up with a list of "Action types" I might want to do during an update.  I query the server for a list of updates passing things like the serial number of the device, and the server returns a list of these Actions sorted by order of execution.  Each action has its own attributes and method of execution so the updater program can kill the main application and polymorphicly go about doing what it needs to do with things like DownloadAction, SqlAction, ShellExAction, UploadAction.

Obviously there is some work to be done on the server, essentially this will be a webservice that returns a message with the ordered set of Actions in it.  This is more work than a file-based solution but also gives us the flexibility of being able to configure different updates for different devices.  You probably don't want too many different versions of your software running, but the actions can be used to assist technically challenged users with deleting temp files, distribute customer-specific content, delete troublesome SqlCE data, etc.  Due to various other aspects of our software its easy to set up a nag feature where the user can choose to skip the update a certain # of times and other useful stuff.  The upload actions can be either FTP or HTTP PUT.

Since I mentioned it, I'll have to post about custom data synchronization processes in the future as well, since I think I've got a pretty good one and as one respected member of the Compact Framework newsgroups says "It is not trivial to go that route".  Sometimes Merge Replication just makes you want to shove salt-covered icepicks through your intestines though, and I think a lot of people would use a custom sync processes if there was a proven one out there.

 

Wednesday, July 20, 2005 3:22:42 PM (Central Standard Time, UTC-06:00)  #    Disclaimer  |  Comments [6]  |  Trackback
 Monday, July 18, 2005

Well, this is what, four non-code posts in a row?  I'm slipping.

I spent some time going over some client work this weekend and it seems that I am catching up.  It seems that I might be getting close to the Period of Rest I've been looking for, this is less satisfying that it would be if my new home was anywhere near completion.  I still have a couple of bigger things that I could work on but these hold the danger of me getting too far ahead of client requirements, the old "Go ahead and work on it but I won't have time to tell you if its right" hurry-up-and-wait.  In light of this, I turned back to something that had been shelved for a while: something I call Project Cesium.  I have alluded to Cesium a couple of times on this blog and to friends, hinting that this may be a press-release-worthy item at some point.  I started working on a re design and some code Saturday afternoon.  Stay tuned for an early 2006 release of something that will hopefully be a big deal.

Monday, July 18, 2005 8:52:49 AM (Central Standard Time, UTC-06:00)  #    Disclaimer  |  Comments [1]  |  Trackback
 Friday, July 15, 2005

Like a lot of people, I tend to define goals for a year at the beginning of each year.  Many of them are typical: get in shape, pay off debt, etc.  Once I went a whole year without consuming alcohol.  Since you're curious, this year's item (I assume you are curious or you would stop reading) was to make a great deal of $$ so that next year I can relax more.  At any rate, I'm adding one UberGoal™ right in the middle of the year.  Yes, I know its not a best practice to change the deliverables in the middle of a project but management says this is important.

My goal is to Be Progressive.  There are a lot of ways that we should just Do The Right Thing that we don't, some of them vitally important to our position in the world and our continued prosperity as a species.  I have some specific things in mind:

  1. Use the metric system as much as humanly possible.  The current NASA fiasco reminds me of just how silly it is that we are not using the metric system.  Being an obnoxious elitist, imagine the fun I'll have telling people how many Kilometers it is to my house, how many liters of beer I drank at the Nerd Dinner, or how good the 700 gram steaks I ate were, or how many kilowatts of power and newton-meters of torque my WRX has.  This will be kilograms of fun!
    1. Action Item: SmartPhone program with conversion rates for everything.
    2. Action Item: Refactor common sayings such as "Kilograms of fun", "A kilogram of cure is worth a gram of prevention", "Go the extra kilometer", "A journey of a thousand kilometers is begun with a single step", "This weighs a Metric Ton", "I'll bet you can't drink 1.83 liters of milk in under an hour", "The whole 8.73 meters", "Give them a centimeter, they take a decimeter"
  2. I cannot type as fast as I used to, due to the Carpal Tunnel/tendonitis brought on by me working way too much.  Contemplating this, I recalled the bit of trivia that the Qwerty keyboard layout was specifically designed to make typing as slow and uncomfortable as possible back in the Golden Age of Typewriters.  Considering the amount of work that is done on PCs these days, my bean counters estimate that this costs us approximately Eleventy-gazillion (0xff∞E^eleventy) in productivity losses each year, mostly in email and MSN messenger related time loss and overly verbose VB.NET code.
    1. Action Item: Obtain, learn, and evangelize an alternate keyboard
  3. Look into renewable energy as much as one man can.  Am I the only person who can see the upward curve in gas price is going to have us paying over $1.20 per liter as soon as next year?  This does not mean I'm buying a hybrid car: I hate to be the one to say that hybrid cars are a joke.  The amount of energy a hybrid car will save you in gas over its lifetime is not as much energy as it took to create the battery in the first place.  How did the power plant make the energy to make your battery in your hybrid car?  Why, burning fossil fuels of course.  On top of that, due to the principles of Entropy, a lot of energy is being wasted in this transformation as well.  That's right, Hybrid Vehicles are driving gas prices up.
    1. Action Item: Laugh at people who drive hybrid cars
    2. Action Item: Look into solar panels on my house, assuming they do not suffer the same drawback as hybrid cars.

That's enough for one year.

Friday, July 15, 2005 11:54:40 AM (Central Standard Time, UTC-06:00)  #    Disclaimer  |  Comments [1]  |  Trackback
 Tuesday, July 12, 2005

So we are going to have ".mobi" domains soon, the idea being that these are meant for mobile devices.  One one hand, I'm all about mobile.  On another, sounds like a way for registrars to make more money.  On another hand, is it so hard to detect the user agent on your server and direct them to a mobile version of your site?  Haven't we had tools to do this for a while?

Next up, ".moz" sites for the anti-IE "look at our CSS implementation" crowd...

Tuesday, July 12, 2005 9:14:00 AM (Central Standard Time, UTC-06:00)  #    Disclaimer  |  Comments [4]  |  Trackback
 Monday, July 11, 2005

Two weeks without an update seems like a very long time.  I assure you I am still alive.  As I have indicated in the past I am building a new home, and we have been in the process of selling the existing home and moving into an apartment while the new home is built.  About the only non-essential activity I have done in the past two weeks is convert my personal site over to DotNetNuke 3.  Overall I'm pretty happy with DNN but I do have a couple of minor issues.  For each module, there seems to be 8 different Settings links such as "Configuration", "Settings", "Manage".  I installed the forum/blog with no issue but "Gallery" blows up, to be fair these are listed as Beta.  Maybe my photos will just be an iframe containing Flickr anyway.

Until at least this week Friday (7/15/2005) I have to continue to focus only on essential activities.  Explosions, crypto, CompactFramework 2, and other promised goodies have to wait.

Monday, July 11, 2005 9:21:30 AM (Central Standard Time, UTC-06:00)  #    Disclaimer  |  Comments [0]  |  Trackback
 Thursday, June 30, 2005

Milwaukee MVP Sean McCormack posted an article regarding GM's employee discount plan on their cars right now.  He makes the point that if they can make a profit, they've really been "sucking us dry for years"; I agree with him, but let me go further and add my 2 cents.

Worse than "sucking us dry for years" is Sucking us Dry for Years and Still being in financial trouble. If they are able to keep the lights on at these prices, it makes it look (to me anyway) as though they could have ran a lean ship all along and not be where they are now.  In many ways, I blame this on the "Executive Caste" that has evolved in this country.  Executive compensation in many of our largest companies has never been more decoupled from their companies' performance.  (At least someone is achieving a high degree of decoupling...) Money magazine has a regular special on this unexplainable and purely American phenomenon.  My favorite example from Money is a couple of years old: In a year when the company's revenues plunged 40%, the CEO of Home Depot was awarded a coupe of hundred million dollars in bonus options and cash.  Huh?  What exactly did this individual do that year to deserve more than their normal salary?  The current Ford and GM CEOs are trying to correct many years of their predecessors' carelessness.

Like many issues, I attribute this to "The Population" being uninformed and not caring anyway.  C-level (not sea level) executives have been the subject of Hero-Worship ever since Lee Iacocca "saved" Chysler.  Did people fail to see that this deliverance came in the form of a gift from Uncle Sam of Billions of taxpayer's money?  Can this be in GM's future?  I hope not.  As much as GM is an American icon, I'd rather not pay for it.  Companies need to realize that we may not come to their rescue if they are this careless.  The jobs are important, sure, but then again I'm not a big fan of the UAW either.  I'd better withhold my union comments and stop it here.

Maybe I'll go buy a Saab...

Thursday, June 30, 2005 1:06:15 PM (Central Standard Time, UTC-06:00)  #    Disclaimer  |  Comments [4]  |  Trackback
 Monday, June 27, 2005

My friend Brian Tinkler, acknowledged Sales Ninja and all around good guy introduced me to Stephen Covey, John Maxwell, Brian Tracy,  and other authors who write on the subjects of leadership, effectiveness, productivity, and various other Good Things ™.  One principle many of these people tease out but do not always call by name is the idea of Excellence.  Excellence and commitment to improvement are the notions that keep many people from "getting" things like the 7 Habits.  They try something for a while, its hard, they give up.  The next day at the water cooler: "That self-improvement stuff is crap."

Of all the principles espoused by these authors and others, the notion of Excellence is very much on my mind these days.  Let me explain, starting with a note of humility: I have always thought of myself as "one of the elite" and to be fair I do pretty well.  My increased participation in the the local .NET user group in all of its various forms has put me in front of more and more people.  One thing I've heard many times is "Hey that was a good post/idea/bit of code Damon but you broke XYZ best practice in this part."  The vast majority of the time,  the best practice is something I am aware of.  Be it Lazy coding practice, "I just want to get this post out so people can look at it", or "I just want to make this deadline", one's work is a reflection of one's self and one's values.  Wanting to do well and being able to do well are not the same as doing excellent work consistently and conciously.

This simply won't do.  No one is perfect.  A programmer who always designes the right patterns, with adequate comments, with the proper unit tests, who looked for a tool first, who takes the time to refactor properly, who thinks about something before they start writing it, who creates UML artifacts to represent a complex interaction, who follows every best practice they can think of, who is a "good citizen", this person is a rare individual indeed, but that doesn't mean you should stop working towards it.  I would argue that in all but the most extreme circumstances one's core Habits and even core mindset can be changed.  It takes concious and constant effort, and the ability to face the ugliest parts of yourself and beat it, disallow it from ruling you.  For example: I hate litter.  There are people in the world who throw their McDonald's bag out the window with no concious thought.  Most people have a momentary flash of a Devil on one shoulder and Angel on the other and they allow the dude with the red suit and 6-pack of Ham's to win.   They don't face and defeat the ugly part.

I argue that the fundamental paradox surrounding these bag-tossers is not that they are breaking the rules someone else has laid in front of them, but that they are acting contrary to a value set that they themselves believe in.  Living up to one's own notion of the human experience is, strangely, an Herculean endeavor for most of us.  A commitment to excellence requires one to face down one's bad habits with every single action and to know that a defeat here and there is unavoidable but to let that defeat push you back down the hill, or back to tossing bags, or back to just putting in that one little hack, is the worst sin of all.  It is a terrible burden to know that you are truly capable of living up to your ideals, but it is also liberating and motivating.

Today I did the Right Thing and refactored a complex design rather than add an "if (name.Equals("SkipMe")) " type of line of code.  I came home and played with my daughter for a very long time despite the pile of work waiting for me, I came home and wrote a Bugzilla report rather than send an IM to the programmer, I did the tedious testing that was necessary because only I could do it.  I did not publish a library I've been working on "as is" becaue I have decided the Right Thing is to refactor it to fit an appropriate Provider model Microsoft allows for this type of code in the .NET framework.  I'm taking those shortcuts less and less, improving my research methods, getting more work done, and producing designs I really want to share with people.  No one will believe you can do great things if they've only seen your mediocre work.  You will not believe you can do great work if you keep letting  yourself do mediocre work.  My thanks to the many Excellent people I know, being around you is a benevolent push that reminds me to strive every day for more Excellence in my life.

Monday, June 27, 2005 8:08:29 PM (Central Standard Time, UTC-06:00)  #    Disclaimer  |  Comments [0]  |  Trackback