<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>danielcolomb.com</title>
	<atom:link href="http://www.danielcolomb.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.danielcolomb.com</link>
	<description>rantings of a technophile</description>
	<lastBuildDate>Tue, 13 Dec 2011 14:26:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Stop Internet Censorship!</title>
		<link>http://www.danielcolomb.com/2011/12/13/stop-internet-censorship/</link>
		<comments>http://www.danielcolomb.com/2011/12/13/stop-internet-censorship/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 14:11:27 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[a default category]]></category>
		<category><![CDATA[Censorship]]></category>
		<category><![CDATA[congress]]></category>
		<category><![CDATA[Idiots]]></category>
		<category><![CDATA[Protect-IP]]></category>
		<category><![CDATA[SOPA]]></category>

		<guid isPermaLink="false">http://www.danielcolomb.com/?p=594</guid>
		<description><![CDATA[<p>I&#8217;ve censored the following, in protest of a bill that gives any corporation and the US government the power to censor the internet&#8211;a bill that could pass THIS WEEK. To see the uncensored text, and to stop internet censorship, visit: http://americancensorship.org/posts/739/uncensor</p> <p>██████████ of any ████ is █████ and ████ ███████ the ████████ ███████ of [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve censored the following, in protest of a bill that gives any corporation and the US government the power to censor the internet&#8211;a bill that could pass THIS WEEK. To see the uncensored text, and to stop internet censorship, visit:<br />
<a title="http://americancensorship.org/posts/739/uncensor" href="http://americancensorship.org/posts/739/uncensor" target="_blank"> http://americancensorship.org/posts/739/uncensor</a></p>
<p>██████████ of any ████ is █████ and ████ ███████ the ████████ ███████ of ████ ███████!</p>
<p>████ ███████ is our █████, ████ ███████ is our █████. Don&#8217;t let ████ ████ it ████ ████ us!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielcolomb.com/2011/12/13/stop-internet-censorship/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>We need to fix it, we need to do something!</title>
		<link>http://www.danielcolomb.com/2011/11/06/we-need-to-fix-it-we-need-to-do-something/</link>
		<comments>http://www.danielcolomb.com/2011/11/06/we-need-to-fix-it-we-need-to-do-something/#comments</comments>
		<pubDate>Sun, 06 Nov 2011 14:39:29 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[a default category]]></category>
		<category><![CDATA[corruption]]></category>
		<category><![CDATA[fixing government]]></category>
		<category><![CDATA[government]]></category>
		<category><![CDATA[lessig]]></category>
		<category><![CDATA[occupy]]></category>
		<category><![CDATA[republic-lost]]></category>

		<guid isPermaLink="false">http://www.danielcolomb.com/?p=590</guid>
		<description><![CDATA[<p>At the time of this posting, i&#8217;m only about half-way done watching this video, but i feel that I need to post this now and share it with everyone i know. What he says sums up what is wrong with our government and makes me want to go to Capitol Hill and kick every [...]]]></description>
			<content:encoded><![CDATA[<p>At the time of this posting, i&#8217;m only about half-way done watching this video, but i feel that I need to post this now and share it with everyone i know. What he says sums up what is wrong with our government and makes me want to go to Capitol Hill and kick every politician out of Congress and force change to happen.</p>
<p>Now if you&#8217;re more to the Left or more to the Right doesn&#8217;t really matter here. No matter what your beliefs in how government works are, they clearly don&#8217;t line up with what reality is. Even if you&#8217;re not very political and have no interest in politics, what happens in our government DOES affect you.</p>
<p>I&#8217;d really like to see some real change happen. Some of the ideas like elections funded from public small amounts only or the ways to reform our government.</p>
<p>Give yourself an hour and a half and watch this.</p>
<p><iframe width="420" height="315" src="http://www.youtube.com/embed/H-f4oiyiHwM" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielcolomb.com/2011/11/06/we-need-to-fix-it-we-need-to-do-something/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Deploying Windows Services from TFS</title>
		<link>http://www.danielcolomb.com/2011/06/27/deploying-windows-services-from-tfs/</link>
		<comments>http://www.danielcolomb.com/2011/06/27/deploying-windows-services-from-tfs/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 18:26:11 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Source Control]]></category>
		<category><![CDATA[TFS]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[PsExec]]></category>
		<category><![CDATA[Service]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.danielcolomb.com/?p=577</guid>
		<description><![CDATA[<p>As part of our initiative to automate code deployments, we needed to move windows services from TFS to our test servers. The way we did this before was to have a build stage all the files and then either stop the services on the destination machine manually, copy files, and restart the services, or [...]]]></description>
			<content:encoded><![CDATA[<p>As part of our initiative to automate code deployments, we needed to move windows services from TFS to our test servers. The way we did this before was to have a build stage all the files and then either stop the services on the destination machine manually, copy files, and restart the services, or use a homebrewed application to deploy the service; which is fine and dandy, except that the original developer isn&#8217;t with the company anymore and the application is limited in certain ways.</p>
<p>So to solve this, I went ahead and created a new build template that would deploy our windows services from a TFS build.</p>
<p><strong>Some prerequisites:<br />
</strong></p>
<ul>
<li><span style="font-weight: normal;">PsExec must be on the build machine </span></li>
<li>Your build service must be an admin on the machine you&#8217;re deploying to (to be able to stop and start services)</li>
</ul>
<p>First, we&#8217;ll set up a new Code Activity, it&#8217;s very similar to the <a title="Deploying to Multiple Locations in TFS 2010" href="http://www.danielcolomb.com/2011/02/23/deploying-to-multiple-locations-in-tfs-2010/">DeployFiles</a> class i wrote about before</p>
<pre class="brush: csharp; title: Code block; notranslate">
using System;
using System.Activities;
using System.IO;
using System.Text.RegularExpressions;
using Microsoft.TeamFoundation.Build.Client;
using Microsoft.TeamFoundation.Build.Workflow.Activities;
using Microsoft.TeamFoundation.Build.Workflow.Tracking;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
namespace BuildProcess.Activities
{
    [BuildActivity(HostEnvironmentOption.Agent)]
    public sealed class DeployWindowsService : CodeActivity
    {
        //Source dir being deployed from
        [RequiredArgument]
        public InArgument&lt;string&gt; SourceDir { get; set; }
        //Destination dir being copied from
        [RequiredArgument]
        public InArgument&lt;string[]&gt; DestinationDir { get; set; }
        //Files to include
        [RequiredArgument]
        public InArgument&lt;string&gt; FileInclusions { get; set; }
        //Folders to include
        [RequiredArgument]
        public InArgument&lt;string&gt; FolderInclusions { get; set; }
        [RequiredArgument]
        public InArgument&lt;string&gt; CollectionName { get; set; }
        public InArgument&lt;string&gt; ConfigLocations { get; set; }
        //globals
        public string fileInclusionPattern = &quot;&quot;;
        public string folderInclusionPattern = &quot;&quot;;
        protected override void Execute(CodeActivityContext context)
        {
            // Obtain the runtime value of the Text input argument
            string fileInclusions = context.GetValue(this.FileInclusions);
            string folderInclusions = context.GetValue(this.FolderInclusions);
            string configLocations = context.GetValue(this.ConfigLocations);
            string[] destinations = context.GetValue(this.DestinationDir);
            string collectionName = context.GetValue(this.CollectionName);
            DirectoryInfo sourceDir = new DirectoryInfo(context.GetValue(this.SourceDir));
            //parse exclusions, add them to regex patterns
            if (!String.IsNullOrWhiteSpace(fileInclusions))
            {
                string[] fileinarr = fileInclusions.Split(',');
                fileInclusionPattern = &quot;(&quot;;
                foreach (string s in fileinarr)
                {
                    fileInclusionPattern += s.ToUpper().Trim().Replace(&quot;.&quot;, @&quot;\.&quot;).Replace(&quot;*&quot;, @&quot;[a-zA-Z0-9]*&quot;) + &quot;$|&quot;;
                }
                if (fileInclusionPattern.EndsWith(&quot;|&quot;))
                    fileInclusionPattern = fileInclusionPattern.Substring(0, fileInclusionPattern.Length - 1);
                fileInclusionPattern += &quot;)&quot;;
            }
            if (!String.IsNullOrWhiteSpace(folderInclusions))
            {
                string[] folderinarr = folderInclusions.Split(',');
                folderInclusionPattern = &quot;(&quot;;
                foreach (string s in folderinarr)
                {
                    folderInclusionPattern += s.ToUpper().Trim().Replace(&quot;.&quot;, @&quot;\.&quot;).Replace(&quot;*&quot;, @&quot;[a-zA-Z0-9]*&quot;) + &quot;$|&quot;;
                }
                if (folderInclusionPattern.EndsWith(&quot;|&quot;))
                    folderInclusionPattern = folderInclusionPattern.Substring(0, folderInclusionPattern.Length - 1);
                folderInclusionPattern += &quot;)&quot;;
            }
            foreach (string dir in destinations)
            {
                DirectoryInfo destDir = new DirectoryInfo(dir);
                //Used for debugging, you don't need this, unless you want to display something custom here.
                context.Track(new BuildInformationRecord&lt;BuildMessage&gt;()
                {
                    Value = new BuildMessage()
                    {
                        Importance = BuildMessageImportance.High,
                        Message = &quot;Source: &quot; + sourceDir.FullName +
                            &quot;\r\nDestination: &quot; + destDir.FullName +
                            &quot;\r\nFolder Inclusion Pattern: &quot; + folderInclusionPattern +
                            &quot;\r\nFile Inclusion Pattern: &quot; + fileInclusionPattern +
                            &quot;\r\nFolder Inclusions String: &quot; + folderInclusions +
                            &quot;\r\nFile Inclusions String: &quot; + fileInclusions,
                    },
                });
                CopyDir(sourceDir, destDir);
            }
            //copy config files
            if (!String.IsNullOrWhiteSpace(configLocations))
            {
                string strTFSName = collectionName;
                //set up TFS connectivity
                Uri tfsName = new Uri(strTFSName);
                TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(tfsName);
                VersionControlServer vcs = (VersionControlServer)tfs.GetService(typeof(VersionControlServer));
                //copy config files to proper location
                string timestamp = DateTime.Now.Ticks.ToString();
                string workspacePath = @&quot;C:\temp\TFSConfigDeployment_&quot; + timestamp;
                Workspace ws = vcs.CreateWorkspace(&quot;TFSConfigDeployment_&quot; + timestamp, vcs.AuthorizedUser);
                //get the workspace locally
                ws.Map(configLocations, workspacePath);
                ws.Get();
                foreach (string configDir in destinations)
                {
                    CopyDir(new DirectoryInfo(workspacePath), new DirectoryInfo(configDir));
                }
                RemoveWorkSpaceDirectory(workspacePath);
            }
        }
        private void RemoveWorkSpaceDirectory(string workspacePath)
        {
            DirectoryInfo dir = new DirectoryInfo(workspacePath);
            var files = dir.EnumerateFiles();
            foreach (FileSystemInfo info in files)
            {
                string filePath = info.FullName;
                if ((File.GetAttributes(filePath) &amp; FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
                {
                    File.SetAttributes(filePath, FileAttributes.Normal);
                }
            }
            var subDirs = dir.EnumerateDirectories();
            foreach (DirectoryInfo subDir in subDirs)
            {
                RemoveWorkSpaceDirectory(subDir.FullName);
            }
            dir.Delete(true);
        }
        private void CopyDir(DirectoryInfo sourceDir, DirectoryInfo destDir)
        {
            //create destination dir if it doesn't exist
            if (!destDir.Exists)
            {
                destDir.Create();
            }
            // get all files from current dir
            FileInfo[] files = sourceDir.GetFiles();
            //copy ze files!!
            foreach (FileInfo file in files)
            {
                string destFilePath = Path.Combine(destDir.FullName, file.Name);
                if (!String.IsNullOrWhiteSpace(fileInclusionPattern))
                {
                    if (Regex.IsMatch(file.Name.ToUpper(), fileInclusionPattern))
                    {
                        if (File.Exists(destFilePath))
                        {
                            if ((File.GetAttributes(destFilePath) &amp; FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
                            {
                                File.SetAttributes(destFilePath, FileAttributes.Normal);
                            }
                            File.Delete(destFilePath);
                        }
                        file.CopyTo(destFilePath);
                        if ((File.GetAttributes(destFilePath) &amp; FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
                        {
                            File.SetAttributes(destFilePath, FileAttributes.Normal);
                        }
                    }
                }
            }
            // get subdirectories.
            DirectoryInfo[] dirs = sourceDir.GetDirectories();
            foreach (DirectoryInfo dir in dirs)
            {
                // Get destination directory.
                string destinationDir = Path.Combine(destDir.FullName, dir.Name);
                if (!String.IsNullOrWhiteSpace(folderInclusionPattern))
                {
                    if (Regex.IsMatch(dir.Name.ToUpper(), folderInclusionPattern))
                    {
                        // Call CopyDirectory() recursively.
                        CopyDir(dir, new DirectoryInfo(destinationDir));
                    }
                }
            }
        }
    }
}
</pre>
<p>For the next step, you&#8217;ll also want to look at the previous post about <a title="Deploying to Multiple Locations in TFS 2010" href="http://www.danielcolomb.com/2011/02/23/deploying-to-multiple-locations-in-tfs-2010/">deploying files from TFS</a>. After you&#8217;ve opened up your ProcessTemplate, you&#8217;ll want to have the following arguements:</p>
<ul>
<li>DeploymentDir &#8211; In &#8211; String[]</li>
<li>SourceRootDir &#8211; In &#8211; String</li>
<li>CollectionName &#8211; In &#8211; String</li>
<li>PsExecPath &#8211; In &#8211; String</li>
<li>ServiceName &#8211; In &#8211; String</li>
<li>ServerName &#8211; In &#8211; String</li>
<li>FileInclusions &#8211; In &#8211; String</li>
<li>FolderInclustions &#8211; In &#8211; String</li>
<li>RestartService &#8211; In &#8211; Boolean &#8211; True</li>
</ul>
<p>Each of these you&#8217;ll probably want to add to the Metadata Argument so you can keep your build definitions organized.</p>
<p><a href="http://www.danielcolomb.com/wp-content/uploads/2011/06/buildDef.png"><img class="alignnone size-full wp-image-584" title="buildDef" src="http://www.danielcolomb.com/wp-content/uploads/2011/06/buildDef.png" alt="" width="745" height="197" /></a></p>
<p>And you&#8217;ll want to add the following Variable:</p>
<ul>
<li>PsExecResult &#8211; Int32 &#8211; Revert Workspace and Copy Files&#8230;</li>
</ul>
<p>Under Process &gt; Sequence &gt; Run On Agent &gt; Try Compile, Test, and Associate Changesets and Work Items &gt; Revert Workspace and Copy Files to Drop Location &gt; If Deployment Location is Set you&#8217;ll want to place a new Sequence and call it Stop Service, Copy Files, Start Service.</p>
<p><a href="http://www.danielcolomb.com/wp-content/uploads/2011/06/StopCopyStartServices.png"><img class="alignnone size-full wp-image-578" title="StopCopyStartServices" src="http://www.danielcolomb.com/wp-content/uploads/2011/06/StopCopyStartServices.png" alt="" width="508" height="673" /></a></p>
<p>Inside that Sequence you&#8217;ll want to place an Invoke Process activity, the new DeployWindowsServices code activity, and an If statement with another Invoke Process activity in the Then clause.</p>
<p>For the first Process Invocation:</p>
<p><a href="http://www.danielcolomb.com/wp-content/uploads/2011/06/InvokePsExecStopService.png"><img class="alignnone size-full wp-image-581" title="InvokePsExecStopService" src="http://www.danielcolomb.com/wp-content/uploads/2011/06/InvokePsExecStopService.png" alt="" width="351" height="176" /></a></p>
<p>Arguements:  ServerName + &#8221; -s -d net stop &#8221; + ServiceName<br />
DisplayName: Stop Service<br />
FileName: PsExecPath<br />
Result: PsExecResult</p>
<p>For the Deployment Activity:</p>
<p><a href="http://www.danielcolomb.com/wp-content/uploads/2011/06/DeployService.png"><img class="alignnone size-full wp-image-579" title="DeployService" src="http://www.danielcolomb.com/wp-content/uploads/2011/06/DeployService.png" alt="" width="354" height="173" /></a></p>
<p>CollectionName: CollectionName<br />
DestinationDir: DeploymentDir<br />
DisplayName: Deploy Windows Service<br />
FileInclustions: FileInclusions<br />
FolderInclustions: FolderInclusions<br />
SourceDir:  BinariesDirectory + &#8220;\&#8221; + SourceRootDir</p>
<p>For the If statement, just check to see if RestartService is set to True, and then enter the values for the second Process Invocation:</p>
<p><a href="http://www.danielcolomb.com/wp-content/uploads/2011/06/InvokePsExecStartService.png"><img class="alignnone size-full wp-image-580" title="InvokePsExecStartService" src="http://www.danielcolomb.com/wp-content/uploads/2011/06/InvokePsExecStartService.png" alt="" width="353" height="179" /></a></p>
<p>Arguements:  ServerName + &#8221; -s -d net start &#8221; + ServiceName<br />
DisplayName: Start Service<br />
FileName: PsExecPath</p>
<p><strong>*NOTE, THE FOLLOWING SECTION DOES NOT WORK PROPERLY YET*</strong></p>
<p>After the If statement, you&#8217;ll want to add in another If, this will check to see if PsExec has failed or not.<a href="http://www.danielcolomb.com/wp-content/uploads/2011/06/PsExecFail.png"><img class="alignnone size-full wp-image-582" title="PsExecFail" src="http://www.danielcolomb.com/wp-content/uploads/2011/06/PsExecFail.png" alt="" width="482" height="223" /></a></p>
<p>Since this isn&#8217;t working properly yet, i just check to see if PsExecResult is &#8217;1&#8242;, which it hasn&#8217;t been as of this writing. In the Then block, add a Throw activity and have it throw an exception of:</p>
<pre class="brush: csharp; title: Code block; notranslate">
New Exception(&quot;PsExecResult: &quot; + PsExecResult.ToString())
</pre>
<p>Optionally, you can also add WriteBuildMessage and WriteBuildWarning activities to your Invoke Process Activities, these are nice because you can see what the process you are invoking outputs.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielcolomb.com/2011/06/27/deploying-windows-services-from-tfs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Camera and weekend exploits!</title>
		<link>http://www.danielcolomb.com/2011/06/05/new-camera-and-weekend-exploits/</link>
		<comments>http://www.danielcolomb.com/2011/06/05/new-camera-and-weekend-exploits/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 02:12:06 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Cameras]]></category>
		<category><![CDATA[friends]]></category>
		<category><![CDATA[life]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[D7000]]></category>
		<category><![CDATA[Nikon]]></category>
		<category><![CDATA[zen tea house]]></category>

		<guid isPermaLink="false">http://www.danielcolomb.com/?p=569</guid>
		<description><![CDATA[<p>Ever since the trip to North Carolina I&#8217;ve been wanting to get a new camera, a DSLR to be precise. I&#8217;ve been looking at different cameras for the last week or so, trying to decide between a Canon T2i, a Nikon D90, and a Nikon D7000. Well, earlier this week i finally settled and [...]]]></description>
			<content:encoded><![CDATA[<p>Ever since the trip to North Carolina I&#8217;ve been wanting to get a new camera, a DSLR to be precise. I&#8217;ve been looking at different cameras for the last week or so, trying to decide between a <a href="http://www.pcfastlane.com/wp-content/uploads/2010/02/canon_t2i.jpg">Canon T2i</a>, a <a href="http://www.imaging-resource.com/PRODS/D90/ZBEAUTY.JPG">Nikon D90</a>, and a <a href="http://cdn.ubergizmo.com/photos/2010/9/nikon-d7000.jpg">Nikon D7000</a>. Well, earlier this week i finally settled and got the <a href="http://cdn.ubergizmo.com/photos/2010/9/nikon-d7000.jpg">D7000</a>. And thanks to my friend Angela, who hooked me up with a Amazon Prime trial I was able to get 1-day shipping for 4 bucks! Order the camera, get it within the next two days, that was the plan anyway. The first day I get home from work and see a note on my door. The package required a signature on delivery, so they couldn&#8217;t just leave the camera on my door step. I guess that&#8217;s smart of Amazon to do, require the signature on expensive items. I&#8217;d never had that happen before, even on things i&#8217;d bought from Amazon. I decided that the second day i&#8217;d take a half-day from work so i could catch the delivery truck and get my precious new toy. No such luck. I get there 15 minutes too late and get another note stuck on my door. So, what i did was change the package to be held at the UPS Customer Center, so i could pick it up that day. I didn&#8217;t want to wait another day. I NEEDED MY PRECIOUS!</p>
<p>Saturday, after staying out a little late the night before after picking up my camera and going to judo, a few friends and I decided to go out for drinks and eat sushi for dinner, aka an awesome chance to try out my new camera <img src='http://www.danielcolomb.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><a class="tt-flickr tt-flickr-Medium" title="DSC_0095" href="http://www.danielcolomb.com/flickr/photo/5801931185/dsc_0095.html"><img class="alignnone" src="http://farm3.static.flickr.com/2756/5801931185_60bc966e26.jpg" alt="Osaka Sushi Restaurant" width="500" height="331" /></a><br />
Osaka is delicous, it&#8217;s actually one of my favorite places to get sushi at. But before we get to that we take a little detour. On the way up to Osaka, we get a phone call from Daphne, saying she has to work late. FOR AN ENTIRE HOUR!</p>
<p>&nbsp;</p>
<p><a class="tt-flickr tt-flickr-Medium" title="DSC_0098" href="http://www.danielcolomb.com/flickr/photo/5802143155/dsc_0098.html"><img class="alignnone" src="http://farm4.static.flickr.com/3177/5802143155_6700cf076f.jpg" alt="DSC_0098" width="500" height="331" /></a><br />
Sarah and I take this opportunity to get some delicious iced beverages at the <a href="http://www.zenteahouse.org/">Zen Tea House</a> while we waited.<br />
<a class="tt-flickr tt-flickr-Medium" title="DSC_0101" href="http://www.danielcolomb.com/flickr/photo/5802489572/dsc_0101.html"><img class="alignnone" src="http://farm4.static.flickr.com/3049/5802489572_9492006f3a.jpg" alt="Abandoned house" width="500" height="331" /></a><br />
After we ate at Osaka, we decided to take a little walk to help our food digest and to use up some time before heading out to <a href="http://sergiosworldbeers.com/">Sergio&#8217;s World Beers</a>. On the way, we saw this old house in very sad shape.<br />
<a class="tt-flickr tt-flickr-Medium" title="DSC_0110" href="http://www.danielcolomb.com/flickr/photo/5802702594/dsc_0110.html"><img class="alignnone" src="http://farm3.static.flickr.com/2654/5802702594_f8dfac46b1.jpg" alt="DSC_0110" width="500" height="331" /></a><br />
After our walk we headed down to the bar where we partook in some delicious beverages. it was hot so a Radler was totally in order <img src='http://www.danielcolomb.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
<a class="tt-flickr tt-flickr-Medium" title="DSC_0123" href="http://www.danielcolomb.com/flickr/photo/5801945771/dsc_0123.html"><img class="alignnone" src="http://farm4.static.flickr.com/3297/5801945771_6ef22ab25b.jpg" alt="DSC_0123" width="331" height="500" /></a><br />
Sarah found this adorable beer hidden in one of the fridges. It was quite good actually.<br />
<a class="tt-flickr tt-flickr-Medium" title="DSC_0118" href="http://www.danielcolomb.com/flickr/photo/5802004696/dsc_0118.html"><img class="alignnone" src="http://farm6.static.flickr.com/5068/5802004696_57d0dfaeff.jpg" alt="DSC_0118" width="331" height="500" /></a><br />
Mary decided to take a shot and try one of the Fruit Ale&#8217;s on draft, it was a Strawberry Ale. Oh man, that was good! Very sweet! We stayed for a while chit chatting about this and that and eventually went home, I took a nap on the drive back :3</p>
<p>Sunday. Mary and I decided to meet up at <a href="http://www.bernheim.org/">Berheim Forest</a> to practice with our cameras (Mary has a D90). We walked around taking pictures of all sorts of things.<br />
<a class="tt-flickr tt-flickr-Medium" title="DSC_0152" href="http://www.danielcolomb.com/flickr/photo/5801947151/dsc_0152.html"><img class="alignnone" src="http://farm3.static.flickr.com/2773/5801947151_d196e96beb.jpg" alt="DSC_0152" width="500" height="331" /></a><br />
These geese were protecting their goslings from other geese trying to steal the food people were throwing at them. Geese can be VICIOUS!</p>
<p>&nbsp;</p>
<p><a class="tt-flickr tt-flickr-Medium" title="DSC_0142" href="http://www.danielcolomb.com/flickr/photo/5802502842/dsc_0142.html"><img class="alignnone" src="http://farm3.static.flickr.com/2141/5802502842_62dcb1671d.jpg" alt="DSC_0142" width="500" height="331" /></a><br />
Typical, insect doing something with a plant picture. Also, &lt;insert camera talk about blurriness and focus point here&gt;.<br />
<a class="tt-flickr tt-flickr-Medium" title="DSC_0254" href="http://www.danielcolomb.com/flickr/photo/5802757256/dsc_0254.html"><img class="alignnone" src="http://farm3.static.flickr.com/2122/5802757256_6220d71112.jpg" alt="DSC_0254" width="331" height="500" /></a><br />
Mary. I don&#8217;t care what she says, I like this picture <img src='http://www.danielcolomb.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  After Bernheim we went and ate at <a href="http://www.saigon-cafe.com/">Saigon Cafe</a>, which was delicious! I&#8217;m really glad i got introduced to Vietnamese food, it&#8217;s so good! Then it was off to <a href="http://www.heinebroscoffee.com/">Heine Bros</a> for some coffee before the trip home.</p>
<p>Once i got to my parents that evening I played with my camera some more, mainly taking pictures of the dogs.<br />
<a class="tt-flickr tt-flickr-Medium" title="DSC_0277" href="http://www.danielcolomb.com/flickr/photo/5801954759/dsc_0277.html"><img class="alignnone" src="http://farm4.static.flickr.com/3246/5801954759_4e28acbb64.jpg" alt="DSC_0277" width="331" height="500" /></a><br />
Nero begging for food. Can&#8217;t you tell? He hasn&#8217;t eaten in minutes!</p>
<p><a class="tt-flickr tt-flickr-Medium" title="DSC_0276" href="http://www.danielcolomb.com/flickr/photo/5802510248/dsc_0276.html"><img class="alignnone" src="http://farm4.static.flickr.com/3181/5802510248_1427ef76f5.jpg" alt="DSC_0276" width="500" height="331" /></a><br />
Papa just wanting attention. Who can resist those eyes?</p>
<p>One thing i&#8217;ve noticed is that Nero and Papa are very photo conscious. They&#8217;re quite good at looking at the camera and being adorable.<br />
<a class="tt-flickr tt-flickr-Medium" title="DSC_0329" href="http://www.danielcolomb.com/flickr/photo/5802226535/dsc_0329.html"><img class="alignnone" src="http://farm4.static.flickr.com/3146/5802226535_206f1e204e.jpg" alt="DSC_0329" width="500" height="331" /></a><br />
Homer on the other hand, couldn&#8217;t give two licks about cameras being pointed at him. He&#8217;s too busy making sure there aren&#8217;t things that need to be sniffed or chased in the yard.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielcolomb.com/2011/06/05/new-camera-and-weekend-exploits/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Duck, NC</title>
		<link>http://www.danielcolomb.com/2011/06/01/duck-nc/</link>
		<comments>http://www.danielcolomb.com/2011/06/01/duck-nc/#comments</comments>
		<pubDate>Wed, 01 Jun 2011 18:15:38 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[friends]]></category>
		<category><![CDATA[Left 4 Dead]]></category>
		<category><![CDATA[life]]></category>
		<category><![CDATA[video games]]></category>
		<category><![CDATA[Duck]]></category>
		<category><![CDATA[fun times]]></category>
		<category><![CDATA[North Carolina]]></category>
		<category><![CDATA[Troll]]></category>

		<guid isPermaLink="false">http://www.danielcolomb.com/?p=552</guid>
		<description><![CDATA[<p>I took a trip to Duck, NC last month. The trip was great! I thought i&#8217;d update here with some video and pictures! The group consisted of friends who all play Left 4 Dead together. We were all looking forward to an epic week!</p> <p>On the first day we got there i was so [...]]]></description>
			<content:encoded><![CDATA[<p>I took a trip to Duck, NC last month. The trip was great! I thought i&#8217;d update here with some video and pictures! The group consisted of friends who all play Left 4 Dead together. We were all looking forward to an epic week!</p>
<p>On the first day we got there i was so exicted! So i made this video <img src='http://www.danielcolomb.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  I was pretty out of breath at the end of it from running around the house, lol.</p>
<p><object width="400" height="224"><param name="allowfullscreen" value="true" /><param name="movie" value="http://www.facebook.com/v/729723004197" /><embed type="application/x-shockwave-flash" width="400" height="224" src="http://www.facebook.com/v/729723004197" allowfullscreen="true"></embed></object></p>
<p>Day two was pretty much chilling at the beach, I made another video to rub it in everyone back home&#8217;s face <img src='http://www.danielcolomb.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  Chair made of sand, ocean waves, plenty of sun screen. All that was missing was the corona.</p>
<p><object width="400" height="224"><param name="allowfullscreen" value="true" /><param name="movie" value="http://www.facebook.com/v/730392277967" /><embed type="application/x-shockwave-flash" width="400" height="224" src="http://www.facebook.com/v/730392277967" allowfullscreen="true"></embed></object></p>
<p>The rest of the week was filled with beach, video and board games, and drinking all sorts of tasty beverages. We also did some touristy stuff, like checking out some of the local shops where we ended up doing some judo on a lawn of a restaurant, haha!</p>
<div id="attachment_559" class="wp-caption alignnone" style="width: 510px"><a href="http://www.danielcolomb.com/wp-content/uploads/2011/06/DuckNCJudo.jpg"><img class="size-medium wp-image-559 " title="DuckNCJudo" src="http://www.danielcolomb.com/wp-content/uploads/2011/06/DuckNCJudo-500x333.jpg" alt="" width="500" height="333" /></a><p class="wp-caption-text">I threw Sean with Koshi Guruma!</p></div>
<p>We also went to see the Currituck Beach Lighthouse, that was really cool! The stair case seemed to go on forever! Higher and higher! But once you got to the top! What a view! </p>
<p><a href="http://www.danielcolomb.com/wp-content/uploads/2011/06/DuckNCLighthouse.jpg"><img class="alignnone size-medium wp-image-562" title="DuckNCLighthouse" src="http://www.danielcolomb.com/wp-content/uploads/2011/06/DuckNCLighthouse-331x500.jpg" alt="" width="331" height="500" /></a></p>
<p>At the end of the week we went out Parasailing. I&#8217;d never gone before, and boy!, was it a fun experience! It was amazing how far you could see and how calm everything was up there.</p>
<div id="attachment_557" class="wp-caption alignnone" style="width: 510px"><a href="http://www.danielcolomb.com/wp-content/uploads/2011/06/DuckNCParasailingDanMarySky.jpg"><img class="size-medium wp-image-557" title="DuckNCParasailingDanMarySky" src="http://www.danielcolomb.com/wp-content/uploads/2011/06/DuckNCParasailingDanMarySky-500x333.jpg" alt="" width="500" height="333" /></a><p class="wp-caption-text">Mary and I way up high</p></div>
<p>The week went by way too fast for me! I wish i could go on vacation all the time! I can&#8217;t wait to for Otakon to meet up with many of you guys again! </p>
<div id="attachment_558" class="wp-caption alignnone" style="width: 510px"><a href="http://www.danielcolomb.com/wp-content/uploads/2011/06/DuckNCGroupPic.jpg"><img class="size-medium wp-image-558" title="DuckNCGroupPic" src="http://www.danielcolomb.com/wp-content/uploads/2011/06/DuckNCGroupPic-500x333.jpg" alt="" width="500" height="333" /></a><p class="wp-caption-text">The whole group in Troll shirt attire <img src='http://www.danielcolomb.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p></div>
<p>I&#8217;d like to thank Tom and Mary for the pictures! You guys take some great shots!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielcolomb.com/2011/06/01/duck-nc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Wonderful World of Minecraft</title>
		<link>http://www.danielcolomb.com/2011/03/20/the-wonderful-world-of-minecraft/</link>
		<comments>http://www.danielcolomb.com/2011/03/20/the-wonderful-world-of-minecraft/#comments</comments>
		<pubDate>Sun, 20 Mar 2011 09:21:57 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[a default category]]></category>
		<category><![CDATA[INTERNETS!]]></category>
		<category><![CDATA[Minecraft]]></category>
		<category><![CDATA[video games]]></category>
		<category><![CDATA[creepers]]></category>
		<category><![CDATA[diamonds]]></category>
		<category><![CDATA[dynmaps]]></category>
		<category><![CDATA[minecraft]]></category>
		<category><![CDATA[tectonicus]]></category>

		<guid isPermaLink="false">http://www.danielcolomb.com/?p=485</guid>
		<description><![CDATA[<p>I&#8217;ve been playing quite a lot of Minecraft lately, I even have my own server up and running. You&#8217;re welcome to join in on the fun! Just connect to krandor.dyndns.org. Our world isn&#8217;t very big right now, we&#8217;ve been mainly working on crafting stuff and playing with all the stuff you can make&#8230; and [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been playing quite a lot of <a href="http://www.minecraft.net">Minecraft</a> lately, I even have my own server up and running. You&#8217;re welcome to join in on the fun! Just connect to krandor.dyndns.org. Our world isn&#8217;t very big right now, we&#8217;ve been mainly working on crafting stuff and playing with all the stuff you can make&#8230; and well, being on the quest to find lots of iron and diamond <img src='http://www.danielcolomb.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  But i do think we&#8217;ve made some pretty neat structures.</p>
<div id="attachment_543" class="wp-caption alignnone" style="width: 510px"><img class="size-medium wp-image-543 " title="anotherSunrise" src="http://www.danielcolomb.com/wp-content/uploads/2011/03/anotherSunrise-500x294.png" alt="" width="500" height="294" /><p class="wp-caption-text">I love the sunrises <img src='http://www.danielcolomb.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p></div>
<p>Carnes has built a rock making machine, as well as a pretty sweet wheat garden, all on top of an elevated fortress surrounded by lava moats.</p>
<div id="attachment_548" class="wp-caption alignnone" style="width: 510px"><a href="http://www.danielcolomb.com/wp-content/uploads/2011/03/treefortress.png"><img class="size-medium wp-image-548 " title="treefortress" src="http://www.danielcolomb.com/wp-content/uploads/2011/03/treefortress-500x294.png" alt="" width="500" height="294" /></a><p class="wp-caption-text">Our first tree fort</p></div>
<p>I&#8217;ve been mainly running around exploring the world and caverns. Those caverns can get dark, expansive, and SCARY!</p>
<p>Another project we&#8217;ve been working on is getting a rail system going, because walking across the world can take a long time!</p>
<p>I started this post quite a while ago, and since then have taken quite a big break from the game. But recently I&#8217;ve gotten back into it, and even have  a few friends on the server regularly. There are also some mods installed on the server which allow us to specify certain areas as safe from monster spawns, set up our own shops to sell things, and even have a dynamically updated map that shows the live goings on of the server!</p>
<div id="attachment_544" class="wp-caption alignnone" style="width: 510px"><a href="http://www.danielcolomb.com/wp-content/uploads/2011/03/forestfire.png"><img class="size-medium wp-image-544" title="forestfire" src="http://www.danielcolomb.com/wp-content/uploads/2011/03/forestfire-500x294.png" alt="" width="500" height="294" /></a><p class="wp-caption-text">kinda had an accident with some flint and steel <img src='http://www.danielcolomb.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p></div>
<p>Carnes&#8217; current project is to construct a quest for us to run at one point. He&#8217;s off somewhere on the map sculpting land and building stuff so we can all go and run the quest together! I can&#8217;t wait!</p>
<div id="attachment_545" class="wp-caption alignnone" style="width: 510px"><a href="http://www.danielcolomb.com/wp-content/uploads/2011/03/kransHouse.png"><img class="size-medium wp-image-545 " title="kransHouse" src="http://www.danielcolomb.com/wp-content/uploads/2011/03/kransHouse-500x294.png" alt="" width="500" height="294" /></a><p class="wp-caption-text">My house! <img src='http://www.danielcolomb.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p></div>
<p>If you want to check out what our world looks like, click <a title="Tectonicus render" href="http://krandor.dyndns.org/mc/maps/map.html">here</a>. This may not be the most up-to-date render, but it does have the most detail. If you&#8217;d like to check out our realtime map, check it out <a title="dynmaps render" href="http://krandor.dyndns.org:8123">here</a>!</p>
<p>Server Details:<br />
For game connection &#8212; <a href="http://krandor.dyndns.org">krandor.dyndns.org</a><br />
For high quality map render &#8212; <a href="http://krandor.dyndns.org/mc/maps/map.html">krandor.dyndns.org/mc/maps/map.html</a><br />
For live dynamic map render &#8212; <a href="http://krandor.dyndns.org:8123">krandor.dyndns.org:8123</a></p>
<h6>I loath <a href="http://www.minecraftwiki.net/wiki/Creeper">creepers</a>&#8230;</h6>
]]></content:encoded>
			<wfw:commentRss>http://www.danielcolomb.com/2011/03/20/the-wonderful-world-of-minecraft/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Deploying to Multiple Locations in TFS 2010</title>
		<link>http://www.danielcolomb.com/2011/02/23/deploying-to-multiple-locations-in-tfs-2010/</link>
		<comments>http://www.danielcolomb.com/2011/02/23/deploying-to-multiple-locations-in-tfs-2010/#comments</comments>
		<pubDate>Wed, 23 Feb 2011 16:32:55 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[TFS]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[multiple locations]]></category>
		<category><![CDATA[TFS 2010]]></category>

		<guid isPermaLink="false">http://www.danielcolomb.com/?p=517</guid>
		<description><![CDATA[<p>This is just a forewarning, I am not an expert in the ways of TFS. I&#8217;ve only been working with TFS in general for about a year, and TFS 2010 for about 2 months or so. That being said, if anyone has recommendations on a better way to do this, please point me in [...]]]></description>
			<content:encoded><![CDATA[<p>This is just a forewarning, I am not an expert in the ways of TFS. I&#8217;ve only been working with TFS in general for about a year, and TFS 2010 for about 2 months or so. That being said, if anyone has recommendations on a better way to do this, please point me in the right direction <img src='http://www.danielcolomb.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h4>Scenario:</h4>
<p>We want to deploy our built code to different environments, but, we don&#8217;t want everything that&#8217;s dumped into the Release folder.</p>
<h4>The Plan:</h4>
<p>The plan is to create a custom build activity to copy files from one place to another checking each file against an exclusion list.</p>
<h4>The Guts:</h4>
<p>Referencing my previous post, <a title="Dependency Replication in TFS 2010" href="http://www.danielcolomb.com/2011/01/20/dependency-replication-in-tfs-2010/">Dependency Replication in TFS 2010</a>, I will build upon the write-ups by <a title="Customizing Team Build 2010" href="http://www.ewaldhofman.nl/post/2010/04/20/Customize-Team-Build-2010-e28093-Part-1-Introduction.aspx">Ewald Hofman</a>.</p>
<p>You can grab the file here: <a title="C# source" href="http://www.danielcolomb.com/files/DeployFiles.cs">DeployFiles.cs</a></p>
<p>Here&#8217;s the whole activity:</p>
<pre class="brush: csharp; title: Code block; notranslate">
using System;
using System.Activities;
using System.IO;
using System.Text.RegularExpressions;
using Microsoft.TeamFoundation.Build.Client;
using Microsoft.TeamFoundation.Build.Workflow.Activities;
using Microsoft.TeamFoundation.Build.Workflow.Tracking;

namespace BuildProcess.Activities
{
    [BuildActivity(HostEnvironmentOption.Agent)]
    public sealed class DeployFiles : CodeActivity
    {
        //Source dir being deployed from
        [RequiredArgument]
        public InArgument&lt;string&gt; SourceDir { get; set; }
        //Destination dir being copied from
        [RequiredArgument]
        public InArgument&lt;string[]&gt; DestinationDir { get; set; }
        //Files to exclude
        [RequiredArgument]
        public InArgument&lt;string&gt; FileExclusions { get; set; }
        //Folders to exclude
        [RequiredArgument]
        public InArgument&lt;string&gt; FolderExclusions { get; set; }

        //globals
        public string fileExclusionPattern = &quot;&quot;;
        public string folderExclusionPattern = &quot;&quot;;

        protected override void Execute(CodeActivityContext context)
        {
            // Obtain the runtime value of the Text input argument
            string fileExclusions = context.GetValue(this.FileExclusions);
            string folderExclusions = context.GetValue(this.FolderExclusions);
            string[] destinations = context.GetValue(this.DestinationDir);
            DirectoryInfo sourceDir = new DirectoryInfo(context.GetValue(this.SourceDir));

            //parse exclusions, add them to regex patterns
            if (!String.IsNullOrWhiteSpace(fileExclusions))
            {
                string[] fileexarr = fileExclusions.Split(',');
                fileExclusionPattern = &quot;(&quot;;
                foreach (string s in fileexarr)
                {
                    fileExclusionPattern += s.ToUpper().Trim().Replace(&quot;.&quot;, @&quot;\.&quot;).Replace(&quot;*&quot;, @&quot;[a-zA-Z0-9]*&quot;) + &quot;|&quot;;
                }

                if(fileExclusionPattern.EndsWith(&quot;|&quot;))
                    fileExclusionPattern = fileExclusionPattern.Substring(0, fileExclusionPattern.Length - 1);

                fileExclusionPattern += &quot;)&quot;;
            }

            if (!String.IsNullOrWhiteSpace(folderExclusions))
            {
                string[] folderexarr = folderExclusions.Split(',');
                folderExclusionPattern = &quot;(&quot;;

                foreach (string s in folderexarr)
                {
                    folderExclusionPattern += s.ToUpper().Trim().Replace(&quot;.&quot;, @&quot;\.&quot;).Replace(&quot;*&quot;, @&quot;[a-zA-Z0-9]*&quot;) + &quot;|&quot;;
                }

                if(folderExclusionPattern.EndsWith(&quot;|&quot;))
                    folderExclusionPattern = folderExclusionPattern.Substring(0, folderExclusionPattern.Length - 1);

                folderExclusionPattern += &quot;)&quot;;
            }

            foreach (string dir in destinations)
            {
                DirectoryInfo destDir = new DirectoryInfo(dir);

                context.Track(new BuildInformationRecord&lt;BuildMessage&gt;()
                {
                    Value = new BuildMessage()
                    {
                        Importance = BuildMessageImportance.High,
                        Message = &quot;Source: &quot; + sourceDir.FullName + &quot;\nDestination: &quot; + destDir.FullName +
                            &quot;\nFolder Exclusion Pattern: &quot; + folderExclusionPattern +
                            &quot;\nFile Exclusion Pattern: &quot; + fileExclusionPattern,
                    },
                });

                CopyDir(sourceDir, destDir);
            }
        }

        private void CopyDir(DirectoryInfo sourceDir, DirectoryInfo destDir)
        {
            //create destination dir if it doesn't exist
            if (!destDir.Exists)
            {
                destDir.Create();
            }

            // get all files from current dir
            FileInfo[] files = sourceDir.GetFiles();

            //copy ze files!!
            foreach (FileInfo file in files)
            {
                if (!String.IsNullOrWhiteSpace(fileExclusionPattern))
                {
                    if (!Regex.IsMatch(file.Name.ToUpper(), fileExclusionPattern))
                    {
                        if (File.Exists(Path.Combine(destDir.FullName, file.Name)))
                        {
                            File.Delete(Path.Combine(destDir.FullName, file.Name));
                        }
                        file.CopyTo(Path.Combine(destDir.FullName, file.Name));
                    }
                }
                else
                {
                    if (File.Exists(Path.Combine(destDir.FullName, file.Name)))
                    {
                        File.Delete(Path.Combine(destDir.FullName, file.Name));
                    }
                    file.CopyTo(Path.Combine(destDir.FullName, file.Name),true);
                }
            }

            // get subdirectories.
            DirectoryInfo[] dirs = sourceDir.GetDirectories();

            foreach (DirectoryInfo dir in dirs)
            {
                // Get destination directory.
                string destinationDir = Path.Combine(destDir.FullName, dir.Name);

                if (!String.IsNullOrWhiteSpace(folderExclusionPattern))
                {
                    if (!Regex.IsMatch(dir.Name.ToUpper(), folderExclusionPattern))
                    {
                        // Call CopyDirectory() recursively.
                        CopyDir(dir, new DirectoryInfo(destinationDir));
                    }
                }
                else
                {
                    // Call CopyDirectory() recursively.
                    CopyDir(dir, new DirectoryInfo(destinationDir));
                }
            }
        }
    }
}
</pre>
<h4>Explanation:</h4>
<p>Now i&#8217;ll go section by section explaining exactly what&#8217;s going on. First up are the input requirements:</p>
<pre class="brush: csharp; light: true; title: Code block; notranslate">
         //Source dir being deployed from
        [RequiredArgument]
        public InArgument&lt;string&gt; SourceDir { get; set; }
</pre>
<p>The SourceDir is where the deployment starts from. This means what subdirectory from the BinariesDirectory gets deployed. This is important for Websites, since they get dropped in a _PublishedWebsites folder inside the BinariesDirectory.</p>
<pre class="brush: csharp; light: true; title: Code block; notranslate">
        //Destination dir being copied from
        [RequiredArgument]
        public InArgument&lt;string[]&gt; DestinationDir { get; set; }
</pre>
<p>The DestinationDir argument is a string array of paths being passed in (we use UNC network paths, ie: \\deploymentbox\websites\sitename)</p>
<pre class="brush: csharp; light: true; title: Code block; notranslate">
        //Files to exclude
        [RequiredArgument]
        public InArgument&lt;string&gt; FileExclusions { get; set; }
</pre>
<p>The FileExclusions argument is meant to be a comma delimited string of filenames and patterns you want to exclude. (ie: &#8220;web.config, *.pdb&#8221;)</p>
<pre class="brush: csharp; light: true; title: Code block; notranslate">
        //Folders to exclude
        [RequiredArgument]
        public InArgument&lt;string&gt; FolderExclusions { get; set; }
</pre>
<p>The FolderExclusions argument is similar to the FileExclusions, except that if there are certain folders you don&#8217;t want deployed, you can specify them here</p>
<pre class="brush: csharp; light: true; title: Code block; notranslate">
        //globals
        public string fileExclusionPattern = &quot;&quot;;
        public string folderExclusionPattern = &quot;&quot;;
</pre>
<p>These two variables will be used to build the Regex pattern which we will check files and folders against.</p>
<p>Now we&#8217;ll go into</p>
<pre class="brush: csharp; light: true; title: Code block; notranslate">protected override void Execute(CodeActivityContext context)</pre>
<p>explaining each part in more detail.</p>
<pre class="brush: csharp; light: true; title: Code block; notranslate">
            // Obtain the runtime value of the Text input argument
            string fileExclusions = context.GetValue(this.FileExclusions);
            string folderExclusions = context.GetValue(this.FolderExclusions);
            string[] destinations = context.GetValue(this.DestinationDir);
            DirectoryInfo sourceDir = new DirectoryInfo(context.GetValue(this.SourceDir));
</pre>
<p>Here we get the values being passed in at execution time</p>
<pre class="brush: csharp; light: true; title: Code block; notranslate">
            //parse exclusions, add them to regex patterns
            if (!String.IsNullOrWhiteSpace(fileExclusions))
            {
                string[] fileexarr = fileExclusions.Split(',');
                fileExclusionPattern = &quot;(&quot;;
                foreach (string s in fileexarr)
                {
                    fileExclusionPattern += s.ToUpper().Trim().Replace(&quot;.&quot;, @&quot;\.&quot;).Replace(&quot;*&quot;, @&quot;[a-zA-Z0-9]*&quot;) + &quot;|&quot;;
                }

                if(fileExclusionPattern.EndsWith(&quot;|&quot;))
                    fileExclusionPattern = fileExclusionPattern.Substring(0, fileExclusionPattern.Length - 1);

                fileExclusionPattern += &quot;)&quot;;
            }

            if (!String.IsNullOrWhiteSpace(folderExclusions))
            {
                string[] folderexarr = folderExclusions.Split(',');
                folderExclusionPattern = &quot;(&quot;;

                foreach (string s in folderexarr)
                {
                    folderExclusionPattern += s.ToUpper().Trim().Replace(&quot;.&quot;, @&quot;\.&quot;).Replace(&quot;*&quot;, @&quot;[a-zA-Z0-9]*&quot;) + &quot;|&quot;;
                }

                if(folderExclusionPattern.EndsWith(&quot;|&quot;))
                    folderExclusionPattern = folderExclusionPattern.Substring(0, folderExclusionPattern.Length - 1);

                folderExclusionPattern += &quot;)&quot;;
            }
</pre>
<p>Here we check to see if anything was passed into the file or folder exclusion parameters. If something was passed in, we split the comma delimited string into an array and then iterate through it adding the exclusions to their appropriate Regex pattern.</p>
<pre class="brush: csharp; light: true; title: Code block; notranslate">
            foreach (string dir in destinations)
            {
                DirectoryInfo destDir = new DirectoryInfo(dir);

                context.Track(new BuildInformationRecord&lt;BuildMessage&gt;()
                {
                    Value = new BuildMessage()
                    {
                        Importance = BuildMessageImportance.High,
                        Message = &quot;Source: &quot; + sourceDir.FullName + &quot;\nDestination: &quot; + destDir.FullName +
                            &quot;\nFolder Exclusion Pattern: &quot; + folderExclusionPattern +
                            &quot;\nFile Exclusion Pattern: &quot; + fileExclusionPattern,
                    },
                });

                CopyDir(sourceDir, destDir);
            }
</pre>
<p>Now we loop through all the destinations we need to deploy to, copying the files and folders.</p>
<p>Now lets take a look at</p>
<pre class="brush: csharp; light: true; title: Code block; notranslate">private void CopyDir(DirectoryInfo sourceDir, DirectoryInfo destDir)</pre>
<pre class="brush: csharp; light: true; title: Code block; notranslate">
            //create destination dir if it doesn't exist
            if (!destDir.Exists)
            {
                destDir.Create();
            }
</pre>
<p>Let&#8217;s make sure the destination directory exists, creating it if it doesn&#8217;t exist already.</p>
<pre class="brush: csharp; light: true; title: Code block; notranslate">
            // get all files from current dir
            FileInfo[] files = sourceDir.GetFiles();
</pre>
<p>Here we get the all the files from the source directory</p>
<pre class="brush: csharp; light: true; title: Code block; notranslate">
            //copy ze files!!
            foreach (FileInfo file in files)
            {
                if (!String.IsNullOrWhiteSpace(fileExclusionPattern))
                {
                    if (!Regex.IsMatch(file.Name.ToUpper(), fileExclusionPattern))
                    {
                        if (File.Exists(Path.Combine(destDir.FullName, file.Name)))
                        {
                            File.Delete(Path.Combine(destDir.FullName, file.Name));
                        }
                        file.CopyTo(Path.Combine(destDir.FullName, file.Name));
                    }
                }
                else
                {
                    if (File.Exists(Path.Combine(destDir.FullName, file.Name)))
                    {
                        File.Delete(Path.Combine(destDir.FullName, file.Name));
                    }
                    file.CopyTo(Path.Combine(destDir.FullName, file.Name),true);
                }
            }
</pre>
<p>Let&#8217;s copy some files! Check each file against the exclusion pattern, if one is set, and copy it if needed. If the file needs to be copied and it exists in the destination already, we&#8217;ll delete it and copy the file over.</p>
<pre class="brush: csharp; light: true; title: Code block; notranslate">
            // get subdirectories.
            DirectoryInfo[] dirs = sourceDir.GetDirectories();

            foreach (DirectoryInfo dir in dirs)
            {
                // Get destination directory.
                string destinationDir = Path.Combine(destDir.FullName, dir.Name);

                if (!String.IsNullOrWhiteSpace(folderExclusionPattern))
                {
                    if (!Regex.IsMatch(dir.Name.ToUpper(), folderExclusionPattern))
                    {
                        // Call CopyDirectory() recursively.
                        CopyDir(dir, new DirectoryInfo(destinationDir));
                    }
                }
                else
                {
                    // Call CopyDirectory() recursively.
                    CopyDir(dir, new DirectoryInfo(destinationDir));
                }
            }
</pre>
<p>Last we check to see if the directory has any sub-directories and we call CopyDir() recursively to copy all sub directories and files inside them, only of course if they aren&#8217;t on the folder exclusion list.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielcolomb.com/2011/02/23/deploying-to-multiple-locations-in-tfs-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dependency Replication in TFS 2010</title>
		<link>http://www.danielcolomb.com/2011/01/20/dependency-replication-in-tfs-2010/</link>
		<comments>http://www.danielcolomb.com/2011/01/20/dependency-replication-in-tfs-2010/#comments</comments>
		<pubDate>Thu, 20 Jan 2011 17:47:04 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Source Control]]></category>
		<category><![CDATA[TFS]]></category>
		<category><![CDATA[dependency]]></category>
		<category><![CDATA[replication]]></category>
		<category><![CDATA[TFS 2010]]></category>

		<guid isPermaLink="false">http://www.danielcolomb.com/?p=494</guid>
		<description><![CDATA[<p>I&#8217;m not sure exactly how many people do this, but it seems like there isn&#8217;t much documentation out there on how to do this exactly. So after lots of trial and error I&#8217;ve finally gotten dll replication to work for our TFS environment.</p> <p>So, first i&#8217;ll go over the general overview of what needs [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m not sure exactly how many people do this, but it seems like there isn&#8217;t much documentation out there on how to do this exactly. So after lots of trial and error I&#8217;ve finally gotten dll replication to work for our TFS environment.</p>
<p>So, first i&#8217;ll go over the general overview of what needs to be done to enable TFS to replicate files during a build. Just a reminder, this is for TFS 2010, not any previous version of TFS.</p>
<p>1) You&#8217;ll need a custom build template<br />
2) You&#8217;ll need a custom TFS Activity</p>
<p>Second, I&#8217;ll let you know i basically followed the <a href="http://www.ewaldhofman.nl/post/2010/04/20/Customize-Team-Build-2010-e28093-Part-1-Introduction.aspx">tutorials</a> by Ewald Hofman and then modified things to work the way I needed them to.</p>
<p>So our scenario is that we have multiple products that use dll&#8217;s from a core product. When that core product gets changed, we don&#8217;t want to have to copy the dll&#8217;s manually from the build location to the locations needed by the other products. Each one of our products have a folder called SharedBinaries, this is where those dll&#8217;s live.</p>
<p>Now the question is, how do we do this? If you&#8217;re using TFS 2008 or 2005, you can easily just acquire <a href="http://tfsdepreplicator.codeplex.com/">TFS Dependency Replicator</a>, it will handle all that for you. For TFS 2010 however, this doesn&#8217;t work anymore. Or more precisely, I was unable to get it to work. So, time to learn how to use Windows Workflow. At first this seems very daunting, but after you take it a bit at a time, things start to make sense.</p>
<p>I would highly recommend you take a look at the tutorials i mentioned earlier, they will give you a good base to work from. And if i were to go through and document the whole process here, i would feel like i&#8217;m plagiarizing someone else&#8217;s work. Go at least as far as <a title="Creating your own custom activity" href="http://www.ewaldhofman.nl/post/2010/04/29/Customize-Team-Build-2010-e28093-Part-4-Create-your-own-activity.aspx">Part 4 &#8211; Creating your own activity</a>, this is where i&#8217;ll start my documentation.</p>
<p>I created a new Code Activity and called it &#8216;ReplicateFiles.cs&#8217;.  You can download it <a title="Source File" href="http://www.danielcolomb.com/files/ReplicateFiles.cs" target="_blank">here</a>.</p>
<p>You&#8217;ll want to add three Arguments to your custom template.</p>
<p><a href="http://www.danielcolomb.com/wp-content/uploads/2011/01/TemplateArguments.png"><img class="alignnone size-full wp-image-506" title="TemplateArguments" src="http://www.danielcolomb.com/wp-content/uploads/2011/01/TemplateArguments.png" alt="" width="898" height="78" /></a><a href="http://www.danielcolomb.com/wp-content/uploads/2011/01/TemplateArguments.png"><br />
</a></p>
<p>In the Metadata Argument, you&#8217;ll want to add those three Arguments as required fields.</p>
<p><a href="http://www.danielcolomb.com/wp-content/uploads/2011/01/TemplateArgumentsMetadata.png"><img class="alignnone size-full wp-image-504" title="TemplateArgumentsMetadata" src="http://www.danielcolomb.com/wp-content/uploads/2011/01/TemplateArgumentsMetadata.png" alt="" width="920" height="630" /></a></p>
<p>In the custom template, I added the custom activity just before the gated check-in process.</p>
<p><a href="http://www.danielcolomb.com/wp-content/uploads/2011/01/TemplateCustomActivity.png"><img title="TemplateCustomActivity" src="http://www.danielcolomb.com/wp-content/uploads/2011/01/TemplateCustomActivity.png" alt="" width="533" height="776" /></a></p>
<p>Lastly, you&#8217;ll want to add the three Arguments into the appropriate fields on the custom activity properties, as well as specifying the BinariesDirectory as the SourceLocation to copy the files from.</p>
<p><a href="http://www.danielcolomb.com/wp-content/uploads/2011/01/TemplateCustomActivityProperties.png"><img class="alignnone size-full wp-image-503" title="TemplateCustomActivityProperties" src="http://www.danielcolomb.com/wp-content/uploads/2011/01/TemplateCustomActivityProperties.png" alt="" width="312" height="215" /></a></p>
<p>While setting up your build, you&#8217;ll want to make sure you fill out those newly required fields in Build Editor Process Section.</p>
<p><a href="http://www.danielcolomb.com/wp-content/uploads/2011/01/BuildDefinitionProcessDetails1.png"><img class="alignnone size-full wp-image-512" title="BuildDefinitionProcessDetails" src="http://www.danielcolomb.com/wp-content/uploads/2011/01/BuildDefinitionProcessDetails1.png" alt="" width="795" height="321" /></a></p>
<p>Before you go wild and start running builds, go through this checklist.</p>
<ul>
<li>Does your build controller know the path to the custom binaries you&#8217;ve made (for the custom build activity).  (<a title="How is custom assembly found" href="http://www.ewaldhofman.nl/post/2010/05/27/Customize-Team-Build-2010-e28093-Part-7-How-is-the-custom-assembly-found.aspx" target="_blank">reference</a>)</li>
<li>Have you checked in the latest version of your custom template, as well as the custom activity dll</li>
</ul>
<ul>
<li>The required arguments in the ReplicateFiles.cs are what you pass into the class from the custom template you&#8217;ve created, make sure those are filled out in the build template.</li>
<li>Make sure you have the correct path to your TFS server for tfsName in ReplicateFiles.cs.</li>
<li>Make sure that the user you run your build service under has file system permissions for the location where you want to create your temporary workspaces.</li>
<li>I had this issue, and it almost drove me nuts! I kept getting access denied errors when trying to overwrite the files in the target branches. Make sure that the files being replicated ARE NOT checked out and locked!</li>
</ul>
<p>If you have any corrections, feedback, or ideas! Please comment and let me know!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielcolomb.com/2011/01/20/dependency-replication-in-tfs-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A few weeks in the making</title>
		<link>http://www.danielcolomb.com/2010/10/19/a-few-weeks-in-the-making/</link>
		<comments>http://www.danielcolomb.com/2010/10/19/a-few-weeks-in-the-making/#comments</comments>
		<pubDate>Tue, 19 Oct 2010 17:57:37 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[entertainment]]></category>
		<category><![CDATA[INTERNETS!]]></category>
		<category><![CDATA[music]]></category>
		<category><![CDATA[Arduino UNO]]></category>
		<category><![CDATA[Benoît Mandelbrot]]></category>
		<category><![CDATA[F*ck You]]></category>
		<category><![CDATA[GIS]]></category>
		<category><![CDATA[NES]]></category>
		<category><![CDATA[XOS2]]></category>

		<guid isPermaLink="false">http://www.danielcolomb.com/2010/10/19/a-few-weeks-in-the-making/</guid>
		<description><![CDATA[<p>Over the last few weeks i&#8217;ve been collecting links i think are neat or interesting or adorable or funny. So some of these links aren&#8217;t even current events (in Internet terms, when yesterday&#8217;s news is already old news and no one cares anymore), but I&#8217;d still like to share them. I think here in [...]]]></description>
			<content:encoded><![CDATA[<p>Over the last few weeks i&#8217;ve been collecting links i think are neat or interesting or adorable or funny. So some of these links aren&#8217;t even current events (in Internet terms, when yesterday&#8217;s news is already old news and no one cares anymore), but I&#8217;d still like to share them. I think here in the future i&#8217;ll be posting some more stuff with actual content. Things have been kinda blah lately. I think we might go shoosting this weekend, I&#8217;ll be sure to take pictures if we do.</p>
<p><a href="http://www.nytimes.com/2010/10/17/us/17mandelbrot.html?_r=2" target="_blank">Benoît Mandelbrot Has Passed Away</a><br />
Honestly I don&#8217;t know much about Mandelbrot sets or Fractal geometry, but i do recognize that Mandelbrot was a genius. Enough so that he even has songs written about him (<a title="Jonathan Coulton - Mandelbrot Set" href="http://danielcolomb.com/media/05 Mandelbrot Set.mp3" target="_blank">Mandelbrot Set</a>).</p>
<p><a title="Fuck You Sega" href="http://www.youtube.com/watch?v=7HI-ZMjn9d8" target="_blank">Angry NES&#8217;s version of Cee Lo&#8217;s &#8220;F*ck You&#8221;</a></p>
<p><strong><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.youtube.com/v/7HI-ZMjn9d8?fs=1&amp;hl=en_US" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/7HI-ZMjn9d8?fs=1&amp;hl=en_US" allowfullscreen="true"></embed></object><br />
</strong>I like this song.</p>
<p><a href="http://www.mysqlfanboy.com/" target="_blank">MySQL Fanboy&#8217;s GIS Articles</a><br />
Not everyone is into GIS, but i think it could have some really neat applications in mobile development.</p>
<p><a href="http://blog.makezine.com/archive/2010/09/2nd-generation_raytheon_exoskeleton.html" target="_blank">Raytheon XOS2 &#8212; Pretty cool</a><br />
I think before long we&#8217;re going to have real life bipedal weapons platforms. Gundams and Evas and Dragonauts! <img src='http://www.danielcolomb.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p><a href="http://www.theatlantic.com/national/archive/2010/09/more-on-the-wealthy-poor-and-a-fair-society/63582/" target="_blank">Perceived Wealth Distribution and Reality</a><br />
I found this interesting. It seems that people think the income gap is a lot smaller than it actually is..</p>
<p><a href="http://www.washingtontimes.com/news/2010/sep/28/survey-americans-dont-know-much-about-religion/" target="_blank">Americans don&#8217;t know much about religion </a><br />
This i found amusing, mainly because I know so many people who think themselves quite religious, but then when you want to have actual discussion or debate about theological issues they can&#8217;t seem to defend their positions.</p>
<p><a href="http://www.ladyada.net/library/arduino/unofaq.html" target="_blank">Arduino UNO FAQ on LadyAda.net</a><br />
For those of you who use Arduinos and are interested in how the new UNO&#8217;s differ from the older series. Take a look here.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielcolomb.com/2010/10/19/a-few-weeks-in-the-making/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Tupperware Computing!</title>
		<link>http://www.danielcolomb.com/2010/10/10/tupperware-computing/</link>
		<comments>http://www.danielcolomb.com/2010/10/10/tupperware-computing/#comments</comments>
		<pubDate>Mon, 11 Oct 2010 00:16:20 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[entertainment]]></category>
		<category><![CDATA[friends]]></category>
		<category><![CDATA[INTERNETS!]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[computing]]></category>
		<category><![CDATA[home made]]></category>
		<category><![CDATA[lubuntu]]></category>
		<category><![CDATA[tupperware]]></category>

		<guid isPermaLink="false">http://www.danielcolomb.com/?p=463</guid>
		<description><![CDATA[<p>A few days ago my roommate got a box of random electronic parts donated to him. Most of the stuff was junk, only good to salvage parts off of. But there were two items that we did find of interest. Two motherboards that seemed like they were still in pretty good condition.</p> <p>What if [...]]]></description>
			<content:encoded><![CDATA[<p>A few days ago my roommate got a box of random electronic parts donated to him. Most of the stuff was junk, only good to salvage parts off of. But there were two items that we did find of interest. Two motherboards that seemed like they were still in pretty good condition.</p>
<p>What if we could get them up and running again?</p>
<p>And so our weekend project was started!</p>
<p><a class="tt-flickr tt-flickr-Small" title="IMAG0080" href="http://www.danielcolomb.com/flickr/photo/5069832604/imag0080.html"><img class="alignleft" src="http://farm5.static.flickr.com/4150/5069832604_3d79eed8f3_m.jpg" alt="IMAG0080" width="180" height="240" /></a> First we got an old power supply and some old RAM we had laying around and plugged everything up to see if it would even turn on. That turned out to be a bit more trouble than we initially thought we&#8217;d have. Sean searched the internet for the manual to the motherboard and we found the pins that the power button was to plug up to. One small problem, we didn&#8217;t have a power button. So while Sean got something together, we used a set of hemostats to bridge the pins and power on the pile of parts. Something was wrong though, the monitor we had hooked up to it didn&#8217;t show anything. and since we didn&#8217;t have a PC speaker, we couldn&#8217;t hear beep codes. We almost resorted to the ancient art of poke-at-it-with-a-screwdriver when i noticed a jumper in between the two RAM banks. I pulled it out and tried the power and BAM! POST!<a class="tt-flickr tt-flickr-Small" title="IMAG0081" href="http://www.danielcolomb.com/flickr/photo/5069832864/imag0081.html"><img class="alignright" src="http://farm5.static.flickr.com/4130/5069832864_241fedd3cd_m.jpg" alt="IMAG0081" width="240" height="180" /></a> By this time Sean had gotten a power button and a light soldered together for us to use. Now we needed some sort of boot up medium, and we decided that a USB drive would be optimal. We got a 2GB drive from Walmart and loaded it up with <a title="Lubuntu.net" href="http://www.lubuntu.net/" target="_blank">Lubuntu</a>.</p>
<p>After tweaking the BIOS settings a bit we finally were able to boot off the USB drive and get to the boot menu for the drive. On our first attempt to boot from the drive we got a kernel panic so we decided to test the RAM. That ended up being a good idea, since we discovered all of our extra DDR RAM was bad. Into the trash with that stuff! Luckily there was a second bank of RAM slots on the motherboard which supported SDRAM, an older format of RAM.</p>
<p>Sean pulled out the motherboard for one of his first computers, Jenny, and luckily it still had RAM in it&#8217;s banks! Thank god for hording computer parts <img src='http://www.danielcolomb.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  We pulled out two of the ram sticks and tested them. They were good to go!<a class="tt-flickr tt-flickr-Small" title="IMAG0095" href="http://www.danielcolomb.com/flickr/photo/5069230203/imag0095.html"><img class="alignleft" src="http://farm5.static.flickr.com/4150/5069230203_c5b4f0c5af_m.jpg" alt="IMAG0095" width="180" height="240" /></a> We booted up and tada! We got a loading screen. It seemed to take forever to load, then we noticed we&#8217;d forgotten to put in the second chip of RAM, whoops :3</p>
<p>Now we&#8217;re in the process of updating the <a title="Ubuntu.com" href="http://www.ubuntu.com/" target="_blank">Ubuntu</a> core and then we&#8217;re going to see if we can get some sort of clustering up and running. It would be neat to get a farm up and running.</p>
<p>There are more pictures on <a title="Tupperware Computing Set" href="http://www.flickr.com/photos/29008510@N04/sets/72157625011929859/" target="_blank">my flickr account</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielcolomb.com/2010/10/10/tupperware-computing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

