Saturday, May 06, 2006

I am learning how to use SubVersion at the moment.  I am a very long time VSS user and have finally been convinced (by poor behavior from Visual Source Safe, not its opponents) that it is not adequate for source control.

While attempting to migrate from VSS bindings in Visual Studio 2005*, I tried to "add solution to repository" but I navigated to the wrong place.  Fortunately, nothing happens on the server until you commit.  Win #1 for SubVersion. 

( *Visual Studio 2005 is a fantastic product, just to be impartial )

Unfortunately, my folder was now a working directory for the root of my source control repository.  After failing to find easy instruction as to how I can "undo" my improper repository binding, I came to the assumption that deleting the magic _svn directory might cause subversion to forget what I had done.  I wouldn't recommend this in the midst of a project under source control but if you've added a project wrong and not yet commited, I see no risk.  So...

  1. Use windows search (or your favorite desktop search) to recursively locate all directories named "_svn" from the root of the windows directory you would like to disassociate from subVersion. 
  2. When search returns with your list, delete every _svn directory shown.  Make sure you are locating hidden files, these directories are marked hidden.

It worked!  The little icons all disappeard from the folders and I could open the project in Visual Studio with no issues. 

Time to try again!

I entered the url to the correct directory in my subVersion repository and checked the "create sub directory" check box.

An error!  It can't find the folder it created.  Repeat step1.  I think I'll try another approach...  more to come

5/6/2006 7:12:09 PM (GMT Standard Time, UTC+00:00)  #    Comments [3]  |  Trackback
Friday, March 10, 2006

First I will point out that I've been tellin' this cat to blog for a year now!  I've tried to enlighten him on the potential Google-Juice that an active blogger can generate.  However, like any organic farmer will proclaim, "sometimes you just have to figure things out for yourself the hard way."

Slim is an SEO Guru who handles all of our Search Engine Optimization initiatives.  He has managed to create a culture where designing for both index-ability and usability are key concerns.  We've tried to trick the Google bots, gotten slapped, tried again, got smacked again...  Finally, everyone looks to him to tell us how to structure our sites so that people using the internet can find us without purchasing the traffic click by click.  Novel idea, eh?

3/10/2006 5:34:16 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback

It occurred to me that everyone has their own way to get to the same destination.  In programming, a professional may read books, they may go to conferences, they might merely use the platform documentation or they might dissect the platform piece by piece to decompose its function and learn how  it worksfrom the inside out.  They might even rewrite it just to figure it out.

I have one friend who told me he doesn't learn from books.  He finds they don't suit his pace of things.  He is one of the most capable, brightest individuals I know and he'll figure things out through experimentation and analysis.  Another peer I've worked with spends his time taking things apart just to learn how they work.  Then he rewrites them and calls them his frameworks.  While he is intelligent, I think he's terribly misguided because his goal is to prove how much he knows about things and the outcome is merely that he knows alot about things but produces nothing truly useful.  Then there are the readers.  I am a reader.  I read so many things that I hardly ever finish a book in entirety and I'm usually reading half a dozen at once.  Sometimes I have a dozen books on to-be-read-queue.  Then there are those people that find the process of staying on the leading edge costly and  prefer to wait for the inevitable trickle of  important information to find its way to them. 

What if all these people could benefit from all these activities?  What if each person's tower of knowledge was a week or two from being accessible every other person?  What if the person who waits for information could be the vehicle to deliver the important things that the dissector learned to the person who reads too much?  What if all anyone did all day was talk about the new things they've learned?  How might that affect the pace of growth in a group?  All these questions are on my mind related to Pair Programming.  I was not a believer until we had Richard Sheirdan of the Menlo Institute give us a one day fire hose on Agile methodology.  He is no dabbler in a few Agile ideas, he is a hard extremist on the agile front.  He's also speaking from real world experience, a lot of it.  He is a huge proponent of Pair Programming.  I'm not talking about height (though he is incredibly tall).  He made a point to say, "I will say a few enthusiastic words in favor of pair programming and then I will drop the subject."  But then he went on to mention it a dozen more times.  We started counting when our CTO took note that he'd brought it up the required 6 times to internalize the idea.  The point, in short, is that after enough a raving about the subject, I stopped mentally blocking the possibility that it has merit in my world.  I believe I am not the only one.  ...and now these questions.

