<?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/" version="2.0">

<channel>
	<title>zobie's blog</title>
	
	<link>http://blog.zobie.com</link>
	<description>I write software, I like music and I'm mildly(?) OCD.</description>
	<lastBuildDate>Mon, 21 Dec 2009 19:02:54 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/zobie" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="zobie" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Trying to Close a Lingo Account: My Horror Story</title>
		<link>http://blog.zobie.com/2009/12/trying-to-close-a-lingo-account/</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 would [...]]]></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&#8217;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&#8217;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&#8217;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&#8217;m trying to cancel my Lingo service&#8230; what a joke. As I started writing this I&#8217;d been on hold for exactly one hour.</p>
<p><strong>Friday, December 17th:</strong></p>
<ul>
<li><strong>11:30am</strong> &#8211; 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> &#8211; 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> &#8211; He&#8217;s going to transfer me to the cancellation department.</li>
<li><strong>11:52a</strong> &#8211; 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&#8217;t want to continue paying for service that I&#8217;m not using. He&#8217;s going to try again so I go back on hold.</li>
<li><strong>12:02p</strong> &#8211; He still can&#8217;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> &#8211; The manager is too busy to speak to me. I tell guy that I&#8217;ll hold for the manager.</li>
<li><strong>12:06p</strong> &#8211; 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> &#8211; I&#8217;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> &#8211; Lingo wins this round. It&#8217;s easy for me to sit on hold while I&#8217;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> &#8211; Called Lingo back. Went through their menu system and am on hold again.</li>
<li><strong>9:20a</strong> &#8211; 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&#8217;ve been open for over two hours already today (Mon &#8211; Fri: 9AM &#8211; 9PM EST)&#8230; this is normal business hours!</li>
<li><strong>9:21a</strong> &#8211; I call back and am again placed on hold.</li>
<li><strong>9:33a</strong> &#8211; 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&#8230;</li>
</ul>
<p>Gotta love their &#8220;<a href="https://www.lingo.com/resources/jsp/terms_conditions.jsp" target="_blank">Terms and Conditions</a>&#8220;:</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&#8217;t answer calls to that phone.</p>
<ul>
<li><strong>9:44a</strong> &#8211; 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> &#8211; Disconnected again. Called back again. I guess that it&#8217;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> &#8211; Disconnected again. Called back again. At least I was smart enough to route the calls through Google Voice this time so I&#8217;m not using my cell&#8217;s minutes.</li>
<li><strong>10:17a</strong> &#8211; Disconnected again. Calling back again. I think I&#8217;ll try connecting to the billing department again (that&#8217;s who I spoke with last Friday). They still put me on hold for the Cancellations Department but at least I didn&#8217;t have to keep calling back.</li>
<li><strong>10:26a</strong> &#8211; 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 &#8220;just in case we&#8217;re disconnected.&#8221; What a joke.</li>
<li><strong>10:32a</strong> &#8211; a manager is on the line. She said that since I&#8217;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&#8217;t have the authority to cancel an account. I don&#8217;t understand her logic for finally accepting the cancellation but I really don&#8217;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> &#8211; 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&#8217;t signup for service with Lingo. It&#8217;s not worth it.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zobie.com/2009/12/trying-to-close-a-lingo-account/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Installing RMagick on Ubuntu 9.04 (Jaunty)</title>
		<link>http://blog.zobie.com/2009/07/installing-rmagick-on-ubuntu-904-jaunty/</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&#8217;ve only tested this on Ubuntu 9.04 (Jaunty) server.

$ sudo aptitude install -y imagemagick
$ sudo aptitude install -y libmagick9-dev
$ [...]]]></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&#8217;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&#8217;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>

]]></content:encoded>
			<wfw:commentRss>http://blog.zobie.com/2009/07/installing-rmagick-on-ubuntu-904-jaunty/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Installing git on Ubuntu 9.04 (Jaunty)</title>
		<link>http://blog.zobie.com/2009/07/installing-git-on-ubuntu-904-jaunty/</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&#8217;re interested). Installing git via aptitude would have given me an older version so here&#8217;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/
