ASP.NET MVC Server Install

Just tossing this up so I can remember it.

msiexec /i AspNetMvc1.msi /q /l*v .\mvc.log MVC_SERVER_INSTALL="YES"

with 0 Comments

Merge Two Objects into an Anonymous Type (while ignoring some properties)

The other day I ran into this situation and found not only a good solution but also built it up a bit. I thought I would share it.

My situation was this, I needed to combine an object with some additional information, as JSON, and pass it back to the original caller, which happens to be an AJAX call. For this post I'm going to focus on the first part of the situation, combining a concrete object with additional info, I'll address serializing to JSON in a future post.

Lately I've been utilizing Anonymous Types a lot more. In this situation my 'additional information' mentioned above happens to be represented by an Anonymous Type, therefore my first thought was to create something that would take a couple of objects (concrete or anonymous) and merge them into a new anonymous type that I create on the fly, then I could serialize that Anonymous Type to JSON to return. Some of you may be thinking "Wait, you can pass around Anonymous Types, they have method scope!" Actually, yes you can pass them around all you want, the thing is you only get an Object to work with and can only access it's members using Reflection or you can cast that Object back into an Anonymous Type which shares the same signature. Check out this post for more info on this.

So before doing any coding myself I did a quick search to see if anyone else had solved this problem. I stumbled across Mark Miller's post Extending Anonymous Types using Reflection.Emit. Perfect, exactly the direction I was thinking! I tested it out and it worked exactly as expected and is written basically how I was thinking so all is good right? Well, not completely. One thing I wanted from the solution was the ability to ignore some properties from the source objects. Basically think AutoMapper CreateMap / ForMember / option.Ignore functionality while merging two objects into a completely new object created on the fly. If you're wondering why not just use AutoMapper for this, well unfortunately it doesn't work with Anonymous Types, or at least I haven't figured out how to make it (and even if it can the syntax would be pretty clumsy).

In coming up with this solution I looked at the way AutoMapper does it's thing but decided I really didn't want to deal with lambdas in my syntax. I wanted something that was very fluid and simple. So as any TDD'er I started out with a unit test and just started typing the syntax I wanted. Here is what I came up with:

var result =TypeMerger.Ignore(obj1.SomeProperty).Ignore(obj2.AnotherProperty).MergeTypes(obj1, obj2) ;

I thought this was pretty simple and easily showed what the code was doing. The idea here is to use Method Chaining in order to have a smooth syntax. (yes, I've been using JQuery a lot lately and if you're familiar with StructureMap you may recognize the pattern too.) If you're not familiar with the Method Chaining pattern it is more common than you think. Here is Martin Fowler's explanation of the pattern:

"Make modifier methods return the host object so that multiple modifiers can be invoked in a single expression."

Method Chaining is used throughout the JQuery framework as well as in the .NET Framework (i.e. DateTime.Now.AddDays(1);). It's a pretty easy pattern to build into your classes and provide fluid interaction with your classes.

For my situation I am dealing with a static class (TypeMerger), which makes the Method Chaining setup a little bit more complex but not much. In the most basic form Method Chaining will return the object for which the call was made on. This doesn't work for Static classes so we have to use an Expression Builder. So what is an Expression Builder? I basically think of it as a buddy class for the target object that will be used to complete the Method Chaining process. For this situation that means keeping track of the items we want to ignore when we merge two types.

Here is the companion class that handles the details of tracking the properties we want to ignore. Introducing the TypeMergerPolicy class:

using System;
using System.Collections;
using System.Collections.Generic;

namespace Finley.Common
{
     public class TypeMergerPolicy
     {

          private IList ignored;

          public IList Ignored
          {
                 get { return this.ignored; }
          }

          public TypeMergerPolicy(IList ignored)
          {
                
this.ignored = ignored;
          }

          public TypeMergerPolicy(object ignoreValue)
          {
                
ignored = new List<object>();
                ignored.Add(ignoreValue);
          }

          public TypeMergerPolicy Ignore(object value)
          {
                
this.ignored.Add(value);
                
return this;
          }

          public Object MergeTypes(Object values1, Object values2)
          {
                
return TypeMerger.MergeTypes(values1, values2, this);
          }
     }
}

