<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>makefile.com - Home</title>
  <id>tag:makefile.com,2008:mephisto/</id>
  <generator version="0.8.0" uri="http://mephistoblog.com">Mephisto Drax</generator>
  <link href="http://makefile.com/feed/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://makefile.com/" rel="alternate" type="text/html"/>
  <updated>2008-04-09T19:56:56Z</updated>
  <entry xml:base="http://makefile.com/">
    <author>
      <name>Scott</name>
    </author>
    <id>tag:makefile.com,2008-04-09:60</id>
    <published>2008-04-09T19:56:00Z</published>
    <updated>2008-04-09T19:56:56Z</updated>
    <category term="Thinking Out Loud"/>
    <link href="http://makefile.com/silly-twink" rel="alternate" type="text/html"/>
    <title>Silly Twink</title>
<content type="html">
            &lt;p&gt;
Google just released AppEngine for 10,000 people.
&lt;/p&gt;
&lt;p&gt;
A few Google engineers built a cool sample app called HuddleChat as a side project.
&lt;/p&gt;
&lt;p&gt;
Jason Fried of 37signals fame says it's a direct rip off of Campfire.
&lt;/p&gt;
&lt;p&gt;
Google stepped in and removed HuddleChat.
&lt;/p&gt;
&lt;p&gt;I'm a bit irritated by this. It's a bloody simple web based Chat application. If you think Campfire is the first to be implemented with the layout of having a chat screen on the left, online users and other gizmos on the right, then, uh, Jason, you live up to your arrogant reputation.
&lt;/p&gt;
&lt;p&gt;
In the words of John Stossel: &lt;em&gt;Give me a break!&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Why is Google censoring? Why is Jason Fried being a twink? Why is &lt;em&gt;anyone&lt;/em&gt; even listening to this clown? Maybe Jason should try &lt;em&gt;getting real&lt;/em&gt;. Or maybe I'll have to reconsider what 37signals stands for. Sad.
&lt;/p&gt;
&lt;p&gt;I'm a pretty big Rails fan. Mostly because it's Ruby. More and more I'm starting to think that the Rails people are just too bloody &lt;em&gt;cool&lt;/em&gt; for me and perhaps I should look at some of the new and up and coming Ruby frameworks like Merb (ok, not so new, but getting serious polish these days) or Wave. Who knows. I'm in a bad mood. App Engine is cool and these twinks at 37signals are just stealing publicity.
&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://makefile.com/">
    <author>
      <name>Scott</name>
    </author>
    <id>tag:makefile.com,2008-03-14:56</id>
    <published>2008-03-14T04:00:00Z</published>
    <updated>2008-03-14T06:28:00Z</updated>
    <category term="General"/>
    <category term="Thinking Out Loud"/>
    <category term="math.pi"/>
    <category term="pi"/>
    <link href="http://makefile.com/happy-pi-day" rel="alternate" type="text/html"/>
    <title>Happy PI day!</title>
<content type="html">
            &lt;p&gt;Today is 3/14&lt;/p&gt;
&lt;p&gt;
In two years we'll discover the fourth digit, but the fifth will baffle us for another five years after.
&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://makefile.com/">
    <author>
      <name>Scott</name>
    </author>
    <id>tag:makefile.com,2008-01-24:53</id>
    <published>2008-01-24T22:41:00Z</published>
    <updated>2008-01-24T23:15:32Z</updated>
    <category term="C#"/>
    <link href="http://makefile.com/better-c-anonymous-delegates" rel="alternate" type="text/html"/>
    <title>Better C# - Anonymous Delegates</title>
<content type="html">
            &lt;p&gt;C# has been kind of in and out of my life since its inception way back when. At one point I really liked it, then I started to despise it because of how garbage collection works and how easy it is to leak resources when you aren't proactively destroying object instances.&lt;/p&gt;