If every two weeks, a person worked with a different partner to accomplish their goals, would the knowledge of each osmotically transfer to the other?  Would that information continue to travel through the whole group?  Would the team as a whole grow more quickly?  Would their progress slow or increase?  Would the cost of sharing a keyboard repay in both quality and efficiency?

When I have a question about technology, the capabilities and cost of implementing, I do a controlled experiment.  I'll research a little, try a small scale implementation and evaluate my results.  I'll report the results of our small scale pair programming experiments.

3/10/2006 1:42:15 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Thursday, May 26, 2005

I noticed something interesting today…

 

While reviewing remaining defects to be corrected in our web application, a programmer’s name came up several times.  Let’s call him Cramer Joe.  Frequently, developers explain the source of the defects as the result of the bad practices and lack of quality that Cramer Joe employed when he modified or wrote code.  Cramer Joe was with us for a while, maybe two years.  He was instrumental in writing a few web applications and responsible for several major rewrites to the same.  Most of us disagree with his methodologies and programming style.  However, he wrote a lot of code.  He produced and delivered a lot of product.  That product made the company money.  His value, when looked at analytically, was very high, even if his code is the bane of our maintenance existence.  He was not very well respected when he was with us.  He had a serious attitude problem.  In fact, he had personality conflicts with several other employees.  He finally left because he felt he wasn’t respected.  For the most part, and completely due to his own behavior, he was right.

 

Another programmer, let’s call him Kareem, is never mentioned.  He was highly respected by many.  When he started, I had high hopes for him.  He is very bright.  So bright, in fact, that he discovered that the best way to never fail was to never do anything.  Delay, stall, make excuses, but never deliver.  So, shortly after he started to become an effective programmer (it was his first programming gig), he became the laziest, least reliable, most unproductive employee I have ever seen.  Well, I take that back: there was Trenton, the SEO Optimization specialist that surfed gay porn all day and generated fake reports, but he doesn’t really count.  He was just a shyster.

 

We never, ever bring up Kareem in conversation.  We all liked him well enough.  He produced nothing in several years of employment.  He was given raises and promotions.  Then he left to pursue other things.  His good name is preserved.  Actually, now that I think of it, he legally changed his name right before he left. I wonder if he’s a terrorist?

 

Cramer Joe, on the other hand, we speak of with disdain, and often.  He left behind his legacy in potentially hundreds of thousand of lines of questionable code.  The code works but we hate having to modify or troubleshoot it.  But it works!  It made a lot of money for our company.  Yet, all we can think of is what a bastard he was when he was with us.  His code, therefore, is like a rodent in the grass.  We chase it with the lawn mower and try to eradicate it wherever we encounter it.

 

The moral of the story is:  If you don’t want people to bad-mouth you when you are gone, be nice.  If you want people to remember you, be productive – and leave something behind.  If you want it to last, make it good.

5/26/2005 3:05:43 PM (GMT Standard Time, UTC+00:00)  #    Comments [2]  |  Trackback
Tuesday, February 08, 2005

I've been building using nAnt for about two years now.  each project in our enterprise has a nant build file.  This file expects all dependencies to be available either in the root or the bin directory, whichever is appropriate.

I built a custom build utility application that manages inter-project dependencies and the build process.  It has served us well.  At least I think it has.

I want to move in the direction of more iterative development and integration.  Today, I took a first step.  I set up Cruise Control to operate on our enterprise projects in VSS. 

First I had to create a build file that would set up the entire suite from visual source safe.  This isn't that hard to do when dealing with the latest files.  So I created one target for each project, specifying where to get the source files from. 

Then I worked from the most stable project (with the least dependencies and the most consumers) to the project with the most dependencies, setting up the call to the build file in each source directory and then the copy of the next project's dependencies into its source directory (or bin, where appropriate).

