programming, tech, hobbies and grief

28. January 2013 04:51
by Paul Apostolos

Keeping up with technology through podcasts, videos, twitter and Instapaper

28. January 2013 04:51 by Paul Apostolos | 0 Comments

I am one of the luckiest guys in the world. My family is amazing, my children make me so proud and my job is not really a job at all; it's just what I would be doing in my spare time if I was forced to have a completely different occupation (for example botanist).

Honestly, I think the only reason people pay me to do my job is to set the priority of my projects and thereby prevent me from spending hours creating data analysis programs for the GPS data in my training watch or developing a way to control my Raspberry Pi XBMC using my iPhone.

To keep up on all of the many technology trends, I use a few different strategies.


No matter what technology knowledge thirst I have, there is usually a podcast to quench it.  I spend a lot of time running or in the car and it is usually the perfect amount of time for a podcast episode. Here are my favorites (in order of amazingness):

  • Hanselminutes - Scott Hanselman's weekly 30 - 50 minute podcast.  Scott usually covers programming languages and trends but he also discusses technology (such as 3-D printing), the plight of the remote worker and the work/life balance.
  • .NET Rocks! - Carl Franklin and Richard Campbell host a great podcast about all things .NET.  In addition, they occasionally do a "geek out" special about a topic outside of the .NET world.  My favorite of these has been the Nuclear Power Geek Out.
  • This Developer's Life - Scott Hanselman and Rob Conery put perspective on programmer's lives by having programmers share their stories on different topics such as workplace drama, hubris and success.
  • Run As Radio - Richard Campbell hosts this podcast about IT issues usually in the Microsoft stack. 
  • Herding Code - The Hearding Code guys (K. Scott Allen, Jon Galloway, Kevin Dente, Scott Koon) showcase programming technologies using a roundtable format where many hosts interview a guest (or guests).


Sometimes hearing about programming and technology is not enough to actually learn about programming and technology.  Thankfully, there are a bevy of video resources available.  Here is my can't-miss list (once again in order of awesomeness):

  • TekPub (paid subscription) - Rob Conery's screencast service covers topics such as Knockout, Backbone, C#, databases and Ruby.  The quality of these screencasts really separates TekPub from other screencasts.  They are fully produced, tightly edited and always educational.
  • Channel 9 - Microsoft's video channel covering all things Microsoft.  There is a lot of content on Channel 9 that doesn't interest me, but occasionally there are some real gems and for those, I keep coming back.
  • Windows Weekly - Every week Mary Jo Foley, Paul Thurrott and Leo Laporte rundown everything Microsoft.  (also available as an audio podcast)
  • This Week in Computer Hardware - Ryan Shrout and Patrick Norton dive deep into desktop computer hardware.  Motherboards, CPUs, memory and video cards are just the tip of the iceberg here. 
  • Tekzilla - Veronica Belmont, Patrick Norton and Robert Heron answer viewer questions and review new products twice a week.
  • Pluralsight (paid subscription) - Screencasts from experts on a variety of topics including .NET, iOS, JavaScript and a whole lot more.  Some of my favorite authors on Pluralsight include John Papa, Julie Lerman and K. Scott Allen.


My following list on twitter reads like a who's who in programming. I find many pearls in my twitter stream from all of the folks I follow, but I never skip tweets from this list:


As I come across something on twitter, I save the link to Instapaper to read later.  Instapaper is a web application that stores all of my "I want to read this but I don't have time right now" pages.  Then when I have time (in an airport, the bathroom and right before bed usually) I go to my Instapaper app on my phone and plow through all the greatness.

Instapaper also has a feature to email your daily "read later" stories (full text) to your Kindle. Very cool.

What else?

I'd really like to hear about how you keep up with technology in your off hours.  Use the comments below to leave your suggestions.

Good luck to you!

25. January 2013 05:46
by Paul Apostolos

Migrate On-Premise TFS Solutions to TFS Service Online

25. January 2013 05:46 by Paul Apostolos | 6 Comments

In the past ten years I have used several different source control solutions including Visual Source Safe, Source Gear Vault, Subversion and finally Team Foundation Server (TFS). The issue with TFS, at least for me, is it is installed on premise. The problem with an on-premise installation is I need to be on the network with the TFS server in order to use it. And, by "on the network" I mean at the client location or attached remotely via VPN. I have yet to have a client willing to open up their firewall for direct TFS access, although I know that is an option too.  So, when I attended //BUILD this year I was excited to learn about new service from Microsoft that could help ease my TFS access woes.