$ ./configure
$ make all doc
$ sudo [...]]]></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&#8217;re interested). Installing git via aptitude would have given me an older version so here&#8217;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
$ git <span style="color: #660033;">--version</span>
git version 1.6.3.3</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.zobie.com/2009/07/installing-git-on-ubuntu-904-jaunty/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Changing the default shell on iPhone</title>
		<link>http://blog.zobie.com/2009/05/changing-the-default-shell-on-iphone/</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&#8217;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&#8217;s header, that&#8217;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 for login.
# It only exisits for compatability [...]]]></description>
			<content:encoded><![CDATA[<p>I wanted to change the default shell on my iPhone. Unfortunately chsh wasn&#8217;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&#8217;s header, that&#8217;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>

]]></content:encoded>
			<wfw:commentRss>http://blog.zobie.com/2009/05/changing-the-default-shell-on-iphone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using P4Merge with Team Foundation Server</title>
		<link>http://blog.zobie.com/2009/04/using-p4merge-with-team-foundation-server/</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&#8217;ve found that the best way to deal with merging is to avoid it completely! Unfortunately that is rarely realistic. So, assuming you don&#8217;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&#8217;ve found that the best way to deal with merging is to avoid it completely! Unfortunately that is rarely realistic. So, assuming you don&#8217;t want to take <a href="/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&#8217;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&#8217;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&#8217;s it! Next time TFS launches a merge tool, it will use P4Merge.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zobie.com/2009/04/using-p4merge-with-team-foundation-server/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Using git to avoid problems with TFS</title>
		<link>http://blog.zobie.com/2009/04/using-git-to-avoid-problems-with-tfs/</link>
		<comments>http://blog.zobie.com/2009/04/using-git-to-avoid-problems-with-tfs/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 05:29:24 +0000</pubDate>
		<dc:creator>zobie</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tfs]]></category>

		<guid isPermaLink="false">http://blog.zobie.com/?p=148</guid>
		<description><![CDATA[For the past few months I&#8217;ve been using Team Foundation Server (TFS) at work. I&#8217;m certainly not a TFS expert; I probably don&#8217;t even quality as a power-user. But I&#8217;ve used TFS enough to have found a handful of things that I like about it. Revision control is not among those things.
As a software version [...]]]></description>
			<content:encoded><![CDATA[<p>For the past few months I&#8217;ve been using <a href="http://en.wikipedia.org/wiki/Team_Foundation_Server">Team Foundation Server (TFS)</a> at work. I&#8217;m certainly not a TFS expert; I probably don&#8217;t even quality as a power-user. But I&#8217;ve used TFS enough to have found a handful of things that I like about it. Revision control is <strong>not</strong> among those things.</p>
<p>As a software version control system, I dislike TFS intensely.</p>
<p>In the short time I&#8217;ve been using TFS I&#8217;ve had several problems with code that was merged incorrectly. I&#8217;ve seen problems where TFS silently allowed older versions of code to overwrite newer versions. I could probably fill an entire blog post airing grievances with TFS but I thought it would be more interesting to describe how I use git on top of TFS to solve some of these problems.</p>
<p>First, to use git to track a TFS repository it is really important that all your source code be on a Fat32 partition. TFS locks files and NTFS respects that lock. Fat32 will track the lock but doesn&#8217;t enforce it. This allows git to modify files (change to different versions of files) without necessarily having those files checked out in TFS.</p>
<p>Using TFS I checked out all my code into <code>s:\src</code>. I then created a new git repository in that same directory and added everything into the git repository.</p>
<p>For working I maintain at least two branches. My <code>master</code> branch always matches TFS. When I need the latest code from TFS I switch to the git <code>master</code> branch, pull from TFS then commit all changes into git. My <code>working</code> branch contains my current code changes. I also have one branch <code>dev</code> that contains a single commit consisting of all my debug code that should never be checked in to TFS.</p>
<p>When I&#8217;m ready to start coding I get the latest code from TFS and commit those changes into git&#8217;s master branch. I create a new git branch, <code>working</code>. I cherry pick my development code from <code>dev</code> into <code>working</code>. Then I do all my coding on that branch. When I need to get code from TFS I can swtich to <code>master</code>, update from TFS, check that code in to git then either merge or rebase the changes back into <code>working</code>.</p>
<p>Once all of my changes in <code>working</code> are complete I need to merge the changes back into <code>master</code> so that I can commit them to TFS. I can&#8217;t do a straight merge becuase my cherry-picked dev code would be included. So I have two ways of doing this:</p>
<ol>
<li>cherry-pick changes from <code>working</code>, applying them to <code>master</code></li>
<li>backout the development code (using <code>git rebase -i</code>) then merge changes back into <code>master</code></li>
</ol>
<p>After going through one of these two options I end up back on <code>master</code> with all of my code changes. I then commit the changes to TFS. Once that is done I delete <code>working</code> and recreate it from <code>master</code> next time I need it.</p>
<p>Working like this has been great for me. If there are conflicts when merging my code changes, git takes care of it. This way I can almost always avoid having to let TFS merge anything.</p>
<p>This is my general way of working but you can easily see how to apply these same principles when you want to work on multiple different changes using multiple different branches in git.</p>
<p>One thing to note: When you&#8217;re working like this git&#8217;s history isn&#8217;t great. This isn&#8217;t like git-svn where you get a seperate git revision for every svn revision. For me, using git with TFS isn&#8217;t about being able to track my changes over time. I just want to make sure that my changes aren&#8217;t lost and I don&#8217;t want to clobber anyone else&#8217;s changes.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zobie.com/2009/04/using-git-to-avoid-problems-with-tfs/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Strange Crash in OS X: securityd</title>
		<link>http://blog.zobie.com/2009/03/strange-crash-in-os-x-securityd/</link>
		<comments>http://blog.zobie.com/2009/03/strange-crash-in-os-x-securityd/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 05:52:32 +0000</pubDate>
		<dc:creator>zobie</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[crash]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[mac]]></category>

		<guid isPermaLink="false">http://blog.zobie.com/?p=135</guid>
		<description><![CDATA[A few days ago my Mac started having problems. I would be in the middle of some task when it would suddenly refuse to launch any new applications. Whenever I tried to launch any app, it would bounce a few times in the dock then exit.
As far as I could tell, any apps that were [...]]]></description>
			<content:encoded><![CDATA[<p>A few days ago my Mac started having problems. I would be in the middle of some task when it would suddenly refuse to launch any new applications. Whenever I tried to launch any app, it would bounce a few times in the dock then exit.</p>
<p>As far as I could tell, any apps that were running when I got into this problem state would continue working fine. The OS would never completely freeze but I noticed that my CPU started being monopolized by CrashReporter. I tried killing that process but it would just immediately relaunch and peg the CPU again. I looked inside <code>/Library/Logs/CrashReporter/</code> and saw that a new crash log was being created about every three seconds. The crash logs were for many different applications but none of the stack traces was useful. I had trouble spotting a pattern to what might trigger the problem.</p>
<p>Once my box was in the bad state I tried to ssh in to see if I could gather any useful information. SSH would prompt me for a password but it always denied access saying that I had entered an invalid password.</p>
<p>The only way out of this state was to restart the machine. When I tried to reboot, OS X would successfully log out but then get stuck on a blue screen. I would see the indeterminate NSProgressIndicator for a few seconds then it would disappear for a few seconds then come back again. I was forced to power cycle the machine.</p>
<p>I finally noticed that when this problem occurred, the first crash log was always for securityd. <code>/Library/Logs/CrashReporter/securityd_2009-03-23-204700_macpro.crash</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Process:         securityd <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">22</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
Path:            <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>securityd
Identifier:      securityd
Version:         ??? <span style="color: #7a0874; font-weight: bold;">&#40;</span>???<span style="color: #7a0874; font-weight: bold;">&#41;</span>
Code Type:       X86 <span style="color: #7a0874; font-weight: bold;">&#40;</span>Native<span style="color: #7a0874; font-weight: bold;">&#41;</span>
Parent Process:  launchd <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
&nbsp;
Date<span style="color: #000000; font-weight: bold;">/</span>Time:       <span style="color: #000000;">2009</span>-03-<span style="color: #000000;">23</span> <span style="color: #000000;">20</span>:<span style="color: #000000;">47</span>:<span style="color: #000000;">00.211</span> <span style="color: #660033;">-0600</span>
OS Version:      Mac OS X 10.5.6 <span style="color: #7a0874; font-weight: bold;">&#40;</span>9G55<span style="color: #7a0874; font-weight: bold;">&#41;</span>
Report Version:  <span style="color: #000000;">6</span>
&nbsp;
Exception Type:  EXC_BAD_ACCESS <span style="color: #7a0874; font-weight: bold;">&#40;</span>SIGSEGV<span style="color: #7a0874; font-weight: bold;">&#41;</span>
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000001000000
Crashed Thread:  <span style="color: #000000;">0</span></pre></div></div>

<p>This information finally led me to the solution.
</p>
<p>The problem was that securityd would crash then any app that needed to authenticate was unable to do so. One newsgroup noted that the problem could be temporarily solved by relaunching the process:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ launchctl load <span style="color: #000000; font-weight: bold;">/</span>System<span style="color: #000000; font-weight: bold;">/</span>Library<span style="color: #000000; font-weight: bold;">/</span>LaunchDaemons<span style="color: #000000; font-weight: bold;">/</span>com.apple.securityd.plist</pre></div></div>

</p>
<p>After a bit more searching I found a permanent answer in a mailing list archive: <a href="http://lists.apple.com/archives/apple-cdsa/2008/Jul/msg00035.html" target="_blank">Keychain access crashing on SecKeychainFindGenericPassword</a>. The solution was incredibly simple (and completely unintuitive). I had to remove the file <code>/var/db/CodeEquivalenceDatabase</code> and reboot. That&#8217;s it!</p>
<p><a href="http://lists.apple.com/archives/apple-cdsa/2008/Jul/msg00035.html" target="_blank">The thread</a> offers more details but basically, &#8220;that file [<code>/var/db/CodeEquivalenceDatabase</code>] has gotten corrupted and runs securityd into an endless memory-eating loop that (usually) ends up running your system out of memory and into the ground.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zobie.com/2009/03/strange-crash-in-os-x-securityd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thoughts on Doing Contract Work as a Software Developer</title>
		<link>http://blog.zobie.com/2009/03/thoughts-on-doing-contract-work-as-a-software-developer/</link>
		<comments>http://blog.zobie.com/2009/03/thoughts-on-doing-contract-work-as-a-software-developer/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 07:07:21 +0000</pubDate>
		<dc:creator>zobie</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[job search]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[startup]]></category>

		<guid isPermaLink="false">http://blog.zobie.com/?p=131</guid>
		<description><![CDATA[As I was recently looking for new employment I spent quite a bit of time deciding wether I might enjoy doing contract work full-time. I enjoy working on different projects and learning new things but there is one major roadblock to becoming a full-time contract developer. My personality doesn&#8217;t let me write software that is [...]]]></description>
			<content:encoded><![CDATA[<p>As I was recently looking for new employment I spent quite a bit of time deciding wether I might enjoy doing contract work full-time. I enjoy working on different projects and learning new things but there is one major roadblock to becoming a full-time contract developer. My personality doesn&#8217;t let me write software that is anything less than my best.</p>
<p><strong>WARNING:</strong> Gross generalizations and simplifications below. I&#8217;m not trying to offend anyone, just describe my experiences.</p>
<p>Most of the contract work I&#8217;ve done has been for people who are not technically savvy. They come to me with a <em>very</em> vague idea of the software they want. They expect me to tell them how much it will cost before we&#8217;ve discussed specific requirements. When the requirements are incomplete or incorrect they expect that I&#8217;ll just fix it without additional cost to them.</p>
<p>Not all of my contract experience has been negative. In fact, most of it has worked out quite well. Usually both my client and myself are pleased with the software and the cost of building it. But I&#8217;ve had enough negative experiences to be careful when considering a new job.</p>
<p>Part of the problem is that it is nearly impossible for anyone to completely define the scope of a project. There is always some miscommunication or misunderstanding, there is always some unforseen problem.</p>
<blockquote><p>&#8220;You want me to setup a blog for your company? No problem, I can get WordPress setup for you in an hour.&#8221;</p>
<p>&#8220;Wait, I didn&#8217;t realize that by &#8216;blog&#8217; you meant store front application that can accept payments, handle accounts payable, accounts receivable and inventory tracking. That will take slightly more than an hour.&#8221;</p>
</blockquote>
<p>That kind of situation actually isn&#8217;t bothersome to me. As a contractor it is part of my job to understand what you want before making a bid. If a potential client obviously doesn&#8217;t know what they want, I can either decline to bid on that job or I can adjust my bid to account for a large amount of unknown. I don&#8217;t love it, but that type of risk is manageable.</p>
<p>The part of contract work that I dislike is being forced to compromise quality. When I&#8217;m working on a fixed cost contract, it is in my best interest to deliver exactly what is specified, as quickly as possible. As long as my client is reasonably happy with the deliverable, I am going to get paid $20k regardless of whether it took two days, two weeks or two months to create. I don&#8217;t get additional money for clean code. I don&#8217;t get extra for having good test coverage.</p>
<p>When I complete a project more quickly than I had anticipated there is no problem. I can spend time verifying that the code is tight and that everything is working as expected. But if I am running behind schedule, it becomes more difficult to care about testing the code or fixing &#8220;little&#8221; bugs.</p>
<p>There may be a bug in the code where order totals aren&#8217;t calculated correctly, but what are the odds that my client will notice the bug before he signs off on the project? If he does find the problem and I correct it, will he think to test for that same bug in every release?</p>
<p>This is the dilemma that makes contract work difficult for me. If I see a bug in my code, I&#8217;m going to fix it. If I&#8217;m writing a tricky or important calculation (like calculating totals), I&#8217;m going to write a test. I need to have confidence that my code is doing what I expect. I&#8217;ve never shipped any software that didn&#8217;t have a list of known bugs but I have also never shipped any software in which I didn&#8217;t have a high level of confidence that it was working correctly.</p>
<p>For me, doing the bare minimum isn&#8217;t an option for two reasons:</p>
<ol>
<li>Quality is <em>extremely</em> important to me. I can&#8217;t just hack something together that meets the contract requirements. When I write software, I want to deliver my personal best.</li>
<li>Most of the time, the fast/crappy way of implementing something simply doesn&#8217;t occur to me.</li>
</ol>
<p>I understand a company&#8217;s need to understand cost before approving custom softare. But if you want me to do contract work, pay me on an hourly basis. I&#8217;ll give you a projected timeline for project completion.</p>
<p>With an hourly rate, you only pay me for the time I actually spend working. With an hourly rate I know that I won&#8217;t lose money just because I insist on high-quality code. We&#8217;ll both be happier in the long run.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zobie.com/2009/03/thoughts-on-doing-contract-work-as-a-software-developer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Rest of My Development Environment</title>
		<link>http://blog.zobie.com/2009/02/the-rest-of-my-development-environment/</link>
		<comments>http://blog.zobie.com/2009/02/the-rest-of-my-development-environment/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 07:22:01 +0000</pubDate>
		<dc:creator>zobie</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://blog.zobie.com/?p=126</guid>
		<description><![CDATA[As a professional software developer the vast majority of my experience has been working on C#.NET WinForm applications. I started using .NET shortly before the 1.0 framework was released. I can&#8217;t remember if I ever did .NET development under Windows 2000; I generally use Windows XP. If you&#8217;re wondering why I don&#8217;t use Vista I [...]]]></description>
			<content:encoded><![CDATA[<p>As a professional software developer the vast majority of my experience has been working on <a href="http://en.wikipedia.org/wiki/C_Sharp_(programming_language)">C#</a><a href="http://en.wikipedia.org/wiki/.NET_Framework">.NET</a> <a href="http://en.wikipedia.org/wiki/Windows_Forms">WinForm</a> applications. I started using .NET shortly before the 1.0 framework was released. I can&#8217;t remember if I ever did .NET development under Windows 2000; I generally use Windows XP. If you&#8217;re wondering why I don&#8217;t use Vista I have to assume that you&#8217;ve never tried Vista yourself. It&#8217;s not good. I&#8217;m waiting for Windows 7 and hoping for the best.</p>
<p>The tools that I use for C#.NET are pretty standard:</p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Microsoft_Visual_Studio#Visual_Studio_2008">Microsoft Visual Studio 2008</a> (with <a href="http://www.jetbrains.com/resharper/">ReSharper</a>)</li>
<li><a href="http://en.wikipedia.org/wiki/SQL_Server_Management_Studio">SQL Server Management Studio</a></li>
<li><a href="http://memprofiler.com/">.NET Memory Profiler</a> to chase down memory leaks</li>
<li><a href="http://www.automatedqa.com/products/aqtime/">AQtime</a> to help locate performance problems</li>
<li><a href="http://en.wikipedia.org/wiki/Microsoft_Outlook">Outlook</a> and <a href="http://skype.com">Skype</a> to stay connected to coworkers</li>
<li><a href="http://en.wikipedia.org/wiki/Team_Foundation_Server">Team Foundation Server</a> (TFS) for tracking work items and for version control</li>
<li><a href="http://www.cygwin.com/">cygwin</a> to make the command line in Windows behave somewhat normally</li>
</ul>
<p><a href="http://www.flickr.com/photos/21254914@N04/3314417978" title="View 'C# Development' on Flickr.com">
<div style="text-align:center;"><img src="http://farm4.static.flickr.com/3298/3314417978_72c581d0ce.jpg" alt="C# Development" border="0" width="500" height="313" /></div>
<p></a></p>
<p>The one thing that is sorta strange about how I do my C#.NET work is that I do everything on a Mac Pro with XP running in <a href="http://www.vmware.com/products/fusion/">VMWare Fusion</a>. I&#8217;ve had a similar setup at home for a couple of years but I&#8217;ve only had this setup at work since January.</p>
<p>There are definitely a few quirks that I had to get used to, working in Windows running in a VM on OS X. But the benefits of this setup <em>far</em> outweigh any inconvenience. The ability to take snapshots of the entire VM is awesome! If a program screws with my registry and Windows starts acting funky I just roll back to the last snapshot!</p>
<p>The other huge benefit to working in VMWare is memory. Unless you&#8217;re using 64-bit Windows (which can be problematic for many reasons) you are limited to 2 GB of memory. Windows sucks at managing virtual memory so I always try to keep my open applications below that 2 GB limit. Since my Mac has 12 GB of memory, if I need to do something else, I can just boot up a second VM.</p>
<p>Most of the software that I&#8217;ve written for OS X has been personal projects. Nothing fancy, just various tools to scratch some itch. Since getting my iPhone I&#8217;ve been doing more work in <a href="http://en.wikipedia.org/wiki/Objective-C">Objective-C</a> and <a href="http://en.wikipedia.org/wiki/Cocoa_(API)">Cocoa</a>.</p>
<p>Because I&#8217;ve done so much work with managed and interpreted languages, it feels a little weird to work in unmanaged C/ObjC. But it is kinda cool too. Objective-C is a fairly simple language and Cocoa is a very nice framework. There are some things that I don&#8217;t like about Obj-C (not having namespaces and gimpy string manipulation come immediately to mind) but I <em>really</em> appreciate being able to actually use Cocoa controls for UI work. It is almost unthinkable to do GUI development for Windows without buying a set of <a href="http://devexpress.com/">third-party controls</a>.</p>
<p>My must-have software for writing Mac/iPhone applications:</p>
<ul>
<li><a href="http://developer.apple.com/TOOLS/xcode/">XCode</a> and <a href="http://developer.apple.com/tools/interfacebuilder.html">Interface Builder</a></li>
<li><a href="http://www.apple.com/macosx/developertools/instruments.html">Instruments</a></li>
<li><a href="http://www.macports.org/">MacPorts</a> to install all of the software that is missing from the base OS X install</li>
<li><a href="http://www.apple.com/macosx/features/mail.html">Mail.app</a>, <a href="http://www.mrrsoftware.com/MRRSoftware/Syrinx.html">Syrinx</a>, <a href="http://www.adiumx.com/">Adium</a> and <a href="http://colloquy.info/">Colloquy</a> to keep in touch with other developers</li>
</ul>
<p><a href="http://www.flickr.com/photos/21254914@N04/3312845171" title="View 'Cocoa Development' on Flickr.com">
<div style="text-align:center;"><img src="http://farm4.static.flickr.com/3616/3312845171_b6fbb0c611.jpg" alt="Cocoa Development" border="0" width="500" height="313" /></div>
<p></a></p>
<p>And finally, a few additional pieces of software that are invaluable to me. These are helpful regardless of what type of software I am writing.</p>
<ul>
<li><a href="http://www.omnigroup.com/applications/omnifocus/">OmniFocus</a> to help me Get Things Done</li>
<li><a href="http://git-scm.com/">git</a> for source control (don&#8217;t tell anyone but I keep my TFS repositories checked into git too)</li>
<li><a href="http://en.wikipedia.org/wiki/Apple_Terminal">Terminal.app</a> for a whole bunch of things</li>
<li><a href="http://www.cocoatech.com/">PathFinder</a> because Finder doesn&#8217;t always cut it</li>
<li><a href="http://projects.tynsoe.org/en/geektool/">GeekTool</a> to keep an eye on logs</li>
<li><a href="http://www.vim.org/">vim</a></li>
<li><a href="http://www.gnu.org/software/screen/">screen</a></li>
<li><a href="http://en.wikipedia.org/wiki/Photoshop">Photoshop</a></li>
<li><a href="http://www.apple.com/itunes/">iTunes</a> to help keep me in <a href="http://www.randsinrepose.com/archives/2006/07/10/a_nerd_in_a_cave.html">The Zone</a>!</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.zobie.com/2009/02/the-rest-of-my-development-environment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web Development Environment</title>
		<link>http://blog.zobie.com/2009/02/web-development-environment/</link>
		<comments>http://blog.zobie.com/2009/02/web-development-environment/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 07:13:33 +0000</pubDate>
		<dc:creator>zobie</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.zobie.com/?p=121</guid>
		<description><![CDATA[During 2008 I spent most of my time doing web development. There was some Java, PHP and Python, but most of my time was spent working in Ruby on Rails. Rails is a lot of fun and (I know this sounds cheesy, but&#8230;) it helped me to enjoy doing web development again.
When I&#8217;m working in [...]]]></description>
			<content:encoded><![CDATA[<p>During 2008 I spent most of my time doing web development. There was some Java, PHP and Python, but most of my time was spent working in Ruby on Rails. Rails is <em>a lot</em> of fun and (I know this sounds cheesy, but&#8230;) it helped me to enjoy doing web development again.</p>
<p>When I&#8217;m working in Java I always prefer to use <a href="http://www.jetbrains.com/">JetBrains&#8217;</a> excellent <a href="http://www.jetbrains.com/idea/">IntelliJ IDEA</a>. However, this past year I didn&#8217;t have a license for IntelliJ. I tried every free IDE I could find and wound up choosing <a href="http://www.eclipse.org/">Eclipse</a>. I&#8217;ve used Eclipse periodically over the last several years. I don&#8217;t really like it but I dislike it less than the other free alternatives.</p>
<p>My work was completely server-side and didn&#8217;t involve developing a database component. Most of my development was done on OS X but I was deploying to Ubuntu so I did work there also. I used <a href="http://maven.apache.org/">maven</a> to build, test and deploy. I&#8217;m not a unit-test fanatic but, in this case unit testing was invaluable.</p>
<p><a href="http://www.flickr.com/photos/21254914@N04/3283428513" title="View 'Java Development' on Flickr.com">
<div style="text-align:center;"><img src="http://farm4.static.flickr.com/3287/3283428513_cef4107e92.jpg" alt="Java Development" border="0" width="500" height="313" /></div>
<p></a></p>
<p>My setup for both PHP and Python is the same. When I&#8217;m working on Mac I use either <a href="http://macromates.com/">TextMate</a> or <a href="http://www.vim.org/">vim</a>. I haven&#8217;t done a great deal of Python work but over the past several years I&#8217;ve tried to find a PHP IDE that I like&#8230; I&#8217;m still looking.</p>
<p><a href="http://www.flickr.com/photos/21254914@N04/3284249898" title="View 'PHP Development' on Flickr.com">
<div style="text-align:center;"><img src="http://farm4.static.flickr.com/3453/3284249898_9d15fb09fb.jpg" alt="PHP Development" border="0" width="500" height="313" /></div>
<p></a></p>
<p>I started out doing my Ruby work using TextMate and Terminal.app. I didn&#8217;t have any major complaints. There are some nice plugins and various tricks that are handy. But personally, I prefer an IDE. I&#8217;ve heard some people say that IDEs make us lazy. Ok, I&#8217;m lazy. But I&#8217;m also far more productive when I have a good IDE. When JetBrains started issung beta releases of <a href="http://www.jetbrains.com/ruby/">RubyMine</a>, TextMate was history!</p>
<p>RubyMine&#8217;s GUI for easily stepping through code in the debugger is great. The inline code analysis is nice for quickly catching typos and the code completion can be useful too. But for me, the best part about having RubyMine is the navigation and documentation.</p>
<p>When I&#8217;m working with other developers (or even with frameworks that I didn&#8217;t write), I don&#8217;t always know exactly what a method does. Being able to instantly bring up documentation is awesome! If I need more information, I hate wasting time trying to hunt down a method buried in code that I am not familiar with. With one key-stroke RubyMine takes me to the code I&#8217;m looking for.</p>
<p><a href="http://www.flickr.com/photos/21254914@N04/3284249934" title="View 'Rails Development' on Flickr.com">
<div style="text-align:center;"><img src="http://farm4.static.flickr.com/3513/3284249934_1cab946dfd.jpg" alt="Rails Development" border="0" width="500" height="313" /></div>
<p></a></p>
<p>I am definitely a fan of JetBrains&#8217; production. IntelliJ is awesome, RubyMine is awesome, and VisualStudio is just broken without <a href="http://www.jetbrains.com/resharper/">ReSharper</a>. There is certainly a learning curve to these tools but once you&#8217;ve memorized the key strokes, the code you need is always right in front of you. And the best part part is that the key bindings are the same across each of JetBrain&#8217;s products!</p>
<p>One last application that deserves to be mentioned is <a href="http://mysql.navicat.com/">Navicat</a>. Navicat is by far the best application that I&#8217;ve found for working with MySQL or PostgreSQL. Unfortunately, that&#8217;s not saying much. I have spent a lot of time using SQL Server and Microsoft&#8217;s related tools and, as far as I can tell, there is nothing for MySQL that is even in the same league.</p>
<p>Don&#8217;t misunderstand me. Navicat is a great tool. Allowing me to save connections to different servers with many different login credentials is a lifesaver, especially the ability to tunnel the connections over ssh. Being able to do basic server management via a GUI is nice too. But when I need to design a database, I always turn back to <a href="http://en.wikipedia.org/wiki/SQL_Server_Management_Studio">SQL Server Management Studio</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zobie.com/2009/02/web-development-environment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss><!-- Dynamic page generated in 1.725 seconds. --><!-- Cached page generated by WP-Super-Cache on 2010-07-18 11:30:48 -->