Looks pretty simple but what's going on here? The TypeMergerPolicy class has an internal List of objects which store the reference to the items to exclude while merging. The MergeTypes method at the end is what allows us to stop the chain. This method simply calls MergeTypes on the Static class TypeMerger passing itself as an argument.

In order to make this all work of course I had to modify the original TypeMerger class to use the new TypeMergerPolicy class. Here are the changes I had to make:

  • Add a private static TypeMergerPolicy object to store the items to ignore.
  • Overload the constructor to take a TypeMergerPolicy class (used by the TypeMergerPolicy.MergeTypes method).
  • Modify a few of the methods to use the TypeMergerPolicy class to exclude properties.
  • And finally the Ignore method that kicks off the Method Chaining.

Here are the modifications I made to the TypeMerger Class:

private static TypeMergerPolicy typeMergerPolicy = null;

public static Object MergeTypes(Object values1, Object values2, TypeMergerPolicy policy)
{    
     typeMergerPolicy = policy;
     return MergeTypes(values1, values2);
}


private static Object[] MergeValues(Object values1, Object values2)
{
     PropertyDescriptorCollection pdc1 = TypeDescriptor.GetProperties(values1);
     PropertyDescriptorCollection pdc2 = TypeDescriptor.GetProperties(values2);

     List<Object> values = new List<Object>();

     for (int i = 0; i < pdc1.Count; i++) {
          if (typeMergerPolicy == null || !typeMergerPolicy.Ignored.Contains(pdc1[i].GetValue(values1)))
                values.Add(pdc1[i].GetValue(values1));
      }

     for (int i = 0; i < pdc2.Count; i++) {
          if (typeMergerPolicy == null || !typeMergerPolicy.Ignored.Contains(pdc2[i].GetValue(values2)))
                values.Add(pdc2[i].GetValue(values2));
     }

     return values.ToArray();
}

private static PropertyDescriptor[] GetProperties(Object values1, Object values2)
{

     //dynamic list to hold merged list of properties
     List<PropertyDescriptor> properties = new List<PropertyDescriptor>();

     //get the properties from both objects
     PropertyDescriptorCollection pdc1 = TypeDescriptor.GetProperties(values1);
     PropertyDescriptorCollection pdc2 = TypeDescriptor.GetProperties(values2);

     //add properties from values1
     for (int i = 0; i < pdc1.Count; i++) {
          if (typeMergerPolicy == null || !typeMergerPolicy.Ignored.Contains(pdc1[i].GetValue(values1)))
                properties.Add(pdc1[i]);
     }

     //add properties from values2
     for (int i = 0; i < pdc2.Count; i++) {
          if (typeMergerPolicy == null || !typeMergerPolicy.Ignored.Contains(pdc2[i].GetValue(values2)))
                properties.Add(pdc2[i]);
     }

     //return array
     return properties.ToArray();
}

public static TypeMergerPolicy Ignore(object value)
{
     return new TypeMergerPolicy(value);
}

That's it! As you can see the TypeMerger.Ignore method kicks off the process and the TypeMergerPolicy.MergeTypes method finishes it off. Below is the full source with a simple unit test included. Please feel free to let me know what you think of the approach.

TypeMerger.zip

Cheers,
Kyle

with 0 Comments

Thanks Windows Autmatic Update for wasting my morning!

So I come into work this morning and fire up my dev virtual machine and am quickly hit with a pegged out CPU and mostly unresponsive applications. I pull up Task Manager to see what is up. Show all processes and notice msiexec and TrustedInstaller taking up the bulk of the cpu. I then realize I never turned off Automatic Update on this new dev machine. I look further down the list and notice vs90sp1-kb971092-x86.exe. Quick search to see what this new patch is and I'm less than happy when I see.

So WTF is vs90sp1-kb971092-x86.exe? It's the installer for the Visual Studio 2008 Service Pack 1 ATL Security Update. I'm a little unsure why this patch is installing now since I did an update of everything about a month ago (which was still after it was released). What kills me about this one is the sheer size of it. The patch is 365.2 megs. WTF guys? An almost 400 meg 'Security Update'? Really? WTF did you forget to add that requires a patch that is half the size of the VS install itself?!?! That on top of the Ridiculous patching system VS has you're left with an update that was pushed on you (unless you have automatic update set to Not install automatically [which I usually do]) that takes an absurd amount of space and processing just to install.

