<?xml version="1.0" encoding="UTF-8"?>
<rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>zobie's blog</title>
	
	<link>http://blog.zobie.com</link>
	<description>I create software, I like music and I'm mildly(?) OCD.</description>
	<lastBuildDate>Thu, 13 Oct 2011 14:32:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/zobie" /><feedburner:info uri="zobie" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>zVision is the future!</title>
		<link>http://feedproxy.google.com/~r/zobie/~3/yL-PMuXVNMk/</link>
		<comments>http://blog.zobie.com/2011/10/zvision-is-the-future/#comments</comments>
		<pubDate>Thu, 13 Oct 2011 14:27:33 +0000</pubDate>
		<dc:creator>zobie</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[saas]]></category>
		<category><![CDATA[soa]]></category>
		<category><![CDATA[srs]]></category>
		<category><![CDATA[srswp]]></category>

		<guid isPermaLink="false">http://blog.zobie.com/?p=258</guid>
		<description><![CDATA[This internal memo was sent to SRS Software this morning. The points are important enough that I wanted to cross-post here. Team, I know there has been a lot of frustration over the last year as we have been working on zVision, the web platform, and ReEn. The shift we are making takes us from [...]]]></description>
			<content:encoded><![CDATA[<p>This internal memo was sent to SRS Software this morning. The points are important enough that I wanted to cross-post here.<br />
</p>
<hr />
<br />
Team,</p>
<p>I know there has been a lot of frustration over the last year as we have been working on zVision, the web platform, and ReEn. The shift we are making takes us from creating products to the creation of a platform.</p>
<p>So far, most have only felt the pain of the transition and have not seen the advantages. I promise you that this transition will be worth the pain and frustration. We are on the cusp of realizing a payout and it will be huge!</p>
<p>A guy who worked at Amazon and is currently at Google recently posted what was intended to be an internal memo on this topic. <strong><em>Everyone should take time to study the attached memo (<a href="http://steverant.pen.io">http://steverant.pen.io</a>) and understand the points that are made.</em></strong></p>
<p>Here are a couple of threads where people are discussing Stevey’s memo that you may find useful:</p>
<ul>
<li><a href="https://plus.google.com/112678702228711889851/posts/eVeouesvaVX">https://plus.google.com/112678702228711889851/posts/eVeouesvaVX</a></li>
<li><a href="http://www.reddit.com/r/programming/comments/l9ehj/steves_google_platform_rant/">http://www.reddit.com/r/programming/comments/l9ehj/steves_google_platform_rant/</a></li>
</li>
</ul>
<p>I will continue to do everything I can to clearly communicate the amazing direction we are headed.</p>
<ul>
<li>zVision puts us at the forefront of the technology industry!</li>
<li>zVision is the platform we need to carry us for the next 10+ years!</li>
<li>zVision will give SRS the flexibility and agility to dominate in our chosen market!</li>
</li>
</ul>
<p>You are welcome to send me questions or comments privately. Alternatively, I have cross-posted this to my blog and you are also welcome to publically comment there.</p>
<ul>
<li><a href="http://blog.zobie.com">http://blog.zobie.com</a></li>
</ul>
<p>- Nate</p>
<p>Nate Zobrist | VP of Software Architecture<br />
Service Repair Solutions, Inc. — Revolutionizing the Delivery of Service and Repair&trade;</p>
<p>770 East Technology Avenue, Building F | Orem, Utah 84097<br />
Phone: (801) 437-5846 | Fax: (801) 437-5899 | Cell: (801) 788-4789<br />
www.servicerepairsolutions.com</p>
<img src="http://feeds.feedburner.com/~r/zobie/~4/yL-PMuXVNMk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.zobie.com/2011/10/zvision-is-the-future/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.zobie.com/2011/10/zvision-is-the-future/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=zvision-is-the-future</feedburner:origLink></item>
		<item>
		<title>Creating Apps Should Be Trivial!</title>
		<link>http://feedproxy.google.com/~r/zobie/~3/Dz_Bd3-9SIc/</link>
		<comments>http://blog.zobie.com/2011/09/creating-apps-should-be-trivial/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 21:07:43 +0000</pubDate>
		<dc:creator>zobie</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[archiecture]]></category>
		<category><![CDATA[soa]]></category>
		<category><![CDATA[srs]]></category>
		<category><![CDATA[srswp]]></category>

		<guid isPermaLink="false">http://blog.zobie.com/?p=243</guid>
		<description><![CDATA[At Dreamforce '11, a presentation I particularly enjoyed was given by Ryan Smith from Heroku. Titled Designing for the Cloud: The 12 Factor App, Ryan discussed some fundamental design patterns and practices that have made Heroku successful. An interesting analogy that was made compares applications to swiss army knives. The analogy is relevant to SRS [...]]]></description>
			<content:encoded><![CDATA[<p>At Dreamforce '11, a presentation I particularly enjoyed was given by <a href="http://twitter.com/ryandotsmith">Ryan Smith</a> from <a href="http://heroku.com">Heroku</a>. Titled <em><a href="https://dreamevent.my.salesforce.com/a093000000CeqeV">Designing for the Cloud: The 12 Factor App</a></em>, Ryan discussed some fundamental design patterns and practices that have made Heroku successful.</p>
<p>An interesting analogy that was made compares applications to swiss army knives. The analogy is relevant to SRS and provides a great visual depiction of the work we are doing as part of our SaaS and SRSWP initiatives.</p>
<p><img class="alignright" style="border-style: initial; border-color: initial; border-width: 0px;" src="http://blog.zobie.com/wp-content/uploads/2011/09/swiss_army_knife_giant.png" alt="swiss_army_knife_giant.png" width="250" height="185" border="0" />Historically our applications were designed as large, monolithic beasts. Like this knife, every feature that could be imagined was rolled into one of our flagship products. This design meant:</p>
<ul>
<li>Duplicated effort because there were no shared components between product lines.</li>
<li>Intense effort required to join the team due to the large, interconnected designs.</li>
<li>Even small changes were risky and had the potential of destabilizing anentire product.</li>
<li>Management of each product line required enormous effort to tightly coordinate development and release of new features.</li>
</ul>
<p><img class="alignright" style="border-style: initial; border-color: initial; border-width: 0px;" src="http://blog.zobie.com/wp-content/uploads/2011/09/swiss_army_classic.png" alt="swiss_army_classic.png" width="250" height="169" border="0" />Contrast that complexity with a design where:</p>
<ul>
<li>Components are small, independent apps that work together (like Linux tools).</li>
<li>Each component delivers specific functionality.</li>
<li>Touch points between components are<a href="http://blog.zobie.com/2011/09/contract-definition-and-stability">well-defined contracts</a>.</li>
</ul>
<p>The workflow enabled by this component-based architecture is truly liberating.</p>
<ul>
<li>Small teams (perhaps even a single-person team) can build on top of the shared platform to quickly create new products.
<ul>
<li>Most products do not need to worry about operational infrastructure, databases, etc.</li>
<li>Products can take advantage of shared services to quickly enable powerful features in innovative ways.</li>
<li>Products can tap into shared repositories of both customer-generated and catalog data.</li>
</ul>
</li>
<li>Existing products are simpler to maintain and introducing change is far less risky.
<ul>
<li>A smaller codebase means that the project is much easier to grok.</li>
<li>Well-defined contracts that have robust automated tests written against them mean that each component can be released independently with confidence.</li>
</ul>
</li>
<li>Teams can work more efficiently by choosing technologies and frameworks that are tailored to fit specific needs.
<ul>
<li>Using standards-compliant web services for an API means that apps written in Java, Ruby on Rails or Node.js can access shared services as easily as a legacy, .NET application.</li>
</ul>
</li>
</ul>
<p>Following a component-based approach will make the creation of new apps a trivial exercise. It will free us to focus on solving interesting problems rather than being bogged down by operational overhead. The quality of our offering will increase as we become much more responsive to customers.</p>
<p>Applying these principles means something different for each of our existing projects and teams. What remains to be done for your team to fully benefit from this component-based design? What new functionality would you like to see exposed by the SRSWP?</p>
<img src="http://feeds.feedburner.com/~r/zobie/~4/Dz_Bd3-9SIc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.zobie.com/2011/09/creating-apps-should-be-trivial/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.zobie.com/2011/09/creating-apps-should-be-trivial/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=creating-apps-should-be-trivial</feedburner:origLink></item>
		<item>
		<title>Contract Definition and Stability</title>
		<link>http://feedproxy.google.com/~r/zobie/~3/jK8XF9xELfo/</link>
		<comments>http://blog.zobie.com/2011/09/contract-definition-and-stability/#comments</comments>
		<pubDate>Sat, 17 Sep 2011 18:39:34 +0000</pubDate>
		<dc:creator>zobie</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[saas]]></category>
		<category><![CDATA[soa]]></category>
		<category><![CDATA[srs]]></category>
		<category><![CDATA[srswp]]></category>

		<guid isPermaLink="false">http://blog.zobie.com/?p=238</guid>
		<description><![CDATA[In my first zVision presentation that was recently given at each of the SRS offices, I identified one of Engineering's current problems as an "absence of trust" between teams. This phrase caused some confusion that I would like to clarify. Let's say I want to write an app that integrates with the del.icio.us bookmarking service. [...]]]></description>
			<content:encoded><![CDATA[<p>In my first zVision presentation that was recently given at each of the SRS offices, I identified one of Engineering's current problems as an "absence of trust" between teams. This phrase caused some confusion that I would like to clarify.</p>
<p>Let's say I want to write an app that integrates with the <a href="http://del.icio.us">del.icio.us</a> bookmarking service. My application will be reliant on their <a href="http://www.delicious.com/help/api">public API</a>. So, for this venture to be successful:</p>
<p>The API's <strong><em>Contract Definition</em></strong> is essential:</p>
<ul>
<li>Method descriptions, examples, limitations and assumptions are all necessary and are included as part of the API documentation.</li>
</ul>
<p>The API's <strong><em>Contract Stability</em></strong> is essential:</p>
<ul>
<li>Breaking changes should be very rare. Even with a disclaimer stating that it may change at any time, there is an implied level of stability in any published API.</li>
<li>When a breaking change to the API is necessary, backwards compatibility will be provided. That's why their APIs all have "v1" in them!</li>
</ul>
<p>Within SRS we should think about cross-project integration similarly to integrating with external services like del.icio.us. Except in very rare situations, touch points between products are limited to APIs (i.e. massively-versioned web services).</p>
<p>When I referred to "absence of trust" in zVision, I call attention to the fact that we do not yet have the requisite level of Contract Definition and Contract Stability in our APIs. Without both definition and stability, I could not trust the del.icio.us API enough to base my app on it. The same is true for building on SRS-internally produced services.</p>
<p>Since the end of 2010 and through 2012 we are making a large investment in re-architecting our products based on principles of SOA and SaaS. Absolutely essential to success are APIs which are both well defined and stable. Once we have those things, we can trust the services provided by other SRS teams as much as we would trust del.icio.us.</p>
<img src="http://feeds.feedburner.com/~r/zobie/~4/jK8XF9xELfo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.zobie.com/2011/09/contract-definition-and-stability/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.zobie.com/2011/09/contract-definition-and-stability/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=contract-definition-and-stability</feedburner:origLink></item>
		<item>
		<title>My New Job (Title)</title>
		<link>http://feedproxy.google.com/~r/zobie/~3/-P7TJbB0wPY/</link>
		<comments>http://blog.zobie.com/2011/09/my-new-job/#comments</comments>
		<pubDate>Thu, 01 Sep 2011 09:30:04 +0000</pubDate>
		<dc:creator>zobie</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[life]]></category>
		<category><![CDATA[srs]]></category>

		<guid isPermaLink="false">http://blog.zobie.com/?p=216</guid>
		<description><![CDATA[It has been quite a long time since I last posted anything to my blog. It's not that I haven't thought about it or that I haven't had time (though life has been busy). I've struggled topically with what to write. This blog was started with the intent that I would share things about my [...]]]></description>
			<content:encoded><![CDATA[<p>It has been quite a long time since I last posted anything to my blog. It's not that I haven't thought about it or that I haven't had time (though life has been busy). I've struggled topically with what to write.</p>
<p>This blog was started with the intent that I would share things about my work: creating software. But, over the last year my job has been in a fairly constant state of flux with my responsibilities shifting radically from what I was doing previously.</p>
<p>I love being a software developer. I love the problem solving that the work entails. I love being in "the zone" while writing code. I love creating something that others find useful and I like to think that I am fairly good at it. Wishful thinking? Perhaps. But, at least one other person has thought me passable, so I choose to believe. <img src='http://blog.zobie.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>At present my job title is VP of Software Architecture. In my new responsibilities I still get to solve incredibly complex problems and derive a lot of satisfaction from it. In many ways the things I work on now are more intricate and stimulating than what I did previously. The only downside is that I rarely get to ride "the zone" via coding anymore.</p>
<p>Two years ago, if someone had described my current job to me and asked if I wanted the position, I would have turned them down outright. I derive so much pleasure and satisfaction from writing code that I could not have imagined wanting something else. I was firm (and vocal) in my commitment to avoiding "the management track." How then did I end up here?</p>
<p>I joined <a href="http://www.mpifix.com">Mobile Productivity, Inc. (MPI)</a> in January 2004. The people were great and the work was both challenging and interesting. But, after a few years I started to grow bored. Nothing had really changed, except that I wasn't creating new software anymore. I was responsible for a significant portion of our flagship product, ARGIS (since rebranded MPI Edge), but I had rewritten most of the code several times and just wasn't being stimulated the way I once was. I decided to leave MPI to go work for another startup named Podango.</p>
<p>Podango was a good company in many respects, but like many startups it wasn't able to thrive and closed at the end of 2008. Friends at MPI heard that I was in the job market and offered me a position. I was a bit hesitant, but a lot of new things were happening and I felt good about returning.</p>
<blockquote><p>&lt;sidenote&gt;<br />
Internally at SRS, this period of my career is jokingly referred to as my "sabbatical."<br />
&lt;/sidenote&gt;</p></blockquote>
<p>Somewhere in all of this, MPI acquired several companies and was renamed <a href="http://www.servicerepairsolutions.com">Service Repair Solutions (SRS)</a>. We've grown from 25 people in a single office to just under 600 total (including offshore teams). The Engineering department alone has over 200 people spread across offices in Utah, Minnesota, Uruguay, Vietnam, Las Vegas and Russia.</p>
<p>I'm not worried about growing bored again any time soon. My job is awesome!</p>
<img src="http://feeds.feedburner.com/~r/zobie/~4/-P7TJbB0wPY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.zobie.com/2011/09/my-new-job/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.zobie.com/2011/09/my-new-job/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=my-new-job</feedburner:origLink></item>
		<item>
		<title>Source Code Management</title>
		<link>http://feedproxy.google.com/~r/zobie/~3/70PjdZsG4-Y/</link>
		<comments>http://blog.zobie.com/2010/02/source-code-management/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 00:12:46 +0000</pubDate>
		<dc:creator>zobie</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[srs]]></category>
		<category><![CDATA[tfs]]></category>

		<guid isPermaLink="false">http://blog.zobie.com/?p=210</guid>
		<description><![CDATA[Note: This blog post was originally posted to an internal SRS blog on February 09, 2010. The post was intended to address specific issues, but I do strongly support the idea of "commit early and often" as a general principle. Source Code Management Source control is a fundamental part of software development. The benefits of [...]]]></description>
			<content:encoded><![CDATA[<p><em>Note: This blog post was originally posted to an <a href="http://home.mpifix.com/Teams/development/blog/Lists/Posts/Post.aspx?ID=56">internal SRS blog</a> on February 09, 2010. The post was intended to address specific issues, but I do strongly support the idea of "commit early and often" as a general principle.</em></p>
<h2>Source Code Management</h2>
<p>Source control is a fundamental part of software development. The benefits of using a source control management (SCM) system are numerous and worthy of their own blog post. But, I have noticed two significant problems with the way that SCM is currently being used on many of our projects:</p>
<ol>
<li>ChangeSets are frequently too large</li>
<li>ChangeSets often contain code that shouldn't be committed</li>
</ol>
<h3>ChangeSets Are Too Large</h3>
<p>I am frequently guilty of working for days on a particular task without committing any changes to source control. I like to wait until my task is completed. I don't want to break the build, and I don't want to commit broken code that might impede others. But, the biggest reason that I avoid committing my working code is that I don't want anyone to see it until I'm finished.</p>
<p>There are several problems with monolithic commits, including:</p>
<ul>
<li>Integration headaches: large ChangeSets increase the odds that changes will conflict with someone else's changes</li>
<li>Useless file history: comments on large ChangeSets are, of necessity, more vague and less likely to convey useful information</li>
</ul>
<p>My preferred <a href="http://git-scm.com">version control software</a> at the moment is a <a href="http://en.wikipedia.org/wiki/Distributed_Version_Control_System">DVCS</a>. DVCSs offer many benefits over traditional SCMs, but one of the best is easy branching and merging. A DVCS allows me to work like this:</p>
<blockquote><p><strong>Branch per Task</strong></p>
<p>Every development task is a new, independent branch. Tasks are merged into the permanent main branch as they are completed.</p>
<p><img src="http://blog.zobie.com/wp-content/uploads/2011/09/branch-per-task.png" alt="Branch Per Task" width="432" height="145" border="0" /></p>
<p>(from <a href="http://www.codinghorror.com/blog/2007/10/software-branching-and-parallel-universes.html">Coding Horror</a>)</p></blockquote>
<p>Each time I am ready to begin a new task I create a branch for all work on that task. I generally have several active working branches that I can easily switch between. I check in code often to my working branch, rarely going more than a few hours between commits. Once I have finished working on a particular task, I merge my completed code back into the shared master branch. I am able to make frequent commits without breaking the master branch due to incomplete code.</p>
<p>Unfortunately, TFS does not easily support this style of development. Creating branches is inconvenient, and merging code between branches is torture. Although I would love to recommend that SRS adopt the style of development that I've described, I just don't believe that it is feasible with current versions of TFS. Given the painful nature of branching and merging in TFS, I don't see a better alternative to our current branch per-release strategy.</p>
<p>Given that TFS doesn't provide easy branching and merging, here's what we can do to find a happy medium. We should not check in broken code, but we shouldn't hesitate to check in code that is incomplete. Especially for new functionality, there shouldn't be any problem checking in a stub method that doesn't do anything. There are very few, if any, situations where we would be unable to commit our working code to TFS once a day.</p>
<p>There will no doubt be times where checking in small, granular ChangeSets will not be practical. There will be times when some of our tasks require us to break the application (not the build though!) in order to complete a task. However, it is my belief that with a little planning these times should be brief and infrequent.</p>
<p>It would be foolhardy to ignore the problems that accompany frequent check-ins. As the number of developers working in the same code base increases, so too does the probability that someone will check in something that will disrupt everyone else's work. This leads directly into my second topic: We must be aware of the code that we are checking in.</p>
<h3>ChangeSets Contain Code They Shouldn't</h3>
<p>When it is time to commit code to TFS, it is not uncommon for developers to simply check every file listed in VisualStudio's "Pending Changes" window and commit all outstanding changes. Although VisualStudio makes it incredibly easy to follow this bad practice (Why are all modified files checked by default?!?), we need to stop doing it. Sometimes debug code is committed and leads to problems that are only discovered after our customers have the release. Sometimes builds are broken as csproj and sln files are inadvertently modified. Sometimes it simply messes up the file's history (TFS always increments the version and updates the file's history, regardless of whether anything in the file has changed). These things should not happen. <em>When checking code into SCM it is the developer's responsibility to verify every change that is being made. The developer should diff <strong>all</strong> changed files and verify <strong>every</strong> change that will be committed.</em></p>
<p>If anyone has found and enabled the option in VisualStudio to "Check in everything when closing a solution or project," please disable it immediately. No good can come from that option!</p>
<p style="text-align: center;"><a href="http://blog.zobie.com/wp-content/uploads/2010/02/CheckInEverythingWhenClosingASolutionOrProject.png"><img class="size-full wp-image-211 aligncenter" src="http://blog.zobie.com/wp-content/uploads/2010/02/CheckInEverythingWhenClosingASolutionOrProject.png" alt="Check in everything when closing a solution or project" width="543" height="321" /></a></p>
<p>In some cases you may imagine that these procedures don't apply to you because you are the only developer on your team. That is a false assumption. Code should always be written for the long-term. Code should <em>always</em> be written and commented in such a way that another developer can pick up your tasks at any time. Julian Bucknall, the CTO of Developer Express, recently posted a thought to his blog that precisely expresses the point I am trying to make: <a href="http://community.devexpress.com/blogs/ctodx/archive/2010/01/27/devexpress-newsletter-20-message-from-the-cto.aspx">Assume your code will be public</a>. I am as guilty as anyone — probably more so, actually — of some of the bad practices that Mr. Bucknall describes. Edge Legacy is full of funny names and informal comments that I wrote to amuse myself. As we consider publishing more of our APIs for external consumption, it is increasingly important that the code we write properly represents the professional nature of SRS and increases the trust that our customers have in us.</p>
<h3>See Also</h3>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/aa730834(VS.80).aspx">MSDN: Branching and Merging Primer</a></li>
<li><a href="http://www.codinghorror.com/blog/archives/001165.html">Coding Horror: Check In Early, Check In Often</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/zobie/~4/70PjdZsG4-Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.zobie.com/2010/02/source-code-management/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.zobie.com/2010/02/source-code-management/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=source-code-management</feedburner:origLink></item>
		<item>
		<title>Trying to Close a Lingo Account: My Horror Story</title>
		<link>http://feedproxy.google.com/~r/zobie/~3/yZjUVVsM8Ec/</link>
		<comments>http://blog.zobie.com/2009/12/trying-to-close-a-lingo-account/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 19:37:56 +0000</pubDate>
		<dc:creator>zobie</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[incompetence]]></category>

		<guid isPermaLink="false">http://blog.zobie.com/?p=191</guid>
		<description><![CDATA[I used Lingo for a few years without any problem. I never had any reason to contact their customer support until deciding to cancel my account. Canceling my Lingo account was an absolute nightmare. In the end I spent nearly three hours on the phone before I was finally able to speak to someone who [...]]]></description>
			<content:encoded><![CDATA[<p>I used <a href="http://www.lingo.com/">Lingo</a> for a few years without any problem. I never had any reason to contact their customer support until deciding to cancel my account.</p>
<p>Canceling my Lingo account was an absolute nightmare. In the end I spent nearly three hours on the phone before I was finally able to speak to someone who would process the cancellation.</p>
<p>I never spoke to anyone in their Cancellation Department. Honestly, I'm not sure that that department has any employees. In the end it came down to a war of attrition. I had to wait on hold and complain vigorously enough that they finally decided I was serious about wanting to close the account.</p>
<p>Many companies understand that when a customer calls to cancel, they have an opportunity to save that account. After this dreadful experience not only will I refuse to do business with Lingo again, I'll tell everyone I can to avoid them like the plague.</p>
<p>Below is the log that I kept while trying to cancel my account. I've done a little grammatical cleanup from the notes I originally posted during the phone calls.</p>
<hr />
<p>Several weeks ago I made the decision to close my voip account with <a href="http://www.lingo.com/">Lingo</a> in favor of just using my cell phone. I got a new cell phone for my house and transferred my phone number from Lingo to my cell provider. Now I'm trying to cancel my Lingo service... what a joke. As I started writing this I'd been on hold for exactly one hour.</p>
<p><strong>Friday, December 17th:</strong></p>
<ul>
<li><strong>11:30am</strong> - I first called Lingo. I listen to the recorded message and navigate their menu system to talk to Customer Service.</li>
<li><strong>11:46am</strong> - I waited on hold for 16 minutes before talking to a guy who took my account information and put me back on hold.</li>
<li><strong>11:47a</strong> - He's going to transfer me to the cancellation department.</li>
<li><strong>11:52a</strong> - The guy asked for a callback number. The cancellation department is too busy to take my call. From the way that he is talking about it it sounds like the cancellation department is one person who is out to lunch. He said that someone would try to call me back in the next 48 hours. I told him that this was unacceptable because I don't want to continue paying for service that I'm not using. He's going to try again so I go back on hold.</li>
<li><strong>12:02p</strong> - He still can't transfer me because no one is available to take the call. I ask to speak to a manager and am placed back on hold.</li>
<li><strong>12:03p</strong> - The manager is too busy to speak to me. I tell guy that I'll hold for the manager.</li>
<li><strong>12:06p</strong> - I finally get to speak to a supervisor. I express frustration about this situation and ask what she can do to help. She is very nice but absolutely no help at all. She says that there is nothing she can do except continue trying to transfer my call. Because I have no other options, I agree.</li>
<li><strong>12:37p</strong> - I've been on this call for over an hour now and am still on hold. I should have used a landline for this call. This is chewing through my cell minutes.</li>
<li><strong>12:50p</strong> - Lingo wins this round. It's easy for me to sit on hold while I'm working at my desk but I have to go to a meeting. I am <em>extremely</em> frustrated!</li>
</ul>
<p><strong>December 22nd:</strong> my second attempt</p>
<ul>
<li><strong>9:09am</strong> - Called Lingo back. Went through their menu system and am on hold again.</li>
<li><strong>9:20a</strong> - got a recorded message saying that they are too busy to take my call and asking me to please call back during normal business hours. According to their website, they've been open for over two hours already today (Mon - Fri: 9AM - 9PM EST)... this is normal business hours!</li>
<li><strong>9:21a</strong> - I call back and am again placed on hold.</li>
<li><strong>9:33a</strong> - I got the recorded message again and was disconnected. I called back immediately. I really wish that their hold music had more than just one song being played over and over and over...</li>
</ul>
<p>Gotta love their "<a href="https://www.lingo.com/resources/jsp/terms_conditions.jsp" target="_blank">Terms and Conditions</a>":</p>
<blockquote><p>Cancellations will only be accepted via phone through Lingo’s Account Management Department at the toll-free number listed on the first page of your invoice, and will be effective upon the date that you cancel with a Lingo Account Management Representative. You will be given a cancellation confirmation number by the representative. Service cancellation requests by mail, e-mail, fax, equipment return, or any other form of non-telephonic communication requests will not be accepted.</p></blockquote>
<p>We only accept cancellations by phone. Also, we don't answer calls to that phone.</p>
<ul>
<li><strong>9:44a</strong> - Disconnected again. Called back again. I guess that their system is programmed to hang up on me every 11 minutes.</li>
<li><strong>9:55a</strong> - Disconnected again. Called back again. I guess that it's more likely that the system hangs up on me after being on hold for 10 minutes. The extra minute is probably just the time it takes me to call and get back in the queue.</li>
<li><strong>10:06a</strong> - Disconnected again. Called back again. At least I was smart enough to route the calls through Google Voice this time so I'm not using my cell's minutes.</li>
<li><strong>10:17a</strong> - Disconnected again. Calling back again. I think I'll try connecting to the billing department again (that's who I spoke with last Friday). They still put me on hold for the Cancellations Department but at least I didn't have to keep calling back.</li>
<li><strong>10:26a</strong> - Spoke to a Customer Support Representative. She verified my information and then put me back on hold. She gave me instructions on how to call back "just in case we're disconnected." What a joke.</li>
<li><strong>10:32a</strong> - a manager is on the line. She said that since I've been on hold for so long and since I had spoken to a manager on Friday that she would cancel the account for me. On Friday I was told that the manager I spoke with didn't have the authority to cancel an account. I don't understand her logic for finally accepting the cancellation but I really don't care. Just close this account! I asked her for a confirmation number and was put back on hold while she processes the cancellation.</li>
<li><strong>10:36a</strong> - The manager processed the account and I have just sent me an email with the cancellation confirmation. This process has been an absolute joke!</li>
</ul>
<p>The moral of this story: Don't signup for service with Lingo. It's not worth it.</p>
<img src="http://feeds.feedburner.com/~r/zobie/~4/yZjUVVsM8Ec" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.zobie.com/2009/12/trying-to-close-a-lingo-account/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.zobie.com/2009/12/trying-to-close-a-lingo-account/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=trying-to-close-a-lingo-account</feedburner:origLink></item>
		<item>
		<title>Installing RMagick on Ubuntu 9.04 (Jaunty)</title>
		<link>http://feedproxy.google.com/~r/zobie/~3/LX89rBuSDVE/</link>
		<comments>http://blog.zobie.com/2009/07/installing-rmagick-on-ubuntu-904-jaunty/#comments</comments>
		<pubDate>Sat, 18 Jul 2009 06:41:36 +0000</pubDate>
		<dc:creator>zobie</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.zobie.com/?p=183</guid>
		<description><![CDATA[Installing the RMagick gem can be a huge headache. Reading the HOWTO on the RMagick site is enough to make anyone nervous. Thankfully the process is much easier on ubuntu however; you only need three commands. DISCLAIMER: I've only tested this on Ubuntu 9.04 (Jaunty) server. $ sudo aptitude install -y imagemagick $ sudo aptitude [...]]]></description>
			<content:encoded><![CDATA[<p>Installing the RMagick gem can be a huge headache. Reading the <a href="http://rmagick.rubyforge.org/install2-linux.html">HOWTO on the RMagick site</a> is enough to make anyone nervous. Thankfully the process is much easier on ubuntu however; you only need three commands.</p>
<p>DISCLAIMER: I've only tested this on Ubuntu 9.04 (Jaunty) server.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">aptitude</span> <span style="color: #c20cb9; font-weight: bold;">install</span> <span style="color: #660033;">-y</span> imagemagick
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">aptitude</span> <span style="color: #c20cb9; font-weight: bold;">install</span> <span style="color: #660033;">-y</span> libmagick9-dev
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> rmagick</pre></div></div>

<p>And you're done! You can verify the installation using this irb command, taken from the RMagick HOWTO:</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;">$ sudo irb <span style="color:#006600; font-weight:bold;">-</span>rubygems <span style="color:#006600; font-weight:bold;">-</span>r RMagick
irb<span style="color:#006600; font-weight:bold;">&#40;</span>main<span style="color:#006600; font-weight:bold;">&#41;</span>:001:<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#6666ff; font-weight:bold;">Magick::Long_version</span>
This is RMagick 2.10.0 <span style="color:#006600; font-weight:bold;">&#40;</span>$Date: <span style="color:#006666;">2009</span><span style="color:#006600; font-weight:bold;">/</span>06<span style="color:#006600; font-weight:bold;">/</span><span style="color:#006666;">19</span> <span style="color:#006666;">22</span>:07:05 $<span style="color:#006600; font-weight:bold;">&#41;</span> Copyright <span style="color:#006600; font-weight:bold;">&#40;</span>C<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006666;">2009</span> by Timothy P. <span style="color:#9900CC;">Hunter</span>
Built with ImageMagick 6.4.5 <span style="color:#006666;">2009</span><span style="color:#006600; font-weight:bold;">-</span>06<span style="color:#006600; font-weight:bold;">-</span>04 Q16 OpenMP http:<span style="color:#006600; font-weight:bold;">//</span>www.<span style="color:#9900CC;">imagemagick</span>.<span style="color:#9900CC;">org</span>
Built <span style="color:#9966CC; font-weight:bold;">for</span> ruby 1.8.7
Web page: http:<span style="color:#006600; font-weight:bold;">//</span>rmagick.<span style="color:#9900CC;">rubyforge</span>.<span style="color:#9900CC;">org</span>
Email: rmagick@rubyforge.<span style="color:#9900CC;">org</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">nil</span></pre></div></div>

<img src="http://feeds.feedburner.com/~r/zobie/~4/LX89rBuSDVE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.zobie.com/2009/07/installing-rmagick-on-ubuntu-904-jaunty/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.zobie.com/2009/07/installing-rmagick-on-ubuntu-904-jaunty/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=installing-rmagick-on-ubuntu-904-jaunty</feedburner:origLink></item>
		<item>
		<title>Installing git on Ubuntu 9.04 (Jaunty)</title>
		<link>http://feedproxy.google.com/~r/zobie/~3/D3zgvMhSA_M/</link>
		<comments>http://blog.zobie.com/2009/07/installing-git-on-ubuntu-904-jaunty/#comments</comments>
		<pubDate>Wed, 15 Jul 2009 00:06:47 +0000</pubDate>
		<dc:creator>zobie</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blog.zobie.com/?p=179</guid>
		<description><![CDATA[Last night I was working on a new ubuntu 9.04 server on ec2 (it was ami-0d729464 from http://alestic.com if you're interested). Installing git via aptitude would have given me an older version so here's what I did. $ sudo apt-get build-dep git-core git-doc libssl-dev $ wget http://kernel.org/pub/software/scm/git/git-1.6.3.3.tar.gz $ tar -xzf git-1.6.3.3.tar.gz $ cd git-1.6.3.3/ $ [...]]]></description>
			<content:encoded><![CDATA[<p>Last night I was working on a new ubuntu 9.04 server on ec2 (it was ami-0d729464 from http://alestic.com if you're interested). Installing git via aptitude would have given me an older version so here's what I did.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> build-dep git-core git-doc libssl-dev
$ <span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>kernel.org<span style="color: #000000; font-weight: bold;">/</span>pub<span style="color: #000000; font-weight: bold;">/</span>software<span style="color: #000000; font-weight: bold;">/</span>scm<span style="color: #000000; font-weight: bold;">/</span>git<span style="color: #000000; font-weight: bold;">/</span>git-1.6.3.3.tar.gz
$ <span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xzf</span> git-1.6.3.3.tar.gz
$ <span style="color: #7a0874; font-weight: bold;">cd</span> git-1.6.3.3<span style="color: #000000; font-weight: bold;">/</span>
$ .<span style="color: #000000; font-weight: bold;">/</span>configure
$ <span style="color: #c20cb9; font-weight: bold;">make</span> all doc
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span> install-doc
$ <span style="color: #c20cb9; font-weight: bold;">git</span> <span style="color: #660033;">--version</span>
<span style="color: #c20cb9; font-weight: bold;">git</span> version 1.6.3.3</pre></div></div>

<img src="http://feeds.feedburner.com/~r/zobie/~4/D3zgvMhSA_M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.zobie.com/2009/07/installing-git-on-ubuntu-904-jaunty/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<feedburner:origLink>http://blog.zobie.com/2009/07/installing-git-on-ubuntu-904-jaunty/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=installing-git-on-ubuntu-904-jaunty</feedburner:origLink></item>
		<item>
		<title>Changing the default shell on iPhone</title>
		<link>http://feedproxy.google.com/~r/zobie/~3/K7Aq8lzakuU/</link>
		<comments>http://blog.zobie.com/2009/05/changing-the-default-shell-on-iphone/#comments</comments>
		<pubDate>Tue, 12 May 2009 05:59:57 +0000</pubDate>
		<dc:creator>zobie</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://blog.zobie.com/?p=172</guid>
		<description><![CDATA[I wanted to change the default shell on my iPhone. Unfortunately chsh wasn't available. &#91;10:40&#93;&#91;root@iPhone:~&#93;$ chsh -bash: chsh: command not found I next thought to modify /etc/passwd but, according to the file's header, that's not going to help. &#91;10:41&#93;&#91;root@iPhone:~&#93;$ cat /etc/passwd # # 4.3BSD-compatable User Database # # Note that this file is not consulted [...]]]></description>
			<content:encoded><![CDATA[<p>I wanted to change the default shell on my iPhone. Unfortunately chsh wasn't available.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">10</span>:<span style="color: #000000;">40</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>root<span style="color: #000000; font-weight: bold;">@</span>iPhone:~<span style="color: #7a0874; font-weight: bold;">&#93;</span>$ <span style="color: #c20cb9; font-weight: bold;">chsh</span>
-bash: <span style="color: #c20cb9; font-weight: bold;">chsh</span>: <span style="color: #7a0874; font-weight: bold;">command</span> not found</pre></div></div>

<p>I next thought to modify <code>/etc/passwd</code> but, according to the file's header, that's not going to help.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">10</span>:<span style="color: #000000;">41</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>root<span style="color: #000000; font-weight: bold;">@</span>iPhone:~<span style="color: #7a0874; font-weight: bold;">&#93;</span>$ <span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">passwd</span> 
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># 4.3BSD-compatable User Database</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Note that this file is not consulted for login.</span>
<span style="color: #666666; font-style: italic;"># It only exisits for compatability with 4.3BSD utilities.</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># This file is automatically re-written by various system utilities.</span>
<span style="color: #666666; font-style: italic;"># Do not edit this file.  Changes will be lost.</span>
<span style="color: #666666; font-style: italic;">#</span>
nobody:<span style="color: #000000; font-weight: bold;">*</span>:-<span style="color: #000000;">2</span>:-<span style="color: #000000;">2</span>:Unprivileged User:<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>empty:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">false</span>
root:<span style="color: #000000; font-weight: bold;">*</span>:<span style="color: #000000;">0</span>:<span style="color: #000000;">0</span>:System Administrator:<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>root:<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">sh</span>
mobile:<span style="color: #000000; font-weight: bold;">*</span>:<span style="color: #000000;">501</span>:<span style="color: #000000;">501</span>:Mobile User:<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>mobile:<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">sh</span>
daemon:<span style="color: #000000; font-weight: bold;">*</span>:<span style="color: #000000;">1</span>:<span style="color: #000000;">1</span>:System Services:<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>root:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">false</span>
_securityd:<span style="color: #000000; font-weight: bold;">*</span>:<span style="color: #000000;">64</span>:<span style="color: #000000;">64</span>:securityd:<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>empty:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">false</span>
_mdnsresponder:<span style="color: #000000; font-weight: bold;">*</span>:<span style="color: #000000;">65</span>:<span style="color: #000000;">65</span>:mDNSResponder:<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>empty:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">false</span>
_sshd:<span style="color: #000000; font-weight: bold;">*</span>:<span style="color: #000000;">75</span>:<span style="color: #000000;">75</span>:sshd Privilege separation:<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>empty:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">false</span>
_unknown:<span style="color: #000000; font-weight: bold;">*</span>:<span style="color: #000000;">99</span>:<span style="color: #000000;">99</span>:Unknown User:<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>empty:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">false</span></pre></div></div>

<p>Finally I found <code>/etc/master.passwd</code>. I just modified root and mobile to use <code>/bin/bash</code> instead of <code>/bin/sh</code> and on my next login I was using bash!</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">10</span>:<span style="color: #000000;">41</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>root<span style="color: #000000; font-weight: bold;">@</span>iPhone:~<span style="color: #7a0874; font-weight: bold;">&#93;</span>$ <span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>master.passwd 
<span style="color: #666666; font-style: italic;">##</span>
<span style="color: #666666; font-style: italic;"># User Database</span>
<span style="color: #666666; font-style: italic;"># </span>
<span style="color: #666666; font-style: italic;"># This file is the authoritative user database.</span>
<span style="color: #666666; font-style: italic;">##</span>
nobody:<span style="color: #000000; font-weight: bold;">*</span>:-<span style="color: #000000;">2</span>:-<span style="color: #000000;">2</span>::<span style="color: #000000;">0</span>:<span style="color: #000000;">0</span>:Unprivileged User:<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>empty:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">false</span>
root:5IS3K.2i<span style="color: #000000; font-weight: bold;">/</span>ciLw:<span style="color: #000000;">0</span>:<span style="color: #000000;">0</span>::<span style="color: #000000;">0</span>:<span style="color: #000000;">0</span>:System Administrator:<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>root:<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">bash</span>
mobile:NhbBgPU3IOnek:<span style="color: #000000;">501</span>:<span style="color: #000000;">501</span>::<span style="color: #000000;">0</span>:<span style="color: #000000;">0</span>:Mobile User:<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>mobile:<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">bash</span>
daemon:<span style="color: #000000; font-weight: bold;">*</span>:<span style="color: #000000;">1</span>:<span style="color: #000000;">1</span>::<span style="color: #000000;">0</span>:<span style="color: #000000;">0</span>:System Services:<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>root:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">false</span>
_securityd:<span style="color: #000000; font-weight: bold;">*</span>:<span style="color: #000000;">64</span>:<span style="color: #000000;">64</span>::<span style="color: #000000;">0</span>:<span style="color: #000000;">0</span>:securityd:<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>empty:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">false</span>
_mdnsresponder:<span style="color: #000000; font-weight: bold;">*</span>:<span style="color: #000000;">65</span>:<span style="color: #000000;">65</span>::<span style="color: #000000;">0</span>:<span style="color: #000000;">0</span>:mDNSResponder:<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>empty:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">false</span>
_sshd:<span style="color: #000000; font-weight: bold;">*</span>:<span style="color: #000000;">75</span>:<span style="color: #000000;">75</span>::<span style="color: #000000;">0</span>:<span style="color: #000000;">0</span>:sshd Privilege separation:<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>empty:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">false</span>
_unknown:<span style="color: #000000; font-weight: bold;">*</span>:<span style="color: #000000;">99</span>:<span style="color: #000000;">99</span>::<span style="color: #000000;">0</span>:<span style="color: #000000;">0</span>:Unknown User:<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>empty:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">false</span></pre></div></div>

<img src="http://feeds.feedburner.com/~r/zobie/~4/K7Aq8lzakuU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.zobie.com/2009/05/changing-the-default-shell-on-iphone/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.zobie.com/2009/05/changing-the-default-shell-on-iphone/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=changing-the-default-shell-on-iphone</feedburner:origLink></item>
		<item>
		<title>Using P4Merge with Team Foundation Server</title>
		<link>http://feedproxy.google.com/~r/zobie/~3/ci-zsJDlUPA/</link>
		<comments>http://blog.zobie.com/2009/04/using-p4merge-with-team-foundation-server/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 10:04:49 +0000</pubDate>
		<dc:creator>zobie</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tfs]]></category>

		<guid isPermaLink="false">http://blog.zobie.com/?p=157</guid>
		<description><![CDATA[I've found that the best way to deal with merging is to avoid it completely! Unfortunately that is rarely realistic. So, assuming you don't want to take any radical measures to completely avoid merging in TFS, you should at least use the best tools available. My favorite merge tool is the freely available (and cross-platform) [...]]]></description>
			<content:encoded><![CDATA[<p>I've found that the best way to deal with merging is to avoid it completely! Unfortunately that is rarely realistic. So, assuming you don't want to take <a href="http://blog.zobie.com/2009/04/using-git-to-avoid-problems-with-tfs">any radical measures</a> to completely avoid merging in TFS, you should at least use the best tools available. My favorite merge tool is the freely available (and cross-platform) <a href="http://www.perforce.com/perforce/downloads/platform.html">P4Merge</a>.</p>
<p>Getting TFS to use P4Merge isn't difficult but neither is it intuitive. For a merge operation P4Merge expects four files to exist:</p>
<ol>
<li>the original, base file</li>
<li>file with conflicting change #1</li>
<li>file with conflicting change #2</li>
<li>final, merged file</li>
</ol>
<p>Unfortunately TFS doesn't create the merged file (#4) until after the merge tool is invoked. A simple batch script will solve the problem though. Save this as <code>p4merge.bat</code>.</p>

<div class="wp_syntax"><div class="code"><pre class="winbatch" style="font-family:monospace;"><span style="color: #66cc66;">@</span>ECHO <span style="color: #0080FF; font-weight: bold;">OFF</span>
COPY <span style="color: #66cc66;">/</span>Y NUL <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">%</span>4<span style="color: #ff0000;">&quot;&quot;</span>
START <span style="color: #66cc66;">/</span><span style="color: #0080FF; font-weight: bold;">WAIT</span> <span style="color: #66cc66;">/</span>D <span style="color: #ff0000;">&quot;C:\Program Files\Perforce\&quot;</span> p4merge.exe <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">%</span>1<span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">%</span>2<span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">%</span>3<span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">%</span>4<span style="color: #ff0000;">&quot;&quot;</span></pre></div></div>

<p>This script will create the merge file and invoke p4merge.exe.</p>
<p>Now you can configure TFS to use P4Merge by running this command from a Visual Studio command prompt: <code>tf diff /configure</code></p>
<p><a title="Visual Studio Command Prompt" href="http://www.flickr.com/photos/zobrist/3464483878/"><img src="http://farm4.static.flickr.com/3520/3464483878_e82493ea2e.jpg" alt="Visual Studio Command Prompt" width="500" height="253" /></a></p>
<p>That will bring up a dialog:</p>
<p><a title="Configure User Tools" href="http://www.flickr.com/photos/zobrist/3464483882/"><img src="http://farm4.static.flickr.com/3553/3464483882_f839fe46e4_o.png" alt="Configure User Tools" width="402" height="247" /></a></p>
<p>If an entry already exists for the Merge operation you can add it. Otherwise just modify the existing entry to point to the batch file we created:</p>
<p><a title="Configure Tool" href="http://www.flickr.com/photos/zobrist/3464483884/"><img src="http://farm4.static.flickr.com/3494/3464483884_c1dea28349_o.png" alt="Configure Tool" width="355" height="196" /></a></p>
<p>Note that you must set the command to be your batch file, not the executable.</p>
<p>And that's it! Next time TFS launches a merge tool, it will use P4Merge.</p>
<img src="http://feeds.feedburner.com/~r/zobie/~4/ci-zsJDlUPA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.zobie.com/2009/04/using-p4merge-with-team-foundation-server/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.zobie.com/2009/04/using-p4merge-with-team-foundation-server/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=using-p4merge-with-team-foundation-server</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 1.882 seconds. --><!-- Cached page generated by WP-Super-Cache on 2012-01-26 13:11:04 --><!-- Compression = gzip -->