&lt;p&gt;Luckily the IDispose interface is available to take care of such things, and you can often achieve the same effect through use of a try/catch/finally clause, ensuring resources are released during a visit to the finally block.&lt;/p&gt;
&lt;p&gt;I generally use the try/catch/finally approach because I find it more obvious and I don't have to wrap up existing classes with an IDispose implementation.&lt;/p&gt;
&lt;p&gt;Another one of my frequent gripes about C# is how verbose it is. The latest generation of C# will introduce a form a type inference that will improve on this in a big way. For now there are still some things we can do to make our active code smaller and more manageable.&lt;/p&gt;
&lt;p&gt;Today I used anonymous delegates to clean up some code and remove a lot of repeated junk.&lt;/p&gt;
&lt;p&gt;The pattern I had went something like this:
&lt;blockquote&gt;
&lt;pre&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;static&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; create&lt;span&gt;(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt; name&lt;span&gt;)&lt;/span&gt;
&lt;span&gt;{&lt;/span&gt;
  IDbConnection db &lt;span&gt;=&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; System&lt;span&gt;.&lt;/span&gt;Data&lt;span&gt;.&lt;/span&gt;SqlClient&lt;span&gt;.&lt;/span&gt;SqlConnection&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  &lt;span&gt;try&lt;/span&gt;
  &lt;span&gt;{&lt;/span&gt;
    db&lt;span&gt;.&lt;/span&gt;ConnectionString &lt;span&gt;=&lt;/span&gt; connect_string_for&lt;span&gt;(&lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    db&lt;span&gt;.&lt;/span&gt;Open&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    IDbCommand command &lt;span&gt;=&lt;/span&gt; db&lt;span&gt;.&lt;/span&gt;CreateCommand&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    command&lt;span&gt;.&lt;/span&gt;CommandText &lt;span&gt;=&lt;/span&gt; &lt;span&gt;string&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;Format&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;CREATE DATABASE {0}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; name&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    command&lt;span&gt;.&lt;/span&gt;ExecuteNonQuery&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  &lt;span&gt;}&lt;/span&gt;
  &lt;span&gt;catch&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;System&lt;span&gt;.&lt;/span&gt;Exception x&lt;span&gt;)&lt;/span&gt;
  &lt;span&gt;{&lt;/span&gt;
    &lt;span&gt;return&lt;/span&gt; x&lt;span&gt;.&lt;/span&gt;Message&lt;span&gt;;&lt;/span&gt;
  &lt;span&gt;}&lt;/span&gt;
  &lt;span&gt;finally&lt;/span&gt;
  &lt;span&gt;{&lt;/span&gt;
    &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;db &lt;span&gt;!&lt;/span&gt;&lt;span&gt;=&lt;/span&gt; &lt;span&gt;null&lt;/span&gt; &amp;amp;&amp;amp; Tools&lt;span&gt;.&lt;/span&gt;included_in&lt;span&gt;&amp;lt;&lt;/span&gt;ConnectionState&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;db&lt;span&gt;.&lt;/span&gt;State&lt;span&gt;,&lt;/span&gt; Tools&lt;span&gt;.&lt;/span&gt;db_open_states&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
    &lt;span&gt;{&lt;/span&gt;
      db&lt;span&gt;.&lt;/span&gt;Close&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;}&lt;/span&gt;       
  &lt;span&gt;}&lt;/span&gt;
&lt;span&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;/p&gt;

&lt;p&gt;Using anonymous delegates (also known as anonymous methods) I was able to extract the repetitive junk, namely the try, catch, and finally stuff plus the db connection piece into a reusable method that named &lt;b&gt;with_db_for&lt;/b&gt; that took the name of the database and the delegate for using the database. Now that code looks like this:
&lt;blockquote&gt;
&lt;pre&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; create&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
&lt;span&gt;{&lt;/span&gt;
  &lt;span&gt;string&lt;/span&gt; result &lt;span&gt;=&lt;/span&gt; Tools&lt;span&gt;.&lt;/span&gt;with_db_for&lt;span&gt;(&lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;delegate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;IDbConnection db&lt;span&gt;)&lt;/span&gt;
  &lt;span&gt;{&lt;/span&gt;
    IDbCommand cmd &lt;span&gt;=&lt;/span&gt; db&lt;span&gt;.&lt;/span&gt;CreateCommand&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    cmd&lt;span&gt;.&lt;/span&gt;CommandText &lt;span&gt;=&lt;/span&gt; &lt;span&gt;string&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;Format&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;CREATE DATABASE {0}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; dbname&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    cmd&lt;span&gt;.&lt;/span&gt;ExecuteNonQuery&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;return&lt;/span&gt; &lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;yes&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  &lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;

  dropped &lt;span&gt;=&lt;/span&gt; result &lt;span&gt;=&lt;/span&gt;&lt;span&gt;=&lt;/span&gt; &lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;yes&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  &lt;span&gt;return&lt;/span&gt; result&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;/p&gt;
&lt;p&gt;Ahhh, much better.&lt;/p&gt;
&lt;p&gt;I'm going to have to keep exploring this. Anonymous delegates are lexical closures which is very satisfying, but they are also strongly typed which is weird for such constructs. I am very pleased with this.
&lt;/p&gt;
&lt;p&gt;The future looks even better. I am really interested in type inference and many of the other benefits of the next generation of C#, and perhaps my mind will change a little and I'll actually start enjoying it once more.&lt;/p&gt;
&lt;p&gt;But never as much as I enjoy &lt;b&gt;Ruby.&lt;/b&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://makefile.com/">
    <author>
      <name>Scott</name>
    </author>
    <id>tag:makefile.com,2008-01-19:50</id>
    <published>2008-01-19T02:25:00Z</published>
    <updated>2008-01-19T02:27:12Z</updated>
    <category term="General"/>
    <category term="Thinking Out Loud"/>
    <link href="http://makefile.com/mapreduce-sucks" rel="alternate" type="text/html"/>
    <title>MapReduce Sucks!</title>
<content type="html">
            &lt;p&gt;No it doesn't. But The Database Column would have you believe it.&lt;/p&gt;
&lt;p&gt;A more fitting title to this may have been &lt;em&gt;What Are These Guys Smoking?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Read the article here: &lt;a href=&quot;http://www.databasecolumn.com/2008/01/mapreduce-a-major-step-back.html&quot;&gt;MapReduce: A major step backwards&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then take a deep breath and let it out the big &quot;Huh?&quot;&lt;/p&gt;
&lt;p&gt;My first reaction to this is simple. Your typical database is based on perfectly structured data. Where the data doesn't fit neatly into the structure (schema) you transform it, often times using an ETL tool of sorts (thats Extract, Transform, Load).&lt;/p&gt;
&lt;p&gt;Search data is anything but perfectly structured. Google indexes a whole lot of different document formats: HTML, PDF, word docs, excel files, and a whole lot more. This stuff doesn't exactly map to a neatly defined database schema does it?&lt;/p&gt;
&lt;p&gt;MapReduce is a time tested proven and infinitely (well...) scalable method for building a resultset from a very large dataset. The neatest part perhaps is that the data that is mined can be in any number of different format stored in any media available. What does this translate into?&lt;/p&gt;
&lt;p&gt;
  &lt;ol&gt;
    &lt;li&gt;Cheap grunt servers&lt;/li&gt;
    &lt;li&gt;Cheap storage&lt;/li&gt;
    &lt;li&gt;Manageability&lt;/li&gt;
    &lt;li&gt;Scaling to the moon&lt;/li&gt;
  &lt;/ol&gt;
&lt;/p&gt;
&lt;p&gt;
Let's talk about that for a second. A low cost Linux server can be put into commission and last an enormous amount of time without every being upgraded. The data will be proliferated through many different systems providing an awesome set of redundant and low cost storage devices. Managing the servers is easy (in relative terms), seriously, they are grunts designed to do one task and do it very well. Upgrades should be minimal since they only have to change if the physical layout of the data changes, and it doesn't have to very often I bet. Scalability, no problem, plug in another thousand servers that are just begging for datasets to reduce and off they go.
&lt;/p&gt;
&lt;p&gt;Allow me to elaborate on the manageability front here. Say you have a linux server designed to dig through a crap-load of this data that you've been collecting through various means (spidering, general data loads, whatever). We're talking about a finely tuned $600 server (retail) that will kick ass at this job. More likely, we're talking about several thousand of these wicked machines. But, the only time you ever have to alter the innards of these beasts is if they fail or the shape of the data changes. With MapReduce you don't have to change the shape, just add a new generation of finely tuned $600 servers (retail) that that can see and process a new shape, and the new data. The old servers are just the aging rock stars, still jamming to the same tune, eventually they'll retire and the data will evolve. Ultimately the users question gets answered by everyone listening and reduced to the most relevant resultset.&lt;/p&gt;
&lt;p&gt;
Try that on any modern vendor provided database system and you'll probably find that it just can't be done that way. You have to have all of your data neatly ordered and ready to go. Show me a product that can evolve with your data, without having to migrate or transform that data's physical shape. I'll bet you can't. The reason you can't is because you have to funnel everything through their engine and it can't possibly be capable of knowing how all of the underlying data in a system like Google's. Google can add any data, in any shape it wants to their ginomrous clusters and the very nature of MapReduce screams &quot;I don't care!&quot; because the workers are doing the work.&lt;/p&gt;
&lt;p&gt;
So what were these guys who wrote this article writing about? Beats me. I think they were just trying to tell IT managers that Google is wrong and they know better. I think they are full of it if that's the case. Or perhaps they really just don't get it. I dunno.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://makefile.com/">
    <author>
      <name>Scott</name>
    </author>
    <id>tag:makefile.com,2008-01-18:49</id>
    <published>2008-01-18T05:03:00Z</published>
    <updated>2008-01-18T05:07:46Z</updated>
    <category term="General"/>
    <category term="Thinking Out Loud"/>
    <link href="http://makefile.com/us-economy-and-a-simple-question" rel="alternate" type="text/html"/>
    <title>US economy and a simple question</title>
<content type="html">
            &lt;p&gt;Quite frankly I'm tired of hearing that we aren't in a recession, but we may be headed towards one. I don't buy the old definition of two consecutive quarters of declining GDP. That just doesn't sit well with me.&lt;/p&gt;
&lt;p&gt;I want to know this instead. For every US dollar I spend, how much of that stays in the US economy?&lt;/p&gt;
&lt;p&gt;I fill up the tank on my Saturn Aura, costs about $36 these days or more depending. How much of that $36 stays here?&lt;/p&gt;
&lt;p&gt;When I buy three 2 liters of Diet Mt. Dew for $3.63, how much of that stays here?&lt;/p&gt;
&lt;p&gt;Is there a measurement for this? I don't know. If there is, I'd like to see it. I'd like even more to hear about it in the news if that's possible.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://makefile.com/">
    <author>
      <name>Scott</name>
    </author>
    <id>tag:makefile.com,2008-01-16:48</id>
    <published>2008-01-16T04:19:00Z</published>
    <updated>2008-01-18T05:08:44Z</updated>
    <category term="General"/>
    <link href="http://makefile.com/kozlov-in-detroit" rel="alternate" type="text/html"/>
    <title>Kozlov in Detroit</title>
<content type="html">
            &lt;p&gt;It was cool to see Slava Kozlov back in Detroit finally. We've waited all season for this game. &lt;/p&gt;
&lt;p&gt;My wife was pleased that both the Thrashers won (5-1 in an odd Wings loss) and that Kozzy scored a goal against Dominick Hasek whom he was traded to Buffalo for in 2001. Attaboy!&lt;/p&gt;
&lt;p&gt;It was quite an upset for the Wings, #1 in the NHL, to lose so badly to the Thrashers who rank 21 overall. Or rather, they did until this evening. I'm not sure where this game puts them.&lt;/p&gt;
&lt;p&gt;Even worse though is that the Wings have now lost three games in a row. Each game they were trailing by 2 points at some point. It's their biggest losing streak of the season and all of the superstar players are dressed and on the ice. Odd that.&lt;/p&gt;
&lt;p&gt;In the end it doesn't matter.  Detroit will surely make the playoffs so it was great to see Slava skating at Joe Louis Arena again tonight and leave with what is certain to be a smile on his face.&lt;/p&gt;
&lt;p&gt;We miss the old #13, even though the new #13 is definite keeper himself.&lt;/p&gt;
&lt;p&gt;Game on!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://makefile.com/">
    <author>
      <name>Scott</name>
    </author>
    <id>tag:makefile.com,2007-11-28:42</id>
    <published>2007-11-28T06:08:00Z</published>
    <updated>2007-11-28T06:15:08Z</updated>
    <category term="Ruby"/>
    <link href="http://makefile.com/killed-two-stones-with-one-bird" rel="alternate" type="text/html"/>
    <title>Killed Two Stones With One Bird</title>
<content type="html">
            &lt;p&gt;
For a long time I've wanted to learn Apple's Cocoa and Objective-C. I've also been very interested in the completely unrelated &lt;a href=&quot;aws.amazon.com/s3&quot;&gt;Amazon Simple Storage Service (S3)&lt;/a&gt;. Last night I embarked upon a quest to teach myself whatever I could of those by building a rather simple, but cool &lt;a href=&quot;http://www.rubyonrails.org&quot;&gt;Ruby on Rails&lt;/a&gt; application. What I should have been doing was reviewing a chapter from an upcoming Ruby on Rails book but this was an itch I had to scratch.
&lt;/p&gt;
&lt;p&gt;
&lt;img src=&quot;http://s3.amazonaws.com/webthumbs-dev/http---panic-com-coda.1024.0.240.0.high.png&quot; /&gt;
Instead of teaching myself Objective-C however I decided to use the wonderful &lt;a href=&quot;http://rubycocoa.sourceforge.net/HomePage&quot;&gt;RubyCocoa&lt;/a&gt; library. To get at the Amazon S3 service I used the also very cool library that is appropriately namespaced &lt;a href=&quot;http://amazon.rubyforge.org/&quot;&gt;AWS::S3&lt;/a&gt;. Removing Objective-C from the equation both hindered and helped. It is a pretty tough language to read so there was a good deal of trial and error when trying to understand some Objective-C code and translate it to Ruby and RubyCocoa.
&lt;/p&gt;
&lt;p&gt;
My inspiration for this tangent comes from &lt;a href=&quot;http://www.panic.com/&quot;&gt;Panic&lt;/a&gt;, or more specifically their &lt;a href=&quot;http://www.panic.com/coda/&quot;&gt;Coda&lt;/a&gt; application. It's an awesome tool and I was really impressed by its ability to generate thumbnails of your website or project. Creating website thumbnails isn't new, &lt;a href=&quot;http://www.alexa.com&quot;&gt;Alexa&lt;/a&gt; at least has been doing it for years. The way Coda does it is inspiring however. They paint nice icons that look like sheets of paper curling up with a well defined shadow, giving it a believable 3D look. It's a small thing, and it's the small things that matter.
&lt;/p&gt;
&lt;p&gt;
My goal isn't to reproduce Coda's thumbnails, I don't have the time or skills to do that yet. My goal is to simply create decent full or partial page screen captures of active websites. The image of the Coda web site here is a result of my efforts. Using a simple web app I enter a URL, the viewport size (default is 1024x768) and the resized version (default is 320x240). If you leave the height off it'll go full height and get entire web page without cropping. Likewise if you leave the resize height off it'll scale it in proportion to the width.
&lt;/p&gt;
&lt;p&gt;
In the end I finally have a good understanding of S3 and I know that I have a long long way to go with Cocoa. Especially if I want to get into Core Image and Quartz.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Here are a few more examples:&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;lt;style&gt;
#thumbs {
  text-align: center;
}
#thumbs a {
  padding: 8px;
}
#thumbs a img {
  border: none;
  display: inline;
}
&amp;lt;/style&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.yahoo.com&quot;&gt;&lt;img src=&quot;http://s3.amazonaws.com/webthumbs-dev/http---www-yahoo-com.1024.768.240.0.high.png&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.rubyonrails.org&quot;&gt;&lt;img src=&quot;http://s3.amazonaws.com/webthumbs-dev/http---www-rubyonrails-org.1024.768.240.0.high.png&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://slashdot.org&quot;&gt;&lt;img src=&quot;http://s3.amazonaws.com/webthumbs-dev/http---slashdot-org.1024.768.240.0.high.png&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.apple.com&quot;&gt;&lt;img src=&quot;http://s3.amazonaws.com/webthumbs-dev/http---www-apple-com.1024.768.240.0.high.png&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://makefile.com/">
    <author>
      <name>Scott</name>
    </author>
    <id>tag:makefile.com,2007-11-05:40</id>
    <published>2007-11-05T22:01:00Z</published>
    <updated>2007-11-06T07:36:55Z</updated>
    <category term="C &amp; C++"/>
    <category term="Ruby"/>
    <link href="http://makefile.com/my-top-5-why-oh-why-s-of-the-day" rel="alternate" type="text/html"/>
    <title>My Top 5 Why-oh-Why's of the Day</title>