It was enlightening to go through this exercise!  I found that each project, almost without exception, built on top of its child projects dependencies.  Example: (in this case, project refers to source and assembly refers to compiled result)  Project B depends on Project A.  Project C depends on project B and A.  However, project B contains the result of Project A, as it is required for project B's assembly to operate.  Some people may not want to keep a copy of Assembly A with Project B's build result but I think it makes sense.  That way, you can use Assembly (or project) B without worrying much about Project A as long as you get Assembly A when you get the artifacts of Project B.   Therefore, you do not need to explicitly manage Project C's dependency to Project A if you get the related assemblies for Project B.  When its time to set up the dependencies for Project C, just get the compilation result of Project B.

There were a few 3rd party dependencies that needed to be explicitly retrieved from VSS but the final build file was manageable and logical.

Once the build file was set up, I moved on to Cruise Control integration.  I had set it up previously with a small test project.  This helped a lot.  It took the complexity described above out of the equation.  I had only defined one project, previously.  I replaced the test VSS path with the real one and was in business, almost.  First, the change monitor in the sourcecontrol plugin gets the files to a local directory.  I am curious as to whether I can use the same directory for the monitor and the build.  I think its likely that the above mentioned dependency management may corrupt the modification monitor process.  I'll experiment with that and report back.  Second, I have all these inter dependent projects as part of an enterprise solution.  I don't want to monitor and build them independently, I want to integrate them!  Continuously.  That's the point, right?!  The latest version may handle this better, the version I used is out of date. 

So that is the experience so far.  I plan to put together a step by step for those who dare to venture down this road.

Bottom line?  if changes are integrated sooner, problems are caught earlier and resolved immediately.  Developers have, fresh in their mind, the changes that need to be assessed.  If tests can be introduced a little at a time, the application can slowly become more stable and dependable.  If development can be reviewed in a stable development deployment without developer interruption, sponsors and managers can have provide better feedback and more contribution to the overall development effort.  Its a communication tool.  It communicates how things are going.  I like that, it makes me feel comfy.

2/8/2005 11:20:26 PM (GMT Standard Time, UTC+00:00)  #    Comments [6]  |  Trackback
Tuesday, September 14, 2004
Assumptions are only useful once they are verified or negated. A story about a project experience that nearly caused mass suicide.
9/14/2004 5:04:59 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Wednesday, August 11, 2004
After two years searching for a reliable way to call VSS via the cammandline executable from within a c# app, I stumbled upon it.
.Net | C# | Programming
8/11/2004 8:26:27 PM (GMT Standard Time, UTC+00:00)  #    Comments [1]  |  Trackback
Wednesday, August 04, 2004
Setting up cruise control .net is no walk in the park! This article is a HUGE help to get started, particularly for the majority of us running sourcesafe (VSS). I'll post my own experiences as well
Programming | .Net | C# | NAnt
8/4/2004 8:36:40 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Tuesday, July 20, 2004
I created a javascript version of the ever-popular c# String.Format. enjoy
Programming | .Net | C#
7/20/2004 12:11:29 AM (GMT Standard Time, UTC+00:00)  #    Comments [3]  |  Trackback
Tuesday, July 13, 2004

today I was going through emails and found many hits from yahoo for my Acura rearview mirror problem, my long hair (which has been recently sacrificed) and my entry on trapping the enter key.  BTW, if you want to trap the enter key in ASP.net, feel free to use this little utility, complete with instructions.

Recently, I tried to give referral to my favorite Volvo Service center in Atlanta.  They didn't appear on Google.  I gave them all sorts of pointers as to how to fix their site.  They have great info on Volvo Service and Information here.  Unfortunately, everything is sub-optimal images and the whole thing is buried in a frameset behind  a useless splash page full of keyword spam....   No wonder they don't show up.  Yet, they are number one on Yahoo!  They also have a paid listing on Yahoo.  Not really a surprise there either.  I stopped using Yahoo a long time ago when Google blew them away for valid, useful content.

I get quite a few referrals from Yahoo searches.  Many of the topics show my postings very highly ranked.  I was amazed to find my trap the enter key    number 1.  Then I went to Google and its number 4!  That aint bad.  Not bad at all. 

In this new world of information at your fingertips, the ease at which knowledge can be shared and found is amazing.  I don't think most people are really paying much attention.  Its just commonplace now.  In ten years, people will be researching the history of the weblog, the advent of RDD and how XML changed the world.  Right now, half of us think its great, the other half don't care and just a few of us are onboard, riding the modern equivalent of the railroad. 

 