The new TFS service is TFS 2012 but hosted on Azure. I love it and I could spend hours writing about how to implement, use and configure it; that's not what this post is about. I want to focus on how to get the source code in the current source control system (whatever it is) into the new TFS Service. 

Sample project

To help with the demo, I created a sample project.  It's simply an MVC site, a test project and a library. All of the projects and files are under the same solution folder and are currently hosted in an on-premise TFS 2010 server project collection. 

I always include a folder called "Referenced Assemblies" for DLL references that are essential to the solution and would be required by other developers on the team. This way, the dev only needs to get the entire solution and magically all the reference pointers are working.

So, now that the solution is in local source control, it needs to be prepped for moving it to TFS Service.  

Prepare for the migration

To begin the migration, I look through the solution projects and files to be sure no other team members have pending changes. Then, I do a "get latest" on the entire solution resolving any conflicts. From there, I navigate to the solution root. I think easiest way to do this is to click on the "Local Path" link in the Visual Studio Source Code Explorer:


I'm now all done with Visual Studio, so say I'll say my goodbyes for now and close it. 

Clean the solution

For this part I am going to use CleanProject (a Visual Studio extension). The CleanProject extension is really sweet, it takes a solution folder and cleans all the unneeded items such as bin, obj and ReSharper folders AND most importantly of all it removes all the source control bindings. Don't worry, it doesn't touch the original folder, instead it creates a copy and does all the magic on that copy.

To use CleanProject, I navigate to the folder one level above the solution root; the solution's parent folder. 

From there I just right click on the solution folder and choose "Clean, Remove Source Bindings and Zip Solution" which will do exactly that: 

When it finishes I have a zip file of all the cleaned contents of my original solution folder: 

There are many command line options for CleanProject. There's even one to just copy the files instead of creating a zip file, but, for simplicity, I am just using the context menu.  For more information on the command line options, visit the CleanProject site on CodePlex.

Move the solution to a new location

Now that the solution is cleaned and zipped into a nice little package, I need to find a new home for it on my hard drive.  I created a folder called CloudTFSService and I extracted the folder contents to that location. Here is a trick that I didn't see documented anywhere. Once I've extract the files, those files retain their attributes from the original location;namely, the Read-only attribute.  I need to remove those attributes before adding the solution to the new TFS Service.  To do this, I just right click on the new solution root, choose "Properties", uncheck the "Read-only" box and apply the changes to all subfolders and files. 

Okay, now I'm all set to open my solution and add it to the TFS Service.

Add the solution to TFS Service

Before I go any further, I'll need to sign into my TFS Service account and add a new team project to hold the new solution.

Once the new project is created, I open Visual Studio and choose "Connect to Team Foundation Server..." which is either on the start screen or under the TEAM menu item.

From here I can add a new TFS server and instead of pointing to a local instance, I'll point to my TFS Service instance.  

The connect dialog then asks me to provide my Windows Live ID credentials to connect and presents me with a list of projects. I then choose the project created in the previous step.

Next, I'll open the solution from the FILE menu by choosing Open -> Project/Solution. 

Okay, I'm almost done. Now that I have the solution open, I'd better make sure it still builds! When I get a successful build, I then, right on the solution in Solution Explorer and choose Add Solution to Source Control... 

Now here is another trick. For projects that only have one (and will only have one) solution, I delete the contents of the "Type the name for the solution folder" textbox.  This creates the solution directly under the project root instead of creating another subfolder to house the solution.  If in this case I was to leave the just how it is, my solution file would reside in  $/SampleProject/SampleProject/SampleProject.sln instead of, simply, $/SampleProject/SampleProject.sln. Don't get me wrong, that convention is nice for projects that will contain multiple versions or many solutions, but this one is more simple than that. 

Now, remember how I said I like to create a "ReferencedAssemblies" folder? Well, that folder has not been added to source control. I want to do that so all team members are working on the same versions of the references. It's pretty easy to do using the Source Code Explorer in Visual Studio.  

To add the folder, I open Source Code Explorer, right click in the solution folder pane and choose "Add Items to Folder..." 

Now I'll select the "ReferencedAssemblies" folder and choose Next (not finish). Then I make sure to INCLUDE any DLLs I want to be added to source control. 

Once I have included the DLLs, I'll be able to click finish and the ReferencedAssemblies folder will appear in the list of solution folders. 

So, what's left? Oh, yeah, I need to actually check in the solution to upload the files to source control. To check in the solution I right click on the solution in Solution Explorer and choose Check In... 

That's it! I'm done.

Wrapping up