What's even better about all this is that if this patch fails during install because of lack of disk space it will just continue to try to install it over and over again. Which can easily happen since this update can require around 3.7GB for Windows Update to do it's thing. That's right folks 3.7 Gigs!  This according to Heath Stewart's post on this patch. Again WTF guys?  Just because storage (RAM and physical) is getting cheaper doesn't mean you get to completely Rape my computer while doing things 'behind the scenes'.

So yeah, my bad for not having Automatic Updates turned off but seriously guys this whole patching system VS uses completely Sucks!!! If MS doesn't get their *** working better I'm going to start looking at doing .NET development in another IDE. And if you think I'm kidding you don't know me very well. I'm beginning to wonder when I'm going to say to hell with all of this MS garbage and just do everything in Eclipse on my Mac running under Mono. I'm definitely going to give VS2k10 a go but if they *** that one up too I'm probably switching.

with 0 Comments

Build + Run MSpec

I hope to put together a full post on MSpec but until then check out Rob Conery's Make BDD your BFF post (which I mostly agree with).

If you're too lazy to click on Rob's post and still reading basically MSpec is Aaron Jensen's twist on a BDD based testing framework that rides on top of a more full featured framework such as NUnit or xUnit. Some are calling this approach Context Specification over pure BDD as Dan North intended it but not going to go into my thoughts on all that here. That's the future post which I promise is coming...

So WTF is this post all about then you may ask. Well if you haven't figured it out already it's a little helper goo you can toss in the VS mix to speed up life and reduce frustrations while using MSpec. Let me back up a little and explain why I did this. MSpec comes with the ability to tie TestDriven.net in as the test runner for all your specs, which is a great thing fore sure! But as all of you know that use TD.net it isn't exactly the snappiest thing in the world. Aaron and crew included another test runner for MSpec which is considerably faster. The problem I kept having (and Rob Conery as well if you look back at his Kona Sreencast) was forgetting to build the project after making changes and then running the MSpec runner. What happens? Nothing, your old code runs. The solution didn't build so what would you expect.

So what's the solution? I created a Macro that kicks off a solution build and uses the build events to then kick off the external command associated with the MSPec runner. First off you need to have MSpec setup as an external task for this to work (follow the steps on Rob's post above). Once you do that add in the following macro goodness.

Drop this procedure in any of your personal macro modules (mind is called BDD)

Public runMSpecOnComplete As Boolean = False

Sub BuildAndRunMSpecForFocusedProject()

    DTE.ExecuteCommand("Build.BuildSolution")
    runMSpecOnComplete = True

End Sub

Add the following sub to the EnvirontmentEvents module included under MyMacros. (Note: BDD is the module the above code is located in)