7/13/2004 6:01:29 PM (GMT Standard Time, UTC+00:00)  #    Comments [1]  |  Trackback
Wednesday, July 07, 2004
What to do if you have a set of words you wish to remove from a bit of text? Use regular expressions and c# some caching to create an optimized solution for a common, if not unfortunate, requirement
Programming | .Net | C#
7/7/2004 10:01:25 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Tuesday, June 22, 2004
How do you add a new token for comments that should appear in your task view?
Programming | .Net | C#
6/22/2004 4:19:01 PM (GMT Standard Time, UTC+00:00)  #    Comments [1]  |  Trackback
Thursday, May 27, 2004
A c# library of three useful javascript functions - cell over & out, reduce document domain, and capture the enter key
Programming | .Net | C#
5/27/2004 2:59:11 PM (GMT Standard Time, UTC+00:00)  #    Comments [3]  |  Trackback
Monday, May 17, 2004
Animated gif stops animation when a form is submitted. This entry describes an easy way to overcome this undesired behavior.
5/17/2004 6:22:38 PM (GMT Standard Time, UTC+00:00)  #    Comments [2]  |  Trackback
Tuesday, May 04, 2004
Two seconds after posting the first entry, I discovered some nifty character functions that take care of my globalization problems...
Programming | .Net | C#
5/4/2004 9:04:16 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
An example of how to format camel back notation as space separated words
Programming | .Net | C#
5/4/2004 8:37:33 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Tuesday, April 27, 2004
my first NUnit ecperience, very pleasurable indeed!
Programming | .Net | C# | NUnit
4/27/2004 4:52:34 PM (GMT Standard Time, UTC+00:00)  #    Comments [5]  |  Trackback
Wednesday, April 21, 2004
And figured out how to restore it!
Programming | .Net | C#
4/21/2004 9:40:19 PM (GMT Standard Time, UTC+00:00)  #    Comments [1]  |  Trackback
The things you never consider...
4/21/2004 8:56:34 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Wednesday, April 14, 2004

That blasted enter key! Don't press the enter key...

When developing in ASP.Net, much of what we used to do in HTML and classic asp is now wrapped up in the server controls.  One of the things that our qa team finds often is incorrect form submission when pressing the enter key. 

Handling fear of mice

There are several appropriate ways to handle the enter key. 

One thing you can do is define a "default action".  For example, if there are several navigation buttons on your page plus a data entry form, it would make sense that any enter key pressed should fire the form submit action. 

Another thing you could do is cancel the enter key entirely.  If you intend to support more han standard browsers, this is not the best approach.  Some users do not actually use a mouse at all.  Keep this in mind if you use the following example. 

When I have time, I'll show how to implement the first approach using this same script as a starting point. 

For now, we're just going to capture the enter key globally for the form.   In ASP.Net, the form is the usually the entire page.  (Hint: once you've captured the enter key press, you have control of the action. Use control.ClientId to cause a clientside event that will execute the post-back.)

A simple example

<script language=javascript>

            <!--

            var bIsEnterKey = false;

            function checkKeyPress(){

                  return !bIsEnterKey;

            }

            function setKeyPress(){

                  bIsEnterKey = (event.keyCode.toString() == '13');

                  window.setTimeout("bIsEnterKey=false;",1000);

            }

           

            //-->

</script>

 

 

<form id="Form1" method="post" runat="server" onsubmit="return checkKeyPress();" onkeypress="setKeyPress()">

What happens?

When the page renders to the client, anything that ASP.net normally adds to the onsubmit event will precede the custome function call.  Therefore, the last thing to happen is going to be the enter key check.  If you have validators on the page, they will be executed first.  If the validation fails, the enter key check will not be called.  In most cases, this is desired, but you need to be aware of it.  Validators can mess with your head!  The good new is that once validation is successful, the enter key function will be called.  If the enter key was the source of the form submission, what ever you've defined in the function (in this case: cancel the form submit)  is going to happen. 

