﻿<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0">
  <channel>
    <atom:id>tag:blogger.com,1999:blog-6643058391401503372</atom:id>
    <lastBuildDate>Thu, 16 Feb 2012 22:31:29 +0000</lastBuildDate>
    <category>Wireless</category>
    <category>Alternative Currency</category>
    <category>Mapping</category>
    <category>Internet</category>
    <category>Notification</category>
    <category>Email</category>
    <category>process</category>
    <category>Pipes</category>
    <category>BizTalk</category>
    <category>Cryptocurrency</category>
    <category>Build</category>
    <category>BitCoin</category>
    <category>T4</category>
    <category>Finance</category>
    <category>Job</category>
    <category>C#</category>
    <category>Notifio</category>
    <category>iPhone</category>
    <category>Data</category>
    <category>Continous-Integration</category>
    <category>VMware</category>
    <category>FTP</category>
    <category>TeamCity</category>
    <category>team-city</category>
    <category>code-generation</category>
    <category>Passwords</category>
    <category>asp.net</category>
    <category>.net</category>
    <category>Push</category>
    <category>svn</category>
    <title>kevin-kinnett</title>
    <description>
    </description>
    <link>kevinkinnett.com</link>
    <managingEditor>kevin@kevinkinnett.com (Kevin Kinnett)</managingEditor>
    <generator>Blogger</generator>
    <openSearch:totalResults>10</openSearch:totalResults>
    <openSearch:startIndex>1</openSearch:startIndex>
    <openSearch:itemsPerPage>25</openSearch:itemsPerPage>
    <item>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-6643058391401503372.post-8324983341234950475</guid>
      <pubDate>Fri, 13 Jan 2012 15:01:00 +0000</pubDate>
      <atom:updated>2012-01-13T09:59:11.570-08:00</atom:updated>
      <category domain="http://www.blogger.com/atom/ns#">BizTalk</category>
      <category domain="http://www.blogger.com/atom/ns#">Mapping</category>
      <category domain="http://www.blogger.com/atom/ns#">C#</category>
      <title>Calling external C# assemblies with overloaded methods using the params keyword in BizTalk 2010</title>
      <description>&lt;p class="MsoNormal"&gt;I created the following method, calling it from a BizTalk mapping functoid not long ago.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;        &lt;span style="color:blue"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p class="MsoNormal" style="text-align: left;margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt; TrimAll(&lt;span style="color:blue"&gt;params&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt;[] addressInfo)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;        {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;              …&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;        }&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: left;margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p class="MsoNormal" style="text-align: left;margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span&gt;I used params because I need to pass in eight string arguments which I was preforming more or less the same operations on. I was curious to see if BizTalk would resolve the method properly. As you’d expect, it did not, and gave me an exception about the number of arguments needed when I tried to test the map.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span&gt;No problem! I just overloaded the method in the class, which explicitly contained eight string parameters. I would not need to change the BizTalk map, as it would resolve to this method, which would in turn call the parameterized methods.&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; "&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;        &lt;span style="color:blue"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt; TrimAll(&lt;span style="color:blue"&gt;string&lt;/span&gt; address1, &lt;span style="color:blue"&gt;string&lt;/span&gt; address2, &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;span style="color:blue"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;string&lt;/span&gt; address3, &lt;span style="color:blue"&gt;string&lt;/span&gt; address4, &lt;span style="color:blue"&gt;string&lt;/span&gt; address5, &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;span style="color:blue"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;string&lt;/span&gt; address6, &lt;span style="color:blue"&gt;string&lt;/span&gt; address7, &lt;span style="color:blue"&gt;string&lt;/span&gt; address8)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;        {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;span style="color:blue"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;return&lt;/span&gt; TrimAll(address1, address2,&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;address3, address4, address5,&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;address6, address7, address8);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;        }&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;But this time, when I tried to test run the map, Visual Studio crashed ungracefully!! So instead of overloading I changed the name of the method…&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;        &lt;span style="color:blue"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;span style="color:blue"&gt;private&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt; TrimIt(&lt;span style="color:blue"&gt;params&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt;[] addressInfo)&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-family: Consolas; "&gt;…and I called it like this…&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-family: Consolas; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;            &lt;span style="color:blue"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;span style="color:blue"&gt;return&lt;/span&gt; TrimIt(&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;address1, address2,&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;address3, address4, address5,&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;address6, address7, address8);&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;This time it ran without error. For kicks I changed it to be an overloaded method again and it crashed consistently. The take away here is that you cannot expose any method that uses the params keyword to the BizTalk mapper.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6643058391401503372-8324983341234950475?l=kevin-kinnett.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <link>www.kevinkinnett.com/Default.aspx?pub=2012-01-13T10:01:00</link>
      <author>kevin@kevinkinnett.com</author>
      <thr:total>0</thr:total>
    </item>
    <item>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-6643058391401503372.post-2547700475894193886</guid>
      <pubDate>Thu, 22 Dec 2011 18:47:00 +0000</pubDate>
      <atom:updated>2012-01-13T07:15:38.288-08:00</atom:updated>
      <category domain="http://www.blogger.com/atom/ns#">BizTalk</category>
      <category domain="http://www.blogger.com/atom/ns#">FTP</category>
      <category domain="http://www.blogger.com/atom/ns#">C#</category>
      <title>Updated BizTalk FTP Port Change Projected</title>
      <description>I have updated the BizTalk ChangeFTPPortProperties project. I have updated the user interface, and updated the project for Visual Studio 2010. The tool will now work on BizTalk 2009 and BizTalk 2010 installations. There is a known limitation that this tool will NOT work on clustered or grouped installs. However, it &lt;i&gt;will&lt;/i&gt; run in 64bit environments. You can download the source and the executable &lt;a href="http://kevinkinnett.com/Files/ChangeFTPPortProperties_V2.zip"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6643058391401503372-2547700475894193886?l=kevin-kinnett.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <link>www.kevinkinnett.com/Default.aspx?pub=2011-12-22T13:47:00</link>
      <author>kevin@kevinkinnett.com</author>
      <thr:total>0</thr:total>
    </item>
    <item>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-6643058391401503372.post-7820988387219370689</guid>
      <pubDate>Fri, 06 May 2011 00:41:00 +0000</pubDate>
      <atom:updated>2011-05-07T10:05:25.558-07:00</atom:updated>
      <category domain="http://www.blogger.com/atom/ns#">VMware</category>
      <category domain="http://www.blogger.com/atom/ns#">Continous-Integration</category>
      <category domain="http://www.blogger.com/atom/ns#">TeamCity</category>
      <category domain="http://www.blogger.com/atom/ns#">svn</category>
      <title>Continuous Integration/Deployment: My Own Example</title>
      <description>&lt;a href="http://kevinkinnett.com/Default.aspx?pub=2011-04-08T15:17:00"&gt;Previously&lt;/a&gt;, I had talked about why continuous integration (CI) is the best approach to software development in terms of improving software quality and saving time and effort for developers on a team. Now I want to explain how I maintain this page among other projects using continuous integration and continuous deployment and why this is beneficial even for one person projects.  I should note that what I am about to describe I would not exactly recommend using in a business environment, I’ll describe that a later (however, if you don’t have any CI environment, this would be a huge improvement). &lt;br /&gt;&lt;br /&gt;First, I use the following software:&lt;br /&gt;1) &lt;a href="http://www.iis.net/"&gt;IIS – Microsoft’s Web Server&lt;/a&gt;.&lt;br /&gt;2) &lt;a href="http://ankhsvn.open.collab.net/"&gt;Subversion (svn) – Source Control&lt;/a&gt;&lt;br /&gt;3) &lt;a href="http://www.jetbrains.com/teamcity/"&gt;Team City - an application specifically built for CI and build management&lt;/a&gt;.&lt;br /&gt;4) &lt;a href="http://subversion.tigris.org/"&gt;Subversion plug-in for Visual Studio&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I have my own windows server set up, which is running the svn server, the Team City server, and IIS.  I have various Team City builds monitoring different parts of the source tree. Whenever I make a change and commit it, the build that monitors &lt;a href="http://kevinkinnett.com"&gt;kevinkinnett.com&lt;/a&gt; will see the change and get kicked off. I’ve configured the build with the following steps:&lt;br /&gt;1) Pulls down a new copy of the source into a temporary build directory&lt;br /&gt;2) Builds the entire solution&lt;br /&gt;3) If, and only if, the solution compiles then a series of unit tests are run against the compiled project.&lt;br /&gt;4) If, and only if, all of the unit tests pass then the solution compiles then a MSBuild script runs which does the following:&lt;br /&gt;   a. Stops IIS&lt;br /&gt;   b. Deploys the artifacts specifically needed to run the application (aspx pages, dlls, etc) to where the directory that IIS is running the site out of.&lt;br /&gt;   c. Restarts IIS&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-tU7udei_NpE/TcV7kRVN8mI/AAAAAAAAEd0/5EnkP61oH6g/s1600/TeamCityBuildNotification.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 400px; height: 203px;" src="http://2.bp.blogspot.com/-tU7udei_NpE/TcV7kRVN8mI/AAAAAAAAEd0/5EnkP61oH6g/s400/TeamCityBuildNotification.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5604021174390354530" /&gt;&lt;/a&gt;If any of the steps fail then Team City tray notification application gives a dashboard display of the status of the builds (see the picture). I can easily see if any changes I have made have caused any deployment issues, and if not, it informs me of when the changes have made to the live environment. &lt;br /&gt;&lt;br /&gt;You can really see the benefit if you consider another project I have that are a series of windows services that monitor various things like rss feeds and host their own WCF services. The steps in this build are as follows:&lt;br /&gt;&lt;br /&gt;1) Pulls down a new copy of the source into a temporary build directory&lt;br /&gt;2) Builds the entire solution&lt;br /&gt;3) If, and only if, the solution compiles then a series of unit tests are run against the compiled project.&lt;br /&gt;4) If, and only if, all of the unit tests pass then a MSBuild script runs which does the following:&lt;br /&gt;   a. Stops the correct windows service&lt;br /&gt;   b. Uninstalls the windows service&lt;br /&gt;   c. Deploys the new service&lt;br /&gt;   d. Starts the new service&lt;br /&gt;&lt;br /&gt;For either the webpage or the windows services, if I wanted to deploy by hand it would take fair bit of time and trouble each time I wanted to do it. This automates the entire process, freeing me to continue to work while the new versions are being pushed out there for me. If I made any mistakes and I have done my due diligence writing tests that cover those cases, then I will have a helpful error message in the tray notification icon soon after I deploy (remember it is easier to track down recent mistakes) and prior to it going out into the live system (fixing bugs before they make it to production).&lt;br /&gt;&lt;br /&gt;I think took me somewhere in the neighborhood of 3 to 4 hours to set up and maintain this process. But how much time did this save me? You can see from the picture that I have done something like 96 deployments of this page alone. It would have taken may times that initial investment to have done all those deployments by hand. What I’ve been able to do is make small incremental changes whenever I want and deploy them without any pain at all. &lt;br /&gt;&lt;br /&gt;Here are some other benefits:&lt;br /&gt;1) I can easily track the changes I have made through the project and revert them if necessary and have the reverted site live within minutes.&lt;br /&gt;2) If I wanted to work on my projects on another machine, I could just pull down the latest version of the project and start working almost immediately. &lt;br /&gt;3) If I wanted someone else to start working on my project tomorrow, I’d simply have to give him access to the svn server, and he could pull down the code and start working immediately. Any time he made changes, I’d have higher level of assurance that his code would work and not take down the live environment. Plus, he would have the ability to deploy his changes without needing to know how to log into the box and do it himself.&lt;br /&gt;&lt;br /&gt;If you were doing this in a business environment then you should definitely maintain a separate build environment from your production environment, plus you should have separate development and quality assurance environments as well. &lt;br /&gt;&lt;br /&gt;Here is one potential real-world scenario: &lt;br /&gt;1) Your continuous integration environment builds you project.&lt;br /&gt;2) Runs unit tests against the compiled project.&lt;br /&gt;3) Creates deployment artifacts (such as a MSI). &lt;br /&gt;4) Uses those artifacts to deploy the entire project to a separate test environment.&lt;br /&gt;5) Run integration tests against that test environment (such as database tests, or automated UI tests).&lt;br /&gt;6) Later, if those tests are successful, another build target takes the deployment artifacts of the most recent successful build and test (or one that you specify) and deploys it to the Quality Assurance environment.&lt;br /&gt;7) QA engineers then run manual functional and regression tests against it. &lt;br /&gt;8) If these tests are successful then the same deployment artifacts can be used to make a deployment to production. &lt;br /&gt;&lt;br /&gt;If you have a reasonable facsimile of the production on your dev and QA environments then this can help ensure a success deployment with less potential for bug being introduced. &lt;br /&gt;&lt;br /&gt;I’ve heard of people having a process similar to the above example but instead using the &lt;a href="http://www.vmware.com/support/pubs/sdk_pubs.html"&gt;API&lt;/a&gt; provided by VMware to create actual running VMs with the product installed on them as a build artifact. It is the actual VM itself that is tested, passed to QA, and deployed to production. This way you are guaranteed that your environments are identical, and what you deploy to production is the same as what you have tested.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6643058391401503372-7820988387219370689?l=kevin-kinnett.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <link>www.kevinkinnett.com/Default.aspx?pub=2011-05-05T20:41:00</link>
      <author>kevin@kevinkinnett.com</author>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-tU7udei_NpE/TcV7kRVN8mI/AAAAAAAAEd0/5EnkP61oH6g/s72-c/TeamCityBuildNotification.png" height="72" width="72" />
      <thr:total>0</thr:total>
    </item>
    <item>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-6643058391401503372.post-7546078257716531197</guid>
      <pubDate>Sat, 30 Apr 2011 15:25:00 +0000</pubDate>
      <atom:updated>2011-04-30T15:31:25.319-07:00</atom:updated>
      <category domain="http://www.blogger.com/atom/ns#">BitCoin</category>
      <category domain="http://www.blogger.com/atom/ns#">Finance</category>
      <category domain="http://www.blogger.com/atom/ns#">Alternative Currency</category>
      <category domain="http://www.blogger.com/atom/ns#">Cryptocurrency</category>
      <title>BitCoin</title>
      <description>&lt;a href="http://www.bitcoin.org/"&gt;BitCoin&lt;/a&gt; is a peer-to-peer crypto currency. Peer-to-peer means that no central authority issues new money or tracks transactions. These tasks are managed collectively by the network. BitCoin has garnered quite a bit of &lt;a href="http://news.google.com/news/search?aq=f&amp;pz=1&amp;cf=all&amp;ned=us&amp;hl=en&amp;q=bitcoin"&gt;attention &lt;/a&gt;of &lt;a href="http://trends.google.com/trends?q=bitcoin&amp;ctab=0&amp;geo=all&amp;date=2011&amp;sort=0"&gt;late&lt;/a&gt;. What is it? Why use it? I’ll try to answer this below. &lt;br /&gt;&lt;br /&gt;Why BitCoin? With all money there is the problem of &lt;a href="http://en.wikipedia.org/wiki/Double-spending"&gt;double spending&lt;/a&gt;. With electronic representation of money in the modern age, it is easy for a financial institution to say that it has your money and then loan it to someone else, then loan it to someone else, etc. The only solution to the problem is heavy government regulation of financial institutions, and we have seen how good that works especially recently (think the Federal Reserve). BitCoin has solved this problem. &lt;br /&gt;&lt;br /&gt;How does it work? There is a BitCoin application that you install on your computer. Each computer running this application operates a peer node in the BitCoin network. All the nodes in the network effectively keep account of all of the transactions that take place in the system. The individuals making the transactions are known only by a long number but the transactions themselves are 'confirmed' by other clients on the network. New BitCoins are slowly entered into the system in the following way: each client has an option of mining. When a client is mining it will make attempts to solve the next block in a chain; this is really just a long sequence of a mathematical problem. This chain keeps track of the history of all the BitCoin transactions. When a node solves this problem it is rewarded with a set about of BitCoins, over time this amount is more and more slowly decreased. It is extremely rare to get rewarded. Given the current difficulty, a standard desktop would have to mine for something like a year before it might randomly solve one of these problems.&lt;br /&gt;&lt;br /&gt;What are the advantages of this system? With our monetary system the only value that the dollar or any other fiat currency has is the faith that you in the issuing institution. BitCoin is completely transparent and open source, so you don't have to trust it, you can look for yourself at the code and the transactions going on. I KNOW that there are only 5 million BitCoins currently in the world, and I know that there will only be 21 million or so total (in about 100 years), because of the mathematics behind it. Right now, you can trade USD, AUS, RUB, or EUR back and forth for BitCoins. There are people accepting BitCoins in exchange for goods and services. &lt;br /&gt;&lt;br /&gt;What are the disadvantages of this system? I worry about BitCoins &lt;a href="http://bitcoincharts.com/charts/mtgoxUSD#rg60zvztgSzm1g10zm2g25"&gt;recent run up&lt;/a&gt;; they have gone from around 30 cents a BitCoin on November of 2010, to, as I write this at the end of April, to almost 4$ per BitCoin. On the surface that sounds great, but with a huge upswing in value it is very likely to have a huge downswing at some point soon. Ideally you would want to see a lot more stability around something like this for more widespread adoption. Another problem is that governments may try to make it illegal. Money and monetary policy is the central means by which governments exert power. BitCoin would take away much of that power. You could make the argument that by its nature it would be hard to get rid of, and you would be correct. But, the vast majority of people would probably not use it if it were to become illegal.&lt;br /&gt;&lt;br /&gt;What is most likely going to happen? I think BitCoins are going to part of our future. I doubt that I will be able to use them one day to fill up my tank at a gas station, or tip a server at a restaurant. But the real promise is the Internet. Newspapers are going out of business because no one will pay money for access to a news website, because there is so much free news. But, consider if there was a way to pay 2 or 3 cents to view a story from a reputable news source. I might be willing to pay that, but how do I get the money to them? I'd have to enter in my credit card information, but I am not going to do that. Even if I could, the credit card transaction fee would make it a losing scenario for the seller. But what if there was an easy way, built into the browsers to send cents or even fraction of cents to wherever without transaction fees? BitCoin has that potential. My hope is that they will become the de-facto recognized currency for certain things on the Internet, and solve the micro payment problem once and for all.&lt;br /&gt;&lt;br /&gt;And by the way, if you like my website or have found it usefully, why consider sending me some BitCoins at this address 173mvmf9Cw2AUKCKf35yG7dPNXN8oySZ3X&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6643058391401503372-7546078257716531197?l=kevin-kinnett.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <link>www.kevinkinnett.com/Default.aspx?pub=2011-04-30T11:25:00</link>
      <author>kevin@kevinkinnett.com</author>
      <thr:total>0</thr:total>
    </item>
    <item>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-6643058391401503372.post-5477471132296101300</guid>
      <pubDate>Fri, 08 Apr 2011 19:17:00 +0000</pubDate>
      <atom:updated>2011-04-08T13:26:12.517-07:00</atom:updated>
      <category domain="http://www.blogger.com/atom/ns#">process</category>
      <category domain="http://www.blogger.com/atom/ns#">Continous-Integration</category>
      <category domain="http://www.blogger.com/atom/ns#">Build</category>
      <category domain="http://www.blogger.com/atom/ns#">.net</category>
      <category domain="http://www.blogger.com/atom/ns#">team-city</category>
      <title>Continuous Integration or To Err is Human</title>
      <description>&lt;p&gt;I am constantly astounded at the number of shops out there that do not have source control not to mention even the most rudimentary build server or continuous integration environment. Or worse, there are developers that scoff at the idea of being ‘held back’ by things like this. More commonly management considers this a waste of time.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;My Personal Experience&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Fresh out of college I worked for a company that had a full-fledged continuous integration environment. In other words, whenever anyone checked in any project code ro artifacts for any project, a process somewhere would be monitoring source control and a build would get kicked off. That project, plus any dependent projects, will get checked out and built. If and only if it built without any errors, that build would then have a series of unit tests run against it. If any of the unit tests did not pass then the build was considered to be broken.&lt;/p&gt; &lt;br /&gt;&lt;p&gt;As I first joined the company, I was part of the team that took this one step further. Each night we would automatically take the latest successful build and install it in a clean environment, then load a bunch of test data in to it, and run a series of integrations tests against. These test were mostly automated UI tests, and generally verified use cases or user scenarios could be accomplished. Also, there was a series of tests performed against the database.&lt;/p&gt; &lt;br /&gt;&lt;p&gt;The results of these tests were automatically compiled together and displayed a SharePoint site, and were broken down into various graphs and what not, and visible to all the development teams, management, and product/project management to see.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The advantage of a system like this are pretty obvious.&lt;p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Developers would know the minute the broke something, or forgot to check something in. As a result of the fast feedback loop, the developer at fault would generally know exactly what he did wrong because he was just working on it. Plus no one else ever wasted time trying to figure out why what the code they just pulled down out of source control would not compile.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Not wanting to break the build, developers would run all the unit tests prior to checking in, catching many bugs before it even reached source control.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Writing unit tests along with your code is very beneficial to distinguish what exactly it is you are trying to get your code to do. So if I made changes, then ran all the unit tests and found I broke one, reading the unit test that broke would more quickly reveal the intent of the code that was broken and to know when it was fixed.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Best of all the progress on the project was completely transparent. Any kind of problems were obviously from the beginning and could be addressed early and dealt with efficiently. This might be having someone else, who has experience with the problem take a look at it, or the project scope/time might need to be changed.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;As this was my first job out of college, I was extremely naïve and thought that this was the norm for software development shops. Now that I have been in a dozen or more software development environments and found none having anything like this, most not even having a build server, and some do not even have source control, I can say without a doubt that continuous integration buys you so much in terms of time, money and quality.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Objections&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Let go over each objection to using it.&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It takes more time to write, develop, and maintain unit tests. We have limited time on this project so we can worry about them later.&lt;br/&gt;&lt;br /&gt;&lt;p&gt;What no one considers is that when I write new code, and most people I know do the same, I write some sort of test harness anyway (an executable, a web page, a win32 app, something), so I can call the code I am writing over and over again while I am writing it. In this way I can have some level of assurance that the interface I am writing for is correct.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So, while it is true that it does take time, in many ways it is just a standardization and capturing of the code that is already being written and thrown away anyway.&lt;/p&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It will take time to set up and maintain the build server and the machines will cost additional resources we do not have.&lt;br/&gt;&lt;br /&gt;&lt;p&gt;Assuming that you are using source control anyway, it is not complicated to set up a build server. I have used cruise control .net and another product called team city. Cruise control is free, team city is commercial product but is free for up to a certain number of developers. I’ve set both of these up to do a simple build on extremely underpowered machines and they run fine. Depending on the complexity of your build it should take a competent  person less than a day to get initially up and running for a single build. With team city using their web interface, if you are using svn or TFS you can just point to your source control machine, give it credentials then it is literally just a drop down menu for a visual studio sln build, you can point to it and about as complicated as it gets. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;If your build is very complex you will most likely need to write a build script. If you are on the Microsoft stack then you will most likely want to use MSbuild. Again, this is probably a good exercise to do anyway. Not only will it save tons of time every time a developer comes on the project, but it will bring to light a bunch of issues and dependencies that your project has and you need to know about and document anyway… right?&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Once, there was a bug that one of my colleagues was working on. After about a half a day he had made little progress and ask me to help. I looked at it for another 3 or 4 hours and made some progress but the bug was not resolved. Finally another developer looked at it for another few hours before fixing it. So 1 bug took 3 developers  a total of 8 or 9 hours to fix. What does 1 hour of developer time cost a company, maybe 100$? So 9 hours times 100$ is 900$ to fix that one bug. This is an extreme example, but each bug effectively can cost an organization several hundred dollars apiece to fix, and that is only development time. Do you have QA and deployment process as well? This will cost. Consider, it might cost you say 2 or 3 thousand dollars to set up a continuous integration environment in terms of time and hardware. And developers might send an extra 10% of their time writing and maintaining tests. If even 25% of bugs are caught up front then that organization has already saved a ton of money for very little overhead.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Even consider the savings simply setting up a simple build server. At one company I was at, I probably wasted 10 to 15 hours a month dealing with and tracking down, why the source I just pulled down did not compile. Again, my salary + benefits + the building I was working in + HR costs + opportunity cost of not working on new features + etc. etc. = 1000$ or 1500$ in wasted time. Having even one developer spending one day could have saved so much wasted time, energy, and money.&lt;/p&gt;&lt;br /&gt;&lt;li&gt;This is complicated and will confuse people.&lt;br/&gt;&lt;br /&gt;&lt;p&gt;Okay, after setting up a continous integration environment in my own spare time to show a manger what kind of benefits it could bring, this was his objection. My response to this is: what kind of people have you hired that they cannot deal with something like this? Developers and generally pretty smart I am sure they can handle it. This is not a new technology, it has been around for years and it benefits have been proven. In his defense he let me go ahead and set it up but I could only build once a night. Of course he was never on board with any organizational buy-in or integrating it into the development process (which, even if he was, was beyond his control).&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;Here are some objections that a developer might have.&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I don’t want to be blamed or ridiculed if I break the build. We have a complex product and this is easy to do.&lt;br/&gt;&lt;br /&gt;&lt;p&gt;If everyone in your organization is an adult (hope most organizations can say this is mostly true) they should be able to handle it. The effect over time of everyone on the team being aware of this should cause more focus to be placed on improving the problem that exist that are causing this. This will in turn reduce the amount of time spent wading through the complexity and allow individual developers to focus on the problems at hand.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Software development is complex by nature. It is far better to realize there is a problem now when you break the build or a test, than six months from now when it is deployed into a customer’s environment and is causing major chaos. Everyone makes mistakes: this is human. This process is simply a recognition of that fact and an attempt to control for it.&lt;/p&gt;&lt;br /&gt;&lt;li&gt;Our product is an enterprise app and I couldn’t possible deploy and test this thing realistically.&lt;br/&gt;&lt;br /&gt;&lt;p&gt;Study up on testing. In particular mocking. You can write you code in such a way using something like dependency injection and the mock test pattern to create a mock or a fake interface such that when you run your tests, they are testing your code and your code alone.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I’ve seen continuous integration environments that use the API for VM ware to spin up multiple new VMs that then have various products that talk to each other all up and running so that you can run actual integration testing automatically in your environment.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Check out &lt;a href="http://msdn.microsoft.com/en-us/vstudio/ee712698"&gt;Microsoft’s Team Foundation Lab Management&lt;/a&gt;. It basically has solved this problem for you.&lt;p&gt;&lt;/ul&gt; &lt;br /&gt;&lt;p&gt;&lt;b&gt;Benefits in Terms of Quality&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The software industry in my options is facing a crisis of quality. No one trusts their software, and with good reason. Most software that is built, even very expensive enterprise level software is riddled with bugs and security problems.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Management could make the argument and many times does, that it isn’t worth the extra cost to implement this because they never intended on fixing those bugs anyway. This could make sense from a business perspective. If one bug is effecting one customer sometimes, then it may not be worth the 1000$ it might take to fix it, go through QA and deploy.&lt;/p&gt; &lt;br /&gt;&lt;p&gt;There is two point I would make against this.&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What is your reputation worth?&lt;/li&gt;&lt;br /&gt;&lt;p&gt;What is this bug really costing you? 1000$? Over time, if your customer, be it an outside company, or another group within your organization, loses confidence in the quality of your software then they will advise others not to buy your software, move on to a competitor, or complain loudly enough to management that you are replaced.&lt;/p&gt;&lt;br /&gt;&lt;li&gt;You don’t know what you don’t know.&lt;/li&gt;&lt;br /&gt;&lt;p&gt;If you had a clear picture of the bugs that you had, you could make a better informed business decision on whether or not to go ahead and fix it. This leads to my next point, technical debt.&lt;/p&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Technical Debt&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I highly recommend you reading &lt;a href="http://www.stevemcconnell.com/"&gt;Steven McConnell&lt;/a&gt;’s article on &lt;a href="http://forums.construx.com/blogs/stevemcc/archive/2007/11/01/technical-debt-2.aspx"&gt;technical debt&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Essentially he argues that it is a legitimate business decision to do bad software engineering now to take advantage of a business opportunity or market conditions now, knowing that it will cost you later to maintain and enhance those systems later. However, the huge caveat, is that management is very rarely aware of the technical debt that they are accruing, and therefor they cannot make informed business decisions.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I argue that continuous integration’s relatively small up-front cost and maintenance buy you huge advantage in terms of productivity, plus it makes you aware of the technical debt whether you choose to address it or not, at least you can make better informed decisions.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Did I mention you should read the &lt;a href="http://forums.construx.com/blogs/stevemcc/archive/2007/11/01/technical-debt-2.aspx"&gt;article&lt;/a&gt;? It is absolutely brilliant, I cannot recommend it enough, I cannot do it justice here. Read it!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Continuous integration like many things, has a diminishing rate of return. Setting up a build server has a huge and immediate benefit. Setting up unit tests to run automatically will give a huge benefit, but the effect may not be felt immediately. As you approach 100% code coverage the quality of your application might be stellar, but developers might be spending an unacceptable amount of time on the overhead, depending on the type of your application.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Once you have a continuous integration environment set up, you can go down the path of really interesting things like test driven development, or behavior driven development, or things like dependency injection with mocking like I had mentioned earlier... if you would like to. These things will really push the limit on you in terms of technical prowess, and truly understanding the product that you are working with. But without it, the possibility doesn’t exist.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6643058391401503372-5477471132296101300?l=kevin-kinnett.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <link>www.kevinkinnett.com/Default.aspx?pub=2011-04-08T15:17:00</link>
      <author>kevin@kevinkinnett.com</author>
      <thr:total>0</thr:total>
    </item>
    <item>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-6643058391401503372.post-1700169731860971866</guid>
      <pubDate>Fri, 08 Apr 2011 01:08:00 +0000</pubDate>
      <atom:updated>2011-04-08T12:25:20.237-07:00</atom:updated>
      <category domain="http://www.blogger.com/atom/ns#">Wireless</category>
      <category domain="http://www.blogger.com/atom/ns#">Data</category>
      <category domain="http://www.blogger.com/atom/ns#">Internet</category>
      <title>Converging Data Usage</title>
      <description>&lt;p&gt;Check out my data usage for my home internet (in green) and the data usage on my phone (in blue). I am using almost half the amount of data on my iphone then what I am using at home.&lt;/p&gt; &lt;br /&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-gHhggDIPGDs/TZ5gdwqdCUI/AAAAAAAAEds/g7pWmyXDac0/s1600/ClearData.png"&gt;&lt;img style="margin: 0px 0px 10px 10px; width: 400px; height: 144px; float: right; cursor: pointer;" id="BLOGGER_PHOTO_ID_5593013851636173122" border="0" alt="" src="http://1.bp.blogspot.com/-gHhggDIPGDs/TZ5gdwqdCUI/AAAAAAAAEds/g7pWmyXDac0/s400/ClearData.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Keep in mind that at home we do not have cable, but we probably watch a half hour or more TV a night primarily through Hulu and Netflix. Also some of that data at home is being used by my phone as well when I am there.&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-gHhggDIPGDs/TZ5gdwqdCUI/AAAAAAAAEds/g7pWmyXDac0/s1600/ClearData.png"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-FIA8ephWYOo/TZ5gdhaSFbI/AAAAAAAAEdk/GhOfl8NUl7U/s1600/ATTData.png"&gt;&lt;img style="margin: 10px 10px 0px 0px; width: 400px; height: 306px; float: left; cursor: pointer;" id="BLOGGER_PHOTO_ID_5593013847541814706" border="0" alt="" src="http://1.bp.blogspot.com/-FIA8ephWYOo/TZ5gdhaSFbI/AAAAAAAAEdk/GhOfl8NUl7U/s400/ATTData.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;What the heck am I doing to rack up so much data on my phone you ask? I have no idea. I stream podcasts, and in the last few days, baseball games to my phone on 3G. I am sure that have having several push email accounts might cause a little bump in data. But consider, if I listened to say a half of an hour of streaming audio per business day (an over estimation), at something like 40 MB an hour, that is only 20MB * 5 days a week * 4 weeks a month = 400 MB. Where is the other GB coming from? I want AT&amp;T to give me a break down of ports and domains.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6643058391401503372-1700169731860971866?l=kevin-kinnett.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <link>www.kevinkinnett.com/Default.aspx?pub=2011-04-07T21:08:00</link>
      <author>kevin@kevinkinnett.com</author>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-gHhggDIPGDs/TZ5gdwqdCUI/AAAAAAAAEds/g7pWmyXDac0/s72-c/ClearData.png" height="72" width="72" />
      <thr:total>0</thr:total>
    </item>
    <item>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-6643058391401503372.post-7311710538483156117</guid>
      <pubDate>Sun, 27 Mar 2011 16:35:00 +0000</pubDate>
      <atom:updated>2011-03-27T09:57:40.737-07:00</atom:updated>
      <category domain="http://www.blogger.com/atom/ns#">Pipes</category>
      <category domain="http://www.blogger.com/atom/ns#">Job</category>
      <title>Filtering for Jobs</title>
      <description>This is a method I have used when searching for jobs in previous years that I also found was a good technique for keeping your eye on the local job market when not looking for jobs, which has plenty advantages as well.&lt;br /&gt;&lt;br /&gt;Essentially this technique is to filter various job posting sites that deliver content via RSS then subscribe to those RSS feeds. In this way can have an ongoing view of job information that you care about.&lt;br /&gt;&lt;br /&gt;If you have never used &lt;a href="http://pipes.yahoo.com"&gt;yahoo pipes&lt;/a&gt;, take a minute to check them out now. I find them pretty easy to use. Pipes is designed to be a model driven programing interface, meaning you can create and design pipes through a GUI and never actually write any 'code’. Pipes are actually kind of like a extremely simple cloud enabled version BizTalk or windows workflow, which I spend most of my time in these days. The nice thing about pipes is you can search and see other pipes that other uses have created and uses them as examples or templates. Since 9 out of 10 things you want to do will probably have been created by someone else already you can just use theirs if you would like.&lt;br /&gt;&lt;br /&gt;Next spend some time researching various companies and organizations located in your city, particularly ones in which are in your industry, or ones that you would be interesting in working for. Then do the same for nation-wide companies and organizations. You will find that most of these companies will have a page where the post jobs, and that for many of these you can subscribe to an RSS feed. For me, there are several very industry specific blogs and websites that I frequent that also have some job postings areas as well and I find that jobs posted here are of incredible quality as well. If you have any sites like this jot them down as well.&lt;br /&gt;&lt;br /&gt;If the job pages does not have an RSS feed by default you can use a service called page2rss which I have found works okay. Essentially it will publish changes to a page you point it at as an RSS feed.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-91ykNC3f-Pg/TY9oDVikejI/AAAAAAAAEdM/glvWcA1mlk4/s1600/JobSelectionPipe.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 400px; height: 343px;" src="http://3.bp.blogspot.com/-91ykNC3f-Pg/TY9oDVikejI/AAAAAAAAEdM/glvWcA1mlk4/s400/JobSelectionPipe.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5588800069121112626" /&gt;&lt;/a&gt;For each one of the feeds, create a yahoo pipe that filters specifically based on the incoming feed. For instance: if you have a  feed that is posting jobs nation-wide, you will want to have a filter that only lets through items containing the name of your city or the name of several cities in the metro area. If the company is national or local you probably want to filter on your job title in either case.&lt;br /&gt;&lt;br /&gt;Next step, subscribe to the resulting yahoo pipes RSS feeds, in your favorite RSS reader. If you don’t have one already I’d suggest Google reader. Now as time goes by you will receive various postings.&lt;br /&gt;&lt;br /&gt;I am not looking for a job currently, but I have an excellent finger on the pulses of the software industry in the Atlanta area. Sometimes recruiters will contact me and make a vague reference to a  job they are trying to fill. I can occasionally spot the job that they are hiring for because the company will, in many cases, also publish the job on their site as well. Or if you are looking for a job, then you can have a live feed of current jobs in your area that you care about, and apply as soon as they are posted.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6643058391401503372-7311710538483156117?l=kevin-kinnett.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <link>www.kevinkinnett.com/Default.aspx?pub=2011-03-27T12:35:00</link>
      <author>kevin@kevinkinnett.com</author>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-91ykNC3f-Pg/TY9oDVikejI/AAAAAAAAEdM/glvWcA1mlk4/s72-c/JobSelectionPipe.png" height="72" width="72" />
      <thr:total>0</thr:total>
    </item>
    <item>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-6643058391401503372.post-5886340398936757159</guid>
      <pubDate>Wed, 16 Feb 2011 03:35:00 +0000</pubDate>
      <atom:updated>2011-03-18T08:02:14.246-07:00</atom:updated>
      <category domain="http://www.blogger.com/atom/ns#">T4</category>
      <category domain="http://www.blogger.com/atom/ns#">asp.net</category>
      <category domain="http://www.blogger.com/atom/ns#">C#</category>
      <category domain="http://www.blogger.com/atom/ns#">code-generation</category>
      <title>T4 Transformations for ASP.NET paths</title>
      <description>&lt;p class="MsoNormal"&gt;T4 is an engine built into Visual Studio for code generation. It has been around since VS 2005 and I have been playing with it for a while. In the past I used it to generate unit tests just after compile time that used the templates and reflection to automatically test a particularly nasty DB persistence layer for one of our company’s products. It ended up uncovering about 4000 inconsistencies and potential bugs.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;More recently I have created a template that automatically creates the paths for the pages in your asp.net project. I hate to hard code values, but sometimes in asp.net it seems you cannot get around hard coding references. This will eliminate that dependency. &lt;/p&gt;&lt;p class="MsoNormal"&gt;It works by iterating over the file structure of your project and finds classes that inherit from Page. It then generates a partial class for each page that has a static string with the full path to that page. It also generates a static class for each type of image resource with a static string with its path as well. In this way you can reference all of the other pages in your project like this &lt;%=MyPage.Path %&gt; or your resources &lt;%=Images.JPG.MyPicture%&gt;. If you ever decide to move the pages or resources around, for whatever reason you can freely do so without worrying about breaking &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;hard coded&lt;/span&gt; references.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;a href="http://kevinkinnett.com/Files/PageResolveGenerator.zip"&gt;Here&lt;/a&gt; is the link to the file that does it.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6643058391401503372-5886340398936757159?l=kevin-kinnett.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <link>www.kevinkinnett.com/Default.aspx?pub=2011-02-15T22:35:00</link>
      <author>kevin@kevinkinnett.com</author>
      <thr:total>0</thr:total>
    </item>
    <item>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-6643058391401503372.post-1929365231910460301</guid>
      <pubDate>Sat, 12 Feb 2011 20:21:00 +0000</pubDate>
      <atom:updated>2011-02-12T12:35:35.390-08:00</atom:updated>
      <category domain="http://www.blogger.com/atom/ns#">Notifio</category>
      <category domain="http://www.blogger.com/atom/ns#">iPhone</category>
      <category domain="http://www.blogger.com/atom/ns#">Email</category>
      <category domain="http://www.blogger.com/atom/ns#">Push</category>
      <category domain="http://www.blogger.com/atom/ns#">Notification</category>
      <title>Notifio - Free and easy mail notifications for your iPhone</title>
      <description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-37W2sCMQEl8/TVbs3YSjQ6I/AAAAAAAAEcA/ae_0FZcXb8g/s1600/notifo_app_iphone.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 203px; height: 400px;" src="http://1.bp.blogspot.com/-37W2sCMQEl8/TVbs3YSjQ6I/AAAAAAAAEcA/ae_0FZcXb8g/s400/notifo_app_iphone.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5572902025074787234" /&gt;&lt;/a&gt;&lt;p class="MsoNormal"&gt;If you are moving from the blackberry to the iPhone, or just a new iPhone user, you may be disappointed to know that the only real mail notification for the iPhone is the ‘ding’ that you here whenever it comes in. Whereas on the blackberry you get a small flashing light on the top of your phone, and in some models you can customize the color based on the person that sent the email.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;You would expect on the iPhone at least a popup notification, so you don’t have to unlock your phone and check the unread mail count every time you want to know if there is a new email or not. But that is exactly what you have to do unless you would like to pay for a third party app that does send you a push notification. In addition all of the apps I have looked into do not support exchange email. Although there may be some that I am unaware of that do this.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;I have found a free alternative.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Download a free app called Notifio &lt;a href="http://itunes.apple.com/us/app/notifo/id359063459?mt=8"&gt;iTunes link&lt;/a&gt;. Then sign up for their free service &lt;a href="http://notifo.com/"&gt;here&lt;/a&gt;. Notifio is basically a platform that send you notifications via several services you can sign up for through there site. You can get things like twitter notifications, etc. However, the part that I am interested in, is a feature that lets you send an email to an address that they give you. Whenever an email is received at that address you get a push notification on your phone with the subject of the email.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;So all you have to do at this point is forward all of your email accounts that you want notifications for to that address and wait for a notification on your phone. The time this takes is generally between instantaneous and 2 seconds. &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;There is one caveat in that if you emails contain sensitive or confidential information you are forwarding them to a 3rd party that you do not have control over.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6643058391401503372-1929365231910460301?l=kevin-kinnett.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <link>www.kevinkinnett.com/Default.aspx?pub=2011-02-12T15:21:00</link>
      <author>kevin@kevinkinnett.com</author>
      <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-37W2sCMQEl8/TVbs3YSjQ6I/AAAAAAAAEcA/ae_0FZcXb8g/s72-c/notifo_app_iphone.png" height="72" width="72" />
      <thr:total>0</thr:total>
    </item>
    <item>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-6643058391401503372.post-4895993540388758668</guid>
      <pubDate>Sun, 06 Feb 2011 20:25:00 +0000</pubDate>
      <atom:updated>2011-12-22T10:59:52.922-08:00</atom:updated>
      <category domain="http://www.blogger.com/atom/ns#">Passwords</category>
      <category domain="http://www.blogger.com/atom/ns#">BizTalk</category>
      <category domain="http://www.blogger.com/atom/ns#">FTP</category>
      <category domain="http://www.blogger.com/atom/ns#">C#</category>
      <title>BizTalk - Importing Bindings with Many Password</title>
      <description>&lt;p&gt;If you ever spend much time exporting and importing apps in BizTalk you will quickly learn that doing so does not copy the passwords of your locations, ftp and otherwise along with it.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;My currently client's environment uses copious amounts of ftp locations, too many probably, though that is a different story. However I find myself spending too much time copying the passwords to the new environment every time I import an app. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;So I whipped up a small app this weekend that will take command line parameters for the application you want to change, the ftp server you are targeting and the the password to set. This was basically an excuse for me to play around with BizTalk object model as well as experiment with WPF&lt;/p&gt;&lt;br /&gt;&lt;p&gt;ChangeFTPPortProperties.exe -application=My.Companies.App -ftp=ftp.biz.com -pass=MyNewPass&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Within seconds you have all of your send and receive ports who are pointed at ftp.biz.com configured with the new password.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;You can download the exe, and the code below.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://kevinkinnett.com/Files/ChangeFTPProperties.zip"&gt;http://kevinkinnett.com/Files/ChangeFTPProperties.zip&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Update&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I have updated the project. The new code is &lt;a href="http://kevinkinnett.com/Files/ChangeFTPPortProperties_V2.zip"&gt;here&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6643058391401503372-4895993540388758668?l=kevin-kinnett.blogspot.com' alt='' /&gt;&lt;/div&gt;</description>
      <link>www.kevinkinnett.com/Default.aspx?pub=2011-02-06T15:25:00</link>
      <author>kevin@kevinkinnett.com</author>
      <thr:total>0</thr:total>
    </item>
  </channel>
</rss>