Private Sub BuildEvents_OnBuildDone(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildDone

     If (BDD.runMSpecOnComplete) Then
       BDD.runMSpecOnComplete = False
       DTE.ExecuteCommand("Tools.ExternalCommand1") 'Where ExternalCommand1 matches the MSPec runner command
       DTE.Windows.Item(Constants.vsWindowKindOutput).Activate()
     End If

End Sub

The last thing I do for more convenience is to associate the Macro with a toolbar button. If you're not sure how to do this just right click on any toolbar in the menus and select customize, on the Commands tab select Macros under Categories list, under the commands listing find the Macro you added the above code to, drag it to a location on the toolbar and drop. Once the command is there you can change the text and the icon. I personally put mine right next to the Play button and use the big Red Diamond. Now when I click on the button my solution builds and my Specs run.

Enjoy!

with 0 Comments

What I've been up to lately...

So it's been a while since I've really focused on this blog. Hopefully that will change as my work situation has changed in the last few months. Earlier this year I was released from the consulting firm I had worked at for almost 5 years. Losing my job was not that surprising and ultimately a good thing. I was horribly unhappy at the company and everyone knew it. I have to say I'm much happier now. So where am I and what am I up to? Well first off I'm still living in Boston. And now I'm working in Boston as well. After many months of searching for the right job (I should post on this, like an unemployment retrospective maybe...) I took a position with a local .com company who has been working in the area for over 20 years (previously all phone based). I've joined a small team which will be taking the companies systems to the next level in order to expand and improve our service.

I joined the company almost 2 months ago and came onboard at the tail end of a long running site rebranding project with the addition of a few new features and product offerings. There were definitely some long nights at first but coming from consulting it was nothing really new, I'm used to being thrown to the fire from start of a project (especially with my old company...). Despite the mountain of work in front of us (and lack of any real system architecture or a single unit test in the production code) we released the site successfully. There is still much work to be done but we have received positive feedback (and yes some negative).

One of the things I'm very excited about with the new gig (other than working on a legit, established, profitable, eCommerce) is the opportunity to bring Agile development practices to the team. I'm working under the Director of IT and he and I share many of the same opinions on System Architecture and Development Methodology practices. I have essentially been given the opportunity to be the Agile Evangelist within the team. I will bring many things to the table and we will all decide what works for us. Here is a list of things we are either currently doing, areas I'll be focusing on, or things we will be moving to very soon. Expect to see blog posts in these areas hopefully very soon and continuing as we grow.

  • BDD using MSPec - ?Context Specification maybe? Future blog post to discuss this more
  • User Stories Based Development
  • SEO Concerns
  • TeamCity - Finally!!
  • Subversion - Not sold on it yet
  • JQuery - Lots of it and Happy about it!

I'm very excited about the new direction and the knowledge I've already gained. I hope to keep the old blog a little more updated and provide more content in these as well as other areas related to custom dev work.

Cheers,
Kyle

with 0 Comments

Merlin Mann - "Toward Patterns for Creativity"

In case you haven't seen this I highly recommend watching it. Merlin Mann is the founder of 43folders.com and IMO has a good grasp on this being creative thing.

Original Video

with 0 Comments

Mix 09 Presentation Videos and Slides

If you're like me and couldn't attend the Mix 09 conference you can still check out the presentations on your own.  The Mix crew has put up a list of all the presentations with the video and slides. 

http://videos.visitmix.com/MIX09/All

Thanks guys!

with 0 Comments

Slipstream Visual Studio 2008 Service Pack 1

During the rebuild of my development environment I wanted to use the same trick I used before to reduce the size of my chained differenced VHD files.  (For info on my setup check out Andrew Connell's HOWTO: Use Virtual PC's Differencing Disks to your Advantage post.)  I haven't had time to dive into this so I did a quick search to see if there would be any issues, unfortunately there is.

According to Heath Stewart slipstreaming Visual Studio 2008 sp1 is not supported except for Active Directory deployments.  Heath's recommendation is to perform an chained unattended install of VS 2k8 and SP1. If you're interested in this approach here is info on how to do this with VS 2k5, steps for VS 2k8 should be very similar.  This would allow you to silently install both Visual Studio and sp1 on a machine.  To address the disk space requirements for installing sp1 Heath recommends you disable the patch baseline cache using the MaxPatchCacheSize policy.  No doubt this option will work but it isn't exactly what I wanted.  Also keep in mind there could be issues using this approach, if you need to repair or uninstall a patch you will be prompted for the source files, which you won't have. Since the forum post implied that an AD deployment of a slipstreamed install is supported I assumed this would still be possible so I wanted to give it a go.

As a starting point I looked back at Richard Rudek's post on slipstreaming Visual Studio 2005 SP1.  As I expected the steps are just about the same but I ran into a little bit of a snag.  Creating the Administrative installation of VS was no problem.  When I applied the service pack to the admin install I received the following error.

 

image

 

A quick Google search led me to the Bug.  Unfortunately the status for the bug is Closed (Won't Fix).  I searched the install folder for the WcfTestClient.chm file and found it in a different folder than where the service pack installer expected it to be, instead the file was in the Program Files\Microsoft Visual Studio 9.0\Common7\1033 folder.  To get around the error I simply copied the WcfTestClient.chm file from the Program Files\Microsoft Visual Studio 9.0\Common7\1033 folder to the Program Files\Microsoft Visual Studio 9.0\Common7\IDE folder and reran the service pack installer.  This time it ran with no errors!  Next finished out the steps in Richard's post (Step 4).  There were much more than 7 files prompted for overwriting, I didn't count the files but just hit N each time I was prompted.  Once the files finished copying I installed the slipstreamed Visual Studio installation on a fresh vm and it installed with no errors.  I checked the SP level of Visual Studio and it showed to be sp1.

Here ere are the commands I ran for each step:

Step 1
msiexec.exe /a E:\vs_setup.msi TARGETDIR=F:\VS2k8 /L*vx F:\VS2k8\vsinstall.log

(Note: Copy WcfTestClient.chm file before running step 2)

Step 2
VS90sp1-KB945140-ENU.exe /extract F:\VS2k8SP1\Extracted

Step 3
msiexec.exe /a F:\VS2k8\vs_setup.msi /p F:\VS2k8SP1\Extracted\VS90sp1-KB945140-X86-ENU.msp /L*vx F:\VS2k8\patch.log

Step 4
xcopy E: /h /i /r /s /exclude:exclude.txt

Once completed the slipstreamed installation folder is 4,490,358,390 bytes and contains 14,966 files with 1,543 folders.  

Hope this helps.

Cheers,
Kyle

with 9 Comments

Resize VHD and Partition

Because of a little downtime I'm reworking my development environment.  For years I've been using Virtual PC and a differenced disk setup based on Andrew Connell's post.  The setup is great for spinning up a new development environment for new clients or for just an isolated development / testing environment.

I primarily use Windows 2003 R2 as my development OS.  The cool thing about this setup is I haven't had to install the OS for over 3 years!  The problem I've had though is that when I set this up I set the dynamic disk size for the Base VHD to 16GB.  This only becomes a problem when I use up the 16 gigs and start to run out of disk space.  There are several tricks you use to deal with this, the simplest is to create a separate VHD to install applications on, this way the differenced disk isn't used and space isn't eaten up on your VPC's C: drive.

So getting to the point...  In reworking my development environment I want to do a couple of things: 

  1. Install latest OS patches
  2. Increase base VHD size

The first one is simple. The second one might seem a little tricky but luckily it's not. 

I searched around and found the VHD Resizer utility from VMTooklit.com.  The tool allows you to select a VHD and increase the physical size of the disk.  I gave it a go and it worked like a charm.  Only one thing I didn't think about, it did increase the size of the VHD but not the partition on the VHD.  So basically this just gave me unallocated space on the disk.  Not what I wanted but I can work with this.  Time to put on my old sys admin hat.  Now I just needed to extend the primary partition to fill up the unallocated space. 

Simplest way to do this is to use the built in diskpart.exe utility.  Only thing is you can't use it on a disk that is running.  No problem, just mount the VHD as a disk in another Virtual Machine and you're good to go.  Also just ask a tip this is a good way to defrag before precompacting the disk (use the -SetDisks option for precompact.exe to specify which disk to precompact).

After going through the steps I'm ready to start my chain of VHDs and now my base image is up to date, 50GB, and only 200MB larger on the disk. :)

Cheers,
Kyle

with 0 Comments

Convert Office Files to 2k7 Format from Explorer Context Menu

A few months ago I thought of this.  I wanted an explorer add-in that would allow me to right click on an Office 2003 or earlier format document and convert it to an Office 2007 format.  I know you can simply open the file in its associated Office 2007 application and save as the newer format but this seemed like too much work for me.  I typically think of this situation when I go to email a file that is in the older format and think to myself "Gee if it was a 2k7 file it would be smaller."

I started looking around and found that you could do this from code but there are also tools that Microsoft have provided to automate the bulk conversion of legacy Office files to the newer format.  Naturally I wanted to leverage the work they had already done if possible.

My early searches led me to Eric White's post Bulk Convert DOC to DOCX.  This post pointed me to the Microsoft Office Migration Planning Manager.  The OMPM consists of a number of things including utilities for bulk file conversion.  The one of interest to me was the Office File Converter utility (OFC.exe)  This tool seems to be great for bulk converting office files to the new 2007 format but that really isn't what I wanted to do.

Fortunately I stumbled upon something posted on the OMPM contributions page that was promising.  It is possible to use the Office Compatibility Pack directly to convert legacy Office files individually to the new Office 2007 Open XML format.  In the Office Compatibility Pack there are individual utilities that convert files from the old format to the new format.  Apparently the OMPM actually calls these executables directly from the OFC.exe utility.

Here are the individual commands for converting each type of file:

Word

"C:\Program Files\Microsoft Office\Office12\wordconv.exe" -oice -nme <input file> <output file>

Excel

"C:\Program Files\Microsoft Office\Office12\excelcnv.exe" -oice <input file> <output file>

PowerPoint

"C:\Program Files\Microsoft Office\Office12\ppcnvcom.exe" -oice <input file> <output file>

 

Once I knew there was a way to convert files individually it was just a matter of adding it as an Action for each type of file.  The trick was passing the correct parameters to the executables.  I put together a little batch file that would allow me to pass in a few parameters and build the correct paths.  Save this file in the Windows directory.

ConvertO2k3to2k7.bat 

"C:\Program Files\Microsoft Office\Office12\%2" -oice %3 %1 "%~$PATH:1x"

 

The batch file takes three parameters.  The full path for the original Office 2k3 file, the executable to use for converting the file, and the third is the extra command line argument used for the wordconv.exe utility.  (This is a little kludgy but it works.)

Again make sure you save this file in the Windows directory.

Now for each type of file (doc, xls, and ppt) I add a new Action.  Here are the steps to create create the action for a Word File Type:

1. In Explorer choose Tools -> Folder Options -> File Types

2. Select the DOC File Type and click Advanced

3. From the Edit File Type dialogue create a New Action

4. For the Action type Convert to docx

5. For the Application used to perform action type ConvertO2k3To2k7.bat "%1" wordconv.exe -nme

The first parameter is the full file path for the file to perform the action on, which is passed as the first parameter to the Action.  The second parameter is the executable to use for the conversation, in this case wordconv.exe because we are working with a DOC file type.  The third is the extra command argument required by the wordconv.exe utility.  You will not need this for the ppt or xls utilities.

Don't worry about selecting Use DDE, it will get selected automatically for you.  Not really sure why but it doesn't seem to matter.

6. Click OK to save the action. You will see the new 'Convert to docx' item in the Actions list as such:

image

7. Click OK on the Edit File Type dialogue and then Close on the Folder Options dialogue.

 

Once you have performed all the steps you will now see a 'Convert to docx' option in the context menu when you right click on a .doc file. After selecting the option a cmd window will appear while the file is being converted.

image

It is possible to select multiple Office files of the same type and convert all of the selected items, however this spawns separate cmd windows for each file.  I have found this doesn't work after selecting a large number of files.  This option really only works best for single file conversion on the fly which is all I wanted if for.

Hope this is helpful for someone out there.  If there are any errors in the steps please feel free to ask questions.

 

Cheers,
Kyle

with 2 Comments

A Year Without Blogging

I just posted a video and I realized it's been almost a full year since my last blog post.  I would say I'm disappointed in myself for not posting in the last year but I'm not.  The last year has been an interesting one.  In the last year I have lived and learned a lot.  So what have I been up to you may ask (assuming there are people out there I don't know that follow this blog).  First let me go back a bit and talk about what led up to last year.

A few years back I received some unfortunate news that a friend from high school who I cared a great deal about but have been out of touch with for many years was in a car wreck and is now paralyzed from the waist down.  Other than this being a terrible thing for her it made me realize life is short, sometimes too short, and fragile.  This made me think of some things I had wanted to do with my life that I felt I had missed out on, so I decided why not just do them. 

This realization sparked a 4-Hour Workweek style mini retirement break.  I came up with this idea in the Fall of 2006 and I did not even hear about this book until I was almost done with my trip, but none the less I did basically what Tim recommends.  I took an extended leave from work, traveled on the cheap, and enjoy life for a bit.  If you haven't checked out his book I recommend it if only just for the time saving recommendations he provides.

My original plan for the time off was simple but as things usually go my plans changed over time and what came to be was way beyond anything I could have come up with at first.  My original plan was to take the majority of the ski season off and live and work in the mountains in Colorado teaching snowboarding and snowkiting as much as possible.  I began saving up as much money as I could with the intention of taking a 4 month leave of absence from work.  As 2007 ws drawing to a close I realized my project at work was not going to wrap up as I had hoped in December and would run long into January.  This combined with  few other things was going to force me to delay the start of my trip until most likely February.  As any good Agile thinker I adapted my schedule and plans to fit what I had to work with.  Long story short here is the ultimate trip I came up with.

  • 1 Week driving from Boston to Colorado with a stop off in Chicago
  • 6 Weeks in Summit County, CO (Breckenridge / Keystone / Arapahoe Basin area)
  • 2 Weeks at The Reef in St. Lucia
  • Wind & Water Open, Corpus Christie, TX
  • 6 Week Road Trip from South Padre Island, TX around the Gulf Coast, Florida, and up the East Coast back to Boston.

What originally started out to be a snowboard / snowkite trip turned into the ultimate kiteboarding adventure.  I realized I had the opportunity to attempt to kiteboard every state that touches ocean between Texas and Maine (18 states).  To my understanding this has never been done, and still has not done, I'm missing 4 states, but will finish the journey as soon as the water warms up.

On the road trip I drove my (new to me) 2000 Jeep Wrangler and camped the majority of the coastal road trip.  On the coastal part of the trip I made it to around 25 different beaches in 13 different states.  Some of the highlights included South Padre Island (camping on the beach), Couch Surfing in Galveston (before Ike), Gulfport, MS (Katrina really F-d that place up), Charleston, SC (Very cool city and great kite spot), Outer Banks (kiting of course but also the random Jam Session I walked in on and played for a few hours), Washington D.C. (landboarding the Washington Monument Park), Random downwinder in Myrtle Beach, 2 am breakfast in the Hilton Bayfront Parking Lot in St. Petersburg, FL (long story, man that french toast was good though), and of course every single day in St. Lucia at The Reef.  There are so many great memories, too many to list here.  I did blog about it here though if anyone is really that interested.

My trip ended in late June and I was back to work in early July.  I wish I could say work has been phenomenal since I got back but that is hardly the case.  All I'll say is I have a fundamental difference of opinion on what type of work I should be doing and what my company seems to focus on.  Which is fine, everyone has differences of opinions.  Recently I have been able to get back to .NET work and starting to implement Agile concepts throughout the business organization at my current client.  I am working with one of the client resources to develop a sort of Agile Methodology in the Sales / Service Industry.  I hope to have some exciting things to blog about if we can make this stick.  The client desperately needs some of the techniques we are going to implement.  The trick will be keeping my PM from knowing what is going on (very very very long story), he hasn't stepped foot on site in the 4 months I've been at the client so I may be able to make this happen.  I guess this is a variation on Robert Martin's Tell the customer nothing, and use agile methods internally approach.  It's just an unfortunate way to handle things.

Well to close this out I'm looking forward to this year.  There is a lot going on in my life (good, bad, exciting, etc.) and I believe this year is going to be a good one.  And I am going to commit to maintaining this blog more actively than I have done in the past.

Cheers,
Kyle

with 0 Comments

Agile Retrospectives: Making Good Teams Great!

I stumbled upon this the other day. 
Presentation by Diana Larsen & Esther Derby at Google.

Nice of them to put this up. 

Original

with 0 Comments

Export Visio to XAML

Saveen Reddy has posted a new version of his Export Visio to XAML tool on CodePlex.  This tool is an add-in for Visio 2007 that exports the document to XAML for rendering with WPF.  The tool uses Thierry Bouquain's svg to xaml converter.

I haven't tried it out yet but this could come in handy. 

with 0 Comments

Slightly Odd Terms of Service Item

Today I went to view a webcast from Microsoft and realized I haven't watched one since using my new computer (I really should blog on that one. hah).  I had to install the Live Meeting client, no big deal.  While waiting for the download to finish I noticed one of the bullets in the terms of service.  As with most of Microsoft's free stuff it included the standard "As Is" notice.  But this one had an addition to the normal stuff.  Here is the bullet full wording:

 

"The software is licensed "AS IS" without any warranty. You can recover from Microsoft only direct damages up to the greater of the amount you paid for the software/service or one dollar (US $1.00)."

 

So what's up with the $1.00 thing?  If I could actually get $1.00 for every item I've downloaded from Microsoft over the years I bet that would actually add up to a pretty decent amount of cash. Hmm.  I might have to keep this in mind for Christmas money next year. :)

with 1 Comments

Done-Done

“Done-done, as a client defines it, means that the development team is done with the feature (specified, designed, coded, unit tested), and the customer is done with the feature (acceptance tested).” source

 

One of my favorite Agile terms.  And always a good state for a feature to be in.

with 0 Comments