<?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>YTechie.com &#187; software</title>
	<atom:link href="http://www.ytechie.com/category/software/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ytechie.com</link>
	<description>Productive software development using ASP.NET, C#, Adobe Flex, and other technologies and tools.</description>
	<lastBuildDate>Fri, 06 Nov 2009 21:16:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Introduction to Distributed Source Control</title>
		<link>http://www.ytechie.com/2009/11/introduction-to-distributed-source-control.html</link>
		<comments>http://www.ytechie.com/2009/11/introduction-to-distributed-source-control.html#comments</comments>
		<pubDate>Fri, 06 Nov 2009 21:16:21 +0000</pubDate>
		<dc:creator>superjason</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://www.ytechie.com/2009/11/introduction-to-distributed-source-control.html</guid>
		<description><![CDATA[Version control systems manage the changes of documents. In software development, their primary purpose is to store the source code for an application, as well as every revision created during its development.
Currently, many developers use a centralized version control system such as Visual Studio Team System (VSTS) or Subversion. With such systems there is a [...]]]></description>
			<content:encoded><![CDATA[<p>Version control systems manage the changes of documents. In software development, their primary purpose is to store the source code for an application, as well as every revision created during its development.</p>
<p>Currently, many developers use a centralized version control system such as Visual Studio Team System (VSTS) or Subversion. With such systems there is a central repository (i.e., Team Foundation Server (TFS)), usually located remotely, that houses the different versions of source code.</p>
<p align="center"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.ytechie.com/post-images/2009/11/image.png" width="365" height="314" /> </p>
<p>Unfortunately, a number of issues accompany typical source control systems that are based on a centralized repository, including, but not limited to the following:</p>
<ul>
<li>Many operations such as checking code in or out can perform poorly over slow connections. </li>
<li>Working offline results in a reduced set of functionality, such as branching or committing multiple features or bug fixes. </li>
<li>Moving the repository can be difficult due to the fact that there is front-end <b>and</b> back-end management. </li>
<li>Working between networks that may never become bridged is impossible or difficult, since a connection must be made to the central repository. </li>
<li>Private work is typically not under source control. </li>
<li>There is often a single point of failure. </li>
<li>Security must be managed, and may become complex due to multiple permission sets and projects. </li>
</ul>
<p>Distributed source control systems (or distributed version control systems, &quot;DVCS&quot; for short) are starting to gain popularity because they offer many advantages over the traditional, centralized repository.</p>
<p><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://www.ytechie.com/post-images/2009/11/image1.png" width="498" height="282" /> </p>
<p>They allow users to work independently in either a connected or disconnected environment. There is a tremendous amount of flexibility in regards to merging, managing different branches of development, and managing product features. </p>
<p>Adopters of this technology include Google Code and Sourceforge. Moreover, many major projects such as GNOME, Perl, MySQL, Python, and Ubuntu are also using a distributed source control system.</p>
<p>You may have already heard about some of the popular implementations. Git, Mercurial, and Bazaar are a few choices that have started to become mainstream. If you&#8217;ve worked with Subversion, you&#8217;ll find that migrating to this new generation of source control systems doesn&#8217;t mean giving up the features that you&#8217;re used to.</p>
<p>There are many problems with centralized repositories that simply disappear when you&#8217;re working with a distributed system:</p>
<ul>
<li>Merging is a core feature and works <i>how</i> and <i>when</i> you want. </li>
<li>Security is trivial since everyone works in their own sandbox. You simply choose who you allow pushing and pulling changes to and from. In open source projects, this typically means allowing certain trusted individuals to push changes to the project repositories. When needed, additional security models such as authentication can be imposed. </li>
<li>Working disconnected doesn&#8217;t require any preparation. You are working offline by default. The only online operation is synchronizing with other repositories. </li>
<li>All operations are near-instantaneous. Synchronizing is the only operation that is dependent on the speed of your connection. </li>
</ul>
<p>&#160;</p>
<p> <b>What is a Distributed Source Control System?</b>
<p>Distributed source control systems have the same purpose, but work much differently than systems like Team Foundation Server (TFS), SourceSafe, Subversion, and CVS. Instead of having a single repository that contains the source code and history, there are many repositories that have the source code, and some or all of its revision history. One or more peers have repositories for a project, and synchronize what they want, when they want to. There are really no requirements or restrictions. The focus is on synchronizing and working independently.</p>
<p><strong>Workflow</strong></p>
<p style="border-bottom: black 2px solid; border-left: black 2px solid; padding-bottom: 4px; background-color: #ffffcc; margin: 5px; padding-left: 4px; padding-right: 4px; border-top: black 2px solid; border-right: black 2px solid; padding-top: 4px">Examples &amp; screenshots included here are from Mercurial using the TortoiseHg explorer extension. Git has similar functionality using TortoiseGit. You can also use the command line for all/some operations if you prefer.</p>
<p>1. <b>Clone a repository</b> &#8211; To create your own local repository, you have to clone (copy) all or part of an existing repository. Since each developer has a copy of the repository, you can clone it from anyone.</p>
<p align="center"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.ytechie.com/post-images/2009/11/image2.png" width="350" height="427" /> </p>
<p>2. <b>Create a &quot;working copy&quot; of the code</b> &#8211; Even though you have the full repository from another developer, you still need to &quot;check-out&quot; or get the latest version of the code. Since the repository is local, this operation is quick and can be done <b>offline</b>.</p>
<p>3. <b>Make changes</b> &#8211; Simply make any changes you like, without concerning yourself about how your source control works. This is similar to Subversion, and contrasts sharply with TFS which needs to track any changes you make by interfacing with Visual Studio.</p>
<p>4. <b>Check-in changes</b> &#8211; When it&#8217;s time to check in your local changes, they are simply committed to your local repository. They <b>do not affect any other repository</b>. Changes are detected by comparing the newest committed revision with the current version on disk.</p>
<p><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://www.ytechie.com/post-images/2009/11/image3.png" width="494" height="216" /> </p>
<p>5. <b>Push or pull changesets</b> &#8211; To actually send your changesets to another repository, you need to &quot;push&quot; or &quot;pull&quot; them. In the Mercurial dialog below, there are options labeled &quot;Incoming&quot; and &quot;Outgoing&quot; which simply compare the local changes with the remote changes and determine what will get pushed or pulled. The &quot;Push&quot; and &quot;Pull&quot; operations send your changesets to another repository, or pull changesets from another repository respectively.</p>
<p><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://www.ytechie.com/post-images/2009/11/image4.png" width="480" height="264" /> </p>
<p>When changesets are transferred between repositories, they <b>do not affect any working copies</b>. This flexibility allows changes to be synchronized without affecting work in progress.</p>
<p><b>Online/Offline Operations</b> </p>
<p>
<table style="border-collapse: collapse" border="2" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="143">
<p><b>Operation</b></p>
</td>
<td valign="top" width="167">
<p><b>TFS</b></p>
</td>
<td valign="top" width="166">
<p><b>Subversion</b></p>
</td>
<td valign="top" width="163">
<p><b>Mercurial/GIT/Bazaar</b></p>
</td>
</tr>
<tr>
<td valign="top" width="143">
<p><b>Get/Update</b></p>
</td>
<td style="background-color: red" valign="top" width="167">
<p>Online</p>
</td>
<td style="background-color: red" valign="top" width="166">
<p>Online</p>
</td>
<td style="background-color: green" valign="top" width="163">
<p>Offline</p>
</td>
</tr>
<tr>
<td style="background-color: red" valign="top" width="143">
<p><b>Check-out</b></p>
</td>
<td style="background-color: red" valign="top" width="167">
<p>Online</p>
</td>
<td style="background-color: red" valign="top" width="166">
<p>Online</p>
</td>
<td style="background-color: green" valign="top" width="163">
<p>Offline</p>
</td>
</tr>
<tr>
<td valign="top" width="143">
<p><b>Check-in</b></p>
</td>
<td style="background-color: red" valign="top" width="167">
<p>Online</p>
</td>
<td style="background-color: red" valign="top" width="166">
<p>Online</p>
</td>
<td style="background-color: green" valign="top" width="163">
<p>Offline</p>
</td>
</tr>
<tr>
<td valign="top" width="143">
<p><b>View History</b></p>
</td>
<td style="background-color: red" valign="top" width="167">
<p>Online</p>
</td>
<td style="background-color: red" valign="top" width="166">
<p>Online</p>
</td>
<td style="background-color: green" valign="top" width="163">
<p>Offline</p>
</td>
</tr>
<tr>
<td valign="top" width="143">
<p><b>Revert</b></p>
</td>
<td style="background-color: red" valign="top" width="167">
<p>N/A</p>
</td>
<td style="background-color: green" valign="top" width="166">
<p>Offline</p>
</td>
<td style="background-color: green" valign="top" width="163">
<p>Offline</p>
</td>
</tr>
<tr>
<td valign="top" width="143">
<p><b>Compare working changes</b></p>
</td>
<td style="background-color: red" valign="top" width="167">
<p>Online</p>
</td>
<td style="background-color: green" valign="top" width="166">
<p>Offline</p>
</td>
<td style="background-color: green" valign="top" width="163">
<p>Offline</p>
</td>
</tr>
<tr>
<td valign="top" width="143">
<p><b>Change tracking</b></p>
</td>
<td style="background-color: yellow" valign="top" width="167">
<p>Limited*</p>
</td>
<td style="background-color: green" valign="top" width="166">
<p>Offline</p>
</td>
<td style="background-color: green" valign="top" width="163">
<p>Offline</p>
</td>
</tr>
</tbody>
</table>
<p>* Changes can be made in a special &quot;offline&quot; mode, and edited files will be checked-out when returning to &quot;online&quot; mode.</p>
<p> <b>Merging Divergent Development Branches</b>
<p>In traditional, centralized source control systems, the only way for a divergence in code paths was to explicitly create a branch. While this is still possible in a distributed source control system, it is also possible for multiple developers to make independent changes that may or may not conflict.</p>
<p>The beauty of the system is that divergent code paths can be merged at any time. It is possible for the developers to make multiple changes, perform multiple synchronizations (pulls), yet not have to merge until they want to, or until they need to push their changes to another repository.</p>
<p><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://www.ytechie.com/post-images/2009/11/image5.png" width="488" height="179" /> </p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.ytechie.com/post-images/2009/11/image6.png" width="496" height="279" /> </p>
<p> <b>Where Is My Repository?</b>
<p>If you&#8217;re working with a team of 20 developers, and each one has a full copy of the repository, you don&#8217;t <b><i>need</i></b> a central repository. However, there are a few reasons why it is recommended:</p>
<ol>
<li><b>Central backup location</b> &#8211; Even though you have numerous copies of the repository, it is still useful to have a single location that can be used as a place where an automated backup process is able to find it. </li>
<li><b>Central communication hub</b> &#8211; The logistics of pushing and pulling code between a number of developers can get complicated. Distributing your repository simplifies many of these problems, but is not perfect by itself. Having a central &quot;authoritative&quot; repository can make it quick and easy for developers to collaborate. </li>
<li><b>Central location for builds</b> &#8211; Automated builds and continuous integration servers need a location to pull source code from, which an authoritative repository provides. </li>
<li><b>Central merge location</b> &#8211; If multiple developers are pulling changes from one another, implicit branches can be created. A central repository serves as location where all of these branches are merged into one development line. </li>
</ol>
<p>Repositories can typically be easily hosted internally using Apache, a built in daemon, CGI script, or simply just a file share. For simplicity, there are many services that provide repository hosting. For Git, there is GitHub and SourceForge. For Mercurial, there is BitBucket, Google Code, and SourceForge.</p>
<p>The beauty of distributed source control is apparent when you take into account the administrative overhead of a central server. Since the central server is no different than any other peer, <b>it can be easily moved or modified</b>. For example, you can start out with no central server, then you can use BitBucket to store your revisions, then you can move to another service within minutes. Changing providers simply means pushing your changes to another server.</p>
<p> <b><u>Common Operations</u></b>
<p><strong>Importing Existing Code</strong></p>
<p>Importing existing code is an extremely simple operation. If it is new code that is not yet under source control, you can simply create a new repository within the folder that contains your code. You can then check in your code as desired.</p>
<p style="border-bottom: black 2px solid; border-left: black 2px solid; padding-bottom: 4px; background-color: #ffffcc; margin: 5px; padding-left: 4px; padding-right: 4px; border-top: black 2px solid; border-right: black 2px solid; padding-top: 4px">In Subversion, the import process involved importing the code into the repository, and then checking out a working copy. Mercurial does not have this complexity.</p>
<p><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://www.ytechie.com/post-images/2009/11/image7.png" width="407" height="300" /> </p>
<p>Mercurial also comes with built in support for converting existing Subversion repositories to Mercurial repositories, including the entire revision history. <a href="http://www.selenic.com/mercurial/wiki/ConvertExtension" onclick="pageTracker._trackPageview('/outgoing/www.selenic.com/mercurial/wiki/ConvertExtension?referer=');">More information is available here</a>.</p>
<p style="border-bottom: black 2px solid; border-left: black 2px solid; padding-bottom: 4px; background-color: #ffffcc; margin: 5px; padding-left: 4px; padding-right: 4px; border-top: black 2px solid; border-right: black 2px solid; padding-top: 4px">To convert from an older source control system such as Visual Source Safe, you can first <a href="http://www.pumacode.org/projects/vss2svn" onclick="pageTracker._trackPageview('/outgoing/www.pumacode.org/projects/vss2svn?referer=');">convert the repository to Subversion</a>, and then to Mercurial.</p>
<p> <b>&#160;</b> <b>Checking-in Code</b>
<p>It is worth mentioning a typical philosophical difference between how some source control systems promote the check-in process for changes. Systems like TFS and Visual Source Safe only provide <a href="http://msdn.microsoft.com/en-us/library/ms194956(VS.80).aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/ms194956_VS.80_.aspx?referer=');"><b>limited functionality for reverting</b></a> and re-applying specific changesets. For this reason, developers tend to check-in groups of unrelated changes. This tends to lead to less useful generic or incomplete comments such as &quot;done for the day&quot;.</p>
<p>Flexible source control systems such as Subversion, Mercurial, and Git provide a lot more value when changesets are fine-grained, and represent a single change to the system. For example, renaming a page and changing the tab order are two changes that should be checked-in separately. If needed, either feature can be pulled in or out, moved, synchronized, or used to patch other versions. It also reduces the likelihood of conflicts, and typically makes conflict resolution easier. Other developers can quickly scan through the changelog and get a clear list of the features that were added, or bugs that were fixed. In an ideal world, all commits should be tied to a bug or feature to increase traceability.</p>
<p> <b>Managing Branches &amp; Releases</b>
<p>It is simple to create <b>explicit branches</b> that allow you to maintain parallel development of different features or versions. Branching simply involves entering a branch name when you commit your code. Switching between branches is as easy as performing an update to the latest revision of a branch. In contrast, TFS requires a branch to be created before you can commit changes to it. TFS also keeps a copy of each branch on the developers machine, which is optional with Subversion, Mercurial, and others.</p>
<p>Since changes can be made independently, there is also a concept of <b>implicit branching</b>. If we have two users, Ann and Bob, they are free to make changes independently of each other. If Ann checks in her changes, and then Bob pulls down those changes while having changes of his own, there are now two implicit branches of development. In this case <b>pulling</b> changes will automatically create multiple parallel lines of development. Changes cannot be <b>pushed</b> unless the code has been merged. The system is designed this way so that merging is only necessary when pushing, typically to a central repository or build server. The effect is that repositories that are only &quot;pushed to&quot; can be easily and cleanly maintained remotely.</p>
<p>Most distributed source control systems include tools that allow a visual display of code branches. This functionality is also likely to be included in Team Foundation Server 2010.</p>
<p> <b>Tagging Revisions</b>
<p>In order to mark the significance of certain revisions, they can be tagged with a specific label. For example, when you release a specific version of your project, you can tag that revision with the label &quot;v1.2&quot; as seen below. Additional flexibility is provided by the &quot;local tag&quot; functionality, which lets you tag code on your computer without sharing the tag with others.</p>
<p><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://www.ytechie.com/post-images/2009/11/image8.png" width="381" height="296" /> </p>
<p> <b>Terminology</b>
<p><b>Distributed Version Control System (DVCS)</b> &#8211; Version control systems manage the changes of documents. In software development, their primary purpose is to store the source code for an application, as well as every revision created during its development.</p>
<p><b>Repository</b> &#8211; A container for a set of changes that represent the history of the source code for a project. A repository may have the ability to store a partial history of the project, or the entire history. The repository is typically optimized by using compression and by only storing deltas or changes of files.</p>
<p><b>Changeset/Revision</b> &#8211; A particular &quot;delta&quot; or change in the codebase. This can include any type of change, in any number of files. Visual Source Safe stored revision numbers for each file. Team Foundation Server and Subversion have global revision numbers for the entire repository. Distributed source control systems often use GUID&#8217;s or hash codes to represent specific revisions.<b></b></p>
<p><b>Working copy</b> &#8211; A particular revision of the code that has been extracted or checked out from the repository. This revision includes the full version of all the files involved so that the developer can load and make changes to the code.</p>
<p><b>Bundle</b> &#8211; A bundle is a file that contains a set of changes that is intended to be sent to another user to update their repository. This technology allows users to be physically disconnected yet pass code changes to each other. This file typically employs some form of compression to minimize file size.</p>
<p><b>Patch/diff</b> &#8211; A patch is a file that shows the changes between two versions of a file or multiple files. It contains enough information to transform the old version into the new version, or vice-versa. It&#8217;s a quick way of sending someone a changeset. Patches are usually in the &quot;unified diff&quot; format, which looks like the following:</p>
<pre style="border-bottom: black 2px solid; border-left: black 2px solid; padding-bottom: 4px; background-color: lightgrey; margin: 5px; padding-left: 4px; padding-right: 4px; border-top: black 2px solid; border-right: black 2px solid; padding-top: 4px">--- /path/to/original timestamp
+++ /path/to/new      timestamp
@@ -1,3 +1,9 @@
+This is an important
+notice! It should
+therefore be located at
+the beginning of this
+document!
+
 This part of the
 document has stayed the
 same from version to
@@ -5,16 +11,10 @@
 be shown if it doesn't
 change.  Otherwise, that
 would not be helping to
-compress the size of the
-changes.
-
-This paragraph contains
-text that is outdated.
-It will be deleted in the -near future.
+compress anything. 

 It is important to spell
-check this dokument. On
+check this document. On
 the other hand, a
 misspelled word isn't
 the end of the world.
@@ -22,3 +22,7 @@
 this paragraph needs to
 be changed. Things can
 be added after it.
+
+This paragraph contains
+important new additions
+to this document. </pre>
<h4>&#160;</h4>
<h4>References</h4>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/ms194956(VS.80).aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/ms194956_VS.80_.aspx?referer=');">http://msdn.microsoft.com/en-us/library/ms194956(VS.80).aspx</a> </li>
<li><a href="http://www.pumacode.org/projects/vss2svn" onclick="pageTracker._trackPageview('/outgoing/www.pumacode.org/projects/vss2svn?referer=');">http://www.pumacode.org/projects/vss2svn</a> </li>
<li><a href="http://www.selenic.com/mercurial/wiki/PublishingRepositories" onclick="pageTracker._trackPageview('/outgoing/www.selenic.com/mercurial/wiki/PublishingRepositories?referer=');">http://www.selenic.com/mercurial/wiki/PublishingRepositories</a> </li>
<li><a href="http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/" onclick="pageTracker._trackPageview('/outgoing/betterexplained.com/articles/intro-to-distributed-version-control-illustrated/?referer=');">http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/</a> </li>
<li><a href="http://code.google.com/p/tortoisegit/" onclick="pageTracker._trackPageview('/outgoing/code.google.com/p/tortoisegit/?referer=');">http://code.google.com/p/tortoisegit/</a> </li>
<li><a href="http://bitbucket.org/tortoisehg/stable/wiki/Home" onclick="pageTracker._trackPageview('/outgoing/bitbucket.org/tortoisehg/stable/wiki/Home?referer=');">http://bitbucket.org/tortoisehg/stable/wiki/Home</a> </li>
<li><a href="http://msmvps.com/blogs/vstsblog/archive/2008/08/17/how-microsoft-uses-team-foundation-server-internally.aspx" onclick="pageTracker._trackPageview('/outgoing/msmvps.com/blogs/vstsblog/archive/2008/08/17/how-microsoft-uses-team-foundation-server-internally.aspx?referer=');">http://msmvps.com/blogs/vstsblog/archive/2008/08/17/how-microsoft-uses-team-foundation-server-internally.aspx</a> </li>
<li><a href="http://blogs.msdn.com/bharry/archive/2007/09/15/update-on-microsoft-tfs-adoption.aspx" onclick="pageTracker._trackPageview('/outgoing/blogs.msdn.com/bharry/archive/2007/09/15/update-on-microsoft-tfs-adoption.aspx?referer=');">http://blogs.msdn.com/bharry/archive/2007/09/15/update-on-microsoft-tfs-adoption.aspx</a> </li>
<li><a href="http://blogs.msdn.com/bharry/archive/2008/09/15/september-08-devdiv-tfs-dogfood-statistics.aspx" onclick="pageTracker._trackPageview('/outgoing/blogs.msdn.com/bharry/archive/2008/09/15/september-08-devdiv-tfs-dogfood-statistics.aspx?referer=');">http://blogs.msdn.com/bharry/archive/2008/09/15/september-08-devdiv-tfs-dogfood-statistics.aspx</a> </li>
</ul>
<p><b>Recommended Reading</b> </p>
<ul>
<li><a href="http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/" onclick="pageTracker._trackPageview('/outgoing/betterexplained.com/articles/intro-to-distributed-version-control-illustrated/?referer=');">Illustrated introduction to distributed version control</a> </li>
<li><a href="http://www.selenic.com/mercurial/wiki/QuickStart" onclick="pageTracker._trackPageview('/outgoing/www.selenic.com/mercurial/wiki/QuickStart?referer=');">Mercurial QuickStart</a> </li>
<li><a href="http://hgbook.red-bean.com/read/" onclick="pageTracker._trackPageview('/outgoing/hgbook.red-bean.com/read/?referer=');">Mercurial: The Definitive Guide</a> </li>
<li><a href="http://bitbucket.org/tortoisehg/stable/wiki/install" onclick="pageTracker._trackPageview('/outgoing/bitbucket.org/tortoisehg/stable/wiki/install?referer=');">TortoiseHg Download</a> </li>
<li><a href="http://code.google.com/p/support/wiki/DVCSAnalysis" onclick="pageTracker._trackPageview('/outgoing/code.google.com/p/support/wiki/DVCSAnalysis?referer=');">Google&#8217;s Analysis of Git vs Mercurial</a> </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.ytechie.com/2009/11/introduction-to-distributed-source-control.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Azure &#8211; Performance, IoC, and Instances</title>
		<link>http://www.ytechie.com/2009/02/azure-performance-ioc-and-instances.html</link>
		<comments>http://www.ytechie.com/2009/02/azure-performance-ioc-and-instances.html#comments</comments>
		<pubDate>Thu, 19 Feb 2009 17:42:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.ytechie.com/2009/02/azure-performance-ioc-and-instances.html</guid>
		<description><![CDATA[Ever since the Google App Engine was released, I’ve been fascinated with cloud computing frameworks. The vision is to have a website that can scale from nothing to infinity, without having to worry about servers, viruses, uptime, etc. I’ve finally gotten a chance to play around with Azure, and I must say that I’m in [...]]]></description>
			<content:encoded><![CDATA[<p>Ever since the <a href="http://code.google.com/appengine/" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/code.google.com/appengine/?referer=');">Google App Engine</a> was released, I’ve been fascinated with cloud computing frameworks. The vision is to have a website that can scale from nothing to infinity, without having to worry about servers, viruses, uptime, etc. I’ve finally gotten a chance to play around with Azure, and I must say that I’m in love with the concept, but disappointed by the current reality.</p>
<p><a href="http://www.ytechie.com/post-images/2009/02/azure.jpg"><img title="Azure" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="178" alt="Azure" src="http://www.ytechie.com/post-images/2009/02/azure-thumb.jpg" width="361" border="0" /></a> </p>
<p><strong>Performance</strong></p>
<p>I’ve taken a site that I consider a “playground site”, and converted it over to run in Azure. One of the metrics I wanted to look at was the responsiveness of the deployed application. I run the main version of the site on a dedicated server, and I don’t think it’s unreasonable to use that as a baseline. After all, the purpose of Azure is to have the advantages of all the different types of hosting, yet have less to worry about.</p>
<p>To gauge performance, I used the Firefox add-in called Firebug. This let me see the amount of time that each requested element took to be transferred from the server. It also gives some insight into the amount of time it takes for the page to render. In the future, I’m going to use some server tracing to find specific operations that may be taking longer.</p>
<p>This is the baseline data from <a href="http://www.simpletracking.com" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.simpletracking.com?referer=');">http://www.simpletracking.com</a>. As you can see, the page is served up very quickly. The page takes less than 100ms to render (1/10 of a second), and the entire page comes through in less than half of a second.</p>
<p><a href="http://www.ytechie.com/post-images/2009/02/simpletrackingcom.png"><img title="simpletracking.com" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="137" alt="simpletracking.com" src="http://www.ytechie.com/post-images/2009/02/simpletrackingcom-thumb.png" width="481" border="0" /></a></p>
<p>Now take a look at the same code running on Azure:</p>
<p><a href="http://www.ytechie.com/post-images/2009/02/simpletrackingcloudappnet.png"><img title="simpletracking.cloudapp.net" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="115" alt="simpletracking.cloudapp.net" src="http://www.ytechie.com/post-images/2009/02/simpletrackingcloudappnet-thumb.png" width="480" border="0" /></a></p>
<p>To render the page, instead of 89ms, it now takes ~650ms. It takes a full second for the entire page and its elements to be sent down to the client.</p>
<p>Running both pages several times started to give me interesting results. The dedicated server was giving me extremely consistent results (even with other users hitting it). Azure however, was all across the board. It was typically around 1 second for the entire page to render, but would spike up to 5 seconds occasionally. Personally, I think this is completely unacceptable performance. Hopefully this is not indicative of the performance I can expect once it’s released.</p>
<p><strong>IoC</strong></p>
<p>Azure is designed so that if you have an application that runs in medium trust, it shouldn’t require any conversion to run straight in Azure (in most cases). If you’re using a database, there are other restrictions because Azure doesn’t use a standard SQL database. In addition to these obvious issues, a non-obvious issue is that if you’re using an IoC container, it probably won’t run in medium trust.</p>
<p>My application uses the IoC container Spring.NET, which immediately failed. I suspected (incorrectly) that Windsor might have worked better, but couldn’t tell from the documentation. To make it easy to plug in different IoC containers, I started using the <a href="http://www.codeplex.com/CommonServiceLocator" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.codeplex.com/CommonServiceLocator?referer=');">Common Service Locator</a>. If you’re doing IoC without the common service locator, I really recommend you check it out.</p>
<p>I was then fortunate enough to find <a href="http://onceuponans.blogspot.com/2009/01/how-i-spent-my-winter-vacation-two.html" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/onceuponans.blogspot.com/2009/01/how-i-spent-my-winter-vacation-two.html?referer=');">this page</a>, which has great information on the different IoC containers and their Azure compatibility:</p>
<blockquote><p><b>Castle Windsor</b> &#8211; My preferred IoC container, but it won&#8217;t run under medium trust. Out!      <br /><b>       <br />StructureMap</b> &#8211; My second favorite IoC container. Runs under medium trust locally, but not under Azure. Submitted bug report to Jeremy Miller. Reading through the <a href="http://groups.google.com/group/structuremap-users" onclick="pageTracker._trackPageview('/outgoing/groups.google.com/group/structuremap-users?referer=');">StructureMap user&#8217;s group</a>, it looks like he&#8217;s going to try to fix that early this year.      <br /><b>       <br />Ninject</b> &#8211; I didn&#8217;t really monkey around with Ninject much. The sample code I saw was riddled with [Inject] attributes, which kinda turned me off. Apologies to @nkohari if I dismissed it too early.      <br /><b>       <br />Autofac</b> &#8211; Works great in medium trust under Azure, easy to configure, but doesn&#8217;t support registering arguments for constructor injection at configuration time. You have to specify them when you resolve the service.      <br /><b>       <br />Unity</b> &#8211; No problems at all! Worked great in medium trust on Azure, easy to configure, supports everything I need! I gotta say I&#8217;m really impressed by how far Unity has come in such a short time.</p>
</blockquote>
<p>My only reasonable option was Unity, which is Microsoft’s IoC container. After another fun conversion, I was up and running! I honestly don’t have any complaints about their IoC offering.</p>
<p><strong>Instances</strong></p>
<p>The Azure team decided to introduce the concept of “Instances”. You have to decide how many virtual instances of a web server that you want running. I really don’t understand the logic here. Their sales pitch is all about handing unpredictable traffic patterns, yet an instance based approach just gives me another aspect of the application that I have to worry about. They’re promising that a configurable heuristics system will eventually be in place to handle the management of the number of instances. In effect, they are putting a band aid on a problem that they’ve created even before release.</p>
<p>Contrast this design with the Google App Engine. With their system, you don’t have to worry about configuring instances at all. It automagically scales from nothing to infinity automatically.</p>
<p>Instances on the worker roles make sense. Worker roles are not public facing, they are there to process data. By configuring the number of worker role instances, I can change the rate at which my data gets processed.</p>
<p><strong>Conclusion</strong></p>
<p>I realize that Azure isn’t even in beta yet, so I shouldn’t expect the world. I had my fingers crossed that their CTP would be production quality (wouldn’t that be nice?). I think that Microsoft will eventually have a great cloud platform on their hands, it’s simply a question of timing. Personally, I really don’t want to have to worry about uptime, scaling, RAID, drivers, viruses, etc. so I think cloud computing is the inevitable solution.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ytechie.com/2009/02/azure-performance-ioc-and-instances.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Convenient Synchronization with Mesh and DropBox</title>
		<link>http://www.ytechie.com/2009/02/convenient-synchronization-with-mesh-and-dropbox.html</link>
		<comments>http://www.ytechie.com/2009/02/convenient-synchronization-with-mesh-and-dropbox.html#comments</comments>
		<pubDate>Sat, 14 Feb 2009 04:27:33 +0000</pubDate>
		<dc:creator>superjason</dc:creator>
				<category><![CDATA[productivity]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.ytechie.com/2009/02/convenient-synchronization-with-mesh-and-dropbox.html</guid>
		<description><![CDATA[A couple of weeks ago, I finally signed up for DropBox. If you&#8217;re unfamiliar with the service, it&#8217;s a file synchronization service. You install a client on multiple machines, and you get a special folder (aka a dropbox). When you make changes on any computer, it&#8217;s synchronized with a central server, as well as the [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of weeks ago, I finally signed up for <a href="https://www.getdropbox.com/" target="_blank" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.getdropbox.com/?referer=');">DropBox</a>. If you&#8217;re unfamiliar with the service, it&#8217;s a file synchronization service. You install a client on multiple machines, and you get a special folder (aka a dropbox). When you make changes on any computer, it&#8217;s synchronized with a central server, as well as the other clients.</p>
<p align="center"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="214" alt="image" src="http://www.ytechie.com/post-images/2009/02/image.png" width="423" border="0"/> </p>
<p>Now that I&#8217;ve gotten the chance to put DropBox through its paces, I have to say that I&#8217;m very impressed. I&#8217;ve done a lot of operations that can sometimes choke file monitoring software like moving and renaming files, copying files while synchronizing, and in-use files. DropBox powered through like a champ, never giving me any errors, and without any noticeable mistakes.</p>
<p>In addition to simply synchronizing your files, their service also keeps a copy of your files on their server. Better yet, it automatically revisions the files. It seems to be fairly efficient, even considering all my files and revisions. Right now I&#8217;m only using 7.8% of the 2GB of space they give you for free.</p>
<p>One of the applications that I use the most is OneNote. Pretty much all of my disconnected thoughts go into OneNote until I can get them organized. I figured it was a great application to test the responsiveness of DropBox. I opened OneNote on two different computers. When I changed the text on one machine, the changes showed up on the other in 10-15 seconds. Perfect for keeping my notes in sync!</p>
<p>My one and only complaint about DropBox is that I can&#8217;t create multiple DropBoxes. A single DropBox is simple and efficient, but it would be nice to have a little more flexibility.</p>
<p><strong>Live Mesh</strong></p>
<p>A few nights ago, I got a demo of the Azure platform by a Microsoft Evangelist. Azure is a huge blank term for a group of confusing technologies. Even the name itself is confusing, since Azure is a cloud computing platform and is also the color of the sky when there are no clouds.</p>
<p align="center"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="194" alt="image" src="http://www.ytechie.com/post-images/2009/02/image1.png" width="412" border="0"/></p>
<p>More importantly, one great thing to come out of the &#8220;Live Services&#8221; portion, is a free product called &#8220;Live Mesh&#8221;. It&#8217;s essentially a competitor to DropBox. The nice thing about Live Mesh is it&#8217;s flexibility. I can make any number of synchronized folders, and they all seem to be as reliable as DropBox. Thanks to a sophisticated permissions system, you can even share folders with other people. For example, you can have a folder set up to distribute your photos to your family.</p>
<p>The Microsoft Azure Evangelist showed us a demo with the client installed on his laptop, and another client installed on his Windows Mobile phone. When he takes a picture on his phone, it&#8217;s immediately pushed over to the other clients. It&#8217;s a neat trick, and does make my mobile device more useful.</p>
<p align="center"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="319" alt="image" src="http://www.ytechie.com/post-images/2009/02/image2.png" width="223" border="0"/><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="318" alt="image" src="http://www.ytechie.com/post-images/2009/02/image3.png" width="222" border="0"/> </p>
<p>As far as I can tell, Live Mesh doesn&#8217;t have plans to support a revision system like DropBox. I think this is a horrible, horrible mistake. Having a file on multiple machines provides nice redundancy, yet if you accidentally delete a file on one computer, Live Mesh will happily delete every copy of it. <a href="http://www.hanselman.com/blog/TechnicalPresentationsBePreparedForAbsoluteChaos.aspx" target="_blank" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.hanselman.com/blog/TechnicalPresentationsBePreparedForAbsoluteChaos.aspx?referer=');">It even happened to Scott Hanselman</a>. In my opinion, this completely destroys any hope it has of competing with DropBox (at least for me). I&#8217;m hoping that they&#8217;ll add a backup feature, or someone will use their API to add it for them.</p>
<p><strong>Others</strong></p>
<p>One service I have yet to try is <a href="http://www.sugarsync.com/" target="_blank" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.sugarsync.com/?referer=');">SugarSync</a>. It looks promising because it syncs multiple folders, stores revisions, and even has a Windows Mobile version (although it&#8217;s missing real-time sync). On paper, it looks like it has all the options you would expect from this type of service.</p>
<p><a href="http://syncplicity.com" target="_blank" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/syncplicity.com?referer=');">Syncplicity</a> looks respectable, but with so many alternatives, I&#8217;m just not sure if they have anything unique that sets them apart.</p>
<p><strong>Conclusion</strong></p>
<p>I think this type of application is going to have a huge market. This is one of those few killer app&#8217;s that if done well, will be on everyone&#8217;s computer. Obviously Microsoft&#8217;s offering will be positioned to dominate, but we all know that they don&#8217;t always have the absolute best product.</p>
<p>For now, I&#8217;ll be using DropBox for my main document folder. It suits my needs, and until it messes up, I won&#8217;t need to look elsewhere.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ytechie.com/2009/02/convenient-synchronization-with-mesh-and-dropbox.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Advantages of a 3rd party diff/compare tool</title>
		<link>http://www.ytechie.com/2008/12/advantages-of-a-3rd-party-diffcompare-tool.html</link>
		<comments>http://www.ytechie.com/2008/12/advantages-of-a-3rd-party-diffcompare-tool.html#comments</comments>
		<pubDate>Fri, 26 Dec 2008 15:23:57 +0000</pubDate>
		<dc:creator>superjason</dc:creator>
				<category><![CDATA[productivity]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://www.ytechie.com/2008/12/advantages-of-a-3rd-party-diffcompare-tool.html</guid>
		<description><![CDATA[I recently spent nearly an hour trying to figure out why all of my unit tests stopped working in a particular class. It turns out that I had accidentally deleted a single character in one of my strings, but the built in diff tool that comes with Team Foundation Server is very simplistic. Learn how [...]]]></description>
			<content:encoded><![CDATA[<p>I recently spent nearly an hour trying to figure out why all of my unit tests stopped working in a particular class. It turns out that I had accidentally deleted a single character in one of my strings, but the built in diff tool that comes with Team Foundation Server is very simplistic. Learn how and why you can replace your stock compare tool with something a little more powerful.</p>
<p>Here is a screenshot of what you&#8217;ll see in the stock Team Foundation Server compare tool:</p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="74" alt="Default TFS Compare Tool" src="http://www.ytechie.com/post-images/2008/12/image4.png" width="484" border="0"/> </p>
<p>See how hard it is to spot the difference? The problem is, ANY change on the entire line causes it to show up as &#8220;changed&#8221;. That includes whitespace changes. For this reason, I frequently end up with extra full lines that are colored as having been changed, making it harder to see the actual code changes. For the most part, I really don&#8217;t care about whitespace changes because they deal with the formatting of the document, and I&#8217;m more concerned with functional changes to my code.</p>
<p>The good news is that those smart guys at Microsoft make it easy to integrate a third party compare tool right into their tools. James Manning was even kind enough to include <a href="http://blogs.msdn.com/jmanning/articles/535573.aspx" target="_blank" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/blogs.msdn.com/jmanning/articles/535573.aspx?referer=');">detailed instructions and the exact settings needed</a> for every major compare tool. You can even use them for merging if you like.</p>
<p>Since my background is in Subversion and TortoiseSVN specifically, I pulled out my trusty <a href="http://kdiff3.sourceforge.net/" target="_blank" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/kdiff3.sourceforge.net/?referer=');">KDiff3</a> (SourceForge) compare tool. It&#8217;s a common alternative for TortoiseSVN&#8217;s own diff tool.</p>
<p>After wiring up KDiff3, here is what I saw when I compared revisions:</p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="110" alt="KDiff3 Character Difference" src="http://www.ytechie.com/post-images/2008/12/image5.png" width="484" border="0"/> </p>
<p>Notice how easy it is to see that I changed a single letter (it&#8217;s obviously easier when it&#8217;s full-size).</p>
<p>There are other good reasons to use a third party compare tool (which vary by tool obviously):</p>
<ul>
<li>Easily compare entire file structures (folder diff)</li>
<li>Inline editing</li>
<li>Easy to use outside of Visual Studio &#8211; often with an explorer context menu</li>
</ul>
<p>I recommend giving a few of the compare tools a try and see which works best for you. I don&#8217;t really see any risk in using a third party compare tool, but there are certainly a lot of advantages that you may not even know you&#8217;re missing right now. I suggest also taking a look at <a href="http://winmerge.org/" target="_blank" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/winmerge.org/?referer=');">WinMerge</a> in addition to <a href="http://kdiff3.sourceforge.net/" target="_blank" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/kdiff3.sourceforge.net/?referer=');">KDiff3</a>, since it seems to be fairly popular and feature-rich as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ytechie.com/2008/12/advantages-of-a-3rd-party-diffcompare-tool.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>ClearType in Remote Desktop with XP</title>
		<link>http://www.ytechie.com/2008/12/cleartype-in-remote-desktop-with-xp.html</link>
		<comments>http://www.ytechie.com/2008/12/cleartype-in-remote-desktop-with-xp.html#comments</comments>
		<pubDate>Tue, 23 Dec 2008 21:39:58 +0000</pubDate>
		<dc:creator>superjason</dc:creator>
				<category><![CDATA[productivity]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://www.ytechie.com/2008/12/cleartype-in-remote-desktop-with-xp.html</guid>
		<description><![CDATA[A new feature in XP SP3 that should of particular interest to developers is ClearType over RDP (remote desktop protocol). If you occasionally use remote desktop to work from home, or work remotely to your development machine, please read on.
If you&#8217;re not familiar with ClearType, you can head over to Wikipedia for a full explanation. [...]]]></description>
			<content:encoded><![CDATA[<p>A new feature in XP SP3 that should of particular interest to developers is ClearType over RDP (remote desktop protocol). If you occasionally use remote desktop to work from home, or work remotely to your development machine, please read on.</p>
<p>If you&#8217;re not familiar with ClearType, you can head over to Wikipedia for a <a href="http://en.wikipedia.org/wiki/ClearType" target="_blank" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/ClearType?referer=');">full explanation</a>. In a nutshell, it takes advantage of the fact that each pixel in an LCD screen actually has 3 sub-pixels. They can be &#8220;hacked&#8221; to improve the anti-aliasing of text displayed on the screen. I&#8217;ve been a huge fan of the feature, especially for source code, and I have a hard time living without it. In XP (locally), it&#8217;s turned <strong>off</strong> by default, but turned <strong>on</strong> in Vista.</p>
<p align="center"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="183" alt="ClearType Effects Dialog" src="http://www.ytechie.com/post-images/2008/12/image3.png" width="425" border="0"/> </p>
<p>I had always noticed the remote desktop would not give me ClearType. However, I became curious when I found the following options on my Vista machine. Apparently ClearType over RDP is now supported in the client, and is also supported when using Vista as the RDP server (no hacking needed).</p>
<p align="center"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="326" alt="RDP Experience Options" src="http://www.ytechie.com/post-images/2008/12/image2.png" width="290" border="0"/> </p>
<p>Unfortunately, these options have no effect when using XP. If you want ClearType over RDP with XP SP3 (sorry, only SP3+), add the following registry key:</p>
<p>
<div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:fb4c1216-6343-4bb0-a4ea-b87b0ee5266b" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c">Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations]
"AllowFontAntiAlias"=dword:00000001</pre>
</div>
<p>After you add that registry key, simply reboot the server (XP), and reconnect. From what I can tell, the client options no longer matter. Even if I uncheck the &#8220;Font Smoothing&#8221; option, it still uses ClearType. It&#8217;s not a big deal, but I thought it was worth mentioning.</p>
<p>So far, after using this option for a while, I haven&#8217;t seen a significant performance impact over a VPN on the Internet.</p>
<p>If you want to take this a step further, install <a href="http://www.microsoft.com/downloads/details.aspx?familyid=22e69ae4-7e40-4807-8a86-b3d36fab68d3&amp;displaylang=en" target="_blank" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.microsoft.com/downloads/details.aspx?familyid=22e69ae4-7e40-4807-8a86-b3d36fab68d3_amp_displaylang=en&amp;referer=');">Consolas</a>, it&#8217;s a font designed specifically for software development, and to take advantage of ClearType. It&#8217;s a free download from Microsoft.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ytechie.com/2008/12/cleartype-in-remote-desktop-with-xp.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Cloud Computing (and Azure) &#8211; Right for your site?</title>
		<link>http://www.ytechie.com/2008/11/cloud-computing-and-azure-right-for-your-site.html</link>
		<comments>http://www.ytechie.com/2008/11/cloud-computing-and-azure-right-for-your-site.html#comments</comments>
		<pubDate>Tue, 11 Nov 2008 17:49:37 +0000</pubDate>
		<dc:creator>superjason</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[virtualization]]></category>

		<guid isPermaLink="false">http://www.ytechie.com/2008/11/cloud-computing-and-azure-right-for-your-site.html</guid>
		<description><![CDATA[Everyone seems to be getting excited lately about the prospect of cloud computing. Just like many others, I get excited by the idea that I wouldn&#8217;t have to worry about adding servers to scale up. Theoretically, a guy (or girl) could make the next YouTube, in his basement, for free. However, there is one huge [...]]]></description>
			<content:encoded><![CDATA[<p>Everyone seems to be getting excited lately about the prospect of cloud computing. Just like many others, I get excited by the idea that I wouldn&#8217;t have to worry about adding servers to scale up. Theoretically, a guy (or girl) could make the next YouTube, in his basement, for <em>free</em>. However, there is one huge advantage that most people ignore, and that&#8217;s the fact that&#8217;s also <strong>perfect for a small scale website</strong>.</p>
<p align="center"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="175" alt="iStock_000004135866XSmall" src="http://www.ytechie.com/post-images/2008/11/istock-000004135866xsmall.jpg" width="240" border="0"/> </p>
<p>I&#8217;ve tried or considered many different ways of hosting my content:</p>
<ul>
<li><strong>Shared hosting</strong> &#8211; Cheaply host your sites, but be at the mercy of their IT guy messing with your computer and rebooting it for automatic updates. Also, in my experience, the performance is terrible if your traffic spikes. They typically have hundreds of users on the same server as you, and you all get to compete for performance.  </li>
<li><strong>Dedicated hosting</strong> &#8211; This is what I use now, because it ensures that I get the full performance of a machine. The disadvantage is that I have a single point of failure, and I have to manage the machine myself. </li>
<li><strong>Hosting from home</strong> &#8211; Yes, people actually do this. If you have a high enough upload speed it shouldn&#8217;t be too bad. The problem is that your connection typically won&#8217;t be able to handle traffic spikes. You&#8217;ll also potentially be a victim of power or Internet outages, where professional hosts would have redundant systems in place (in theory).</li>
</ul>
<p>Now, let&#8217;s talk about cloud computing. That magical cloud that many don&#8217;t understand. There are two potentially viable cloud computing methods available right now:</p>
<ul>
<li><strong>Cloud virtual machines</strong> &#8211; Amazon&#8217;s EC2 solution is probably the most popular in this category. Basically, you can create, start, and stop virtual machines remotely. You just pay an hourly rate while the computer is running. You can even upgrade and downgrade the hardware as needed. The advantage is that you can treat the computer like a physical machine and configure and use it however you like. The disadvantage is that maintaining individual machines can be time consuming and is not necessarily part of your core business. </li>
<li><strong>Cloud application server</strong> &#8211; Instead of creating virtual machines, a cloud application server runs your application directly. You no longer worry about the constraints of a physical machine. You application could potentially be run on dozens or hundreds of servers simultaneously. The major advantage is that there is little to no maintenance, because that is the job of the provider.</li>
</ul>
<p>I see the cloud application server as having some of the greatest advantages. You&#8217;re free to write your application with a level of abstraction, which allows you to solve the problems you really want to solve.</p>
<p>One of the most well known cloud application services is the <a href="http://code.google.com/appengine/" target="_blank" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/code.google.com/appengine/?referer=');">Google App Engine</a>, which currently supports Python applications. Microsoft joined the game recently with <a href="http://www.microsoft.com/azure/default.mspx" target="_blank" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.microsoft.com/azure/default.mspx?referer=');">Azure</a> for ASP.NET.</p>
<p>As I mentioned, not only do application servers let your applications scale up, they let you <strong>pay only for what you use</strong>. This is great for the small to medium website&#8217;s that are stuck with bad shared hosting or difficult-to-manage dedicated hosting. The fact is that most sites get a <strong>few hundred visitors daily or less</strong>. If you start to think about how often a page is actually requested, you&#8217;ll realize that it&#8217;s not very much. Even with 500 users requesting 5 pages each in a 12 hour period can easily be handled with a very low end server from years ago.</p>
<p>The reason that application servers are so much more efficient than shared hosting is because they&#8217;re built from the ground up to spread the load around. This results in higher utilization, but more headroom for any single application. Shared hosting providers can move users between servers, but it&#8217;s usually a manual, and often difficult process. You&#8217;re bound to a specific physical machine (unless it&#8217;s VPS hosting), and if it goes down, so does your site.</p>
<p>Cloud computing is also a great way to handle traffic spikes such as the Digg effect. Let&#8217;s say that you only have 500 visitors today, but might get 10, 100, or 1000 times more in a single day. <a href="http://www.lukasbiewald.com/?p=153" target="_blank" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.lukasbiewald.com/?p=153&amp;referer=');">It happened to FaceStat</a>. They went from 10,000 page views per day to almost a million because of a story on the front page of Yahoo. They had to scramble to add application servers and develop a scaling strategy immediately.</p>
<p><strong>Conclusion &#8211; Cloud Application Server Benefits</strong></p>
<p>Cloud computing has tremendous benefits. You no longer have to worry about scaling the underlying hardware, you simply pay as you go, and you can handle traffic spikes with ease. Once cloud computing becomes mainstream and absolutely reliable, there will be few reasons to not use it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ytechie.com/2008/11/cloud-computing-and-azure-right-for-your-site.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Secure XAMPP by only allowing local access</title>
		<link>http://www.ytechie.com/2008/10/secure-xampp-by-only-allowing-local-access.html</link>
		<comments>http://www.ytechie.com/2008/10/secure-xampp-by-only-allowing-local-access.html#comments</comments>
		<pubDate>Fri, 31 Oct 2008 15:17:15 +0000</pubDate>
		<dc:creator>superjason</dc:creator>
				<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.ytechie.com/2008/10/secure-xampp-by-only-allowing-local-access.html</guid>
		<description><![CDATA[This site and a couple others are served up on a dedicated server. To make it easy to set up Wordpress, I&#8217;m using XAMPP. In this post, I&#8217;ll give a quick overview of XAMPP, and then also show you how to secure it so that administrative utilities are only available locally.
XAMPP Super-Quick Overview
XAMPP is basically [...]]]></description>
			<content:encoded><![CDATA[<p>This site and a couple others are served up on a dedicated server. To make it easy to set up Wordpress, I&#8217;m using XAMPP. In this post, I&#8217;ll give a quick overview of XAMPP, and then also show you how to secure it so that administrative utilities are only available locally.</p>
<p><strong>XAMPP Super-Quick Overview</strong></p>
<p>XAMPP is basically a quick way of setting up MySQL, PHP, Perl, and Apache. You can download it, extract it, and run it from any location. If you&#8217;re not experienced Apache/PHP world, this is the easiest way to get something working ASAP. In the next image, you&#8217;ll see the directory structure under your XAMPP directory:</p>
<p align="center"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="276" alt="image" src="http://www.ytechie.com/post-images/2008/10/image.png" width="328" border="0"/> </p>
<p>Here are the key folders you would probably need to worry about:</p>
<ul>
<li><strong>apache</strong> &#8211; Contains the installation of Apache.</li>
<li><strong>htdocs</strong> &#8211; Contains the folder that is served up by Apache. If you want to install a web application such as Wordpress, you probably want it in here.</li>
<li><strong>mysql</strong> &#8211; Contains the installation of MySql.</li>
</ul>
<p>Now, if you simply want to install Wordpress on XAMPP, I&#8217;m not going to write yet another tutorial. There are plenty out there, most with screenshots of step-by-step instructions, <a href="http://www.google.com/search?q=xampp+wordpress" target="_blank" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?q=xampp+wordpress&amp;referer=');">just Google for them</a>.</p>
<p><strong>Securing XAMPP</strong></p>
<p>Once I configured XAMPP, I stupidly assumed that the utility applications like phpmyadmin would not be publicly available. I was very wrong, and was warned before anyone decided to do something bad.</p>
<p>Most of the instructions I found through Google for securing the utility paths seemed kind of weak to me. They basically work by securing those paths with a password. I&#8217;m a little paranoid, so I don&#8217;t want those paths remotely accessible <em>at all</em>.</p>
<p>The first thing I did was lock down Apache security so that it&#8217;s very restrictive by default (apache/httpd.conf):</p>
<p>
<div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:8cd376e9-1946-4c7b-9be7-f6a978446954" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="xml">&lt;Directory /&gt;
    Options Indexes FollowSymLinks Includes ExecCGI
    AllowOverride All
    Order deny,allow
    Deny from all
&lt;/Directory&gt;</pre>
</div>
<p>Make sure that you don&#8217;t have any other directory directives in your configuration file that may override this.</p>
<p>Next, in the .htaccess file for each Wordpress installation, I added this line: &#8220;Allow from all&#8221;. This basically tells Apache that this folder is safe to serve up to everyone.</p>
<p>Now, the problem is that XAMPP has a configuration file that overrides the utility paths and allows access for anyone. To fix this, perform a search and replace in the (in Apache/Conf/Extra) &#8220;httpd-xampp.conf&#8221; file to change &#8220;Allow from all&#8221; to &#8220;Allow from 127.0.0.1&#8243;. Now, all of the XAMPP directories will only be served locally.</p>
<p><strong>Conclusion</strong></p>
<p>My background is certainly not Apache/PHP, but I&#8217;m still learning. If I made any mistakes in my configuration, please leave a comment or send me an email.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ytechie.com/2008/10/secure-xampp-by-only-allowing-local-access.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Vista actually is pretty good, honest</title>
		<link>http://www.ytechie.com/2008/09/vista-actually-is-pretty-good-honest.html</link>
		<comments>http://www.ytechie.com/2008/09/vista-actually-is-pretty-good-honest.html#comments</comments>
		<pubDate>Thu, 25 Sep 2008 14:04:23 +0000</pubDate>
		<dc:creator>superjason</dc:creator>
				<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.ytechie.com/2008/09/vista-actually-is-pretty-good-honest.html</guid>
		<description><![CDATA[I know that Microsoft doesn&#8217;t need anyone defending them, but I think that the series of events surrounding Vista were certainly not ideal. I&#8217;ve highly anticipated every new release of Windows, and Vista was no exception.
 
Watching the progress of Vista, I couldn&#8217;t help being disappointed. Vista was supposed to change the world. There would [...]]]></description>
			<content:encoded><![CDATA[<p>I know that Microsoft doesn&#8217;t need anyone defending them, but I think that the series of events surrounding Vista were certainly not ideal. I&#8217;ve highly anticipated every new release of Windows, and Vista was no exception.</p>
<p align="center"><a href="http://www.ytechie.com/post-images/2008/09/image3.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="145" alt="Vista Logo" src="http://www.ytechie.com/post-images/2008/09/image-thumb1.png" width="195" border="0" /></a> </p>
<p>Watching the progress of Vista, I couldn&#8217;t help being disappointed. Vista was supposed to change the world. There would be an amazing new file system, a cutting edge graphics system, and .NET driving many of the core functionality. But one by one, the features got neutered or disappeared completely.</p>
<p>When it was released, the bad hype had already nearly killed it for me. Then I installed it in a virtual machine and learned what a pile of crap it really was. It took minutes to boot, and the UI was barely usable. Every few seconds I would get security prompts. I was done with this OS for a long time.</p>
<p>Fast forward to Windows 2008. I started reading great things about how this OS made a great desktop OS. At the core, it&#8217;s Vista SP1, but with much of the crap removed. I tried it out, and loved it. I had a few issues with incompatible drivers, but that&#8217;s expected when using a just-released 64-bit OS.</p>
<p>Then, Vista SP1 was released, and most of the cynics said it was &quot;decent&quot;. Time had helped fix the driver issues, and SP1 addressed specific pain points. Eventually I got around to installing Vista SP1 (64 bit) over Windows 2008. I was amazed. Nearly all of the drivers were already included. It was fast, and some of the new features, while not life changers, were a boost to my productivity none-the-less.</p>
<p>Recently, I purchased a new laptop. It&#8217;s shocking what you can get for a mere $650. It&#8217;s a 14.1&quot; HP (dv2910us) with 3GB RAM, 2GHz Core 2 Duo, 250GB hard drive, 802.11n, DVD burner, and even a built-in removable remote control. Of course it included a license for Vista. HP includes a shocking amount of crapware, so I reinstalled Vista from my MSDN media. One major improvement over XP is that your OEM key works with MSDN media. That means I can actually use the key that was on the sticker of the laptop! Thank you Microsoft (and it&#8217;s about time)!</p>
<p>It runs great on my laptop, and I&#8217;ve had no complaints whatsoever. In fact, I think I&#8217;ve had less issues than if I was running XP. Much to my surprise, a few days ago I get a prompt to install updates. <strong>The update in the list was SP1.</strong> Yes, that&#8217;s right, I wasn&#8217;t even using SP1. Maybe Vista was bad when it came out, but I think the horsepower of modern computers combined with finally decent driver support erases the bad history.</p>
<p align="center"><a href="http://www.ytechie.com/post-images/2008/09/image4.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="198" alt="Vista Copy Dialog" src="http://www.ytechie.com/post-images/2008/09/image-thumb2.png" width="334" border="0" /></a></p>
<p>I&#8217;ll sum up what I love about Vista over XP in one paragraph. Integrated search from the start menu rocks, and I use it <strong>constantly</strong>. I also love the new copy dialog, which tells me the actual speed of file transfers. As far as 64-bit support, I&#8217;ve been very impressed. It&#8217;s very possible to run the 64-bit version and have a decent change of all of your devices working as expected. This is a must since typical new high-end computers are going to start going over 4GB RAM soon (if they haven&#8217;t already). There are even hard to find features that are very nice. When you copy a folder over another folder, it actually gives you a reasonable set of options, as well as enough information to make a decision about merging, overwriting, or even renaming them.</p>
<p align="center"><a href="http://www.ytechie.com/post-images/2008/09/image5.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="204" alt="Vista UAC Dialog" src="http://www.ytechie.com/post-images/2008/09/image-thumb3.png" width="368" border="0" /></a>&#160; </p>
<p>Now what about UAC? You know, the feature that pops up an annoying dialog every 5 seconds? Well, if you run your computer as a local administrator (like you did in XP), you&#8217;ll rarely see them. I actually appreciate them because it does make your computer safer.</p>
<p><strong>Conclusion</strong></p>
<p>Make up your own opinion about Vista and give it a try. It&#8217;s mature enough that I recommend it to my tech friends. I was just as apprehensive as everyone else, but I&#8217;m glad I made the switch. In case you&#8217;re wondering, no Microsoft hasn&#8217;t paid me, but it sure would be nice <img src='http://www.ytechie.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ytechie.com/2008/09/vista-actually-is-pretty-good-honest.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>New Backup Solution &#8211; JungleDisk + Amazon S3</title>
		<link>http://www.ytechie.com/2008/07/new-backup-solution-jungledisk-amazon-s3.html</link>
		<comments>http://www.ytechie.com/2008/07/new-backup-solution-jungledisk-amazon-s3.html#comments</comments>
		<pubDate>Wed, 02 Jul 2008 15:26:49 +0000</pubDate>
		<dc:creator>superjason</dc:creator>
				<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.ytechie.com/2008/07/new-backup-solution-jungledisk-amazon-s3.html</guid>
		<description><![CDATA[I&#8217;ve settled on a new backup solution. I&#8217;m going to be using Amazon&#8217;s persistent storage solution called S3. Amazon provides a virtually infinite, scalable storage cloud that allows you to store files indefinitely. You pay a small fee to get the data there ($.10/gig), a fee to store the data ($.15/gig/month), and a fee to [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve settled on a new backup solution. I&#8217;m going to be using <a href="http://www.amazon.com/gp/browse.html?node=16427261" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.amazon.com/gp/browse.html?node=16427261&amp;referer=');">Amazon&#8217;s persistent storage solution called S3</a>. Amazon provides a <strong>virtually infinite, scalable storage</strong> cloud that allows you to store files indefinitely. You pay a small fee to get the data there ($.10/gig), a fee to store the data ($.15/gig/month), and a fee to retrieve the data ($.17/gig).</p>
<p>Features I was looking for:</p>
<ul>
<li>Reasonably Priced</li>
<li>Automatic</li>
<li>Reliable</li>
<li>Scalable</li>
<li>Well performing</li>
<li>Easy</li>
</ul>
<p><strong>Price</strong></p>
<p>To automate my backups, I&#8217;m using a product called <a href="http://www.jungledisk.com/" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.jungledisk.com/?referer=');">JungleDisk</a>. You can purchase it for $20, and you get free upgrades for life. I love products that have free upgrades for life, since I don&#8217;t have to worry about <em>when</em> buy it. They also allow you to use it on unlimited computers, which I definitely need.</p>
<p>JungleDisk by default talks directly with S3, so they don&#8217;t need to run any servers. You&#8217;re counting 100% on the reliable storage provided by S3.</p>
<p><strong>Organization</strong></p>
<p>Amazon stores your files in &quot;buckets&quot;, which you can think of as a single level folder/directory structure. JungleDisk can easily connect to multiple buckets at the same time. You configure each bucket independently. JungleDisk can automatically detect all of your buckets, and you can easily create new ones.</p>
<p><img height="309" alt="image" src="http://www.ytechie.com/post-images/2008/07/image1.png" width="209" border="0" /> </p>
<p>I highly recommend creating buckets for each logical group of files you want to back up. Try to avoid sharing a bucket between computers when possible. If you tell JungleDisk that a bucket is only used on one computer, it doesn&#8217;t have to query S3 to determine what needs to be synchronized. The default is set to <strong>multiple computers</strong>. This setting is under the &quot;Bucket Settings&quot; for each bucket.</p>
<p><img height="173" alt="image" src="http://www.ytechie.com/post-images/2008/07/image2.png" width="427" border="0" /> </p>
<p>Each bucket also lets you choose what to back up. Of course there are extensive options for backing up subfolders, excluding files, etc.</p>
<p><img height="125" alt="image" src="http://www.ytechie.com/post-images/2008/07/image3.png" width="479" border="0" /></p>
<p>You can even set up how your local folders get mapped to the remote folders. This lets you do multiple folders in one bucket. On my laptop, I have a couple of folders that get backed up to a single bucket, but are organized into different folders so that I could easily restore them independently.</p>
<p><img height="94" alt="image" src="http://www.ytechie.com/post-images/2008/07/image4.png" width="322" border="0" />&#160; </p>
<p><strong>Scheduling</strong></p>
<p>Setting up a schedule is very easy. For example, on my laptop, I have it set to synchronize my files every hour. It uses the timestamp&#8217;s of the files to determine if there are any new, changed, or deleted files. Since I&#8217;m not sharing this particular bucket between machines, it can <em>instantly</em> determine if anything needs backed up.</p>
<p><img height="111" alt="image" src="http://www.ytechie.com/post-images/2008/07/image5.png" width="199" border="0" /> </p>
<p>&#160;<img height="71" alt="image" src="http://www.ytechie.com/post-images/2008/07/image6.png" width="327" border="0" /> </p>
<p><strong>Security</strong></p>
<p>JungleDisk has all the security options you would expect. You can communicate with Amazon over port 80 unencrypted, or use SSL. I actually turn off the SSL option, because I use the JungleDisk encryption. I don&#8217;t see a reason to do double encryption.</p>
<p><img height="75" alt="image" src="http://www.ytechie.com/post-images/2008/07/image7.png" width="401" border="0" /></p>
<p>When you create the bucket, you can specify a custom key that encrypts your data. I like this option because I am the only one that has access to the data. Even Amazon can&#8217;t tell what I&#8217;m storing on there.</p>
<p><img height="91" alt="image" src="http://www.ytechie.com/post-images/2008/07/image8.png" width="500" border="0" /> </p>
<p><strong>Performance</strong></p>
<p>Since Amazon is providing the storage, they&#8217;re able to scale indefinitely. You can be confident that they can handle whatever you throw at them. They had no problem letting me upload at over 56,000 kbits/sec from my dedicated host. I backed up 4 gigs in about 10 minutes.</p>
<p><img height="322" alt="Fast Upload" src="http://www.ytechie.com/post-images/2008/07/fast-upload.png" width="408" border="0" /> </p>
<p><strong>Other Features</strong></p>
<ul>
<li><strong>Bandwidth limiting</strong> &#8211; If you don&#8217;t want to use up all of your upstream or downstream bandwidth, you can limit it, and even schedule when it&#8217;s limited. This could be useful for limiting the connection during the day. However, I much prefer a QoS solution since it will maximize the amount of bandwidth I can use.</li>
<li><strong>Previous versions</strong> &#8211; There are extensive options for storing previous versions of changed or deleted files. This option is very impressive, and great for documents.</li>
<li><strong>Network drive</strong> &#8211; You can make a bucket show up as a drive on your computer, which allows you to drag and drop files to and from the bucket.</li>
<li><strong>Jungle Disk Plus</strong> &#8211; For $1/month extra, you can get JungleDisk Plus. They use an Amazon EC2 server to proxy your data to S3. This allows you to resume large file uploads, and also lets you send just the differences. If you&#8217;re backing up large files and/or files that may have sections change frequently, this could end up saving you money.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.ytechie.com/2008/07/new-backup-solution-jungledisk-amazon-s3.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Using an army and luck to reach critical mass</title>
		<link>http://www.ytechie.com/2008/06/using-an-army-and-luck-to-reach-critical-mass.html</link>
		<comments>http://www.ytechie.com/2008/06/using-an-army-and-luck-to-reach-critical-mass.html#comments</comments>
		<pubDate>Tue, 24 Jun 2008 13:21:48 +0000</pubDate>
		<dc:creator>superjason</dc:creator>
				<category><![CDATA[ecommerce]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.ytechie.com/2008/06/using-an-army-and-luck-to-reach-critical-mass.html</guid>
		<description><![CDATA[This post is going to explain the importance of your product reaching critical mass. When I say &#8220;product&#8221;, I mean an actual product you&#8217;re selling, or simply a website or blog. When I&#8217;m talking about critical mass, I&#8217;m describing the point at which your product becomes viral, sometimes known as the network effect. This should [...]]]></description>
			<content:encoded><![CDATA[<p>This post is going to explain the importance of your product reaching critical mass. When I say &#8220;product&#8221;, I mean an actual product you&#8217;re selling, or simply a website or blog. When I&#8217;m talking about critical mass, I&#8217;m describing the point at which your product becomes viral, sometimes known as the <a rel="nofollow" href="http://en.wikipedia.org/wiki/Network_effect" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Network_effect?referer=');">network effect</a>. This should be a lesson to anyone thinking of creating their own product or service.</p>
<p><img src="http://www.ytechie.com/post-images/2008/06/image4.png" border="0" alt="image" width="476" height="169" /></p>
<p>Above, you&#8217;ll see the typical <a rel="nofollow" href="http://en.wikipedia.org/wiki/Technology_Adoption_LifeCycle" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Technology_Adoption_LifeCycle?referer=');">technology adoption bell curve</a>. What you need to realize is that you&#8217;re starting on the left, and you&#8217;re trying to get up the hill. Do you think it&#8217;s easy? Well, judging by Youtube, twitter, <a rel="nofollow" href="http://www.milliondollarhomepage.com/" onclick="pageTracker._trackPageview('/outgoing/www.milliondollarhomepage.com/?referer=');">milliondollarhomepage</a>, Digg, or myspace, it must be easy!</p>
<p>The truth is, you should have a path to success. Here are just a couple of paths that have worked for other products:</p>
<ul>
<li>Create a product that is leaps and bounds better than anything your potential customers have ever seen &#8211; An example is Google, which was originally created by students in college. The brilliance of the algorithm and its implementation were the start of a massive company.</li>
<li>Have an army of followers that listen to your advice &#8211; A great example is Steve Jobs. Before he even makes a new product announcement, people line up at Apple stores. People trust that he&#8217;ll make cool stuff, so they listen to whatever he says. You can bet that if Steve Jobs mentioned your product, you would people lining up at your door to buy it.</li>
<li>Get lucky &#8211; It happens time and time again. Multiple products are released at the same time, all with similar features and price. Sometimes one of them gets lucky, and the others die. An example is the VHS vs Betamax format war. VHS was considered the inferior product, yet it went on to become the de facto standard.</li>
<li>Create a product that is viral by nature &#8211; Twitter and Myspace come to mind. Once one person joins, they&#8217;re begging their friends to use if. If they don&#8217;t, the service is useless. The result is that you get an army of free advertisers talk to your key demographic.</li>
<li>Spend a ridiculous amount of cash to bombard users with advertising &#8211; infomercial&#8217;s and those annoying &#8220;<a rel="nofollow" href="http://www.poop-freeze.com" onclick="pageTracker._trackPageview('/outgoing/www.poop-freeze.com?referer=');">we&#8217;ll double the offer</a>&#8221; commercials come to mind.</li>
</ul>
<p>Hopefully I&#8217;m making the situation look difficult. I couldn&#8217;t find any concrete numbers, but you can be sure that more than half of online businesses fail within the first couple of years. That includes well-funded businesses. If you expect to start the next <a rel="nofollow" href="http://www.fogcreek.com/" onclick="pageTracker._trackPageview('/outgoing/www.fogcreek.com/?referer=');">Fog Creek Software</a> while working part time in the evenings, you need to have a plan.</p>
<p>The best advice I can give you is to do whatever it takes to get your product into the hands of as many people as possible. It might mean making partnerships with someone of influence, or it might mean creating a viral marketing campaign. It might also mean that you&#8217;ll have to give your product away for free, build up your army of followers, and then invent another great product. If you already have a product with a good user base, you&#8217;re probably already in good shape. If you are just starting out, don&#8217;t think that people will magically find you, unless you&#8217;re counting on the &#8220;lucky&#8221; path I described.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ytechie.com/2008/06/using-an-army-and-luck-to-reach-critical-mass.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