In the rendered page notice the form onsubmit action.  This show the result of placing a RequiredFieldValidator on the page.  Nothing special needs to happen beyond the code shown above.

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >

<HTML>

  <HEAD>

                  

                   <script language=javascript>

                   <!--

                   var bIsEnterKey = false;

                   function checkKeyPress(){

                             return !bIsEnterKey;

                   }

                   function setKeyPress(){

                             bIsEnterKey = (event.keyCode.toString() == '13');

                             window.setTimeout("bIsEnterKey=false;",1000);

                   }

                  

                   //-->

                   </script>

</HEAD>

          <body>

                   <form name="Form1" method="post" action="AdSenseEdit.aspx" language="javascript" onsubmit="ValidatorOnSubmit();return checkKeyPress();" id="Form1" onkeypress="setKeyPress()">

<input type="hidden" name="__VIEWSTATE" value="..." />

                

<script language="javascript" src="/aspnet_client/system_web/1_0_3705_288/WebUIValidation.js"></script>

 

 

                             <div id="pnlPropFields" align="Center" style="width:600px;">

 

Programming | .Net | C#
4/14/2004 2:32:43 PM (GMT Standard Time, UTC+00:00)  #    Comments [3]  |  Trackback
Monday, April 12, 2004
oh, ink. now I get it.
Programming | .Net | C#
4/12/2004 5:48:36 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Wednesday, April 07, 2004
the hard way
Programming | .Net | C#
4/7/2004 2:27:08 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Tuesday, April 06, 2004

Serialization is one of my favorite features of .Net and I use it more every day.  Much like Xml, once you've gotten the hang of it, you find new uses every time you turn around. 

Today I wanted to serialize to string.  Simple enough?  The examples I found online often created byteArrays and char arrays and went through more work than necesary.  So, for those who are searching like I was, here is the simplest example I could write.

The simplest overload provided by the Serialize method of the System.Xml.Serialization.XmlSerializer class takes two parameters: TextWriter and an instance of the class to serialize. 

System.IO.StringWriter inherits from TextWriter, therefore, it can be used in this method call.

using System;

using System.Xml.Serialization;

using System.IO;

 

namespace HPCi.ResourceGuide.Google

{

      [Serializable]

      ///

      /// A very simple entity class

      ///

      public class Class1

      {

            ///

            /// A couple of public fields. 

            /// In the real world, I always create

            /// private fields with public accessors

            /// additionally, I usually initialize fields to

            /// default values or empty values rather than null

            ///

            public string MyPublicStringField = String.Empty;

            public bool IsPrettyCool = true;

 

            ///

            /// Serialization of the class

            /// Incredibly simple and can be used for any class,

            /// just change the type

            ///

            /// string

            public string SerializeToXml()

            {

                  // Serialization of Class into string of xml

                  XmlSerializer xmlsSlzr = new XmlSerializer( typeof( Class1 ) );

                  StringWriter sw = new StringWriter();

                  xmlsSlzr.Serialize( sw, this );

                  return sw.ToString();

            }

      }

}

note:  you could easily make this a static method and pass in the class instance to serialize.  Use reflection to create a type to pass to the XmlSerializer contructor. 

The following code illustrates this:

public static string SerializeToXml(object obj)

            {

                  // Serialization of generic Class into string of xml

                  XmlSerializer xmlsSlzr = new XmlSerializer( obj.GetType() );

                  StringWriter sw = new StringWriter();

                  xmlsSlzr.Serialize( sw, obj);

                  return sw.ToString();

            }

      }

}

 

I don't like this approach as much as it reminds me too much of vb and utility function libraries.  A less oo approach.

Programming | .Net | C#
4/6/2004 9:32:28 PM (GMT Standard Time, UTC+00:00)  #    Comments [2]  |  Trackback
Monday, April 05, 2004

While prototyping a generic form generator, I found success when using Type.GetType() to get a System.Type instance.  I passed in the string name of the “Type” I wished to inspect, for instance:

Type type = Type.GetType("MyNamespace.MyClass");
// List of properties that belong to the given Type
PropertyInfo[] itemTypeProperties = type.GetProperties();
// Object property
PropertyInfo property;
// Loop through the properties of the specified Type
for(int i = 0; i < itemTypeProperties.Length; i++ )
{
   ...make some labels and form fields
}

