<?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>R. Kris Hardy &#187; Articles</title>
	<atom:link href="http://www.rkrishardy.com/category/articles/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rkrishardy.com</link>
	<description>Software Development, Web Applications and Business Analytics</description>
	<lastBuildDate>Tue, 19 Jul 2011 17:58:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Getting Started with Git and SVN</title>
		<link>http://www.rkrishardy.com/2011/07/getting-started-with-git-and-svn/</link>
		<comments>http://www.rkrishardy.com/2011/07/getting-started-with-git-and-svn/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 14:32:32 +0000</pubDate>
		<dc:creator>Kris</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[git git-svn code.google.com googlecode tutorial]]></category>

		<guid isPermaLink="false">http://www.rkrishardy.com/?p=288</guid>
		<description><![CDATA[Getting Started with Git and SVN What is Git, and why would you want to use it? Git is a distributed version control system that was written by Linus Torvalds (the developer of the Linux kernel). &#8220;Distributed&#8221; means that the entire revision history is stored on your local machine, which allows you to manage commits, [...]]]></description>
			<content:encoded><![CDATA[<h1>Getting Started with Git and SVN</h1>
<h2>What is Git, and why would you want to use it?</h2>
<p><a href="http://git-scm.com">Git</a> is a distributed version control system that was written by Linus Torvalds (the developer of the Linux kernel). &#8220;Distributed&#8221; means that the entire revision history is stored on your local machine, which allows you to manage commits, rollback changes, merge branches, tag, etc., all without having to maintain a constant connection to the central svn server.</p>
<p>This also allows you to use very non-linear development methods, and incrementally commit changes and publish those changes on SVN in one batch once you know that everything that you&#8217;re working on works.</p>
<p>The other really nice part of git is that you can branch your code in-place on your local machine, meaning that you can branch the trunk and make multiple branches (and even branches of branches) to try things out and see what works best. Once you have your changes in place, you can merge the branches back together and commit them to svn.</p>
<p>I&#8217;ve has been using this for my development starting in May 2011, and I&#8217;ve been really happy with it, although it takes a little time to get used to. This page is working document of some of the tricks, lessons, and best practices that I&#8217;ve picked up as I&#8217;ve started to use git. (BTW, I&#8217;m so happy with git that all my personal development projects have been entirely migrated to git both on the workstation and my server).</p>
<p>If you have any questions, make sure to post a message below. I continue to add to this tutorial so that I have a central place to store my working knowledge of git svn.</p>
<p>Thanks!</p>
<h2>Introductory Material (or reference material if you get stuck)</h2>
<p>To start with, <a href="http://git.or.cz/course/svn.html">here is a cheatsheet of git commands</a>, and how they relate to svn. Now, git can do a LOT more than this, but it will help you get started with understanding how git works.</p>
<p>For a more lengthy introduction to git, read the <a href="http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html">Git Tutorial</a> and then the <a href="http://www.kernel.org/pub/software/scm/git/docs/everyday.html">Everyday GIT with 20 commands or so</a> page.</p>
<h2>Typical Workflow with Git and SVN</h2>
<p><strong>Before you start this tutorial, if you want to also try committing to a svn server, send me an e-mail at <a href="mailto:kris@rkrishardy.com">kris@rkrishardy.com</a>, and give me your e-mail address so that I can give you commit access.</strong> (I just ask that you be considerate with what you commit, and don&#8217;t commit anything that is not tasteful).</p>
<p>To get started, first, download and install Git. If you are on Windows, download Git from http://git-scm.com. If you are on a Unix/Linux variety, use your repository or package manager.</p>
<p>On Fedora/RedHat/CentOS:<br />
<code><br />
$ sudo yum install git git-svn<br />
</code></p>
<p>On Debian/Ubuntu:<br />
<code><br />
$ sudo apt-get install git-core git-svn<br />
</code></p>
<p>For FreeBSD, check out the <a href="http://www.freebsd.org/doc/handbook/ports.html">instructions for installing packages and ports</a>, depending on your preference.</p>
<p>Now, let&#8217;s use the <a href="http://code.google.com/p/git-svn-sandbox/">git-svn-sandbox project at code.google.com</a> as an example to show you how this works.</p>
<p>The directory that you want to clone from svn is the one with the trunk/tags/branches directories inside of it. For example, let&#8217;s clone git-svn-sandbox.</p>
<p><code><br />
$ git svn clone https://git-svn-sandbox.googlecode.com/svn/ git-svn-sandbox -Ttrunk -bbranches -ttags --username your@emailaddress.com<br />
This may take a while on large repositories<br />
Checked through r...<br />
...<br />
Checked out HEAD:<br />
http://code.google.com/p/git-svn-sandbox r...<br />
</code></p>
<p>This will create a git-svn-sandbox folder and clone the entire svn history into the git-svn-sandbox/.git folder. This may take some time because it needs to walk the entire svn revision tree, so grab some tea or coffee and give it a few minutes.</p>
<p>Once the cloning is done, you should have a local &#8216;master&#8217; branch in place:</p>
<p><code><br />
$ cd git-svn-sandbox<br />
$ git branch<br />
* master<br />
</code></p>
<p>The &#8216;*&#8217; shows you which branch you currently have checked out. You should currently be in the &#8220;master&#8221; branch.</p>
<p>Now, see what remote tracking branches are available (these are on the SVN server):</p>
<p><code><br />
$ git branch -r<br />
tags/1.0<br />
test<br />
trunk<br />
</code></p>
<p>git branch is the command to use for managing local branches. Using git branch, you can create, delete, merge, etc. your local branches. (These are isolated from the SVN remote branches, and branches you create here are not automatically uploaded to the SVN server, so create and delete branches without fear).</p>
<p>SVN doesn&#8217;t handle conflicts smoothly, so here&#8217;s what I do. Before I start changing anything, I first create a new local branch and start working on that. If you forget to branch, that&#8217;s OK. If you get a conflict during the git svn rebase or git svn dcommit, see the &#8220;I did an git svn rebase, but I got a bunch of merge errors. What should I do?&#8221; section below.</p>
<p><code><br />
$ git checkout -b my_branch<br />
Switched to a new branch 'my_branch'<br />
</code></p>
<p>You have created a new branch and switched to it. This command was<br />
shorthand for:</p>
<p><code><br />
$ git branch my_branch<br />
$ git checkout my_branch<br />
</code></p>
<p>Now, and and/or edit the files you need to. When you are done, take a<br />
look at the list of files that changed.</p>
<p><code><br />
$ git status<br />
# On branch my_branch<br />
# Changes not staged for commit:<br />
# (use "git add ..." to update what will be committed)<br />
# (use "git checkout -- ..." to discard changes in working<br />
directory)<br />
#<br />
# modified: test.txt<br />
#<br />
# Untracked files:<br />
# (use "git add ..." to include in what will be committed)<br />
#<br />
# abcd.123<br />
no changes added to commit (use "git add" and/or "git commit -a")<br />
</code></p>
<p>Here, text.txt is already in the git index and has been modified but not flagged to be committed. Also, abcd.123 has been added, but is not in the git index.</p>
<p>To add both to the git index, use git add -A (which adds all untracked and modified files to the index).</p>
<p><code>$ git add -A</code></p>
<p>Now you can commit the files to the git branch using git commit.</p>
<p><code><br />
$ git commit<br />
[my_branch db1292d] Saving changes<br />
2 files changed, 3 insertions(+), 0 deletions(-)<br />
create mode 100644 abcd.123<br />
</code></p>
<p>When you are done developing and you want to share your code on the svn server, make sure that you have all the files checked into your development branch.</p>
<p><code><br />
$ git status<br />
</code></p>
<p>Add and commit any changes that show up, and then checkout the master branch.</p>
<p><code><br />
$ git checkout master<br />
Switched to branch 'master'<br />
</code></p>
<p>If you didn&#8217;t remember to do your development in a different branch, and you made modifications in master, follow the instructions in &#8220;I did an git svn rebase, but I got a bunch of merge errors. What should I do?&#8221; if you run into any problems with the next set of steps.</p>
<p>Rebase your master branch with the svn server.</p>
<p><code><br />
$ git svn rebase<br />
...<br />
Current branch master is up to date.<br />
</code></p>
<p>If any files had been committed to svn by other developers, you should see the changes applied in the output of git svn rebase.</p>
<p>Merge in the changes that you want to commit to svn.</p>
<p><code><br />
$ git merge temp<br />
Updating 3877696..f68e10c<br />
Fast-forward<br />
test.txt | 1 +<br />
1 files changed, 1 insertions(+), 0 deletions(-)<br />
create mode 100644 test.txt<br />
</code></p>
<p>If you see any conflicts in the output, you can find the conflicts by using git status.<br />
<code><br />
$ git status<br />
</code></p>
<p>If you want to diff the conflicts, use git diff.<br />
<code><br />
$ git diff<br />
</code></p>
<p>Once the conflicts have been resolved, make sure that all the changes have been committed to master. Then commit the changes to svn using git svn dcommit.</p>
<p><code><br />
$ git commit<br />
$ git svn dcommit --username your@emailaddress.com<br />
Committing to https://git-svn-sandbox.googlecode.com/svn/trunk ...<br />
A test.txt<br />
Committed r4<br />
A test.txt<br />
r4 = 4c55148ecefac8b83b626fa568b2bc1f99ea990e (refs/remotes/trunk)<br />
No changes between current HEAD and refs/remotes/trunk<br />
Resetting to the latest refs/remotes/trunk<br />
</code></p>
<p><strong>If git svn dcommit failed with a message stating &#8220;Authorization failed: &#8230;&#8221;, I need to give you commit access to the repository. Please send me an e-mail at <a href="mailto:kris@rkrishardy.com">kris@rkrishardy.com</a>, and give me your e-mail address so that I can give you commit access.</strong> (I just ask that you be considerate with what you commit, and don&#8217;t commit anything that is not tasteful).</p>
<p>If you got the &#8220;Committed r&#8230;&#8221; line, congratulations! Your changes have been published to the svn server!</p>
<p>If you want to continue working on your local development branch, check it back out and rebase it to bring it up to date with the master.</p>
<p><code><br />
$ git checkout my_branch<br />
$ git rebase master<br />
First, rewinding head to replay your work on top of it...<br />
</code></p>
<p>When you are completely done with your branch, you can delete it by checking out a different branch and using git branch -d.</p>
<p><code><br />
$ git checkout master<br />
$ git branch -d my_branch<br />
Deleted branch my_branch (was 15971cb).<br />
</code></p>
<p>Congratulations. You now have the basic workflow down. If you run into problems, checkout out the &#8220;Troubleshooting&#8221; section below, or take a look at the Git documentation at <a href="http://git.or.cz/course/svn.html">Git SVN Cheatsheet</a>, the<br />
<a href="http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html">Git Tutorial</a>, the <a href="http://www.kernel.org/pub/software/scm/git/docs/everyday.html">Everyday GIT with 20 commands or so</a> page, or the extensive <a href="http://www.kernel.org/pub/software/scm/git/docs/user-manual.html">Git Users Manual</a>.</p>
<h2>Troubleshooting</h2>
<h3>I did a git svn rebase, but I got a bunch of merge errors. What should I do?</h3>
<p>Before you do anything, revert the rebase by typing:</p>
<p><code><br />
$ git rebase --abort<br />
</code></p>
<p>Now, make a backup of your current master by branching it.</p>
<p><code><br />
$ git branch temp<br />
</code></p>
<p>Use git log to figure out which commit was the last one that was sync&#8217;d with svn. Here is an example of the output:</p>
<p><code><br />
$ git log<br />
commit 4ebf8122c5b18ab16167268b1791fa49996e56cc<br />
Author: Kris Hardy<br />
Date: Sat Jul 2 10:01:55 2011 -0400</code></p>
<p><code>Modified test.txt</code></p>
<p><code>commit ec8a9e15a30c01c7ad7b83d6cb8cde39e1c6a650<br />
Author: hardyrk@gmail.com<br />
Date: Sat Jul 2 13:58:02 2011 +0000</code></p>
<p>&nbsp;</p>
<p><code>Adding initial files</code></p>
<p><code>git-svn-id: https://git-svn-sandbox.googlecode.com/svn/trunk@2 fb457a7e-32b5</code></p>
<p>&nbsp;</p>
<p><code>commit 96acefc8a443a02568453c7a504064ffc6d8428e<br />
Author: (no author) &lt;(no author)@fb457a7e-32b5-5db0-b168-d315aa6739ac&gt;<br />
Date: Sat Jul 2 13:12:00 2011 +0000</code></p>
<p><code>Initial directory structure.</code></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><code>git-svn-id: https://git-svn-sandbox.googlecode.com/svn/trunk@1 fb457a7e-32b5<br />
</code></p>
<p>Look for the latest git-svn-id to find the latest commit. In this example, it<br />
was commit ec8a9e15a30c01c7ad7b83d6cb8cde39e1c6a650.</p>
<p>You only have to use the first few characters of the commit id, so we&#8217;ll<br />
use ec8a9 as a short-hand for the full commit string.</p>
<p>Now, reset the master branch to the last version that was sync&#8217;d with<br />
SVN. NOTE: This command will erase commits that occurred after the<br />
commit, so make sure you backed up your master branch (using git branch)!!!.</p>
<p><code><br />
$ git reset --hard ec8a9<br />
HEAD is now at ec8a9<br />
</code></p>
<p>Now, you are safe to rebase master with the svn trunk using git svn rebase.<br />
<code><br />
$ git svn rebase<br />
...<br />
Current branch master is up to date.<br />
</code></p>
<p>If any files had been committed to svn by other developers, you should see the changes applied in the output of git svn rebase.</p>
<p>Merge in the changes that you want to commit to svn.</p>
<p><code><br />
$ git merge temp<br />
Updating ec8a9..4ebf8<br />
Fast-forward<br />
test.txt | 1 +<br />
1 files changed, 1 insertions(+), 0 deletions(-)<br />
create mode 100644 test.txt<br />
</code></p>
<p>If you see any conflicts in the output, you can find the conflicts by using git status.</p>
<p><code><br />
$ git status<br />
</code></p>
<p>If you want to diff the conflicts, use git diff.</p>
<p><code><br />
$ git diff<br />
</code></p>
<p>Once the conflicts have been resolved, make sure that all the changes have been committed to master. Then commit the changes to svn using git svn dcommit.</p>
<p><code><br />
$ git commit<br />
$ git svn dcommit --username your@emailaddress.com<br />
Committing to https://git-svn-sandbox.googlecode.com/svn/trunk ...<br />
A test.txt<br />
Committed r4<br />
A test.txt<br />
r4 = 4c55148ecefac8b83b626fa568b2bc1f99ea990e (refs/remotes/trunk)<br />
No changes between current HEAD and refs/remotes/trunk<br />
Resetting to the latest refs/remotes/trunk<br />
</code></p>
<h3>I checked out an svn branch (or tag), and how svn dcommit in master pushes the changes to the svn branch!</h3>
<p>When checking out a remote branch or tag, master sometimes stops tracking the svn trunk, and instead starts tracking the svn branch or tag.  To fix this:</p>
<ol>
<li>Check the git master branch back out</li>
<li>Back up any changes</li>
<li>Do a hard reset, setting the svn trunk as the remote tracking branch</li>
<li>Reapply the backed up changes</li>
</ol>
<p><code><br />
$ git checkout master<br />
$ git branch temp<br />
$ git reset --hard remotes/trunk<br />
HEAD is now at ...<br />
$ git svn dcommit -n<br />
Committing to https://git-svn-sandbox.googlecode.com/svn/trunk ...<br />
$ git merge temp<br />
Updating ...<br />
$ git branch -d temp<br />
Deleted branch temp (was ...<br />
$ git svn dcommit<br />
Committing to https://git-svn-sandbox.googlecode.com/svn/trunk<br />
...<br />
</code></p>
<p><a href="http://stackoverflow.com/questions/192736/how-do-i-make-git-svn-use-a-particular-svn-branch-as-the-remote-repository" title="How do I make git-svn use a particular svn branch as the remote repository?">Adapted from StackOverflow: How do I make git-svn use a particular svn branch as the remote repository?</a></p>
<h2>Stupid Git-SVN tricks</h2>
<h3>I want to ignore files from git (just like setting &#8216;svn:ignore&#8217;)</h3>
<p>To ignore files from git, add the filename or filename pattern to a .gitignore file in the folder that the file is in, or in one of the folder&#8217;s ancestors if it is a global ignore (such as ignoring *.o or *~ files, for example).</p>
<p><code><br />
$ touch .gitignore<br />
$ echo *.o &gt;&gt; .gitignore<br />
$ git add .gitignore<br />
$ git commit -m "Ignoring *.o files"<br />
</code></p>
<h3>How do I create a tag in SVN?</h3>
<p>Use git svn tag.</p>
<p><code><br />
$ git svn tag 1.0<br />
Copying https://git-svn-sandbox.googlecode.com/svn/trunk at r4 to https://git-svn-sandbox.googlecode.com/svn/tags/1.0...<br />
Found possible branch point: https://git-svn-sandbox.googlecode.com/svn/trunk =&gt; https://git-svn-sandbox.googlecode.com/svn/tags/1.0, 4<br />
Found branch parent: (refs/remotes/tags/1.0) a029adfba661303ad73be48fcbb92372fba9a9f1<br />
Following parent with do_switch<br />
Successfully followed parent<br />
r5 = 974647bc0548d3d21c67d7f6fe2904da2f02a846 (refs/remotes/tags/1.0)<br />
$ git branch -r<br />
tags/1.0<br />
trunk<br />
</code></p>
<p>If you want to check to make sure that master is still tracking the svn trunk, use git svn dcommit -n.</p>
<p><code><br />
$ git svn dcommit -n<br />
Committing to https://git-svn-sandbox.googlecode.com/svn/trunk ...<br />
</code></p>
<h3>How do I create a branch in SVN?</h3>
<p>Use git svn branch.</p>
<p><code><br />
$ git svn branch temp<br />
Committing to https://git-svn-sandbox.googlecode.com/svn/trunk ...<br />
$ git svn branch temp<br />
Copying https://git-svn-sandbox.googlecode.com/svn/trunk at r4 to https://git-svn-sandbox.googlecode.com/svn/branches/temp...<br />
Found possible branch point: https://git-svn-sandbox.googlecode.com/svn/trunk =&gt; https://git-svn-sandbox.googlecode.com/svn/branches/temp, 4<br />
Found branch parent: (refs/remotes/temp) a029adfba661303ad73be48fcbb92372fba9a9f1<br />
Following parent with do_switch<br />
Successfully followed parent<br />
r6 = 4c0195271d0d586f2facd2707a83653844fec3a2 (refs/remotes/temp)<br />
$ git branch -r<br />
tags/1.0<br />
temp<br />
trunk<br />
</code></p>
<p>If you want to check to make sure that master is still tracking the svn trunk, use git svn dcommit -n.</p>
<p><code><br />
$ git svn dcommit -n<br />
Committing to https://git-svn-sandbox.googlecode.com/svn/trunk ...<br />
</code></p>
<h3>How do I checkout/track a remote branch or tag from SVN, and manage the files using Git?</h3>
<p>You can create a git branch, and have it track the remote svn branch using git branch. The git branch will now be synchronized with the svn tag or branch.</p>
<p><code><br />
$ git branch local/tags/1.0 tags/1.0<br />
$ git branch<br />
local/tags/1.0<br />
* master<br />
$ git branch -r<br />
tags/1.0<br />
temp<br />
trunk<br />
$ git checkout local/tags/1.0<br />
Switched to branch 'local/tags/1.0'<br />
$ git svn dcommit -n<br />
Committing to https://git-svn-sandbox.googlecode.com/svn/tags/1.0 ...<br />
</code></p>
<h3>My branches are forks of the svn trunk.  How can I keep the forks up to date without the conflicts caused by git merge?</h3>
<p>See this page for a great walkthrough (hint, use git rebase &#8211;onto):</p>
<p><a href="http://blog.bleeds.info/sofa/_design/sofa/_list/post/post-page?startkey=[%22Maintaining-a-Fork-With-Git%22]" title="Maintaining a Fork With Git">Maintaining a Fork With Git</a></p>
<div class="diggthis_container">
<script type="text/javascript">
digg_url = 'http://www.rkrishardy.com/2011/07/getting-started-with-git-and-svn/';
digg_title = 'Getting Started with Git and SVN';
digg_bodytext = '&lt;h1&gt;Getting Started with Git and SVN&lt;/h1&gt;\n&lt;h2&gt;What is Git, and why would you want to use it?&lt;/h2&gt;\n&lt;a href=&quot;http://git-scm.com&quot;&gt;Git&lt;/a&gt; is a distributed version control system that was written by Lin...';
digg_skin = 'compact';
digg_window = 'new';
</script>
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script>
</div> 
<!-- start wp-tags-to-technorati 1.02 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/git+git-svn+code.google.com+googlecode+tutorial' rel='tag' target='_self'>git git-svn code.google.com googlecode tutorial</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.rkrishardy.com/2011/07/getting-started-with-git-and-svn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testing an Enterprise Application Integration (EAI) Implementation</title>
		<link>http://www.rkrishardy.com/2010/04/testing-an-enterprise-application-integration-eai-implementation/</link>
		<comments>http://www.rkrishardy.com/2010/04/testing-an-enterprise-application-integration-eai-implementation/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 13:07:59 +0000</pubDate>
		<dc:creator>Kris</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[enterprise application integration]]></category>

		<guid isPermaLink="false">http://www.rkrishardy.com/?p=256</guid>
		<description><![CDATA[Adapted from the following presentation: &#8220;Testing an EAI Implementation&#8221; Matt VanVleet VP Product Development and Practice Management Pillar Technology Enterprise Application Integration Alliance Columbus, Ohio http://www.meetup.com/Enterprise-Application-Integration 4/8/2010 Before I begin, I want to give my thanks to Matt VanVleet of Pillar Technology for giving us his time, knowledge and experience for his presentation.  Most of [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Adapted from the following presentation:</p>
<p><strong>&#8220;Testing an EAI Implementation&#8221;</strong></p>
<p style="text-align: left;">Matt VanVleet<br />
VP Product Development and Practice Management<br />
<a href="http://www.pillartechnology.com/index">Pillar Technology</a></p>
<p><a href="http://www.meetup.com/Enterprise-Application-Integration">Enterprise Application Integration Alliance</a><br />
Columbus, Ohio<br />
<a href="http://www.meetup.com/Enterprise-Application-Integration">http://www.meetup.com/Enterprise-Application-Integration</a><br />
4/8/2010</p>
<p>Before I begin, I want to give my thanks to Matt VanVleet of Pillar Technology for giving us his time, knowledge and experience for his presentation.  Most of the following article is directly from, or inspired by, what he shared.</p>
<p>I also want to thank the members of the Enterprise Application Integration Alliance for attending.  Without them, valuable presentations like Matt&#8217;s would not be possible.</p>
<p>Now to the topic at hand&#8230;</p>
<p>If you look at the architecture of a standard Enterprise Application Integration (EAI) implementation, it typically consists of a series of independent applications or systems that are loosely-coupled to one another through a central integration system (such as an Enterprise Service Bus).</p>
<p><a href="http://www.rkrishardy.com/wp-content/uploads/2010/04/Diagram1.jpg"><img class="aligncenter size-full wp-image-257" title="EAI Implementation Diagram" src="http://www.rkrishardy.com/wp-content/uploads/2010/04/Diagram1.jpg" alt="" width="452" height="212" /></a></p>
<p>EAI projects usually consist of 4 phases, each of which create unique challenges to the enterprise:</p>
<ol>
<li>Implementation</li>
<li>Upgrade the EAI</li>
<li>Upgrade the Back-end Systems, Data Warehouse or Applications</li>
<li>Upgrade a 3rd Party Integration</li>
</ol>
<h2>1. Implementation</h2>
<p style="text-align: left;">When EAI projects are started, the EAI team typically works closely with the teams that are in charge of each application that needs to be integrated.  Each team needs to cooperate with the development, documentation, and testing.  They also need to coordinate releases so that the integration does not break if some critical component or feature of the application or the EAI system itself is being upgraded.</p>
<p>Since so many teams are involved and the implementations are complex, the cost of implementing an EAI system are high.</p>
<p>In addition, since releases need to by sync&#8217;d across the enterprise, it slows down the speed of development and adds at least one additional layer of management.  Furthermore, while each endpoint is loosely-coupled to one another, it is tightly coupled to the EAI system itself.  Each EAI-to-endpoint integration creates a potential point of failure, so each change needs to be thoroughly tested before being deployed.</p>
<h2>2. Upgrade the EAI</h2>
<p style="text-align: left;">Once an EAI implementation is in place, upgrading the EAI can be as time consuming and expensive as developing the EAI in the first place.  Each team has to brought back together the plan, develop and synchronize the upgrade.</p>
<p style="text-align: left;">
<h2>3. Upgrade the Back-end Systems, Data Warehouse or Applications</h2>
<p style="text-align: left;">Some of the teams will be needed for this upgrade, including the EAI team and the team in charge of the application being upgraded.</p>
<h2>4. Upgrade a 3rd Party Integration</h2>
<p style="text-align: left;">The EAI team will be very involved in this, and it may require the coordination and help of the 3rd party service provider that you are integrating with.</p>
<h1>Issues</h1>
<p style="text-align: left;">Since each of these systems is now tightly-coupled to the EAI system, upgrades at any point along the enterprise become major events.  One slight change, unless properly planned, managed and tested, can have a significant impact at some other end of the enterprise.</p>
<p>As the enterprise generates more and more data, the EAI implementation is put under more and more load.  What could be simple tweaks to the persistance layer or server configuration now involve much more risk.</p>
<p>Also, once an EAI implementation is in place, it never gets the attention that the applications themselves get.  Since EAI is behind the scenes, it tends to be an afterthought when it comes to the corporate budget.  It&#8217;s necessary, but it&#8217;s not &#8220;sexy&#8221;.</p>
<p>What is the best way to manage this?  How can you ensure that your EAI system is stable, while allowing the teams responsible for each application to be as autonomous as possible?  How can we decrease the upgrade cost of an EAI and also make it flexible enough to now slow down the application developers?</p>
<h1>Solution</h1>
<p style="text-align: left;">If you look at an EAI implementation as a central data system and don&#8217;t worry about how it works on the inside (which is a reasonable assumption when you are just dealing with interfaces), you can simplify it as a black box connected to a series of interfaces: Application-to-EAI, Data Warehouse-to-EAI, Web Service-to-EAI, etc.</p>
<p><a href="http://www.rkrishardy.com/wp-content/uploads/2010/04/Diagram2.jpg"><img class="aligncenter size-full wp-image-259" title="EAI Interfaces" src="http://www.rkrishardy.com/wp-content/uploads/2010/04/Diagram2.jpg" alt="" width="665" height="310" /></a></p>
<p>At each interface, you can then divide the interface into two halves: 1) Application-side and 2) EAI-side</p>
<p><a href="http://www.rkrishardy.com/wp-content/uploads/2010/04/Diagram3.jpg"><img class="aligncenter size-full wp-image-260" title="Application-to-EAI Interface" src="http://www.rkrishardy.com/wp-content/uploads/2010/04/Diagram3.jpg" alt="" width="673" height="225" /></a></p>
<p>If you are an application developer, you are developing your application to work with the interface that the EAI implementers expose.  It could be a database socket, a web service, flat files, messaging, etc.  This is essentially the same for the Database Warehouse and Back-end systems (such as SAP).</p>
<p>At each interface, there is typically inbound and outbound traffic.  Some of the traffic will be the result of the application itself (such as adding a customer to a CRM which is then forwarded to the ESB), some of the traffic will be responses to data sent by the application (a reply from the ESB), and some of the traffic will sent without any aparent trigger (the ESB sends a message to the application, caused by new data from another application).</p>
<p>To ensure that your EAI implementation and the applications are communicating properly, you can put tests in place to make sure that the systems respond properly.  You can also develop simulated systems, also known as mocks, that act like the system that is at the other end of the interface.</p>
<p>These tests and mocks can help you during any stage in the lifecycle of your EAI implementation:</p>
<ol>
<li>During development &#8211; Test your applications and ESB, independently, to make sure that they respond to events in the right way.</li>
<li>During production &#8211; Regularly test your applications and ESB to identify any mismatches or problems immediately.  With up-to-date tests, it is even possible to detect defects in the system that were somehow missed by a development team.  You can then respond proactively and disconnect the communication to the bad system, for example, to keep the other systems across the enterprise running properly.</li>
</ol>
<p style="text-align: left;">Now, let&#8217;s use the internal application-to-EAI implementation interface as an example.</p>
<h2>Application-to-EAI Testing</h2>
<p style="text-align: left;"><a href="http://www.rkrishardy.com/wp-content/uploads/2010/04/Diagram41.jpg"><img class="aligncenter size-full wp-image-262" title="EAI-to-Application Tests and Mocks" src="http://www.rkrishardy.com/wp-content/uploads/2010/04/Diagram41.jpg" alt="" width="673" height="322" /></a>When you are developing an EAI or application to be compliant with the Application-to-EAI interface, there are 4 test assets that need to be developed in order to assure that both the application and EAI system are working properly.</p>
<ol>
<li>Mock of EAI Implementation &#8211; Used to test the application against an EAI system that responds correctly to requests and generates application-bound traffic.</li>
<li>Test of Application interface &#8211; Used to test the application to make sure that it responds properly traffic from the EAI implementation.</li>
<li>Mock of Application &#8211; Used to test the EAI system against a fake application that responds correctly to requests and generates EAI-bound traffic.</li>
<li>Test of EAI interface &#8211; Used to test the EAI system to make sure that it responds properly to traffic from the application.</li>
</ol>
<h2 style="text-align: left;">3rd Party-to-EAI Testing</h2>
<p style="text-align: left;"><a href="http://www.rkrishardy.com/wp-content/uploads/2010/04/Diagram5.jpg"><img class="aligncenter size-full wp-image-263" title="3rd-Party Integration Mocks and Tests" src="http://www.rkrishardy.com/wp-content/uploads/2010/04/Diagram5.jpg" alt="" width="685" height="322" /></a></p>
<p style="text-align: left;">If you are integrating with a 3rd party, the layout is the same.  However, there may be a larger barrier between the EAI team and the 3rd party team.  In that case, you probably will have to assume that their testing is in place, or work with them to ensure that they have their tests and mocks in place.</p>
<p style="text-align: left;">If they don&#8217;t have a valid mock system (which, unfortunately happens), you may have to build a mock internally using what you can learn about the 3rd-party system.</p>
<p style="text-align: left;">If you don&#8217;t currently have tests or mocks in place, one way to start is to use a &#8220;wire-tap&#8221; or proxy to log messages, requests and responses in order to build the test cases.</p>
<h2 style="text-align: left;">End-to-End Integration Testing</h2>
<p><a href="http://www.rkrishardy.com/wp-content/uploads/2010/04/Diagram6.jpg"><img class="aligncenter size-full wp-image-266" title="End-to-End Testing" src="http://www.rkrishardy.com/wp-content/uploads/2010/04/Diagram6.jpg" alt="" width="683" height="312" /></a></p>
<p>The necessity of testing an entire enterprise application can be significantly reduced by doing as much testing at the atomic level as possible.  By testing the application-to-EAI interfaces and the intra-EAI processing through EAI-specific tests, the need for end-to-end testing is, theoretically, eliminated.  If the tests cover all the corner cases, all the EAI processes and interfaces pass the tests, then the EAI is working properly.  At each interface, if all tests that invoke the mock services pass, then the applications work properly with the interfaces.  End-to-end testing, at that point, isn&#8217;t necessary.</p>
<p>However, there are commonly reasons for doing automated end-to-end tests just to &#8220;be absolutely sure&#8221; that data is flowing from one endpoint application to another.  In that case, it requires the collaboration of the application teams in order to build the tests and observers for the full end-to-end tests.</p>
<h1>Technology</h1>
<p style="text-align: left;">These are a few of the many open-source applications that can be used to help you develop the tests and mocks.</p>
<h2>Tests</h2>
<ol>
<li><a href="http://www.junit.org/">jUnit</a> (or a member of the xUnit family)</li>
<li>Depending on the EAI implementation, some IDEs (such as <a href="https://open-esb.dev.java.net/">Netbeans w/ OpenESB</a>) have testing integrated into the system.</li>
</ol>
<h2>Mocks</h2>
<ol>
<li><a href="http://www.jmock.org/">jMock</a></li>
<li><a href="http://camel.apache.org/mock.html">Apache Camel mocking</a></li>
<li><a href="http://www.soapui.org/userguide/mock/services.html">SoapUI (web service mocking)</a></li>
</ol>
<h1>Considerations</h1>
<ol>
<li>Someone has to &#8220;own&#8221; the specification for each interface.  Personally, I believe that the specification should be owned by each application team, in collaboration with the EAI team.  However, due to the complexity of the interface or the size of the implementation, it may be better to have the EAI team own the specification, or perhaps put it in the hands of a higher-level enterprise data architect.</li>
<li>Someone has to develop the mock of the EAI.  A collaborative effort between the application team and the EAI team usually work best to build the interface specification, and then the mock is maintained by the EAI team so that it is always up-to-date with the production and development EAI implementations.</li>
<li>Someone has to develop the tests for the EAI.  Again, a collaborative effort to build the specification is needed, and then the tests are maintained by the EAI team so that it is always up-to-date.</li>
<li>Someone has to develop the mock of the applications.  A cross-team collaborative effort is needed, and then the mock is maintained by the application team so that it is always up-to-date.</li>
<li>Someone has to develop the tests for the applications.  The same application-EAI collaborative efforts is needed to build the specification, and then the tests are maintained by the application team so that it is always up-to-date.</li>
</ol>
<h1>Summary</h1>
<p style="text-align: left;">Testing and mocking for EAI implementations allows each team to stay independent by testing their applications against an interface and catching problems before they go to production.  This decreases the cost of developing and maintaining enterprise architectures by reducing the interdependence between each development team, as well as by reducing the potential for regressions.</p>
<p style="text-align: left;">In one case that Matt talked about, a company he worked with was planning an upgrade to their EAI system, which ordinarily is a very expensive process.  Matt&#8217;s company had created all the tests and mocks for their old EAI system, so during the upgrade, they ran all their tests and mocks against the new EAI and they were able to immediately find the regressions and fix them.  This decreased the development and implementation time by over 50-fold.</p>
<p style="text-align: left;">Testing of EAI implementation is becoming more main-stream, but does involve some investment up front.  That investment, however, will pay handsome dividends when you upgrade any of your systems in the enterprise and you need to retest to make sure that it works properly.  Automated testing, built once, can save you weeks of hand-testing during each upgrade.</p>
<p style="text-align: left;">Thanks again to Matt VanVleet for his presentation and to the members of the <a href="http://www.meetup.com/Enterprise-Application-Integration">EAI Alliance</a> for attending.  If you are in the Columbus, OH area and are interested in EAI at any level, from programmer through executive, be sure to sign up (it&#8217;s free), and take part in our meetings.  <a href="http://www.meetup.com/Enterprise-Application-Integration">http://www.meetup.com/Enterprise-Application-Integration</a></p>
<div class="diggthis_container">
<script type="text/javascript">
digg_url = 'http://www.rkrishardy.com/2010/04/testing-an-enterprise-application-integration-eai-implementation/';
digg_title = 'Testing an Enterprise Application Integration (EAI) Implementation';
digg_bodytext = '&lt;p style=&quot;text-align: left;&quot;&gt;Adapted from the following presentation:&lt;/p&gt;\n&lt;strong&gt;&quot;Testing an EAI Implementation&quot;&lt;/strong&gt;\n&lt;p style=&quot;text-align: left;&quot;&gt;Matt VanVleet\nVP Product Development and Prac...';
digg_skin = 'compact';
digg_window = 'new';
</script>
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script>
</div> 
<!-- start wp-tags-to-technorati 1.02 -->

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.rkrishardy.com/2010/04/testing-an-enterprise-application-integration-eai-implementation/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Subversion Fix: svn copy causes &#8220;Repository moved permanently to &#8216;&#8230;&#8217;; please relocate</title>
		<link>http://www.rkrishardy.com/2009/12/subversion-fix-svn-copy-causes-repository-moved-permanentl/</link>
		<comments>http://www.rkrishardy.com/2009/12/subversion-fix-svn-copy-causes-repository-moved-permanentl/#comments</comments>
		<pubDate>Sat, 12 Dec 2009 17:54:52 +0000</pubDate>
		<dc:creator>Kris</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[repository moved permanently]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn copy]]></category>

		<guid isPermaLink="false">http://www.rkrishardy.com/?p=220</guid>
		<description><![CDATA[Background Subversion is a version control system. It can run as either it&#8217;s own server (svnserve), or as an Apache module (mod_dav_svn.so). When using the mod_dav_svn module for Apache, and doing an svn copy operation on the repository itself can fail if the VirtualHost configuration for subversion is not correct. Put simply, if Apache itself [...]]]></description>
			<content:encoded><![CDATA[<h1>Background</h1>
<p><a href="http://subversion.tigris.org/">Subversion</a> is a version control system.  It can run as either it&#8217;s own server (svnserve), or as an Apache module (mod_dav_svn.so).</p>
<p>When using the mod_dav_svn module for Apache, and doing an svn copy operation on the repository itself can fail if the VirtualHost configuration for subversion is not correct.  Put simply, if Apache itself and mod_dav_svn are serving content from the same path, then conflicts can occur.  Apache can get confused if it attempts to serve a physical file instead of routing the request through mod_dav_svn.</p>
<p>&#8220;svn copy &#8230;&#8221; operations will fail, while &#8220;svn update &#8230;&#8221;, &#8220;svn commit &#8230;&#8221;, and &#8220;svn checkout &#8230;&#8221; operations work fine.</p>
<p>Detail of the problem, diagnosing the problem, and the fix are below.</p>
<p><span id="more-220"></span></p>
<h1>Problem</h1>
<p>Repository checkouts (svn co &#8230;) and commits (svn ci &#8230;) work fine and throw no errors, but svn trunk copying operations fail &#8220;svn copy &#8230;/trunk &#8230;/tags/x.x&#8221; with &#8220;svn: Repository moved permanently to &#8216;&#8230;&#8217;; please relocate&#8221;.</p>
<p><code><br />
$ svn co https://svn.test.com/myproject/trunk myproject<br />
... (checkout progress)<br />
Checked out revision [x].<br />
$ svn ci myproject<br />
Committed revision [x].<br />
$ svn cp https://svn.test.com/myproject/trunk https://svn.test.com/myproject/tags/x.x<br />
svn: Repository moved permanently to 'https://svn.test.com/myproject/'; please relocate<br />
</code></p>
<h1>Diagnostics</h1>
<p>To diagnose the problem, first make sure the local checkout urls are correct.</p>
<p><code><br />
$ svn info myproject<br />
...<br />
URL: https://svn.test.com/myproject/trunk<br />
Repository Root: https://svn.test.com/myproject<br />
</code></p>
<p>The Repository Root should match the root url of the project repository that you are working with because the svn commit above worked.  However, if they don&#8217;t match, then use svn switch to move the url that your local checkout is linked to:</p>
<p><code><br />
$ svn switch --relocate [OLD URL] [NEW URL] myproject<br />
$ svn cp https://svn.test.com/myproject/trunk https://svn.test.com/myproject/tags/x.x<br />
</code></p>
<p>If relocating the base url of the checkout (svn switch &#8211;relocate &#8230;) does not fix the problem, but checkouts and commits work fine, the next step is to look at the virtual host configuration in Apache for the subversion module.  This is where I found my problem.</p>
<h1>The Cause</h1>
<p>The file path of the subversion repository was within public_html, so it had a physical path that was identitical to it&#8217;s url path.</p>
<p><code><br />
$ ls public_html<br />
repos<br />
$ cat /etc/httpd/conf.d/subversion.conf<br />
&lt;VirtualHost 127.0.0.1:443&gt; #YOUR IP ADDRESS:PORT<br />
DocumentRoot /home/svn/public_html #YOUR WEBROOT PATH<br />
...<br />
&lt;Location /repos&gt;<br />
DAV svn<br />
SVNParentPath /home/svn/public_html/repos #YOUR REPOSITORY PATH<br />
...<br />
&lt;/Location&gt;<br />
&lt;/VirtualHost&gt;<br />
</code></p>
<p>The problem is that the Location is an actual physical filepath, not an alias.  So, Apache isn&#8217;t sure whether to attempt to serve the physical file itself, or to pass the request through to mod_dav_svn.  Most of the time mod_dav_svn wins and Apache forward the request through.  However, &#8220;svn copy&#8221; must work slighly differently, and Apache attempts to serve the request itself, rather than pass it through mod_dav_svn.  The request then fails and svn errors out with the &#8220;svn: Repository moved permanently to &#8216;&#8230;&#8217;; please relocate&#8221; message.</p>
<p>A reader of this blog also pointed out that this can also happen if you have an overlap between a URL path alias and the repos folder itself:</p>
<p><code><br />
#Alias /repos    “/srv/svn/repos” #Commenting this line out fixed the problem<br />
</code></p>
<h1>Fix</h1>
<p>The fix is to 1) change the Apache configuration, and 2) change the physical path to the repository so that it does not match the url.  This way, Apache will never attempt to serve a physical file itself, and will instead forward the requests to mod_dav_svn.</p>
<h2>Edit /etc/httpd/conf.d/subversion.conf</h2>
<p><code><br />
&lt;VirtualHost svn.test.com:443&gt;<br />
DocumentRoot /home/svn/public_html<br />
...<br />
&lt;Location /repos&gt;<br />
DAV svn<br />
SVNParentPath /home/svn/repos #NOTE THAT repos IS NOW OUT OF THE PHYSICAL WEBROOT PATH<br />
...<br />
</code></p>
<h2>Move the repository directory out of the physical webroot path and restart Apache.</h2>
<p><code><br />
[svn /home/svn]$ mv public_html/repos .<br />
[svn /home/svn]$ sudo service httpd restart<br />
</code></p>
<p>All your &#8220;svn copy&#8221; operations should work now.</p>
<div class="diggthis_container">
<script type="text/javascript">
digg_url = 'http://www.rkrishardy.com/2009/12/subversion-fix-svn-copy-causes-repository-moved-permanentl/';
digg_title = 'Subversion Fix: svn copy causes &quot;Repository moved permanently to \'...\'; please relocate';
digg_bodytext = '&lt;h1&gt;Background&lt;/h1&gt;\n&lt;a href=&quot;http://subversion.tigris.org/&quot;&gt;Subversion&lt;/a&gt; is a version control system.  It can run as either it\'s own server (svnserve), or as an Apache module (mod_dav_svn.so).\n\nW...';
digg_skin = 'compact';
digg_window = 'new';
</script>
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script>
</div> 
<!-- start wp-tags-to-technorati 1.02 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/apache' rel='tag' target='_self'>apache</a>, <a class='technorati-link' href='http://technorati.com/tag/repository+moved+permanently' rel='tag' target='_self'>repository moved permanently</a>, <a class='technorati-link' href='http://technorati.com/tag/subversion' rel='tag' target='_self'>subversion</a>, <a class='technorati-link' href='http://technorati.com/tag/svn+copy' rel='tag' target='_self'>svn copy</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.rkrishardy.com/2009/12/subversion-fix-svn-copy-causes-repository-moved-permanentl/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Confessions of a Researcher-turned-Engineer</title>
		<link>http://www.rkrishardy.com/2009/11/confessions-of-a-researcher-turned-engineer/</link>
		<comments>http://www.rkrishardy.com/2009/11/confessions-of-a-researcher-turned-engineer/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 18:59:55 +0000</pubDate>
		<dc:creator>Kris</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Random Thoughts]]></category>
		<category><![CDATA[education]]></category>
		<category><![CDATA[einstein]]></category>
		<category><![CDATA[feynman]]></category>
		<category><![CDATA[newton]]></category>
		<category><![CDATA[problem solving]]></category>

		<guid isPermaLink="false">http://www.rkrishardy.com/?p=210</guid>
		<description><![CDATA[I wasn&#8217;t always a software engineer&#8230; Before I began developing software for a living, I used to be in chemical research &#38; development as a biochemist.  For some reason, I always found myself gravitating back towards software and informatics, so I eventually gave in and started a software company.  But I&#8217;ve learned a lot of [...]]]></description>
			<content:encoded><![CDATA[<p>I wasn&#8217;t always a software engineer&#8230;</p>
<p>Before I began developing software for a living, I used to be in chemical research &amp; development as a biochemist.  For some reason, I always found myself gravitating back towards software and informatics, so I eventually gave in and started a software company.  But I&#8217;ve learned a lot of lessons during my time as a scientist.</p>
<h3>When solving a difficult problem and you know 25% of the solution, you can figure out 70% through hard work, patience and trial-and-error.  The last 5% may never come, and if it does, is rarely when you&#8217;re looking for it.</h3>
<p>&#8220;I am enough of an artist to draw freely upon my imagination. Imagination is more important than knowledge. Knowledge is limited. Imagination encircles the world.&#8221;  &#8211; <a href="http://en.wikiquote.org/wiki/Albert_Einstein">Albert Einstein</a></p>
<p>Just because you don&#8217;t know the answer right now, doesn&#8217;t mean that you can made headway and figure it out as you go.  I&#8217;ve learned the most when I&#8217;ve tried things that haven&#8217;t worked, but figured out what went wrong and then tried again.</p>
<h3>If you&#8217;re not continually learning and improving yourself, your working days are numbered.</h3>
<p><span>&#8220;Genius without education is like silver in the mine.&#8221; &#8211; <a href="http://brainyquote.com/quotes/keywords/education.html">Benjamin Franklin</a><br />
</span></p>
<p>Don&#8217;t be afraid of challenging yourself and learning new languages, technologies or skills.  Each one of them expands your experience and perspective, and can give you an opportunity to take a look at the status quo.  Unfortunately, self-motivated learners are in short supply but in constant demand because they can adapt to any situation.</p>
<h3>If you want to succeed, you have to train for it.</h3>
<p>&#8220;You can know the name of a bird in all the languages of the world, but when you&#8217;re finished, you&#8217;ll know absolutely nothing whatever about the bird&#8230; So let&#8217;s look at the bird and see what it&#8217;s doing — that&#8217;s what counts. <strong>I learned very early the difference between knowing the name of something and knowing something.</strong>&#8221; &#8211; <a href="http://en.wikiquote.org/wiki/Richard_Feynman">Richard Feynman</a></p>
<p>Let&#8217;s face it&#8230;  The likelihood that you&#8217;re going to &#8220;knock one out of the park&#8221; your first time up to bat is pretty low.  Whether it&#8217;s business or baseball, the odds are against you.  It takes grit, determination, exercising yourself both physically and mentally, and lots of disappointment as you fail again and again.  But each day, train yourself a little more, a little harder, and each day you get a little stronger.  It&#8217;s cumulative, and it takes a lot of time.</p>
<h3>Give credit to those who came before you.</h3>
<p><span>“</span>If I have seen further it is by standing on the shoulders of Giants.<span>” &#8211; <a href="http://en.wikipedia.org/wiki/Isaac_Newton">Sir Isaac Newton</a><br />
</span></p>
<p>In science, recognition is incredibly important and one of the first lessons that you learn.  When you&#8217;re making a presentation, writing an article, or doing your homework, you have to cite any sources of information that when into your work.  This is partly because scientists are focusing on sharing knowledge, and in order for the community to work together, there has to be trust between researchers that their information will not be stolen by one-another.</p>
<p>Even more so, no inventions are made in complete isolation.  They are incremental improvements based on our understanding of our world and everything that has come before.  The iPhone wouldn&#8217;t exist without the much earlier inventions of silicon wafers, transistors, plastics, aluminum, and light.  And the next wave of inventions will be no different.</p>
<p>Take advantage of the information and knowledge that we have, but show respect to the community that this knowledge came from.  You probably will need more help from it in the future.</p>
<div class="diggthis_container">
<script type="text/javascript">
digg_url = 'http://www.rkrishardy.com/2009/11/confessions-of-a-researcher-turned-engineer/';
digg_title = 'Confessions of a Researcher-turned-Engineer';
digg_bodytext = 'I wasn\'t always a software engineer...\n\nBefore I began developing software for a living, I used to be in chemical research &amp; development as a biochemist.  For some reason, I always found myself...';
digg_skin = 'compact';
digg_window = 'new';
</script>
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script>
</div> 
<!-- start wp-tags-to-technorati 1.02 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/education' rel='tag' target='_self'>education</a>, <a class='technorati-link' href='http://technorati.com/tag/einstein' rel='tag' target='_self'>einstein</a>, <a class='technorati-link' href='http://technorati.com/tag/feynman' rel='tag' target='_self'>feynman</a>, <a class='technorati-link' href='http://technorati.com/tag/newton' rel='tag' target='_self'>newton</a>, <a class='technorati-link' href='http://technorati.com/tag/problem+solving' rel='tag' target='_self'>problem solving</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.rkrishardy.com/2009/11/confessions-of-a-researcher-turned-engineer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Micro-Scrum: Agile Development for the 1-Man Army</title>
		<link>http://www.rkrishardy.com/2009/11/micro-scrum-agile-development-for-the-1-man-army/</link>
		<comments>http://www.rkrishardy.com/2009/11/micro-scrum-agile-development-for-the-1-man-army/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 15:32:18 +0000</pubDate>
		<dc:creator>Kris</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[microscrum]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[submerged solutions]]></category>

		<guid isPermaLink="false">http://www.rkrishardy.com/?p=206</guid>
		<description><![CDATA[I&#8217;ve found that Scrum, and Agile methods in general, are incredibly valuable in single-man &#8220;teams&#8221; if done properly.  In my experience though, there are some sticking points that need to be worked through with how you work with your clients and manage communications.  These will have a significant impact on your projects and how successful [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve found that <a href="http://en.wikipedia.org/wiki/Scrum_%28development%29">Scrum</a>, and Agile methods in general, are incredibly valuable in single-man &#8220;teams&#8221; if done properly.  In my experience though, there are some sticking points that need to be worked through with how you work with your clients and manage communications.  These will have a significant impact on your projects and how successful Scrum can be for you.</p>
<p>Before I get too far, let me give a quick overview of Scrum:</p>
<p><a href="http://en.wikipedia.org/wiki/Scrum_%28development%29">Scrum development</a> is a business process that seeks to speed up development, decrease bugs, and increase the quality of products that are delivered.  It doesn&#8217;t have to be focused on software development, but that&#8217;s where it has the greatest pull right now, and the use that I am going to focus on.</p>
<p>Scrum, at least how we use it (mixed with <a href="http://www.extremeprogramming.org/">Extreme Programming</a>), uses several key components:</p>
<ul>
<li><strong>Iterative and Incremental Development</strong> &#8211; A product is released after each &#8220;Sprint&#8221; (typically 1-4 weeks).</li>
<li><strong>Test Driven Development</strong> &#8211; Automated unit tests are created to test the code, databases, and user interface.  For PHP, we use <a href="http://www.phpunit.de/">PHPUnit</a> and some in-house database testing tools.  For Java and integration endpoint API tests (regardless of language), <a href="http://junit.org/">JUnit</a> would be a good start.</li>
<li><strong>One-Touch Build, Document &amp; Deploy</strong> &#8211; Automated build and deployment sequences are developed to reduce variables, problems and time.  <a href="http://ant.apache.org/">Ant</a> is a great tool for this.</li>
<li><strong>Continual Integration</strong> &#8211; The software is compiled and thoroughly tested nightly (and as needed) throughout the sprint.  <a href="http://cruisecontrol.sourceforge.net/">CruiseControl</a> is useful for this, although you can also do something as easy as schedule a nightly cron job to execute an ant build file.</li>
<li><strong>Source Version Control</strong> &#8211; We use a central version control system (<a href="http://subversion.tigris.org/">Subversion</a>), to manage our code.  This allows me to work from multiple computers on the same code (such as when I&#8217;m traveling), and it also allows me to work with other developers when I&#8217;m partnering or outsourcing work.</li>
<li><strong>Product Backlog</strong> &#8211; The product backlog is a list      of stories and feature sets that our customers want in their software that      haven’t been completed yet.  Each story or feature is then prioritized      by business necessity and value to the business.  I’ve heard good      things about XPlanner and Pivotal Tracker, and IDEs such as Visual Studio,      Eclipse and Netbeans support backlogs.       We prefer to use Kanban boards, which are adapted from the Lean      Manufacturing method.</li>
<li><strong>Sprint Backlog</strong> &#8211; The sprint backlog is the      list of stories and feature sets that we will complete during a single sprint.       The items that are put in this backlog are negotiated between us and our      client.  Once the items are chosen for the Sprint, they are then fed      into the “<strong>Work In Progress.</strong>”  The stories and features are then fed      into our web-based project management tool.  We currently use dotProject for this,      but a wiki, Google Wave, or a project management application like BaseCamp      or MS Project would work just as well.       The important thing is that your client must be able to read each      item and make notes on them.</li>
<li><strong>Work In Progress</strong> – A series of stages are used to track the      progress of work that is in progress during a sprint:
<ol>
<li><strong>Awaiting Tests</strong></li>
<li><strong>Test Writing in Progress</strong> – We develop the tests before we       write the code.</li>
<li><strong>Awaiting Code</strong></li>
<li><strong>Coding in Progress</strong> – In this stage, the application is       actually being built</li>
<li><strong>Awaiting Integration</strong></li>
<li><strong>Integration in Progress</strong> – The code changes are integrated       into the main development code base for this sprint, and all tests must       pass before continuing to the next phase.</li>
<li><strong>Awaiting Documentation</strong></li>
<li><strong>Documentation in Progress</strong> – The documentation for the application       is updated and rebuilt.  PHPDoc is       a great help for us in our PHP applications, and can extract       documentation directly from our in-line documentation in the code.  Similar applications exist for many       other languages.</li>
<li><strong>Awaiting Acceptance</strong></li>
<li><strong>Done</strong> – The story or feature has proper test code coverage,       all tests pass, the code has been properly integrated, documented, and       signed-off by person in charge of Quality Assurance.  In our case, this is done through a       demo with the client.</li>
</ol>
</li>
<li><strong>Sprint Review</strong> &#8211; During the review, we reflect on and catalog all our lessons learned during the sprint.  By looking at went well and what didn’t go well, we can make changes in our process for our next sprint.  Also, the client’s likes and dislikes of the last product release are included.  We use a wiki for this, such as <a href="http://www.mediawiki.org/wiki/MediaWiki">MediaWiki</a> or <a href="http://www.dokuwiki.org/dokuwiki">dokuWiki</a>.</li>
</ul>
<p>A typical Scrum team consists of:</p>
<ul>
<li><strong>Product owner</strong> &#8211; The person who is responsible      for the delivery of the project to the client.  This is usually a      Business Analyst or Project Manager.</li>
<li><strong>Users </strong>- The end-users, commonly the client&#8217;s staff.</li>
<li><strong>Stakeholders </strong>- Typically, these people are the client-side Project Managers and are the ones that are paying for the product.</li>
<li><strong>Scrum Master</strong> &#8211; The member of the consulting      or development team that is responsible for leading the <strong>Team Members</strong>, and reports to the <strong>Product Owner</strong>.</li>
<li><strong>Team Members</strong> &#8211; The actual development team</li>
</ul>
<p>When you are running a Micro-Scrum (such as if you are a lone consultant), the scrum master, team members and product owner are consolidated to a single person (you).  When your clients are like ours, and are almost all small businesses, your client contact ends up filling multiple roles.  The actual Scrum roles end up looking more like this:</p>
<ul>
<li>Scrum Master/Team/Product Owner (Consultant)</li>
<li>Stakeholder/User (President, CEO, or General Manager, etc.)</li>
<li>User (Client&#8217;s Staff)</li>
</ul>
<p>By consolidating the Scrum roles, I, as the Product Owner, now don’t just need to make sure that the product is developed and delivered.  I also need to fill the roll of a Business Analyst, so I need to understand the business case, consolidate all the user’s needs and negotiate with the client to prioritize the importance of each user story.  I also have to avoid focusing on my own “pet features”, which developers can sometimes do, and instead have to focus on what will bring my client the greatest value in the shortest amount of time.</p>
<p>Standing in the client’s shoes, the client needs to be both the stakeholder and the end user.  As the stakeholder, the client needs to watch the business’s bottom line and help prioritize the user stories for the development team.  The stakeholder’s goal is to get the best product that meets the most critical needs within both schedule and budget.  As the end user, the client also needs to look critically at their business processes and workflows.  He or she needs to be able to understand and explain the strengths and weaknesses of their current software to the rest of the team.  The client also needs to provide his/her time and in-depth knowledge to the team, enabling them to architect and develop the software that best meets the client’s business needs.</p>
<p>Consolidating those roles makes things both easier and harder at the same time.  It’s a bit easier because there are fewer people that you need to communicate with.  However, it also makes things more difficult because there is more responsibility that is asked of each person, and, by its’ nature, each person has a greater impact on the success or failure of the project.</p>
<p>The ultimate success of a Micro-Scrum development project hinges on the ability of both the consultant and the client to be proactive, efficient and thorough communicators.  In my experience, the quality of this communication, especially early in a project, will make all the difference.</p>
<p>There needs to be a very clear understanding from both the client and the consultant on what is going to happen throughout the life of the project and how the product is going to be developed and delivered.  Both the consultant and client need to be transparent and honest with one-another.  Micro-Scrum works especially well if both parties work hard at building a good rapport with one another.</p>
<p>When both the client and consultant are on the same page and can effectively communicate, the project works very well.  When our client is not a willing communicator, delivering a product that meets their needs is a lot more difficult.</p>
<h2>5 Hard-Learned Lessons in Effective Micro-Scrum Projects</h2>
<h3>1. In Micro-Scrum, the focus needs to be on quality, NOT on cost.</h3>
<p>All too often, small Agile studios like mine are compared to freelancers or overseas developers on sites like Elance and Guru.  The bottom line is that we cannot complete with their hourly cost, so we don&#8217;t even try.  <strong>What we focus on is Quality, above all else.</strong></p>
<p>We deliver unit-tested code, usability and performance tests, code reviews, security audits, and are actively involved in communication with our clients throughout the entire process.</p>
<p>It has worked well for us, and we&#8217;ve kept our current clients for nearly 2 years at full workload.  The past year has been our best year ever, despite the recession.</p>
<h3>2. Micro-Scrum development usually costs more, initially, than methodology-less development (aka cowboy coding).</h3>
<p>This goes along with the previous lesson.  The up-front costs are usually higher, however the bug rate is much lower and the documentation is better.  Also, the risk and time involved when refactoring and modifying the code is MUCH lower.  Software changes are anticipated, so we develop with that in mind.</p>
<h3>3. When working with a new client, deliver early and often.</h3>
<p>When working with non-tech-savvy businesses, keep the sprints short.  We like to do 2-3 day sprints at the beginning to get them accustomed to the process.  Even if that means just delivering them a framework, some raw code, a library or sketches, it pays off dividends over the course of the project.  It opens up communication and makes sure that our direction matches their vision.</p>
<p>In addition, you get to run through a deployment dry run each time.  If you notice problems in the process, you can fix them early on rather than waiting until the end and being surprised that their server doesn&#8217;t support a dependency that you built into your software.  (It may sound silly, but it happens.)</p>
<p>The risk with rapid iteration is that if you don&#8217;t explain why you&#8217;re doing it, your client may feel like you just don&#8217;t understand what they want.  <em>They&#8217;re right!</em></p>
<p>The entire purpose of these short sprints at the beginning is to teach your client how to communicate with you, and to learn what your client wants by giving them something tangible that they can critique and use as a reference.  That tangible prototype can help you understand what they <em>really</em> want, which often is different that what their Request for Proposal or Product Specification actually says.</p>
<h3>4. Keep the up-front requirements gathering as short as possible.</h3>
<p>Feel free to post flame-comments below.  <img src='http://www.rkrishardy.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>I’ve run into many clients that don’t always know how to explain their product vision and be clear with what they ultimately want.  For about 1 full month back in 2008, I beat my head against a wall because one of my clients seemed to contradict their needs on a weekly basis with an accounting system I was developing for them.</p>
<p>I decided, out of desperation, to cut the requirements gathering short and push forward with what I had at that point.  Amazingly, I was pretty much right.  After Sprint 1, there were some modifications and changes, of course, but I was able to hit the target with only about 30% of the requirements being known up-front.  In addition, it forced us to build a very flexible architecture so that we could easily adapt to the unknowns and changes when we hit them.</p>
<p>What we do now is start with a very quick Sprint 0, maybe a week at most.  During Sprint 0, we build the user stories, initial specifications and product backlog.  There will be lots of unknowns and changes later on, so knowing every specific detail is neither important nor possible.  Managing and working around those unknowns is just part of software development, especially when you’re working with companies that don’t understand software development.</p>
<h3>5. Failure is GOOD!</h3>
<p>This may seem counter-intuitive, but failure is a good thing.  It opens the lines of communication for constructive feedback.</p>
<p>A goal we have for all our projects is to “fail fast.”  What that means is that we deliver a product in an early iteration (ideally Sprint 1) that our client will see lots of problems with.  Maybe the interface doesn’t meet their needs, or the work flow isn’t intuitive.  Whatever it is, I actually want my client to come back to me and say “I don’t like this.”  I then ask them “What specifically don’t you like?”  Or I’ll ask my favorite question: “Can I set up a screencast for you and you can show me what’s happening?”</p>
<p>We take each failure as an opportunity to open the lines of communication even further.  You can learn exactly what your client wants by watching him or her use your application.  Developing a Micro-Scrum team takes time, and building the relationship and trust through open communication is essential.</p>
<p>I’m sure you’ve noticed that communication is a common theme in Micro-Scrum.  Actually, it’s really the primary driver behind Scrum and any other Project Management methodology.  In order to deliver what a client wants, you need to have clear communication to truly understand their needs.  In my eyes, there is no other way to deliver a successful product.</p>
<p>Scrum formalizes the communications and works to get everyone, from the users and stakeholders to the developers, engaged in the success of the product.  When you are Micro-Scrumming, this communication becomes even more vital since there are fewer people involved and more responsibility on each person.  Harnessed wisely, it can lead to very successful projects that have good short-term value and outstanding long-term value.</p>
<p>If you&#8217;re in the Columbus, OH area and want to learn more about Agile Software Development, I highly suggest going to the <a href="http://www.cohaa.org/content/">Columbus Ohio Agile Alliance (COHAA)</a> meetings and getting involved in <a href="http://www.meetup.com/techlifecolumbus/">TechLife Columbus</a> meetup group.</p>
<div class="diggthis_container">
<script type="text/javascript">
digg_url = 'http://www.rkrishardy.com/2009/11/micro-scrum-agile-development-for-the-1-man-army/';
digg_title = 'Micro-Scrum: Agile Development for the 1-Man Army';
digg_bodytext = 'I\'ve found that &lt;a href=&quot;http://en.wikipedia.org/wiki/Scrum_%28development%29&quot;&gt;Scrum&lt;/a&gt;, and Agile methods in general, are incredibly valuable in single-man &quot;teams&quot; if done properly.  In my experien...';
digg_skin = 'compact';
digg_window = 'new';
</script>
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script>
</div> 
<!-- start wp-tags-to-technorati 1.02 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/agile' rel='tag' target='_self'>agile</a>, <a class='technorati-link' href='http://technorati.com/tag/junit' rel='tag' target='_self'>junit</a>, <a class='technorati-link' href='http://technorati.com/tag/microscrum' rel='tag' target='_self'>microscrum</a>, <a class='technorati-link' href='http://technorati.com/tag/phpunit' rel='tag' target='_self'>phpunit</a>, <a class='technorati-link' href='http://technorati.com/tag/scrum' rel='tag' target='_self'>scrum</a>, <a class='technorati-link' href='http://technorati.com/tag/submerged+solutions' rel='tag' target='_self'>submerged solutions</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.rkrishardy.com/2009/11/micro-scrum-agile-development-for-the-1-man-army/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Art of Bootstrapping a Business</title>
		<link>http://www.rkrishardy.com/2009/11/the-art-of-bootstrapping-a-business/</link>
		<comments>http://www.rkrishardy.com/2009/11/the-art-of-bootstrapping-a-business/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 22:14:51 +0000</pubDate>
		<dc:creator>Kris</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Random Thoughts]]></category>
		<category><![CDATA[bootstrapping]]></category>
		<category><![CDATA[business development]]></category>
		<category><![CDATA[columbus ohio]]></category>

		<guid isPermaLink="false">http://www.rkrishardy.com/?p=204</guid>
		<description><![CDATA[I was sent this great article that Guy Kawasaki wrote way back in 2006 about bootstrapping that I just have to share. At it&#8217;s essence, Bootstrappers are business owners that start and grow their business without any outside funding. That means no angel investors and no VC deals. You don&#8217;t hear about it much because [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.guykawasaki.com/2006/01/the_art_of_boot.html#axzz0X9fPlbLZ">I was sent this great article that Guy Kawasaki wrote way back in 2006 about bootstrapping</a> that I just have to share.</p>
<p>At it&#8217;s essence, Bootstrappers are business owners that start and grow their business without any outside funding.  That means no angel investors and no VC deals.  You don&#8217;t hear about it much because it&#8217;s not glamorous, but it&#8217;s the way that most businesses are started.</p>
<p>I am a hard-core believer in bootstrapping, and I know for a fact that I have learned a lot of lessons the hard way that I wouldn&#8217;t have learned as easily if I had not been a bootstrapper.  (Mo&#8217; money, mo&#8217; problems anyone?)</p>
<p>Especially when you start your first business (and if you&#8217;re like me, your second as well), you WILL make mistakes, and lot of them.  I still make mistakes, but I like to think that my hard-fought experience has saved me several times.  Sometimes I can get out of the way in time, and sometimes I still get run over.  But I&#8217;ve become better and better at keeping the damages small and keeping the business agile.</p>
<p>If you&#8217;re in the Columbus, OH area, come out to a meeting of the <a href="http://www.bootstrappingassociation.org">International Bootstrapping Association</a> and say hi!  Our next meeting is Dec 9th, 2009 at TechColumbus hear Ohio State University.  RSVP at the link below:</p>
<p><a href="http://www.bootstrappingassociation.org">http://www.bootstrappingassociation.org</a></p>
<div class="diggthis_container">
<script type="text/javascript">
digg_url = 'http://www.rkrishardy.com/2009/11/the-art-of-bootstrapping-a-business/';
digg_title = 'The Art of Bootstrapping a Business';
digg_bodytext = '&lt;a href=&quot;http://blog.guykawasaki.com/2006/01/the_art_of_boot.html#axzz0X9fPlbLZ&quot;&gt;I was sent this great article that Guy Kawasaki wrote way back in 2006 about bootstrapping&lt;/a&gt; that I just have to shar...';
digg_skin = 'compact';
digg_window = 'new';
</script>
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script>
</div> 
<!-- start wp-tags-to-technorati 1.02 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/bootstrapping' rel='tag' target='_self'>bootstrapping</a>, <a class='technorati-link' href='http://technorati.com/tag/business+development' rel='tag' target='_self'>business development</a>, <a class='technorati-link' href='http://technorati.com/tag/columbus+ohio' rel='tag' target='_self'>columbus ohio</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.rkrishardy.com/2009/11/the-art-of-bootstrapping-a-business/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Macromedia Founder Creating &#8220;Digital City&#8221; in Ohio</title>
		<link>http://www.rkrishardy.com/2009/09/macromedia-founder-creating-digital-city-in-ohio/</link>
		<comments>http://www.rkrishardy.com/2009/09/macromedia-founder-creating-digital-city-in-ohio/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 12:30:13 +0000</pubDate>
		<dc:creator>Kris</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[broadband mechanics]]></category>
		<category><![CDATA[columbus]]></category>
		<category><![CDATA[macromedia]]></category>
		<category><![CDATA[marc canter]]></category>
		<category><![CDATA[people aggregator]]></category>
		<category><![CDATA[social networking]]></category>
		<category><![CDATA[techlife]]></category>

		<guid isPermaLink="false">http://www.rkrishardy.com/?p=197</guid>
		<description><![CDATA[Marc Canter, a founder of Macromedia and now CEO/Chairman and Founder of Broadband Mechanics, gave a very interesting presentation/pitch yesterday at the TechLife Columbus Meetup at the Chocolate Cafe near OSU. If you don&#8217;t know Marc, he was with the MacroMind/Macromedia back when they had first developed and released Flash (or maybe it was the [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_198" class="wp-caption alignright" style="width: 310px"><a href="http://docs.google.com/present/view?id=0AXFHOmdiyC8KZGNyOTJrNnRfMjE0aGgzc3ZjZnM&amp;hl=en"><img class="size-medium wp-image-198" title="Digital City Layout" src="http://www.rkrishardy.com/wp-content/uploads/2009/09/2009-09-03_0657-300x224.png" alt="Digital City Layout" width="300" height="224" /></a><p class="wp-caption-text">The Digital City Project - Columbus, OH</p></div>
<p><a href="http://marc.blogs.it">Marc Canter</a>, a founder of Macromedia and now CEO/Chairman and Founder of <a href="http://www.broadbandmechanics.com">Broadband Mechanics</a>, gave a very interesting presentation/pitch yesterday at the <a href="http://www.meetup.com/techlifecolumbus/calendar/11075701/">TechLife Columbus Meetup</a> at the Chocolate Cafe near OSU.</p>
<p>If you don&#8217;t know Marc, he  was with the MacroMind/Macromedia back when they had first developed and released Flash (or maybe it was the predecessor to Flash, I&#8217;m not 100% sure).  Multimedia is a huge interest of Marc&#8217;s, and more recently, he&#8217;s been teaching a course at Case Western Reserve University on this concept of a &#8220;Digital City&#8221;.</p>
<p>The presentation was a little scattered, but here&#8217;s what his vision as how I understand it:</p>
<p>Using a special interest of &#8220;Workforce Development&#8221;, his company, <a href="http://www.broadbandmechanics.com">Broadband Mechanics</a>, is developing and deploying  an open source social network software platform called &#8220;People Aggregator&#8221;.  This software allows blogging, social networking, live video chat, and all the other usual social-media stuff.  It is developed to  OpenSocial specifications, so that it can be integrated with other open social media platforms (Facebook, Google, etc.).  Now, at this point in the presentation, I was starting to think &#8220;so what?&#8221;</p>
<p>But here&#8217;s what is very interesting about this, and what makes this is unique business.  Marc realized that there are a few needs that are unfulfilled in the market today:</p>
<p><span id="more-197"></span></p>
<p>There are many people who need computer skills in order to land new jobs, but they don&#8217;t have them.  And we&#8217;re talking about basic stuff here&#8230;  How to use a web browser, how to log into a web site, how to check their e-mail, how to use a form on a web page, etc.  Why not create a platform to help them learn?  But how can you get them involved and step them through the learning process without them even realizing it?  How about using a social networking platform as the learning tool?</p>
<ol>
<li>Social networking needs to be relevant.  And, for techno-challenged people, it has to be relevant for them in order for them to use it.  If you make it hyper-relevant to a local community, with all that community&#8217;s info and residents at that person&#8217;s fingertips, it&#8217;s more likely that they will use the system.  Now, if you also facilitate off-line activities and volunteerism, so that the online system becomes a resource rather than just an internet destination, you can make it even more relevant to that person&#8217;s life.</li>
<li>If you have 1-on-1 interactions throughout the entire process, you can remove the barriers that are keeping techno-challenged from using the computer, and you can remove them one-at-a-time in manageable chunks.</li>
<li>Once people get familiar with the computer, they can then learn other skills.  This business will have a mix of paid staff and volunteers with a wide range of experience, and they will offer their time as mentors to the newbies.  (Marc calls this &#8220;The Haves helping the Have-Nots.&#8221;)</li>
</ol>
<p>It&#8217;s actually a great idea, but about halfway through I felt that Marc lost the path and started talking about all the wild multimedia education concepts and what is wrong with Wikipedia.  But we did get back to the point and talked about more right-here-right-now barriers to this business model.  My number 1 question to Marc was about the initial push to get people on the system, and the resources involved in supporting those people.  Here&#8217;s why this is such an important issue:</p>
<p>Workforce Development is not a sexy topic for most people.  And the individuals that you are developing this entire system for are the ones who are the most resistant to learning and the most easily discouraged.  Personally, I don&#8217;t think that these people are going to come to People Aggregator for the sake of being early adopters.  These people are the late-if-ever adopters.  Marketing a tech service to them is going to be VERY difficult.  However, if you get endorsement by the local government, educational institutions, libraries, etc., and you have a physical location that is recommended as the #1 place to go for new computer users for easy, fun, free or very-low-cost training, you might be able to get some people started.  Now, to keep those people entertained and educate them, you will have to have a sufficient staff of people with good soft skills and lots of patience.  To grow the community, you then need to scale your staff to teach more people how to turn on their computers, log in, and get started.  You also need to handle the support requests from new users.</p>
<p>Here was Marc&#8217;s answer (it&#8217;s not verbatim, but distilled from his answer and the presentation):</p>
<blockquote><p>His company will set up &#8220;Digital Bureaus&#8221; in each area, which will provide staff for the in-person support and video help.  Also, the users can help each other out, and once a user has become comfortable enough with the system and gained a good reputation with the managers, he can then give back to the community and volunteer his or her time on video help.</p></blockquote>
<p>I&#8217;m not exactly sure what to think.  On one hand, there does appear to be a largely untapped market in Workforce Development, and there are lots of people that need computer training.  <a href="http://www.insidefacebook.com/2009/02/02/fastest-growing-demographic-on-facebook-women-over-55/">Also, the 55+ age group is the fastest-growing population of facebook users (and presumably social networks in general)</a>.  On the other hand, I would image that these people are the hardest to convert, and they&#8217;re not going to learn to use a computer unless they either are forced to (such as mandatory training due to unemployment), or they decide to on their own.  The entire business model is focused on being there at the right time, with the right community and staff.</p>
<p>But, above all, any service must be <em>relevant and meaningful </em>to it&#8217;s users, and I&#8217;m not so sure that this community will define itself quickly enough to be viable.  You need that initial seed, either through early adopters or an active group of experienced volunteers and staff.</p>
<p>Admittedly, I was very skeptical last night while Marc was talking, but the more I think about it, the more I think that it just might work.  It&#8217;s not KISS (keep it stupid-simple), because there are just too many pieces to this jigsaw puzzle, but with proper funding, good planning and government endorsement (or at least well-refined marketing), Marc might be able to pull it off.  If Video Professor can do so well for itself teaching basic computer skills, there should be plenty of room to do the same thing using person-to-person interaction.</p>
<p>With a little planning and structure, and a flexible, scalable business model, People Aggregator just might pull it off.  Kudos to Marc Canter for thinking big, yet again!</p>
<div class="diggthis_container">
<script type="text/javascript">
digg_url = 'http://www.rkrishardy.com/2009/09/macromedia-founder-creating-digital-city-in-ohio/';
digg_title = 'Macromedia Founder Creating &quot;Digital City&quot; in Ohio';
digg_bodytext = '&lt;a href=&quot;http://docs.google.com/present/view?id=0AXFHOmdiyC8KZGNyOTJrNnRfMjE0aGgzc3ZjZnM&amp;a...';
digg_skin = 'compact';
digg_window = 'new';
</script>
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script>
</div> 
<!-- start wp-tags-to-technorati 1.02 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/broadband+mechanics' rel='tag' target='_self'>broadband mechanics</a>, <a class='technorati-link' href='http://technorati.com/tag/columbus' rel='tag' target='_self'>columbus</a>, <a class='technorati-link' href='http://technorati.com/tag/macromedia' rel='tag' target='_self'>macromedia</a>, <a class='technorati-link' href='http://technorati.com/tag/marc+canter' rel='tag' target='_self'>marc canter</a>, <a class='technorati-link' href='http://technorati.com/tag/people+aggregator' rel='tag' target='_self'>people aggregator</a>, <a class='technorati-link' href='http://technorati.com/tag/social+networking' rel='tag' target='_self'>social networking</a>, <a class='technorati-link' href='http://technorati.com/tag/techlife' rel='tag' target='_self'>techlife</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.rkrishardy.com/2009/09/macromedia-founder-creating-digital-city-in-ohio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Targeting Your Website Based on a Visitor&#8217;s Location</title>
		<link>http://www.rkrishardy.com/2009/06/targeting-your-website-based-on-a-visitors-location/</link>
		<comments>http://www.rkrishardy.com/2009/06/targeting-your-website-based-on-a-visitors-location/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 12:44:17 +0000</pubDate>
		<dc:creator>Kris</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[geotargeting]]></category>
		<category><![CDATA[ip address]]></category>
		<category><![CDATA[ip geolocation]]></category>
		<category><![CDATA[market segmentation]]></category>

		<guid isPermaLink="false">http://www.rkrishardy.com/?p=155</guid>
		<description><![CDATA[Here&#8217;s a question about geolocation-based online marketing I received today: I use google analytics. The service I sell online is location specific. I am getting visits clustered around various locations. Any creative ideas on how to target visitors from specific locations? Does this make any sense? Something like: If you are from San Diego, click [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://duggme.com/2009/05/google-analytics-map-overlay-and-targeting-specific-locations-for-marketing-a-service">Here&#8217;s a question about geolocation-based online marketing I received today:</a></p>
<blockquote><p>I use google analytics. The service I sell online is location specific. I am getting visits clustered around various locations.</p>
<p>Any creative ideas on how to target visitors from specific locations? Does this make any sense?</p>
<p>Something like: If you are from San Diego, click here for a special offer?</p>
<p>Thoughts? Ideas? Experience to share?</p></blockquote>
<p><strong>Geotargeting your advertising messages is INCREDIBLY beneficial in a lot of cases.</strong></p>
<p><span id="more-155"></span>For example, think about this.  If you are looking for a carpet cleaner and you start searching in Google for carpet cleaners, you will find a bunch.  Now, what if one of the carpet cleaner&#8217;s  sites that you visit has an special offer specifically for your city, but the other 5 you visit don&#8217;t?</p>
<p>Which business looks like it is in your city?</p>
<p><strong><em>Which one of the 6 businesses are you more likely to call?</em></strong></p>
<p><strong>See the benefit of geo-targeted messages, even on your own website?</strong></p>
<p>Now, let&#8217;s assume that your carpet cleaning business doesn&#8217;t just serve one city.  Let&#8217;s say that it is actually a large franchise that serves the entire country.  What then?</p>
<p>You can still geo-target your sales messages on your own site.  Actually, in this case it&#8217;s even more important than if you&#8217;re a small, local company.</p>
<p><strong>If you geo-target your offers, it makes your business look like it is there to serve the specific location of your visitor.  And that, my friend, is <em>HUGE!</em></strong></p>
<p>It also keeps confusion down since you&#8217;re not showing irrelevant information.  For example, if someone from New York sees an ad for San Diego on your site, they might believe that your business only serves San Diego.  If you serve New York as well, then you probably just lost a customer.  Ouch&#8230;</p>
<p>If want to capitalize on geo-targeting and are wondering exactly how you can do it, there are a few options for you, depending on how you are sending traffic to your site.  The trick is to either look up where your visitors are coming from by using their IP address or some other identifying information, or tag your url links with something that will tell your server where they are from.</p>
<h2>Here are 2 ways to do this:</h2>
<h3>The best way to do this works really well, but it is the more complex of the two.  I personally do it this way, using PHP:</h3>
<p>1) Have your web developer program your site to look at the visitor’s IP address (With an Apache server running a PHP-based site, your visitor&#8217;s IP address is stored in $_SERVER['REMOTE_ADDR']).</p>
<p>2) Set up the Net::Geo PEAR package for PHP, which allows your server to do geolocation lookups on your visitor&#8217;s IP address to determine approximately where he/she is located (at least down to the portion of the state).</p>
<p><a href="http://articles.techrepublic.com.com/5100-10878_11-6103179.html">Here’s a link to the Net::Geo installation instructions</a></p>
<p>3) If they are within the region of the state you are having the special offer for, then show the ad. Otherwise, don’t show it. (Using this method, you can have a series of ads that are all location-specific).  This will require some more code from your developer.</p>
<h3>Here&#8217;s the other way to do it, but it is limited to Pay-Per-Click ads only.  It&#8217;s easy to do, but much more limited:</h3>
<p>1) Geotarget your ads in Google Adense, Yahoo, etc. (make a set of ads that target San Diego only)</p>
<p>2) Change the urls in these ads to include a parameter, like this:</p>
<p>http://www.myurl.com/?loc=SanDiego</p>
<p>3) Now get your web developer to write in a simple test on your site so that if the loc parameter = “SanDiego”, then show the ad.</p>
<p><strong>Using either of these two methods works very well, although I prefer the first method.  It&#8217;s more complex, but it covers all cases.</strong></p>
<p>If you don&#8217;t do geo-location targeting on your website, you could be missing out on landing new customers.  Targeting your sales messages directly to your customers based on their location makes your business more relevant to what they need and gives it a more local feeling.  Those always increase sales.  Especially if your business provides a service, being in the right location (or at least the appearance of being in the right location) means everything in the mind of your customer.</p>
<p><strong>Stop missing out on sales that are so easy to capitalize on!</strong></p>
<p>If you have any questions or need help, let me know.  My business specializes in doing things just like this, which are child&#8217;s play to us.</p>
<p><a href="http://www.submergedsolutions.com">Web Development, System Integration and Online Marketing by Submerged Solutions LLC</a></p>
<p>-Kris</p>
<div class="diggthis_container">
<script type="text/javascript">
digg_url = 'http://www.rkrishardy.com/2009/06/targeting-your-website-based-on-a-visitors-location/';
digg_title = 'Targeting Your Website Based on a Visitor\'s Location';
digg_bodytext = '&lt;a href=&quot;http://duggme.com/2009/05/google-analytics-map-overlay-and-targeting-specific-locations-for-marketing-a-service&quot;&gt;Here\'s a question about geolocation-based online marketing I received today:&lt;/...';
digg_skin = 'compact';
digg_window = 'new';
</script>
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script>
</div> 
<!-- start wp-tags-to-technorati 1.02 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/geotargeting' rel='tag' target='_self'>geotargeting</a>, <a class='technorati-link' href='http://technorati.com/tag/ip+address' rel='tag' target='_self'>ip address</a>, <a class='technorati-link' href='http://technorati.com/tag/ip+geolocation' rel='tag' target='_self'>ip geolocation</a>, <a class='technorati-link' href='http://technorati.com/tag/market+segmentation' rel='tag' target='_self'>market segmentation</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.rkrishardy.com/2009/06/targeting-your-website-based-on-a-visitors-location/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Revolutionize Your Business Through Market Innovation</title>
		<link>http://www.rkrishardy.com/2009/05/revolutionize-your-business-through-market-innovation/</link>
		<comments>http://www.rkrishardy.com/2009/05/revolutionize-your-business-through-market-innovation/#comments</comments>
		<pubDate>Sat, 30 May 2009 16:09:05 +0000</pubDate>
		<dc:creator>Kris</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[ipod]]></category>
		<category><![CDATA[itunes]]></category>
		<category><![CDATA[market innovation]]></category>
		<category><![CDATA[podcasting]]></category>

		<guid isPermaLink="false">http://www.rkrishardy.com/?p=140</guid>
		<description><![CDATA[I was reading Ed Dale&#8217;s blog the other day, and this term popped into my mind.  I don&#8217;t think that I&#8217;ve heard it before, so I&#8217;m going to coin it&#8230; &#8220;Market Innovation&#8221; So what is Market Innovation and why am I writing about it? Market Innovation is a 5-step process: Start by looking at a [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://tubbynerd.com/2009/05/28/if-your-shy-cherish-privacy-support-manchester-united-or-heaven-forbid-own-a-pc-is-the-thirty-day-challenge-for-you-30dc/">I was reading Ed Dale&#8217;s blog the other day</a>, and this term popped into my mind.  I don&#8217;t think that I&#8217;ve heard it before, so I&#8217;m going to coin it&#8230;</p>
<h1><strong>&#8220;Market Innovation&#8221;</strong></h1>
<p>So what is Market Innovation and why am I writing about it?</p>
<p><strong>Market Innovation is a 5-step process:</strong></p>
<ol>
<li>Start by looking at a large market.</li>
<li>Identify a segment of that market that has a common, unfulfilled need.</li>
<li>Pivot the market segment &#8211; Innovate a revolutionary product that spins that market segment 180 degrees with your product as the pivot point.</li>
<li>Develop a community of consumers around your product by selling complimentary products to your consumer base.</li>
<li>Control and Grow your New Market &#8211; Through shaping the market segment and becoming the pivot, you have created an entire new market around your products.  You now control the market.  Your mission at this point is to keep them happy and grow your market.</li>
</ol>
<h3>Let me show you an example&#8230;</h3>
<p>Before <a href="http://www.apple.com">Apple </a>came out with the <a href="http://www.apple.com/itunes/">iPod</a>, there were lots of MP3 players around.  Most were cheeply made, were missing a lot of features, and required you to convert your own CDs to MP3 so that you could load them on your player.</p>
<p>The iPod changed all that.  In late 2001, they completely changed the MP3 player market by solving those problems for the people who were unhappy with their current MP3 players or who wanted an MP3 player but were scared off by the other players at that time.</p>
<p>The iPod was a very nice-looking, easy to operate and well-featured MP3 player.  Now the features and design of the iPod alone really grabbed the market&#8217;s attention, but I believe that the true market innovation happened with the iTunes software.</p>
<h3>iTunes was Apple&#8217;s Pivot</h3>
<p><a href="http://www.apple.com/itunes/overview/">iTunes</a> made it REALLY easy to get songs onto the iPod, without having to go to the store, buy a CD, bring it home and convert it to MP3.  You could download them directly from Apple to your iPod.  Another problem solved.</p>
<h3>The Podcast Built the Community</h3>
<p>They then built the community of rabbid fans with the invention of the <a href="http://en.wikipedia.org/wiki/Podcast">Podcast</a>.  By allowing users to syndicate their own MP3 recordings to anyone with iTunes, Apple extablished itself as the center of the internet audio consumer market.  By becoming the conduit of music and information, iTunes completely took over the MP3 market as the player-of-choice for most people.</p>
<p>The success of iTunes, in my opinion, is what really is keeping the iPod ahead of the competition.  iTunes has become the center of the MP3 market, and through market innovation, has grown the market from a small niche into the main stream.</p>
<p>Apple is still innovating with the iPod and iTunes and finding new things to sell to its consumers.  iTunes is regularly being updated and new features are added.</p>
<p>They now have a 75% market share of the MP3 player market, and iTunes has become the 4th largest music retailer.</p>
<p><object width="400" height="326" data="http://video.google.com/googleplayer.swf?docid=6960974522224017009&amp;hl=en&amp;fs=true" type="application/x-shockwave-flash"><param name="id" value="VideoPlayback" /><param name="src" value="http://video.google.com/googleplayer.swf?docid=6960974522224017009&amp;hl=en&amp;fs=true" /><param name="allowfullscreen" value="true" /></object></p>
<h3>So what does this mean for you?</h3>
<p>I could go through a similar process with every current market leader &amp; long-lived successful product.  Google, Microsoft, Wal-Mart, Lowes, the Apple Macintosh, etc.</p>
<p>Market Innovation is at the core of every market leader, but you don&#8217;t have to be the leader in order to start.  Nor do you have to the be market leader in order to pivot the market.  Each of these companies started small at one point, and they found the market that they could pivot.  Once you pivot the market, even if it is a small niche, you become the center of it.</p>
<p>At its simplest, I really see it as a 5-step process:</p>
<ol>
<li>Start by looking at a large market.</li>
<li>Identify a Segment of that market that has a common, unfulfilled need.</li>
<li>Pivot the Market Segment.</li>
<li>Develop a Community of Consumers.</li>
<li>Control and Grow your New Market.</li>
</ol>
<p>I am putting together a video series on how you can do this in your own market, from market research to launching your product.  If you would like to get on the insider&#8217;s list and learn how to innovate and control your own market, watch the video at <a href="http://www.submergedsolutions.com">Submerged Solutions</a>:</p>
<p><a href="http://www.submergedsolutions.com"><img class="aligncenter size-medium wp-image-137" title="Biggest Problems Video" src="http://www.rkrishardy.com/wp-content/uploads/2009/05/2009-05-29_1120-300x195.png" alt="Biggest Problems Video" width="300" height="195" /></a></p>
<p>What are your thoughts?</p>
<p>-Kris</p>
<div class="diggthis_container">
<script type="text/javascript">
digg_url = 'http://www.rkrishardy.com/2009/05/revolutionize-your-business-through-market-innovation/';
digg_title = 'Revolutionize Your Business Through Market Innovation';
digg_bodytext = '&lt;a href=&quot;http://tubbynerd.com/2009/05/28/if-your-shy-cherish-privacy-support-manchester-united-or-heaven-forbid-own-a-pc-is-the-thirty-day-challenge-for-you-30dc/&quot;&gt;I was reading Ed Dale\'s blog the oth...';
digg_skin = 'compact';
digg_window = 'new';
</script>
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script>
</div> 
<!-- start wp-tags-to-technorati 1.02 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/apple' rel='tag' target='_self'>apple</a>, <a class='technorati-link' href='http://technorati.com/tag/ipod' rel='tag' target='_self'>ipod</a>, <a class='technorati-link' href='http://technorati.com/tag/itunes' rel='tag' target='_self'>itunes</a>, <a class='technorati-link' href='http://technorati.com/tag/market+innovation' rel='tag' target='_self'>market innovation</a>, <a class='technorati-link' href='http://technorati.com/tag/podcasting' rel='tag' target='_self'>podcasting</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.rkrishardy.com/2009/05/revolutionize-your-business-through-market-innovation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AdWords Confusion Lawsuit: Google&#8217;s Dismissal Overturned</title>
		<link>http://www.rkrishardy.com/2009/04/adwords-confusion-lawsuit-googles-dismissal-overturned/</link>
		<comments>http://www.rkrishardy.com/2009/04/adwords-confusion-lawsuit-googles-dismissal-overturned/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 14:51:46 +0000</pubDate>
		<dc:creator>Kris</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[lawsuit]]></category>
		<category><![CDATA[paid search]]></category>
		<category><![CDATA[rescuecom]]></category>
		<category><![CDATA[use in commerce]]></category>

		<guid isPermaLink="false">http://www.rkrishardy.com/?p=95</guid>
		<description><![CDATA[When I first started watching these paid search lawsuits, I personally thought that they were non-issues.  In several cases of companies suing the search engines for running competitor&#8217;s adds on the search engine results pages for a trademarked term, the search engines had won.   A precedent had already been set from these cases, right?  [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_97" class="wp-caption alignright" style="width: 160px"><a href="http://www.scribd.com/doc/13967718/Rescuecom-Google-Key-Word-Decision"><img class="size-thumbnail wp-image-97" title="Google v. Rescuecom" src="http://www.rkrishardy.com/wp-content/uploads/2009/04/2009-04-06_1053-150x150.png" alt="Google v. Rescuecom" width="150" height="150" /></a><p class="wp-caption-text">2d Circuit: Rescuecom Defeats Google&#39;s Motion to Dismiss (4/3/09)</p></div>
<p>When I first started watching these <a href="http://www.rkrishardy.com/2009/03/paid-search-lawsuit-did-amazon-infringe-on-video-professor-trademark/">paid search lawsuits</a>, I personally thought that they were non-issues.  In several cases of companies suing the search engines for running competitor&#8217;s adds on the search engine results pages for a trademarked term, <a href="http://www.thedomains.com/2009/02/18/yahoo-wins-ppc-keyword-ad-case/">the search engines had won</a>.   A precedent had already been set from these cases, right?  At least I thought so.</p>
<p>Now, that leads to this article that was published on Friday: <a href="http://www.mediapost.com/publications/?fa=Articles.showArticle&amp;art_aid=103490">Google Loses Round in AdWords Lawsuit</a>.</p>
<p>To boil down the article to the sticky residue that remains, the <a href="http://www.schwimmerlegal.com/2009/04/2d_circuit_sale.html">2nd Circuit federal appellate court overturned Google&#8217;s motion to dismiss the case for allowing the trademark &#8220;rescuecom&#8221; to trigger paid ads</a>.</p>
<p>While this doesn&#8217;t mean that Google will lose the case, it is an interesting reversal since the case was originally dismissed by the district court on the grounds that allowing the keyword &#8220;rescuecom&#8221; to trigger paid advertisements did not violate trademark law because it wasn&#8217;t a use in commerce.</p>
<p><span id="more-95"></span>The term <a href="http://blog.ericgoldman.org/archives/2008/04/trademark_use_i.htm">&#8220;Use In Commerce&#8221; </a>is very important here, and is the primary indicator of whether or not your trademark is being violated.  A good example of &#8220;use in commerce&#8221; is if you owned a company that sold a product to computer geeks under the name &#8220;Microsoft&#8221;, disregarding the fact that there is another company that uses the name &#8220;Microsoft&#8221; and sells products within the same market.</p>
<p>The other key determinate is whether confusion is likely to exist.  In my example above, for a person shopping for computer equipment, there absolutely will be confusion over the products (the real Microsoft vs. the other Microsoft).</p>
<p>In the case of search keywords, it is a bit more touchy.  It is common to position yourself against your competitors by using their company name or product, and then writing an ad that says, essentially, &#8220;Their product sucks.  Our product is awesome.  Buy our stuff instead.&#8221;  (Whether that is really a viable method that works well, I don&#8217;t have the data to back it up.  That&#8217;s an entire other topic that I might get to some other time.)</p>
<p>Now, it gets sticky if the advertiser is either trying to game the system, or doesn&#8217;t think out his tactic.  Here are examples:</p>
<ol>
<li>Gaming the system: Bidding on search ads for competitors trademarks, using the trademark in the title and making the ad appear to be the authentic company.</li>
<li>Not thinking out their tactics: Putting a trademark in their list of keywords for the ad, and putting a dynamic title in the ad that causes the trademark to automatically be inserted into the advertisement.  Especially, if you don&#8217;t differentiate your company from their in the ad copy, you may be opening your door to a lawsuit.</li>
</ol>
<p>For the advertiser, Google has already put some safeguards in place.  For example, if your ad copy uses a term that is in their list of trademarked terms, your ad will be disapproved.  If this happens to you, don&#8217;t take it personally.  Take it from those of us that have managed lots of campaigns in some really crowded markets: it&#8217;s likely to happen to you at some point.</p>
<p>The way around this is to either:</p>
<ol>
<li>Be permitted by the manfuacturer or distributor of your product to use the trademark, and forward that information to Google, or</li>
<li> Use a different term in the ad copy to differentiate your product or service from the trademarked product or service.</li>
</ol>
<p>I will be keeping an eye closely on this lawsuit, as it has the possibility of changing the landscape of paid search.  If Google looses, it also may pave the way for more restricitve rules on paid search ads.</p>
<p>What are your thoughts or questions?  Post a comment!</p>
<p>-Kris</p>
<div class="diggthis_container">
<script type="text/javascript">
digg_url = 'http://www.rkrishardy.com/2009/04/adwords-confusion-lawsuit-googles-dismissal-overturned/';
digg_title = 'AdWords Confusion Lawsuit: Google\'s Dismissal Overturned';
digg_bodytext = '&lt;a href=&quot;http://www.scribd.com/doc/13967718/Rescuecom-Google-...';
digg_skin = 'compact';
digg_window = 'new';
</script>
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script>
</div> 
<!-- start wp-tags-to-technorati 1.02 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/google' rel='tag' target='_self'>google</a>, <a class='technorati-link' href='http://technorati.com/tag/lawsuit' rel='tag' target='_self'>lawsuit</a>, <a class='technorati-link' href='http://technorati.com/tag/paid+search' rel='tag' target='_self'>paid search</a>, <a class='technorati-link' href='http://technorati.com/tag/rescuecom' rel='tag' target='_self'>rescuecom</a>, <a class='technorati-link' href='http://technorati.com/tag/use+in+commerce' rel='tag' target='_self'>use in commerce</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.rkrishardy.com/2009/04/adwords-confusion-lawsuit-googles-dismissal-overturned/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