<content type="html">
            &lt;p&gt;
  Just a few questions that I can't seem to find any answers for.
&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Why do people still use CVS or Subversion when there are tools like Darcs, Mercurial, or Git?&lt;/li&gt;
  &lt;li&gt;Why are people still developing in and for Windows?&lt;/li&gt;
  &lt;li&gt;Why are people still declaring variable types ahead of time?&lt;/li&gt;
  &lt;li&gt;Why isn't Objective-C more popular?&lt;/li&gt;
  &lt;li&gt;Why did I learn about S-expressions so late in life?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
  It's been a rough day. I hate trying to figure out how to get a project set up in Visual Studio when all you have are source files.
&lt;/p&gt;
&lt;p&gt;I'm aggravated at the fact that Subversion is such a piece of crap, but to use anything better you really have to get away from a crappy Windows command prompt and into something more useful, like csh or bash. The droppings left by Subversion in .svn directories (oops, sorry, they are _svn in Windows, WTF?) are super-duper annoying.&lt;/p&gt;
&lt;p&gt;I'm also tired of the excessive typing (pun intended) required to develop in C++ or C#. Why can't I just say &quot;x = y&quot; without declaring the type of x; if y is already known. Even worse, why do I have to write code like this (in C#):&lt;/p&gt;
&lt;p&gt;
&lt;blockquote&gt;
&lt;pre&gt;XmlDocument x &lt;span&gt;=&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; XmlDocument&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
x&lt;span&gt;.&lt;/span&gt;load&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;file.xml&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;

&lt;span&gt;foreach&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;XmlElement e &lt;span&gt;in&lt;/span&gt; x&lt;span&gt;.&lt;/span&gt;SelectNodes&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;//foo[@title='bar']&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; 
&lt;span&gt;{&lt;/span&gt;
    doSomethingUsefulWith&lt;span&gt;(&lt;/span&gt;e&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;When all I really need is this (in Ruby):&lt;/p&gt;
&lt;p&gt;
&lt;blockquote&gt;
&lt;pre&gt;x &lt;span&gt;=&lt;/span&gt; XmlDocument&lt;span&gt;.&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;
x&lt;span&gt;.&lt;/span&gt;&lt;span&gt;load&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;file.xml&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;

x&lt;span&gt;.&lt;/span&gt;&lt;span&gt;each&lt;/span&gt; &lt;span&gt;do&lt;/span&gt; |e| 
  doSoemthingUsefulWith&lt;span&gt;(&lt;/span&gt;e&lt;span&gt;)&lt;/span&gt; 
&lt;span&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;
I know, silly arguments. Especially since C# 3.0 brings in Linq and var and a whole slew of other new features to make it more tolerable.&lt;/p&gt;
&lt;p&gt;But you know what? You &lt;em&gt;still&lt;/em&gt; have to create a bloody class with a &lt;b&gt;public&lt;/b&gt; version of the &lt;b&gt;static&lt;/b&gt; method &lt;b&gt;main&lt;/b&gt; in order to execute. And you still have to wait for 3.0 to come out and stabilize. And then you have to pay for it if you want VS.NET. That's just not right. Yet people continue to pay for it. Suckers? Nah, they just wont listen.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://makefile.com/">
    <author>
      <name>Scott</name>
    </author>
    <id>tag:makefile.com,2007-10-31:39</id>
    <published>2007-10-31T20:38:00Z</published>
    <updated>2007-10-31T20:39:19Z</updated>
    <category term="General"/>
    <category term="Thinking Out Loud"/>
    <link href="http://makefile.com/right-on-brutha" rel="alternate" type="text/html"/>
    <title>Right on brutha!</title>
<content type="html">
            &lt;p&gt;
Is there any wonder why &lt;em&gt;young&lt;/em&gt; people are flocking to this guy?  He had it right in '88 and he still has it right today.&lt;/p&gt;
&lt;p&gt;
Bottom line: Keep it simple you morons.  Stop complicating our bloody lives.
&lt;/p&gt;
&lt;p&gt;
Watch and see:
&lt;/p&gt;
&lt;p&gt;
&amp;lt;object height=&quot;355&quot; width=&quot;425&quot;&gt;&amp;lt;param&gt;&amp;lt;/param&gt;&amp;lt;param&gt;&amp;lt;/param&gt;&amp;lt;embed src=&quot;http://www.youtube.com/v/I1EFHgUXZaU&amp;amp;rel=1&quot; height=&quot;355&quot; width=&quot;425&quot;&gt;&amp;lt;/embed&gt;&amp;lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;
P.S. I just have nothing interesting to talk about in the realm of growing software. So enjoy!
&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://makefile.com/">
    <author>
      <name>Scott</name>
    </author>
    <id>tag:makefile.com,2007-10-26:37</id>
    <published>2007-10-26T02:24:00Z</published>
    <updated>2007-10-26T02:25:51Z</updated>
    <category term="General"/>
    <category term="Thinking Out Loud"/>
    <link href="http://makefile.com/off" rel="alternate" type="text/html"/>
    <title>!Off</title>
<content type="html">
            &lt;p&gt;Sometimes you are just in a really crappy mood.&lt;/p&gt;
&lt;p&gt;And you just need something that makes it all make sense again:&lt;/p&gt;
&amp;lt;object height=&quot;355&quot; width=&quot;425&quot;&gt;&amp;lt;param&gt;&amp;lt;/param&gt;&amp;lt;param&gt;&amp;lt;/param&gt;&amp;lt;embed src=&quot;http://www.youtube.com/v/Q41eoZXDb64&amp;amp;rel=1&quot; height=&quot;355&quot; width=&quot;425&quot;&gt;&amp;lt;/embed&gt;&amp;lt;/object&gt;
          </content>  </entry>
  <entry xml:base="http://makefile.com/">
    <author>
      <name>Scott</name>
    </author>
    <id>tag:makefile.com,2007-07-06:36</id>
    <published>2007-07-06T02:01:00Z</published>
    <updated>2007-07-06T12:22:46Z</updated>
    <category term="General"/>
    <category term="Thinking Out Loud"/>
    <category term="douglas adams"/>
    <category term="forty-two"/>
    <category term="hitchhikers guide to the galaxy"/>
    <link href="http://makefile.com/mr-adams-you-are-correct-sir" rel="alternate" type="text/html"/>
    <title>Mr. Adams, you are CORRECT sir!</title>
<content type="html">
            &lt;p&gt;It appears Douglas Adams was right on the money.&lt;/p&gt;
&lt;p&gt;According to &lt;a href=&quot;http://www.theaustralian.news.com.au/story/0,20867,22025960-29677,00.html&quot;&gt;this article&lt;/a&gt;, the weight of life, the universe, and everything (well, almost) is 3x10^42.  That's the number three with 42 zeros after it.&lt;/p&gt;
&lt;p&gt;Rest in peace my friend.&lt;/p&gt;
&lt;p&gt;Fortunately for us the Vogon destructor fleet must've fallen asleep on their way to obliterate the earth for the new hyperspace bypass.  Whew.&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;And now for some Vogon Poetry...&lt;/b&gt;&lt;blockquote&gt;&lt;pre&gt;Oh freddled gruntbuggly,
Thy micturations are to me
As plurdled gabbleblotchits
On a lurgid bee.
Groop, I implore thee, my foonting turlingdromes
And hooptiously drangle me
With crinkly bindlewurdles,
Or I will rend thee in the gobberwarts with my blurglecruncheon,
See if I don't!&lt;/pre&gt;&lt;/blockquote&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://makefile.com/">
    <author>
      <name>Scott</name>
    </author>
    <id>tag:makefile.com,2006-12-30:32</id>
    <published>2006-12-30T04:23:00Z</published>
    <updated>2006-12-30T04:26:55Z</updated>
    <category term="Ruby"/>
    <category term="Thinking Out Loud"/>
    <category term="centos"/>
    <category term="rails"/>
    <category term="ruby"/>
    <category term="subversion"/>
    <category term="trac"/>
    <category term="virtuozzo"/>
    <link href="http://makefile.com/bootstrapping-ruby-on-rails-on-centos" rel="alternate" type="text/html"/>
    <title>Ruby on Rails on a CentOS Virtuozzo VPS</title>
<content type="html">
            &lt;p&gt;
I've done this at least a dozen times in &lt;a href=&quot;http://www.vmware.com&quot;&gt;VMware&lt;/a&gt;, &lt;a href=&quot;http://www.openvz.org&quot;&gt;OpenVZ&lt;/a&gt;, and &lt;a href=&quot;http://www.sw-soft.com&quot;&gt;Virtuozzo&lt;/a&gt; virtual servers.  Every time I do it I start from scratch.  It's silly.  This time I'm writing down the steps so I don't forget.
&lt;/p&gt;
&lt;h3&gt;Getting Started&lt;/h3&gt;
&lt;p&gt;
Let's start with a Virtuozzo powered VPS running a clean installation of &lt;a href=&quot;http://www.centos.org&quot;&gt;CentOS&lt;/a&gt; 4.4.  We begin by removing a few things that we just don't need right now.
&lt;ul&gt;
  &lt;li&gt;Fetchmail&lt;/li&gt;
  &lt;li&gt;SWSoft's Apache build&lt;/li&gt;
  &lt;li&gt;SWSoft's Sendmail build&lt;/li&gt;
  &lt;li&gt;The Pop3 server that we don't need&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;h4&gt;Remove what gets in the way&lt;/h4&gt;
&lt;p&gt;
&lt;blockquote&gt;&lt;pre&gt;rpm -e fetchmail hspc-wwwroot
rpm -qa | grep httpd | xargs rpm -e
rpm -qa | grep sendmail | xargs rpm -e
rpm -qa|grep ^apr|xargs rpm -e
rpm -e popa3d
service xinetd restart&lt;/pre&gt;&lt;/blockquote&gt;
&lt;/p&gt;
&lt;h4&gt;Install yum&lt;/h4&gt;
&lt;p&gt;
In the virtual server I am on right now, &lt;b&gt;yum&lt;/b&gt; is not installed.  Odd.  Let's install it:
&lt;blockquote&gt;&lt;pre&gt;rpm -i http://mirror.centos.org/centos/4.4/os/i386/CentOS/RPMS/yum-2.4.3-1.c4.noarch.rpm \
       http://mirror.centos.org/centos/4.4/os/i386/CentOS/RPMS/python-elementtree-1.2.6-4.2.1.i386.rpm \
       http://mirror.centos.org/centos/4.4/os/i386/CentOS/RPMS/python-sqlite-1.1.7-1.2.i386.rpm \
       http://mirror.centos.org/centos/4.4/os/i386/CentOS/RPMS/sqlite-3.3.3-1.2.i386.rpm \
       http://mirror.centos.org/centos/4.4/os/i386/CentOS/RPMS/sqlite-devel-3.3.3-1.2.i386.rpm \
       http://mirror.centos.org/centos/4.4/os/i386/CentOS/RPMS/python-urlgrabber-2.9.8-2.noarch.rpm&lt;/pre&gt;&lt;/blockquote&gt;
&lt;/p&gt;
&lt;h4&gt;The CentOS-4  Testing repository&lt;/h4&gt;
&lt;p&gt;
Now we want to add the c4-testing yum repository so we will install the latest &lt;a href=&quot;http://www.ruby-lang.org&quot;&gt;Ruby &lt;/a&gt; rpm's.  Or we can install from sources, but no point in doing that right now since c4-testing has Ruby 1.8.5.
&lt;blockquote&gt;&lt;pre&gt;cat &amp;lt;&amp;lt; EOF &gt; /etc/yum.repos.d/CentOS-Testing.repo
[c4-testing]
name=CentOS-4 Testing
baseurl=http://dev.centos.org/centos/\$releasever/testing/\$basearch/
enabled=1
gpgcheck=1
gpgkey=http://dev.centos.org/centos/RPM-GPG-KEY-CentOS-testing
EOF
yum -y update&lt;/pre&gt;&lt;/blockquote&gt;
&lt;/p&gt;
&lt;h3&gt;Install Ruby, and Rails&lt;/h3&gt;
&lt;p&gt;
As mentioned previously, you can install Ruby from sources or use the RPM provided in the CentOS repository.  I use the CentOS built Ruby simply because it's already at the latest version (1.8.5 at this time) and it saves a little time.
&lt;/p&gt;
&lt;h4&gt;Ruby&lt;/h4&gt;
&lt;p&gt;
&lt;blockquote&gt;&lt;pre&gt;yum install -y ruby ruby-libs ruby-devel ruby-rdoc ruby-irb ruby-ri&lt;/pre&gt;&lt;/blockquote&gt;
&lt;/p&gt;
&lt;h4&gt;Ruby Gems&lt;/h4&gt;
&lt;p&gt;
&lt;blockquote&gt;&lt;pre&gt;wget http://rubyforge.org/frs/download.php/11289/rubygems-0.9.0.tgz
tar zxf rubygems-0.9.0.tgz
cd rubygems-0.9.0
ruby setup.rb&lt;/pre&gt;&lt;/blockquote&gt;
&lt;/p&gt;
&lt;h4&gt;Rails, Mongrel, and Sqlite3-ruby&lt;/h4&gt;
&lt;p&gt;
Rails, mongrel, and sqlite3-ruby:
&lt;blockquote&gt;&lt;pre&gt;gem install -y rails
gem install -y mongrel
gem install -y sqlite3-ruby&lt;/pre&gt;&lt;/blockquote&gt;
&lt;h3&gt;Apache and Subversion&lt;/h3&gt;
&lt;p&gt;
And now we get to the tougher stuff.  We need subversion if we plan to freeze_edge, which I always do during development.  I also like to use &lt;a href=&quot;http://trac.edgewall.org/&quot;&gt;Trac&lt;/a&gt;.  We wont cover the installation of Trac today, but we'll make sure our environment is Trac friendly.  More on that another time perhaps.
&lt;/p&gt;
&lt;p&gt;
So let's get prepared for Subversion.  We'll need the following items installed before we can build it the way we need it:
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.apache.org&quot;&gt;Apache&lt;/a&gt; Portable Runtime (&lt;a href=&quot;http://apr.apache.org&quot;&gt;apr, apr-util&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;The Apache &lt;a href=&quot;http://httpd.apache.org&quot;&gt;Web Server&lt;/a&gt; (httpd)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.webdav.org/neon&quot;&gt;Neon&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.swig.org&quot;&gt;SWIG&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;h4&gt;apr&lt;/h4&gt;
&lt;p&gt;
Starting with apr and apr-util, we need to download, configure, build, and install from sources:
&lt;blockquote&gt;&lt;pre&gt;wget http://www.ip97.com/apache.org/apr/apr-1.2.8.tar.bz2
bzip2 -dc apr-1.2.8.tar.bz2 | tar xf -
cd apr-1.2.8
./configure &amp;&amp; make &amp;&amp; make install&lt;/pre&gt;&lt;/blockquote&gt;
&lt;/p&gt;
&lt;h4&gt;apr-util&lt;/h4&gt;
&lt;p&gt;
&lt;blockquote&gt;&lt;pre&gt;wget http://www.ip97.com/apache.org/apr/apr-util-1.2.8.tar.bz2
bzip2 -dc apr-util-1.2.8.tar.bz2 | tar xf -
cd apr-util-1.2.8
./configure --with-berkeley-db --with-apr=/usr/local/apr/bin/apr-1-config &amp;&amp; make &amp;&amp; make install&lt;/pre&gt;&lt;/blockquote&gt;
&lt;/p&gt;
&lt;h4&gt;Apache Web Server&lt;/h4&gt;
&lt;p&gt;
&lt;blockquote&gt;&lt;pre&gt;wget http://apache.downlod.in/httpd/httpd-2.2.3.tar.bz2
bzip2 -dc httpd-2.2.3.tar.bz2 | tar xf -
cd httpd-2.2.3
./configure -C \
            --prefix=/usr/local \
            --with-apr=/usr/local/apr/bin/apr-1-config \
            --with-apr-util=/usr/local/apr/bin/apu-1-config \
            --datadir=/var/www/home \
            --sysconfdir=/etc/httpd/conf \
            --enable-dav \
            --enable-suexec --with-suexec \
            --with-suexec-caller=apache \
            --with-suexec-docroot=/var/www \
            --with-suexec-logfile=/var/log/httpd/suexec.log \
            --with-suexec-bin=%{_sbindir}/suexec \
            --with-suexec-uidmin=500 --with-suexec-gidmin=500 \
            --with-devrandom \
            --enable-cache --enable-disk-cache --enable-mem-cache --enable-file-cache \
            --enable-ssl --with-ssl \
            --enable-deflate --enable-cgid \
            --enable-proxy --enable-proxy-connect \
            --enable-proxy-http --enable-proxy-ftp \
            --enable-proxy-balance &amp;&amp; make &amp;&amp; make install&lt;/pre&gt;&lt;/blockquote&gt;
&lt;/p&gt;
&lt;h4&gt;Neon&lt;/h4&gt;
&lt;p&gt;
&lt;blockquote&gt;&lt;pre&gt;wget http://www.webdav.org/neon/neon-0.25.5.tar.gz
tar zxf neon-0.25.5.tar.gz
cd neon-0.25.5
./configure --with-ssl=openssl &amp;&amp; make &amp;&amp; make install&lt;/pre&gt;&lt;/blockquote&gt;
&lt;/p&gt;
&lt;h4&gt;SWIG&lt;/h4&gt;
&lt;p&gt;
&lt;blockquote&gt;&lt;pre&gt;wget http://prdownloads.sourceforge.net/swig/swig-1.3.31.tar.gz
tar zxf swig-1.3.31.tar.gz
cd swig-1.3.31
./configure &amp;&amp; make &amp;&amp; make install&lt;/pre&gt;&lt;/blockquote&gt;
&lt;/p&gt;
&lt;h4&gt;Subversion&lt;/h4&gt;
&lt;p&gt;
&lt;blockquote&gt;&lt;pre&gt;wget http://subversion.tigris.org/downloads/subversion-1.4.2.tar.bz2
bzip2 -dc subversion-1.4.2.tar.bz2 | tar xf -
cd subversion-1.4.2
./configure --with-apxs=/usr/local/bin/apxs \
            --with-swig=/usr/local \
            --with-ssl \
            --with-neon=/usr/local \
            --with-apr=/usr/local/apr/bin \
            --with-apr-util=/usr/local/apr &amp;&amp; make &amp;&amp; make install&lt;/pre&gt;&lt;/blockquote&gt;
&lt;/p&gt;
&lt;h3&gt;Good to go&lt;/h3&gt;
&lt;p&gt;
At this point we're good to go.  I usually install Vim7 right about now because I prefer to do all my coding in vi.  CentOS 4 only has Vim6;  Vim7 has newer rhtml and rb syntax files.  Adding PostgreSQL or MySQL will complete your stack for a production environment.  Sqlite3 is great for getting the ball rolling.  Now it's time to be a &lt;a href=&quot;http://www.thomasandfriends.com/usa/thomas_the_tank_official_us_website_intro.htm&quot;&gt;Really Useful Engine&lt;/a&gt; and get working on your shiny new &lt;a href=&quot;http://www.rubyonrails.org&quot;&gt;Rails&lt;/a&gt; app.
&lt;/p&gt;
&lt;p&gt;
Good luck!
&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://makefile.com/">
    <author>
      <name>Scott</name>
    </author>
    <id>tag:makefile.com,2006-12-18:30</id>
    <published>2006-12-18T03:13:00Z</published>
    <updated>2006-12-18T15:56:21Z</updated>
    <category term="C &amp; C++"/>
    <category term="c"/>
    <category term="code"/>
    <category term="subversion"/>
    <link href="http://makefile.com/subversion-and-those-annoying-svn-directories" rel="alternate" type="text/html"/>
    <title>Subversion and those annoying .svn directories.</title>
<content type="html">
            &lt;p&gt;
Nearly a year ago I wrote about a &lt;a href=&quot;http://www.makefile.com/2006/2/26/a-load-bearing-kludge&quot;&gt;Load-Bearing Kludge&lt;/a&gt;.   In that article I talked about how we implemented a work-around for getting rid of those pesky .svn directories that &lt;a href=&quot;http://subversion.tigris.org&quot;&gt;Subversion&lt;/a&gt; uses for meta-data.   The solution wasn't to get around them, but to relocate them.  To do this I had to create a shared library that intercepted and decorated a few low-level C library functions like open, fopen, unlink, and a few others.
&lt;/p&gt;
&lt;p&gt;
Since that article last February I've received quite a few requests for the source code that did this.  It isn't anything spectacular and in fact the code was abandoned for a much better solution of not using Subversion at all.  At any rate, I just received approval from &lt;a href=&quot;http://engineering.site5.com/developers/show/1&quot;&gt;Matt Lightner&lt;/a&gt;, the CEO of &lt;a href=&quot;http://www.site5.com&quot;&gt;Site5&lt;/a&gt; to go ahead and give it away.  So here it is.
&lt;/p&gt;
&lt;h3&gt;The code&lt;/h3&gt;
&lt;p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://www.makefile.com/assets/2006/12/18/fix_dotsvn.c&quot;&gt;fix_dotsvn.c&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://www.makefile.com/assets/2006/12/18/Makefile&quot;&gt;Makefile&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/p&gt;
&lt;h3&gt;Build it&lt;/h3&gt;
&lt;p&gt;
The provided Makefile is the simplest of Makefiles.  It knows how to build the .so, only using gcc.  AFAIK this code will not easily work on Windows.&lt;/p&gt;
&lt;p&gt;
Just copy the fix_dotsvn.c and Makefile into a directory and run make.  This should create fix_dotsvn.so.
&lt;/p&gt;
&lt;h3&gt;Use it&lt;/h3&gt;
&lt;p&gt;
fix_dotsvn.so will reroute all &quot;.svn&quot; directory access to whatever directory specified in the environment variable &quot;DOT_SVN_PREFIX&quot;, which defaults to &quot;/backup/svn_home&quot;. Change it to wherever you would like to reroute your .svn's.
&lt;/p&gt;
&lt;p&gt;
To load it, set your LD_PRELOAD environment variable to /path/to/fix_dotsvn.so before running the svn command.  Example:
&lt;code&gt;
  $ LD_PRELOAD=/path/to/fix_dotsvn.so svn update
&lt;/code&gt;
&lt;/p&gt;
&lt;h3&gt;That's all folks&lt;/h3&gt;
&lt;p&gt;
That's really all there is to it.  It worked perfectly while we used it.
&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://makefile.com/">
    <author>
      <name>Scott</name>
    </author>
    <id>tag:makefile.com,2006-12-13:26</id>
    <published>2006-12-13T19:05:00Z</published>
    <updated>2006-12-13T19:11:05Z</updated>
    <category term="General"/>
    <category term="Thinking Out Loud"/>
    <category term="oops"/>
    <link href="http://makefile.com/flamethrowers" rel="alternate" type="text/html"/>
    <title>Flamethrowers</title>
<content type="html">
            &lt;blockquote&gt;
&lt;p&gt;
&lt;em&gt;
Think for a moment about the concept of the flamethrower. Okay? The flamethrower. Because we have them. Well, *we* don't have them, the army has them. That's right. We don't have any flamethrowers. I'd say we're fucked if we have to go up against the army, wouldn't you? But we have flamethrowers. And what this indicates to me, it means that at some point, some person said to himself, &quot;Gee, I sure would like to set those people on fire over there. But I'm way to far away to get the job done. If only I had something that would throw flame on them.&quot; Well, it might have ended right there, but he mentioned it to his friend. His friend who was good with tools. And about a month later, he was back. &quot;Hey, quite a concept!&quot; WHHOOOOOOOOSSHHH! And of course the army heard about it, and they came around. &quot;We'd like to buy about five hundred-thousand of them please. We have some people we'd like to throw flame on. Give us five hundred thousand and paint them dark brown. We don't want anyone to see them.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;- George Carlin, 1984&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;s/people/code/g&lt;/h4&gt;
&lt;p&gt;So I'm stuck.  I have to fix an application that was born broken.  I mean the architecture, the design, the implementation, all of it.  Broken.  What does work works entirely by accident.&lt;/p&gt;
&lt;p&gt;The application is a web application.  Written for the ASP.NET platform with C# underpinnings.  Not an entirely bad choice of platforms.  Until you start looking under the hood.  It's a procedural mess wrapped up in pseudo classes that act as nothing more than namespaces.  Exceptions are silently absorbed and rarely managed.  The so-called data access layer is nothing short of frightening.&lt;/p&gt;
&lt;p&gt;The worst part?  It's something that I helped build several years ago.  I hold my head in shame.  Kind of.  In fact, several years ago I birthed a framework using ASP.NET and C# that I called &quot;Epicenter.&quot;  Epicenter was an ultra thin implementation of the Apache &lt;a href=&quot;http://cocoon.apache.org/&quot;&gt;Cocoon&lt;/a&gt; framework that used XML quite liberally to define application flow and data access and used XSLT for rendering XHTML output.  It was neat but it wasn't mature enough to be used in a production environment.  Sso the choice was made to use the standard ASP.NET WebForms. I got frustrated and have long since lost the code for Epicenter.  If this were on fark, I'd clearly deserve the Dumbass tag.&lt;/p&gt;
&lt;p&gt;All I can say about this today is:  &lt;em&gt;Ooops, where's that bloody flamethrower?&lt;/em&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://makefile.com/">
    <author>
      <name>Scott</name>
    </author>
    <id>tag:makefile.com,2006-11-02:16</id>
    <published>2006-11-02T03:00:00Z</published>
    <updated>2006-11-02T03:17:27Z</updated>
    <category term="projects"/>
    <link href="http://makefile.com/personal-projects" rel="alternate" type="text/html"/>
    <title>Personal Projects</title>
<content type="html">
            &lt;p&gt;
I always seem to be meddling with one thing or another.  More often than not I end up throwing away whatever it is I am working on because, well, I'm not all that interested in the final product.  I'm more interested in the intellectual challenge or learning something.  Occasionally though I really do build something useful, and then I end up throwing it away for no good reason at all.
&lt;/p&gt;
&lt;p&gt;
It's time to stop doing that.  Start keeping my projects online so they never get totally lost.  So look up.  There's a new &lt;a href=&quot;/projects&quot;&gt;Projects&lt;/a&gt; tab up there.  Watch it.  See what I've done or am doing.  It could be boring, or it could be fun.  It could be useful or it could be totally useless.  Who knows?  You certainly wont unless you watch.
&lt;/p&gt;
          </content>  </entry>
</feed>