The class MyNamespace.MyClass was defined in a sepecate .cs file within the same project as the Form where I called the above code.  Everything worked great!

I wanted to move the class .cs file to its own project as it will be reused by more than one project (aah!  good, eh) but, when I did, the above code failed.  ...but, for why?!

I checked that the reference was appropriately made to the new project and that the build order and dependencies were correct but I got a null reference after the line:
Type type = Type.GetType("MyNamespace.MyClass");

I then tried the following.

// Get an instance of the desired class
MyNamespace.MyClass MyInstance = new MyNamespace.MyClass;
// Get the Type from the class instance
Type type = MyInstance.GetType();
// ...continue as before
// List of properties that belong to the given Type
PropertyInfo[] itemTypeProperties = type.GetProperties();
// Object property
PropertyInfo property;
// Loop through the properties of the specified Type
for(int i = 0; i < itemTypeProperties.Length; i++ )
{
   ...make some labels and form fields
}

For the life of me, I can't figure out why moving a file outside the project causes a failure.  I assume there is something I am missing about assembly inspection that is probably quite obvious.  If I figure it out, I'll post a follow up.  If you figure it out, tell me why I'm dumb

Programming | .Net | C#
4/5/2004 9:44:58 PM (GMT Standard Time, UTC+00:00)  #    Comments [1]  |  Trackback
Friday, March 26, 2004

I have been trying to use VSS integration with VS.Net for well over a year.  It works great at home when I am by myself.  I can track changes and keep versions in history and can confidently change code knowing that I can roll back if I have to.  At work, however, when it is critically important, the integration has limitations that result in having to use VSS explorer outside of VSS.Net.

I have come to very few revolutionary conclusions.  I was hoping to get to a point where I could recommend a configuration for a large development team.  Unfortunately, I can only express that for those who wish to use it, VSS integration is tolerable.

First off, only bind what you will be editing.  If you aren't going to be changing a project that is part of a larger solution, get the files from source control and use them locally but don't bind them to the VSS location.  If you don't need the source code at all (for debugging or stepping through funtionality) simply get the binaries and use the compiled dll.  Its much easier and saves a lot of time when getting latest.

For a project that you do modify and require VSS functionality, here are some tips:

  • Project should remain writable.  It is a pain in the butt to have to check the project out to remove a component from the project or to add a test page.  When you need to make persistent project changes, check out the project file externally, make your changes, check it back in, then mark the file writable again.
  • In VS.Net, under tools --> options --> Source Control --> General:  check the box 'Allow checked in items to be edited'
  • Now you can chose “edit“ in the Source Control dialog in addition to check out, when you attempt to modify a file.  Very useful when you want to add a simple message or line of test code but do not want to persist that change
  • When you try to save the file, you can choose “save as“
  • right click on the file you want to save, choose properties, uncheck read only.
  • Save your edited file
  • When you get latest next time, over write your changes if you want to

 

Its cumbersome but marginally useful.  Its like a cup holder that doesn't really hold any cup well (my Acura) but is better than no cup holder at all (my Westfalia)

 

That's all I have for now, if I think of anything else, I'll let you know.

 

Programming | .Net | C#
3/26/2004 4:15:37 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Wednesday, March 10, 2004

I have been trying to use VSS integration with VS.Net for well over a year.  It works great at home when I am by myself.  I can track changes and keep versions in history and can confidently change code knowing that I can roll back if I have to.  At work, however, when it is critically important, the integration has limitations that result in having to use VSS explorer outside of VSS.Net.

I have come to very few revolutionary conclusions.  I was hoping to get to a point where I could recommend a configuration for a large development team.  Unfortunately, I can only express that for those who wish to use it, VSS integration is tolerable.

First off, only bind what you will be editing.  If you aren't going to be changing a project that is part of a larger solution, get the files from source control and use them locally but don't bind them to the VSS location.  If you don't need the source code at all (for debugging or stepping through funtionality) simply get the binaries and use the compiled dll.  Its much easier and saves a lot of time when getting latest.

For a project that you do modify and require VSS fu