In this post I demonstrated how to migrate an exiting source-controlled solution to the new TFS Service.  Hopefully you will find a few useful tidbits in here to help you migrate your solutions.

Good luck and let me know how it all works out for you!

23. January 2013 05:56
by Paul Apostolos

Synchronize Visual Studio Settings Across Machines with Dropbox

23. January 2013 05:56 by Paul Apostolos | 2 Comments

I live in Visual Studio 2012 (VS2012)...Well, not literally, but I do spend lots of my waking moments in front of a computer and that computer always has at least one instance of Visual Studio running. The important thing to note from the last sentence is not that I am a huge nerd and I need to make time for more popular forms of fun, but that I said "a computer." That's the rub, it's not always the same computer. However, the experience of Visual Studio, and for that matter SQL Server Management Studio 2012 (after all it's just Visual Studio 2010 really), are the same across all of my many, many machines thanks to this technique.

The first question I always get (usually from my wife) is "why do you have many, many machines?" Let rundown the machines and reasons:

  1. Home office desktop computer -  Four monitors, great audio system, six cores and 24GB of ram all in a place where I can just plop my but down at any point and start working. No docking, no connectors, no wrestling with display adapters that are limited to just three displays (I'm looking at you Lenovo W530). Seriously, for any significant programming session, a minimum of four monitors are required.  Actually, seven is probably the magic number, but four is a good first step.
  2. Everyday laptop -  Lenovo W530 with three SSDs, 20GB of ram and the best laptop keyboard ever built. The main issue with this monster is weight.  I think my right shoulder is now 1.2 inches lower than my left from carrying the W530 in my backpack on one shoulder for a year.
  3. Travel laptop -  Macbook Air 13" running Windows 8 in BootCamp.  It only weighs three pounds and is nearly as effective as the W530 at less than half the weight. And, I get a strange satisfaction when people say, "Oh, you are using a Mac." and I reply, "Yeah, I can go both ways."
  4. 12 virtual machines - For every client I have, if needed, I create a virtual machine development environment to mimic their production environment as closely as possible.  This way if I need to test an integration for example with MAS90 or QuickBooks, I'm all set.

With all of these different "machines" I used to go crazy trying to set things up exactly the same for both Visual Studio 2012 and SQL Server Management Studio 2012.  Then I would get frustrated when I would decide to change a setting on my W530 in the middle of the day, only to go home and have to make the same change again. Thankfully, this use case did not go without notice by the members of the Visual Studio team. Now I can synchronize all my settings for both programs across all my machines and it's really easy. So, let's get started:

In order to use this option effectively, I suggest (if you don't already have) you get yourself an account with Dropbox, SkyDrive, Google Drive or some other online storage service.  They all offer a free plan that would be more than enough to implement this project.  However, as my grandmother always says, "If you aren't signed up for at least 50GB of online storage, you are just doing it wrong." Once your shared storage is all set up, you can proceed to the next step. And, if you have at least 50GB, you can rest easy at night knowing my grandmother thinks you are doing it right.

To begin sharing your settings to all of your machines, you'll need to export your favorite machine's settings to a folder under your online storage root. To export your settings open VS2012 and go to TOOLS (Ha! all caps) -> Import and Export Settings... 

From there choose Export selected environment settings. 

Next, you will see a list of settings so you can choose exactly which settings you want to include in this master settings file. I just accepted the default (all) and clicked Next. 

The next screen is where you select the folder to save your settings file.  Be sure to choose a folder that is accessible by all of your machines. For mine, I created a folder under my Dropbox root called VisualStudioSettings (remember when we couldn't have spaces in file names? me too and I can't shake that habit). Don't forget to click Finish. 

Done! Well, not really, but done with the export at least.  The next step will be to tell Visual Studio on all your machines (including the one you used to do the export) to always use the settings from that file.  To do this go to TOOLS -> Options

Under the Environment section, click on the Import and Export Settings link. Then in the right pane, check the box "Use team settings file:" and browse to the path of the file you just exported. It is important to use your online storage service so changes to the file on one computer are shared to the others. 

That's it! Just repeat the last step for all your computers and all of your Visual Studio settings will be shared across all of your machines. Now, here's the bonus...The same exact procedure works for Visual Studio 2010 and SQL Server Management Studio 2012. 

I'm still looking for the holy grail, which for me would include a way to also synchronize extensions, such as (some of my favorites) AttachTo, Indent Guides, Visual Studio 2012 Color Theme Editor, Productivity Power Tools, and the AMAZING, AMAZING, AMAZING Web Essentials 2012.  

Good luck and let me know how it all works out for you!