<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Information Technology Dark Side &#187; Development</title>
	<atom:link href="http://www.techdarkside.com/category/development/feed" rel="self" type="application/rss+xml" />
	<link>http://www.techdarkside.com</link>
	<description>Struggles of a Self-Taught Coder</description>
	<lastBuildDate>Mon, 30 Jan 2012 17:18:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Metrics That Matter</title>
		<link>http://www.techdarkside.com/metrics-that-matter</link>
		<comments>http://www.techdarkside.com/metrics-that-matter#comments</comments>
		<pubDate>Mon, 16 Feb 2009 14:03:40 +0000</pubDate>
		<dc:creator>David Christiansen</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[metrics]]></category>
		<category><![CDATA[pomodoro]]></category>
		<category><![CDATA[story points]]></category>
		<category><![CDATA[user stories]]></category>

		<guid isPermaLink="false">http://www.techdarkside.com/?p=327</guid>
		<description><![CDATA[I&#8217;ve always had an allergic reaction to metrics in software development. Over the years, lots of people have commented that they find this strange, given my background in manufacturing/mechanical engineering. I&#8217;ve never been able to explain why, but the metrics I&#8217;ve seen proposed for software development have never felt as genuinely useful as the type [...]]]></description>
			<content:encoded><![CDATA[<p><div style="float: right"><script type="text/javascript"><!--
google_ad_client = "pub-9768843936559157";
/* 300x250 Post Ads */
google_ad_slot = "1495790255";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>I&#8217;ve always had an allergic reaction to metrics in software development. Over the years, lots of people have commented that they find this strange, given my background in manufacturing/mechanical engineering. I&#8217;ve never been able to explain why, but the metrics I&#8217;ve seen proposed for software development have never felt as genuinely useful as the type of metrics I&#8217;ve seen collected about manufacturing processes.</p>
<p>I&#8217;ve recently discovered a very powerful personal health metric&#8217;s usefulness: calories. I first started tracking calories with <a href="http://uladoo.com">uladoo.com</a> and <a href="http://www.twitter.com">twitter</a>, then recently switched to Lose It!, an iPhone app recommended to me by a friend. As I&#8217;ve tracked calories, I&#8217;ve realized how little I knew about nutrition. It was astounding to discover there are more than 10 times the calories in a tablespoon of Hershey&#8217;s syrup than there are in a large asparagus stalk. Cheese, sour cream, ice cream, chocolate, soda, and even macaroni and cheese all have a completely different meaning to me than they once did. Counting calories has really changed my perspective and altered my behavior. But counting calories in itself is not the really powerful part &#8211; it&#8217;s the calorie budget that really makes a difference. I can eat 2,642 calories every day and lose a pound a week. If I eat more than that, I won&#8217;t lose weight. If I eat less, I will lose weight more quickly.</p>
<p>You might think that this experience has changed my viewpoint about software development metrics, and you&#8217;d be right, in a way. My position hasn&#8217;t changed (still haven&#8217;t seen a useful one), but I now understand why well enough to articulate the reasoning behind my position. So, here&#8217;s my list of what makes a good metric, along with quotes meant to be good counter-examples:</p>
<li>A metric must be simple. &#8220;A function point is unit of measurement to express the amount of business functionality an information system provides to a user.&#8221;</li>
<li>A metric must be easily measurable. One person with a simple tool. &#8220;Seriously &#8211; you want me to track how much time I spend on prod support, project X, and project Y at the minute level?&#8221;</li>
<li>A metric must be an unambiguous indicator. There should be no debate about the actual value measured itself. &#8220;Well, we say it&#8217;s 3 function points, but if you look at the underlying code you realize it&#8217;s a lot more complicated than it seems.&#8221;</li>
<li>A metric must be accompanied by boundaries that are clear, indisputable indicators of badness, like my caloric budget. &#8220;Yes my project is 25% over budget, but we&#8217;re also a bit ahead of schedule in the requirements gathering, so we&#8217;ll make it up in the end.&#8221;</li>
<li>Boundaries must be based on meaningful stuff (my caloric budget is derived from my height and weight and medical tables) as opposed to just pulled out of an orifice. &#8220;My boss expects me to find 3 bugs each day, so I bank up bugs and enter them later when I get my quota.&#8221;</li>
<p>The vast majority of software development metrics I&#8217;ve seen in my career violate most, if not all, of these rules.</p>
<p>Here are some exceptions that I&#8217;ve experienced:</p>
<li>Hours spent at the office (as opposed to hours working, which is pretty ambiguous in software development &#8211; if I think about a coding problem while I shower am I &#8220;working&#8221;). More than 40 for more than three weeks in a row is bad, bad, bad.</li>
<li>Story points completed per iteration. When the same group of people do the estimating and the work over multiple iterations, this becomes a pretty valuable metric and it meets all my criteria. If you don&#8217;t know what I&#8217;m talking about, read User Stories Applied.</li>
<li>I&#8217;m starting to think <a href="http://submissions.agile2008.org/node/1229">pomodoros</a> might be a good measure of personal productivity over time, but I haven&#8217;t been doing it long enough to be sure. It&#8217;s certainly a good technique for creating focus.</li>
<p>Notice that this is a short list, and there are lots and lots of metrics for software development I&#8217;ve seen over the users. Why haven&#8217;t they succeeded? Because they almost always break one of my premises of metrics that matter.</p>
<p>Think you&#8217;ve got a metric I would like? Let&#8217;s see it then, in the comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.techdarkside.com/metrics-that-matter/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Please sign the open source letter to President Obama</title>
		<link>http://www.techdarkside.com/please-sign-the-open-source-letter-to-president-obama</link>
		<comments>http://www.techdarkside.com/please-sign-the-open-source-letter-to-president-obama#comments</comments>
		<pubDate>Tue, 10 Feb 2009 12:18:01 +0000</pubDate>
		<dc:creator>David Christiansen</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[trisano]]></category>

		<guid isPermaLink="false">http://www.techdarkside.com/?p=320</guid>
		<description><![CDATA[This morning Stuart Cohen (CEO, Collaborative Software Initiative) and I published an open source letter to President Obama, urging him to consider the role open source software will play in the various technology initiatives that are part of the pending economic stimulus. Co-signers of the letter include executives from a variety of companies in the [...]]]></description>
			<content:encoded><![CDATA[<p>This morning Stuart Cohen (CEO, Collaborative Software Initiative) and I published an open source letter to President Obama, urging him to consider the role open source software will play in the various technology initiatives that are part of the pending economic stimulus. Co-signers of the letter include executives from a variety of companies in the open-source industry, including Alfresco, Compiere, Hyperics, Ingres, Unisys, and others.</p>
<p>Please take a minute and read the <a href="http://consideropensource.blogspot.com/2009/02/to-president-obama-please-consider-open.html">open source letter</a>. If you agree about the importance of considering the source of software products in government projects, you can sign the letter by posting a comment with your name, company (if appropriate) and web-site. We&#8217;d also appreciate any mention you might make of the open source letter to your friends and colleagues through email, blogs, and twitter.</p>
<p>The letter itself is open-sourced under a creative commons license, which means you can post it, print it, share it, etc with those around you. We hope you will do just that, and help promote the idea that open-source can help bring cost-effective, transparent solutions to government software projects.</p>
<p>Thanks!</p>
<p>Dave</p>
]]></content:encoded>
			<wfw:commentRss>http://www.techdarkside.com/please-sign-the-open-source-letter-to-president-obama/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Life Beyond IT: The Cycle of Self-Doubt</title>
		<link>http://www.techdarkside.com/life-beyond-it-the-cycle-of-self-doubt</link>
		<comments>http://www.techdarkside.com/life-beyond-it-the-cycle-of-self-doubt#comments</comments>
		<pubDate>Tue, 03 Feb 2009 14:31:36 +0000</pubDate>
		<dc:creator>David Christiansen</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[confidence]]></category>
		<category><![CDATA[self-doubt]]></category>
		<category><![CDATA[startup]]></category>

		<guid isPermaLink="false">http://www.techdarkside.com/?p=315</guid>
		<description><![CDATA[It&#8217;s hard to get fired in corporate IT I worked in corporate IT for a decade before I finally escaped. In all that time, I saw only a handful of people get fired for performance reasons. Sure, I saw people get put on a performance plan and &#8220;reviewed&#8221; out of the company, but those people [...]]]></description>
			<content:encoded><![CDATA[<p><div style="float: right"><script type="text/javascript"><!--
google_ad_client = "pub-9768843936559157";
/* 300x250 Post Ads */
google_ad_slot = "1495790255";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div><strong>It&#8217;s hard to get fired in corporate IT</strong><br />
I worked in corporate IT for a decade before I finally escaped. In all that time, I saw only a handful of people get fired for performance reasons. Sure, I saw people get put on a performance plan and &#8220;reviewed&#8221; out of the company, but those people left on their own wheels after successive annual reviews describing them as low performers. I even saw one or two cases where a total bottomfeeder was able to hang on to her job for YEARS just by engaging in the performance coaching process. The fact that she &#8220;tried&#8221; to do better added at least another year to her time in the company. In the end, even she didn&#8217;t get fired. She eventually got the hint and moved on.</p>
<p>This frustrating tendency of corporate IT to hang on to employees was also a bit of a security blanket for me. I didn&#8217;t worry about getting fired. It&#8217;s hard to fire people and most managers just don&#8217;t have the energy to do it. It&#8217;s easier to reassign you to another group, reduce your work assignment to non-critical activities, or just ignore you altogether until layoffs come around and include you in the cut.</p>
<p>Getting fired for performance is not the same as getting fired for cause or getting laid off. Getting fired for cause is bad &#8211; it means you don&#8217;t get any unemployment benefits, but it&#8217;s also reasonably easy to avoid. Don&#8217;t steal, don&#8217;t forget to call in sick when you can&#8217;t make it to work, don&#8217;t pinch the secretary&#8217;s butt, and don&#8217;t use racial/sexual slurs. Getting fired for performance will not result in losing unemployment benefits, and it often comes with a severance package, though generally reduced from what you would get if you were laid off (I often hoped I would get laid off, sometimes secretly but often publicly &#8211; I would have received almost six months of pay).</p>
<p><strong>Goodbye Security Blanket!</strong><br />
I don&#8217;t have a security blanket anymore, but oddly I&#8217;m not worried about getting fired. What I&#8217;m worried about is failing. Previously, failing didn&#8217;t worry me as much as it does now. Why? Because it didn&#8217;t matter as much to the company. What difference did my $2,000,000 mistakes make in a company that had canceled at least $200,000,000 in projects after disastrous failures? Besides, since I used scrum, I had some confidence that we would deliver something of value before we spent the entire budget, reducing the likelihood of total failure substantially.</p>
<p>Now though, failure means much more. The company needs me to be successful. This is not to imply that they would fail without me &#8211; I don&#8217;t think that&#8217;s true. But I impact the bottom line in a way I never have before.  Throw my other ventures into the mix &#8211; trooptrack.com and uladoo.com &#8211; and suddenly the prospect of failure really, really bothers me. It scares me frankly.</p>
<p><strong>Hello Upside</strong><br />
At the same time, the upside potential of the work I&#8217;m doing now is staggering. It blows my mind to think about being involved in a product as great as TriSano and to know I have a real stake in its success. We&#8217;re taking risks and building an awesome product that benefits the public and the government. The potential consequences of success are buoying and tremendous.</p>
<p>On a smaller scale, the same thing is true of TroopTrack.com and Uladoo.com. Success in these ventures has much more potential than the payoff from successfully delivering a corporate IT project ever did.</p>
<p><strong>Enter the Cycle of Self-Doubt</strong><br />
These two forces, the fear of failure and the hope for success, play off each other in dramatic ways. I find myself cycling weekly through wild optimism and and modest pessimism about the prospects of success and failure. I&#8217;m not used to this level of emotional variability, and at first it really bothered me, until I noticed that it was cyclical. Here&#8217;s how the cycle works:</p>
<p>First, some sort of positive signals emerge about the prospects of something I&#8217;m working on. My enthusiasm builds off of this feedback and I feed off of it.</p>
<p>The enthusiasm grows and I chase after it. I work harder and get more results, until it finally peaks in a somewhat irrational level of optimism. </p>
<p>Finally, the work starts to make me tired. My expectations drop to a more realistic level. Reality points out that progress takes time. I rest a little bit, still pleased with where we&#8217;ve gotten to.</p>
<p>Resting makes me nervous about the future. I start to have thoughts about whether I have done my part. Am I pulling my own weight? Am I giving my fair share to the team? Even if I am, is it enough? I start to feel a yearning for progress, for some improvement that makes me feel positive again.</p>
<p>I wade back in, attacking some problem that bothers me. I make progress, and I start to feel optimistic again. Look what a difference you made by doing this, I tell myself. </p>
<p>Some sort of positive signals emerge as a result of these efforts, and the cycle starts all over again.</p>
<p><strong>Recognizing the Cycle Makes It Bother Me Less</strong><br />
A week ago I noticed the cycle and started to joke about it with my friends. When they ask how things are going, I said things like &#8220;I&#8217;m at the bottom of my self-doubt cycle right at the moment,&#8221; or &#8220;I&#8217;m at the top of the ferris wheel just now&#8221;. It usually took a bit of explanation before they knew what I meant, but I found it a useful way to talk about how I&#8217;m feeling about my job.</p>
<p>This cycle feels very natural to me, and overall it has a positive effect on motivating me. The bottom of the self-doubt cycle prevents me from resting on my laurels while there is important work to be done, the top of the cycle feeds my imagination and enthusiasm, and the middle states are highly productive times that yield lots of results.</p>
<p>I know this may sound weird, but now that I can see the cycle, I like it. I really do.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.techdarkside.com/life-beyond-it-the-cycle-of-self-doubt/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Obfuscating Private Data in a Database Dump File</title>
		<link>http://www.techdarkside.com/obfuscating-private-data-in-a-database-dump-file</link>
		<comments>http://www.techdarkside.com/obfuscating-private-data-in-a-database-dump-file#comments</comments>
		<pubDate>Fri, 03 Oct 2008 14:40:51 +0000</pubDate>
		<dc:creator>David Christiansen</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[data masking]]></category>
		<category><![CDATA[data obfuscation]]></category>
		<category><![CDATA[personal data]]></category>

		<guid isPermaLink="false">http://www.techdarkside.com/?p=271</guid>
		<description><![CDATA[Here&#8217;s a common problem in software development: you&#8217;re production application has sensitive/personal/private/legally protected data in it that probably isn&#8217;t wise to share with everybody and their dog. But, you need to debug a problem from prod, test a database upgrade, verify a new feed works properly, or some other task that would really be a [...]]]></description>
			<content:encoded><![CDATA[<p><div style="float: right"><script type="text/javascript"><!--
google_ad_client = "pub-9768843936559157";
/* 300x250 Post Ads */
google_ad_slot = "1495790255";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>Here&#8217;s a common problem in software development: you&#8217;re production application has sensitive/personal/private/legally protected data in it that probably isn&#8217;t wise to share with everybody and their dog. But, you need to debug a problem from prod, test a database upgrade, verify a new feed works properly, or some other task that would really be a lot easier if you could use production data to do it. Unfortunately, putting that data in your test environment would require everyone who has access to it to hand over their first born child in escrow against them stealing it, selling it, or abusing it in some other way.</p>
<p>Now, it&#8217;s worth noting that the problem I&#8217;m trying to solve is NOT the problem of hackers getting into your production database. I&#8217;m just trying to take a production database, create a database dump file, make that file safe for general use, and then load it in my test database. Simple right?</p>
<p>Yeah, actually it turns out it is. I wrote a simple Ruby script called <a href="https://trisano.csinitiative.net/source/browse/trisano/top-level/trunk/trisano/webapp/script/obfu.rb?view=markup">Obfu</a> that goes through the dump file, finds the fields I&#8217;m worried about, and changes them to random (but human readable) values.</p>
<p>Why not just encrypt the sensitive data? Well, sure, that would work, if you want to read X87rkd834k for a first name, I guess. I&#8217;m not sure what an encrypted email address, phone number, or street address looks like, but I have doubts about whether it would format properly.</p>
<p>So, here&#8217;s how <a href="https://trisano.csinitiative.net/source/browse/trisano/top-level/trunk/trisano/webapp/script/obfu.rb?view=markup">Obfu</a> works: First, you grab the source code from TriSano.org with this link: <a href="https://trisano.csinitiative.net/source/browse/trisano/top-level/trunk/trisano/webapp/script/obfu.rb?view=markup">Obfu</a></p>
<p>Next, change the method get_obfu_config to include the tables and columns you want obfu&#8217;ed. What get_obfu_config is simultaneously complex and simple: it&#8217;s complex because it uses an array of hases of arrays of hashes, but it&#8217;s simple once you get over that.</p>
<p>Here&#8217;s an example from the code that might help you understand how that array/hash/array/hash mess works:<br />
[<br />
    {#COPY telephones (id, location_id, country_code, area_code, phone_number, extension, created_at, updated_at, email_address) FROM stdin;<br />
      :table_name => 'telephones', :fields => [<br />
        {:field_loc => 4, :type => 'value', :value => '555'},  # Area code<br />
        {:field_loc => 5, :type => 'num', :digits => 7},       # Phone number<br />
        {:field_loc => 6, :type => 'num', :digits => 3},       # Extension<br />
        {:field_loc => 9, :type => 'email'} # email<br />
      ]<br />
    },<br />
    {#COPY people (id, entity_id, birth_gender_id, ethnicity_id, primary_language_id, first_name, middle_name, last_name, birth_date, date_of_death, created_at, updated_at, food_handler_id, age_type_id, approximate_age_no_birthday, first_name_soundex, last_name_soundex, vector, live, next_ver, previous_ver, disposition_id) FROM stdin;<br />
      :table_name => &#8216;people&#8217;, :fields => [<br />
        {:field_loc => 6, :type => 'text', :word_count => 1},  # first_name<br />
        {:field_loc => 7, :type => 'text', :word_count => 1},  # middle_name<br />
        {:field_loc => 8, :type => 'text', :word_count => 1},  # last_name<br />
        {:field_loc => 9, :type => 'date', :keep_year => true} # birth_date<br />
      ]<br />
    }<br />
  ]</p>
<p>Each item in the big array is a table, and it really only has two values: table name and fields. The fields value is an array of the columns you want obfuscated. Each column has a hash of values that tell obfu what to do to the column. You&#8217;ll notice I don&#8217;t have a field name for the column name. That&#8217;s a little lazy on my part and I&#8217;d love you to fix it (the <a href="http://www.trisano.org">TriSano</a> OSS license requires you contribute improvements back, if I understand it correctly). I use :field_loc instead, which is simply the position of the field in the COPY statement in the dump file.</p>
<p>Every column has two values field_loc and type. All the other values depend on the type you specify. Here&#8217;s how it breaks down:<code><br />
<table border=1>
<tr>
<th>type</th>
<th>values</th>
</tr>
<tr>
<td>num</td>
<td>:digits</td>
</tr>
<tr>
<td>value</td>
<td>:value (I use this to always set area codes to '555')</td>
</tr>
<tr>
<td>text</td>
<td>:word_count</td>
</tr>
<tr>
<td>email</td>
<td>none</td>
</tr>
<tr>
<td>date</td>
<td>:keep_current_year: true or false (useful for birthdates)</td>
</tr>
</table>
<p></code></p>
<p><a href="https://trisano.csinitiative.net/source/browse/trisano/top-level/trunk/trisano/webapp/script/obfu.rb?view=markup">Obfu</a> uses lorum ipsum dolor text to randomly generate words for text and email fields. Numbers are all randomly generated, and so are dates, but with some limits. You won&#8217;t get day values greater than 28, for example, and you might want to consider the fact that randomly generating certain dates will break validations.</p>
<p>Use <a href="https://trisano.csinitiative.net/source/browse/trisano/top-level/trunk/trisano/webapp/script/obfu.rb?view=markup">Obfu</a> all you like. Tell your friends about it if turns out to be helpful for you. I&#8217;m hoping to externalize the configuration and turn it into a gem next time I get some free time (unless you do it first, in which case I&#8217;ll just thank you and use yours!).</p>
<p>Obfu takes two arguments: input file and output file, in that order. I haven&#8217;t added any error handling, etc., so use at your own risk.</p>
<p><a href="https://trisano.csinitiative.net/source/browse/trisano/top-level/trunk/trisano/webapp/script/obfu.rb?view=markup">Obfu</a> has only been tested against Postgresql database dump files. You might need to change Obfu up to make it work with other databases.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.techdarkside.com/obfuscating-private-data-in-a-database-dump-file/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ruby on Rails: It&#8217;s LIKE having a soul again</title>
		<link>http://www.techdarkside.com/coding-its-like-having-a-soul-again</link>
		<comments>http://www.techdarkside.com/coding-its-like-having-a-soul-again#comments</comments>
		<pubDate>Fri, 29 Aug 2008 22:35:36 +0000</pubDate>
		<dc:creator>David Christiansen</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.techdarkside.com/?p=266</guid>
		<description><![CDATA[There&#8217;s a soul check room when you join IT management &#8211; I turned mine in about four years ago. I kept the ticket in my top dresser drawer for a long time, just in case I ever needed the thing again. The other day I checked for it and couldn&#8217;t find it. Then I remembered [...]]]></description>
			<content:encoded><![CDATA[<p><div style="float: right"><script type="text/javascript"><!--
google_ad_client = "pub-9768843936559157";
/* 300x250 Post Ads */
google_ad_slot = "1495790255";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>There&#8217;s a soul check room when you join IT management &#8211; I turned mine in about four years ago. I kept the ticket in my top dresser drawer for a long time, just in case I ever needed the thing again. The other day I checked for it and couldn&#8217;t find it. Then I remembered &#8211; it must have been lost when we got new furniture. Flippin&#8217; golden handcuffs.</p>
<p>For a few years, I was able to hold onto a little piece of my soul by blogging and writing articles, but lately I&#8217;ve fallen behind even on that, and I&#8217;m afraid my soul is completely gone. I may never see it again. </p>
<p>I&#8217;ve been coding lately, and that&#8217;s been a relief. Sure, it&#8217;s not incredibly complex stuff &#8211; just RSpec tests. But&#8230; still, it&#8217;s been oddly invigorating. It reminds of the time, not so long ago, when I was an expert at something. When I could code circles around myself, like the time I wrote an XML marshaller/unmarshaller for an obscure OO language, or when I wrote pattern smoothing algorithms for the high-speed cutting of carbon fiber helicopter parts.</p>
<p>Those were the good ole days. Why&#8217;d I ever stop doing that? What made me think management would be more fulfilling?</p>
<p>Java. That&#8217;s what it was. I don&#8217;t like that language. It&#8217;s a nice idea &#8211; OO with cross-platform portability, but it&#8217;s too wordy. It&#8217;s perfect for the quadruple abstraction factory guys, but not for me. I don&#8217;t want to have to instantiate four different classes just to read a file. No thank you. I prefer to just open the dang thing. Besides, that whole portability thing didn&#8217;t really work out in the end, and it never seemed to matter either. And the frameworks, with all that dang XML. Aargh. I just never liked that girl, I just liked the idea of that girl.</p>
<p>For a while there it seemed Java was going to take over the world. It certainly seemed to take the wind out of the proprietary language I was such an expert at. And the prospect of learning Java made me cringe.</p>
<p>So I turned my back on the code, and checked my soul in at my local chapter of PMI.</p>
<p>But that didn&#8217;t help either. The bad taste in my mouth is different now, but it still makes me want to double up on Altoids. Few things have made me want to take up drinking more than IT management.</p>
<p>Then along came Ruby. Well, actually she&#8217;d been around for a while, I just hadn&#8217;t noticed her. Then one day, in the middle of a ginormous crisis, I needed someone to parse a log file as big as our crisis and turn some specific time stamps into a graph. <a href="http://www.michaeldkelly.com">Mike Kelly</a> did it in about five minutes. I couldn&#8217;t believe it. When I asked him how, he said &#8220;Ruby&#8221;. I didn&#8217;t start picking up on her right away, but it registered. Ruby was cute, or at least practical.</p>
<p>A year went by and I needed to parse some log files again. I remembered Mike and his cute little friend Ruby, and I googled her. Ten minutes later, I was looking at the graph I needed. I wasn&#8217;t quite as impressed with Mike&#8217;s ginormous crisis magic trick now, because it was pretty easy with Ruby. Java had made me expect everything to be hard.</p>
<p>Things blossomed from there. I discovered Rails, and I started getting more serious. Then I found some paying work on the side and suddenly critical mass materilized. Now there was money involved.</p>
<p>At any rate, I&#8217;m really digging this Ruby on Rails thing. I know I&#8217;m not good enough at it yet to say I have my soul back, but I&#8217;m getting there. Thanks Ruby.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.techdarkside.com/coding-its-like-having-a-soul-again/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Creating Post-Commit Subversion Hooks with Dreamhost</title>
		<link>http://www.techdarkside.com/creating-post-commit-subversion-hooks-with-dreamhost</link>
		<comments>http://www.techdarkside.com/creating-post-commit-subversion-hooks-with-dreamhost#comments</comments>
		<pubDate>Wed, 13 Aug 2008 01:48:30 +0000</pubDate>
		<dc:creator>David Christiansen</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.techdarkside.com/?p=264</guid>
		<description><![CDATA[Okay, so this is a little bit afield of what I normally write about, since I don&#8217;t normally delve into technical issues. Happily, my work life is becoming more technical and this blog is likely to follow suit, so you might expect more tech and less philosophizing in the future. If you don&#8217;t know, subversion [...]]]></description>
			<content:encoded><![CDATA[<p><div style="float: right"><script type="text/javascript"><!--
google_ad_client = "pub-9768843936559157";
/* 300x250 Post Ads */
google_ad_slot = "1495790255";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>Okay, so this is a little bit afield of what I normally write about, since I don&#8217;t normally delve into technical issues. Happily, my work life is becoming more technical and this blog is likely to follow suit, so you might expect more tech and less philosophizing in the future. </p>
<p>If you don&#8217;t know, subversion allows you to create &#8220;hooks&#8221;, actions that are executed when certain events occur in your subversion repository. Some of the events you can use as triggers for your hooks are commits, locks, unlocks, and revision properties changes. You can create pre- and post-hooks, which just means they run before or after the event occurs.</p>
<p>Some examples of how these are used: sending an email to the dev team whenever a commit occurs, kicking off a deployment after a commit, or running a bunch of tests.</p>
<p>I needed some of these hooks for one of my projects, but I couldn&#8217;t figure out how to do it at first. Google didn&#8217;t help much &#8211; most of the examples were really old and looked like really bad ideas. Eventually, I was able to figure it out on my own, but I thought it would be a good idea to post it.</p>
<p>Anyway, it&#8217;s pretty easy to set these up with Dreamhost, in spite of what the Google search results will tell you.</p>
<p>The problem with Dreamhost&#8217;s subversion install is that all the files are owned by the dhapache user and therefore you can&#8217;t make the .tmpl files executable (the .tmpl files are sample hooks provided with the svn install). Normally, you would edit the files you want to use, then use the mv command in ssh to remove the .tmpl files, which is what makes subversion start acting on them. Unfortunately, doing it this way leaves your &#8220;hook&#8221; with no permission to execute, and you can&#8217;t change it.</p>
<p>So, the easiest thing to do is to first copy the hook template you want to use to a new file with no extension (post-commit.tmpl copied to post-commit, for example) and edit it as you like. Then chmod it to 755 and it will work.</p>
<p>That&#8217;s all it took. Now, if I exposed some security flaw hopefully one of my readers will know and tell me what a moron I am. I&#8217;ll appreciate that.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.techdarkside.com/creating-post-commit-subversion-hooks-with-dreamhost/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

