<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3082589280007776602</id><updated>2011-12-23T00:37:54.838-08:00</updated><category term='ruby'/><category term='time capsule'/><category term='astronomy'/><category term='vi'/><category term='mysql'/><category term='jesus'/><category term='cache'/><category term='feminism'/><category term='svn:ignore'/><category term='sierra on-line'/><category term='vim git find'/><category term='import'/><category term='christmas'/><category term='games'/><category term='os x'/><category term='oop'/><category term='textmate'/><category term='iMovie'/><category term='tinytext'/><category term='roomba'/><category term='literature'/><category term='pair programming'/><category term='rspec'/><category term='ruby on rails'/><category term='prince of persia'/><category term='git'/><category term='gem'/><category term='helper'/><category term='rails'/><category term='pivotal'/><category term='video'/><category term='macvim'/><category term='vim'/><category term='project'/><category term='mint'/><category term='c++'/><category term='orson welles'/><category term='blogs'/><category term='aptana'/><category term='svn'/><category term='subversion'/><title type='text'>Things I googled for but didn't find</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Mark Wilden</name><uri>http://www.blogger.com/profile/12466799858988018090</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>30</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-4362175315395993142</id><published>2011-03-29T13:22:00.000-07:00</published><updated>2011-03-29T13:22:26.306-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim git find'/><title type='text'>How to list all filenames except those in git repositories</title><content type='html'>I wanted to see the names of all Vim source files in my &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;~/.vim&lt;/span&gt; directory. Because I use pathogen and submodules, there are a lot of &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;.git&lt;/span&gt; directories under there, and I didn't want to list those. So I learned how to use the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;find&lt;/span&gt; command's 'not' operator, and it was easy:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;find . \! -path "*.git*"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;If you're curious, the reason I wanted to do this was to see if Vim authors typically use dashes or underscores to separate words in filenames. &lt;/span&gt;The answer: dashes (usually).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-4362175315395993142?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/4362175315395993142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=4362175315395993142' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/4362175315395993142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/4362175315395993142'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2011/03/how-to-list-all-filenames-except-those.html' title='How to list all filenames except those in git repositories'/><author><name>Mark Wilden</name><uri>http://www.blogger.com/profile/07153901140004937121</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://2.bp.blogspot.com/_yxWAn7EZVVw/SZCRYVuSluI/AAAAAAAAABE/lAITHBIT3p8/S220/mark+looking+up.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-4349100505088858255</id><published>2011-01-15T21:10:00.000-08:00</published><updated>2011-01-15T21:11:09.787-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='roomba'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='mint'/><title type='text'>Your product is not as important to us as it is to you</title><content type='html'>I own a &lt;a href="http://mintcleaner.com/"&gt;Mint&lt;/a&gt;. Is that a stupid name, or what? Especially when there's another hot &lt;a href="http://www.mint.com/"&gt;product&lt;/a&gt; by that name which predates it. There's no way Mint will ever achieve the brand loyalty of Roomba, because its aficionados don't have a special word to use. I own a Mint. What's that??&lt;br /&gt;&lt;br /&gt;A Mint is a Roomba for swiffing hard floors. And it's a great gadget, if pricey ($250). It quietly goes about its business, using a fixed infrared navigation beacon to build a map of your floor, chairs, stairs and other obstacles while it swiffs up the dust and cat hair. I really love it.&lt;br /&gt;&lt;br /&gt;The other day, the power went out. And the Mint, which was recharging, went berserk. It started beeping and flashing its lights in a realistic display of a machine frightened out of its wits. "I'm without power! Saaaaaave me!!!"&lt;br /&gt;&lt;br /&gt;Because, of course, in a major power outage, my first concern is whether my cleaning robot has enough charge left to swiff the bathroom.&lt;br /&gt;&lt;br /&gt;This behavior obviously made sense to the machine's designers. They reasoned that if you were recharging your Mint, you'd want to know if that function failed. But imagine if all rechargeable appliances behaved this way. You'd go around from appliance to appliance, calming them down, unplugging their chargers, whispering reassuring words...&lt;br /&gt;&lt;br /&gt;How does a design flaw like this happen? My belief it's because of the tunnel vision caused&amp;nbsp; by working day and night on a product, putting your heart and soul into it. To you, it's the most important thing in the world. So you tend to forget that for other people, it's just a minor aid to keeping floors clean. It's just not that important to us.&lt;br /&gt;&lt;br /&gt;But that's not what prompted this blog post.&lt;br /&gt;&lt;br /&gt;It was this:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_yxWAn7EZVVw/TTJ5cOCkY4I/AAAAAAAAAC0/-eZUF3edwjc/s1600/Screen+shot+2011-01-15+at+8.3702+++Sat+1-15-11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_yxWAn7EZVVw/TTJ5cOCkY4I/AAAAAAAAAC0/-eZUF3edwjc/s320/Screen+shot+2011-01-15+at+8.3702+++Sat+1-15-11.png" width="269" /&gt;&lt;/a&gt;&lt;/div&gt;This is the output from a Ruby on Rails upgrade tool. It checks your project to see what you might need to change to upgrade it from Rails 2 to Rails 3. An excellent utility.&lt;br /&gt;&lt;br /&gt;But you can see that its designers too got caught up in the importance of their own work. If a message is important, why, let's display it in red! If it's less important, a subtle grey is best. And then let's use two more colors for other categories of information.&lt;br /&gt;&lt;br /&gt;This is the equivalent of using &amp;lt;blink&amp;gt; on an HTML page. Dudes, it's a commandline console. We're not playing Nethack here. We can read simple black and white. But we &lt;i&gt;can't&lt;/i&gt; read this because &lt;i&gt;it assumes it's being run on a terminal with a black background!&lt;/i&gt; (It doesn't look any more attractive on such a terminal, but at least you can see what it says).&lt;br /&gt;&lt;br /&gt;This mistake by the utility's designers arises, I think, from the same sense of the work product's self-importance shown in the Mint. In both cases, they were so focused on making their product useful that they didn't take a step back to consider it in the context of all the other products out there, of which their baby is just one.&lt;br /&gt;&lt;br /&gt;Remember, it may be the most important thing in your life while you're working on it. But it's not the most important thing in our life.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-4349100505088858255?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/4349100505088858255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=4349100505088858255' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/4349100505088858255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/4349100505088858255'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2011/01/i-own-mint.html' title='Your product is not as important to us as it is to you'/><author><name>Mark Wilden</name><uri>http://www.blogger.com/profile/07153901140004937121</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://2.bp.blogspot.com/_yxWAn7EZVVw/SZCRYVuSluI/AAAAAAAAABE/lAITHBIT3p8/S220/mark+looking+up.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_yxWAn7EZVVw/TTJ5cOCkY4I/AAAAAAAAAC0/-eZUF3edwjc/s72-c/Screen+shot+2011-01-15+at+8.3702+++Sat+1-15-11.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-4326939292175141592</id><published>2010-12-05T13:17:00.000-08:00</published><updated>2010-12-07T14:48:43.637-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pair programming'/><title type='text'>Why I love solo programming (and why I hated working for Pivotal)</title><content type='html'>About a year ago, I wrote a post about &lt;a href="http://mwilden.blogspot.com/2009/11/why-i-dont-like-pair-programming-and.html"&gt;why I don't like pair programming (and why I left Pivotal)&lt;/a&gt;. This is the flip side.&lt;br /&gt;&lt;br /&gt;I've been working for the &lt;a href="http://www.calacademy.org/"&gt;California Academy of Sciences&lt;/a&gt;&amp;nbsp;for the past five months. I'm creating an NSF-funded website for ant taxonomists: &lt;a href="http://antcat.org/"&gt;antcat.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It's the best job I've ever had in 25 years as a programmer.&lt;br /&gt;&lt;br /&gt;There are a number of reasons: I get to work at a museum where I can go and look at amazing fish, lizards, and butterflies every day, on a greenfield application in Rails, for an intelligent and easy-going boss, for an audience of scientists, in Golden Gate Park, ten minutes from my house. The pay is "only" 100K, which is less than I've made in quite a few years. But there's health insurance, and I get to work the tidepool exhibit a couple of times a week.&lt;br /&gt;&lt;br /&gt;But the #1 plus is that I work alone.&lt;br /&gt;&lt;br /&gt;I'm not proud of enjoying this so much. I'd much prefer it if I liked being part of a vibrant and innovative team - even pairing with them. But I don't.&lt;br /&gt;&lt;br /&gt;Quite simply, at this job I get to do things the way I want. That means 95% test-driven. It means agile - doing the simplest thing that could possibly work. It means adding Solr when I want. It means really learning Javascript for the first time. It means applying the lessons learned over a quarter of a century of experience in my field. And it means not having to argue about it.&lt;br /&gt;&lt;br /&gt;Maybe it's just been my bad luck, but I've never seemed to have worked with people who share my views on lean development, agile methodology, OOP, database design, or even structured programming. Views &amp;nbsp;I've learned from reading people like Martin Fowler and Kent Beck. Obvious things that these guys just take for granted, like avoiding premature optimization, or following the single responsiblity principle.&lt;br /&gt;&lt;br /&gt;So my interaction with my fellow developers has always seemed to involve a lot of arguing. I've become much more diplomatic and polite over the years, and I'm much quicker to concede a point (after all, I might be wrong). But there comes a point where you get tired of being the OOP "purist" (I'm not). You just want to do it right.&lt;br /&gt;&lt;br /&gt;Now, I'm very aware of what I'm missing out on by working alone. My way may not in fact be right. I might not learn about other ways that I would end up embracing. I no doubt create more bugs. I sometimes make bad design decisions that cost me time. All these things would be tempered by working in a team, including pairing. And as far as pairing is concerned, I know for a fact that I'm not as productive as when I pair-programmed at Pivotal. We got some amazing results, just chugging through the feature list. The only problem is that I hated it.&lt;br /&gt;&lt;br /&gt;I also know that I seem to be arguing for the "cowboy coder" style of development. These guys are a real pain to deal with on a team. But what if there's no team?&lt;br /&gt;&lt;br /&gt;I know too that you'll hear this argument more frequently from members of my generation than the young pups who grew up on agile methods. All I can say is that I do tend to embrace the more leading-edge ideas - OOP in 1989, TDD in 2000, lean today. That's been the cause of many of my disagreements!&lt;br /&gt;&lt;br /&gt;When it comes down to it, I believe that the only intelligent criterion for behavior is happiness. The only reason for a person to do something is because it makes them happy (in the long or short term). &lt;br /&gt;&lt;br /&gt;The bottom line is that this way makes me happy.&lt;br /&gt;&lt;br /&gt;FOLLOWUP: There are a couple of things I mentioned in the original post that might have been missed if you just read this one: 1) I think pair programming is a great way of doing software development (just not for me), and 2) Pivotal Labs is an awesome place to work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-4326939292175141592?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/4326939292175141592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=4326939292175141592' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/4326939292175141592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/4326939292175141592'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2010/12/why-i-love-solo-programming-and-why-i.html' title='Why I love solo programming (and why I hated working for Pivotal)'/><author><name>Mark Wilden</name><uri>http://www.blogger.com/profile/07153901140004937121</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://2.bp.blogspot.com/_yxWAn7EZVVw/SZCRYVuSluI/AAAAAAAAABE/lAITHBIT3p8/S220/mark+looking+up.jpg'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-9022963061230150358</id><published>2010-12-04T16:32:00.000-08:00</published><updated>2010-12-04T16:32:56.924-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><title type='text'>Two modifiers in one statement (Ruby)</title><content type='html'>I never tried this before, but I like it:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;return if shows.empty? unless show_if_empty&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-9022963061230150358?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/9022963061230150358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=9022963061230150358' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/9022963061230150358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/9022963061230150358'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2010/12/two-modifiers-in-one-statement-ruby.html' title='Two modifiers in one statement (Ruby)'/><author><name>Mark Wilden</name><uri>http://www.blogger.com/profile/07153901140004937121</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://2.bp.blogspot.com/_yxWAn7EZVVw/SZCRYVuSluI/AAAAAAAAABE/lAITHBIT3p8/S220/mark+looking+up.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-6354400743217361759</id><published>2010-11-23T11:53:00.000-08:00</published><updated>2010-11-23T11:54:30.855-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><title type='text'>Beware of RSpec's before :all</title><content type='html'>When you add data in an RSpec &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;before :all&lt;/span&gt;, it's not inside the transactions RSpec places around each test. &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;rake spec&lt;/span&gt; clears the database before running all the specs, but the data created in&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; before :all&lt;/span&gt; will hang around after it runs. This introduces an order dependency between specs. A spec that assumes the database (or one table) is empty will run fine if it runs before the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;before :all&lt;/span&gt;, but can fail if it runs after. Your specs can start failing just because you reorganized them, which changed their run order.&lt;br /&gt;&lt;br /&gt;I've been bitten by this three or four times. The moral is to not create data in a &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;before :all&lt;/span&gt; if other code assumes that data isn't there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-6354400743217361759?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/6354400743217361759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=6354400743217361759' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/6354400743217361759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/6354400743217361759'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2010/11/beware-of-rspecs-before-all.html' title='Beware of RSpec&apos;s before :all'/><author><name>Mark Wilden</name><uri>http://www.blogger.com/profile/07153901140004937121</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://2.bp.blogspot.com/_yxWAn7EZVVw/SZCRYVuSluI/AAAAAAAAABE/lAITHBIT3p8/S220/mark+looking+up.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-3050159447938908558</id><published>2010-08-08T11:14:00.000-07:00</published><updated>2010-08-08T11:14:13.706-07:00</updated><title type='text'>Code gets cut off in blog posts</title><content type='html'>When you put code inside &lt;code&gt;&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&lt;/code&gt; in a Blogger post, if it's too wide for its column, the excess just gets cut off. The solution is to use &lt;code&gt;&amp;lt;pre style="overflow: auto;"&amp;gt;&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-3050159447938908558?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/3050159447938908558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=3050159447938908558' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/3050159447938908558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/3050159447938908558'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2010/08/code-gets-cut-off-in-blog-posts.html' title='Code gets cut off in blog posts'/><author><name>Mark Wilden</name><uri>http://www.blogger.com/profile/07153901140004937121</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://2.bp.blogspot.com/_yxWAn7EZVVw/SZCRYVuSluI/AAAAAAAAABE/lAITHBIT3p8/S220/mark+looking+up.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-2305355261080993467</id><published>2009-12-26T10:20:00.000-08:00</published><updated>2009-12-27T10:38:59.612-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jesus'/><category scheme='http://www.blogger.com/atom/ns#' term='christmas'/><category scheme='http://www.blogger.com/atom/ns#' term='astronomy'/><title type='text'>The Hidden Meaning of Christmas?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_yxWAn7EZVVw/SzZdEVEiEHI/AAAAAAAAABw/-OdeRg3gyrE/s1600-h/sunrise-xmas-jerusalem-300ad.%230"&gt;&lt;/a&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/n2M8NWjcBQo&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/n2M8NWjcBQo&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div&gt;This video purports to show that stories of the birth and death of Jesus Christ were based on astronomical events. I was not convinced.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;The first tip-off is when the narrator says "Sirius...on Dec 24th aligns with the three brightest stars in Orion's belt." Stars don't line up with each other on particular days of the year. They are fixed (for all intents and purposes). There's nothing special about Dec 24th. Also, the stars in Orion's Belt don't point directly to Sirius, as the video implies.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The narrator then says that Orion's Belt and Sirius point to the rising sun on that day. This is just not true. The image below shows the relation of these bodies at sunrise on Dec 24, 300AD (around the time when the Christmas myth was created) at Jerusalem. The image is not substantially different on Dec 25, or even in the year 2009.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(85, 26, 139); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://4.bp.blogspot.com/_yxWAn7EZVVw/SzZdEVEiEHI/AAAAAAAAABw/-OdeRg3gyrE/s320/sunrise-xmas-jerusalem-300ad.%230" border="0" alt="" id="BLOGGER_PHOTO_ID_5419621530543984754" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 320px; height: 242px; " /&gt;&lt;/span&gt;&lt;div&gt;&lt;div&gt;Sirius and Orion's Belt on the right clearly point nowhere near the Sun on the left.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The other main inaccuracy of the video (which is in fact its entire point) is that on Dec 25 the Sun rises in Crux, the Southern Cross. Apart from the fact that Crux is hard to see from the Northern Hemisphere, the image shows that the Sun is nowhere near the Southern Cross (center) at that time.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-2305355261080993467?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/2305355261080993467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=2305355261080993467' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/2305355261080993467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/2305355261080993467'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2009/12/hidden-meaning-of-christmas.html' title='The Hidden Meaning of Christmas?'/><author><name>Mark Wilden</name><uri>http://www.blogger.com/profile/07153901140004937121</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://2.bp.blogspot.com/_yxWAn7EZVVw/SZCRYVuSluI/AAAAAAAAABE/lAITHBIT3p8/S220/mark+looking+up.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_yxWAn7EZVVw/SzZdEVEiEHI/AAAAAAAAABw/-OdeRg3gyrE/s72-c/sunrise-xmas-jerusalem-300ad.%230' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-1660901924314214778</id><published>2009-12-07T19:40:00.000-08:00</published><updated>2009-12-07T19:44:25.907-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pivotal'/><category scheme='http://www.blogger.com/atom/ns#' term='pair programming'/><title type='text'>Why I Don't Like Pair Programming (and Why I Left Pivotal)</title><content type='html'>&lt;div&gt;First, I want to say that I think pair programming is fine - for other people. Based on pairing fulltime for a month at Pivotal Labs, I've been exposed to both its good side and its bad side.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First, the good side. I think the production of good code with two people working together is greater than with two people working apart. It's not hugely greater. The pair has to generate twice as much code as one programmer just to break even. That's helped by the fact that pairing forces you to spend the day programming instead of goofing off.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But where pairing wins is the "good code" part. From my experience, stupid little bugs (which accounts for the great majority of bugs) are caught much more frequently at coding time. That's a big win.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also think that there is way less "bad code" produced. "Bad code" can happen when someone makes the wrong design choice and spends time going down a rathole patching and fixing the code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Those are the good parts of pair programming. I've no doubt left out others. Now for the bad parts.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When you pair program, you're effectively joined at the hip with your pair. You can't pair if only one of you is there. This means that you both come into work at the same time, you both take lunch at the same time, you both take breaks at the same time, and you both leave at the same time. The work is so concentrated that you work 8-hour days (which is good). But you can't take time off without affecting your pair. Working from home is possible, but it's obviously not as pairy as sitting beside one another. This is an aspect of pair programming I hadn't considered until I tried it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You have to be able to think out loud - 8 hours a day. Then you have to type in code while someone is watching you. They'll catch your typos (hopefully after giving you a chance to spot them yourself) and they'll see when you're floundering for how to do something. This turned out to be my own personal biggest problem with pair programming. When I was at the keyboard, I got dumber. It could be simple nervousness, or it could be that gaps were being exposed in my knowledge - gaps I felt shouldn't exist. Either way, I was not comfortable, and I was definitely less productive than if I were on my own. This is a personal reaction. I don't consider it a failing of pair programming, but a failing of me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I may have been able to work through this handicap. I certainly learned more in one day than in a whole week of solo programming. And there might have come a time when I was comfortable programming in front of other people. But there was an even bigger problem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pair programming doesn't encourage quiet reflection and exploration. You can't just sit back and read some code. You can't just sit and think. I mean, you &lt;i&gt;can&lt;/i&gt;, but then your pair is just sitting there. If you both agree that such contemplation is necessary, that's fine, but what if your pair is perfectly happy with an existing way? You don't want to waste their time. You don't want to argue (unless the other person wants to as well). You give in more often than if you were working alone.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This can be a good thing. When each of you have veto power, that reduces the chance of bad design. However, I think it also reduces the chance of truly innovative design (unless you both agree to explore it).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;An example might help. We needed to display a graph of the relationship between entities. The models contained the names of the entities and the names of their relationships. The graphing "little language" needed to be generated for each entity and relationship. My pair's idea was to give each model a method to generate the graphing code. I felt that graphing code was for viewing the models - not part of the models themselves. I proposed a Presenter to translate models into views. This certainly sounds more complicated than putting the code in the models, which is what what my pair wanted to do, and so that's what we did.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The design was perfectly workable, but it lead to its own complications as the work progressed. For example, when you click on a node, that node becomes selected. In order for the model to create the graphing code for it, it has to know which node is selected. This meant adding a 'selected_node' parameter to each call to the model graphing code. That wouldn't have been necessary using a Presenter who was in charge of graphing the model tree.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There were other small problems, and I believe more problems would be found as we worked with the code. The reason is because we were violating MVC.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I made this point to my pair (who was an extremely intelligent guy), but he disagreed, so we did without a Presenter. Big deal, right? But when you multiply that scenario by ten or twenty, you'll get some idea of my experience working with pair programming.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;TDD? Well, we do it when it's easy. It's not worth testing views, after all. And what difference does it make whether you test before or after you write the code, anyway? Database normalization makes things too slow. MVC requires writing additional classes. Cucumber is only valuable when clients write features. Fixtures are faster than factories and mocking.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;These were the sorts of issues that came up during my one month of pairing. And I lost on every point. That, to me, is the greatest drawback to pair programming (at least when I'm doing it). You just want to get the story done. Innovation can be stifled. Programming according to generally recognized principles is cast aside, as long as one of the pairs (especially the dominant one) "doesn't see the need" for it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And that's the kind of stuff I'm good at. I reckon that 95% of my code over the last 10 years has been written in response to a failing test. I keep view code out of models (and vice versa). I program from the UI in, because I think what happens on the screen and the keyboard is the only truly important part of an application (everything else is implementation details). My database tables are in third normal form. I believe I write well-factored code that is simple because it puts responsibility in the right place. Of course, I know there are exceptions to every one of the preceding principles. But you start by doing it "right."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So that's why I don't like pair programming. My weaknesses are exaggerated and my strengths are vetoed. For me, pairing doesn't work. For plenty of others, it very clearly does work. But not me. And that's why I quit the best company I've ever worked for: Pivotal Labs. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-1660901924314214778?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/1660901924314214778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=1660901924314214778' title='40 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/1660901924314214778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/1660901924314214778'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2009/11/why-i-dont-like-pair-programming-and.html' title='Why I Don&apos;t Like Pair Programming (and Why I Left Pivotal)'/><author><name>Mark Wilden</name><uri>http://www.blogger.com/profile/07153901140004937121</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://2.bp.blogspot.com/_yxWAn7EZVVw/SZCRYVuSluI/AAAAAAAAABE/lAITHBIT3p8/S220/mark+looking+up.jpg'/></author><thr:total>40</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-3332852168694255339</id><published>2009-07-03T14:57:00.000-07:00</published><updated>2009-07-03T15:22:18.062-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='orson welles'/><category scheme='http://www.blogger.com/atom/ns#' term='literature'/><category scheme='http://www.blogger.com/atom/ns#' term='feminism'/><title type='text'>Jane Eyre and feminism</title><content type='html'>I read &lt;i&gt;Jane Eyre&lt;/i&gt; recently. This was necessary because I'm reading Simon Callow's excellent biography of Orson Welles, and I'd got to the part where Welles appears in that movie. I had to see the movie before reading that section of the biography, and I had to read the book before seeing the movie. So it fit in well with my desire to enjoy some of these famous works as I get on in years. Call it a literary bucket list.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For most of the book, I found myself laughing at Jane and the rest of the characters. It's hard for me to imagine real people speaking and thinking in this way. I'd love to hear how they talk after the collective stick had been removed from their asses.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But at some point, I simply accepted the style, and I enjoyed the book far more. The plot was just as ridiculous, however. Mr Rochester goes from talking about marrying Blanche and sending Jane away to clasping her in his arms in the space of a paragraph or two. I never did understand the reason for or in fact any evidence of a transition in his intent. One sentence Blanche - next sentence Jane. We were all expecting it, of course, but it certainly made no sense.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then there's the amazing coincidence of the house Jane stumbles upon, which just so happens to contain her nearest relatives. She's apparently half-dead by this time from exposure and hunger, but as near as I can tell, she was only away from a soft bed and a hot meal for about three days. Not very stern stuff, one feels.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But the reason I wanted to make this blog post was to react to the statement in the (modern) introduction that &lt;i&gt;Jane Eyre &lt;/i&gt;is "one of the most intensely erotic books in the English language." First, it's good of the writer to concede that there are eroticer books in other languages (too bad she doesn't mention what they are, or I would by all means start a course of study in those languages). Second, what the fuck? It is impossible to imagine Jane even possessing a clitoris, much less any kind of erotic feeling.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The writer of the introduction is from feminist school of the 1980's. I am all for feminist schools. I consider myself a feminist and have done since the age of 12. I am so feminist, in fact, that I know that I'm sexist. But besides being erotic, this novel is, according to the writer of the introduction, a triumph of feminism and female power. How can it be, when all Jane does is serve and obey? True, she twice obeys her God over her male masters, but this is hardly empowerment. Throughout the book, Jane is either a slave or trying to become a slave.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I still enjoyed the book. The character was foreign enough to make her interesting. And I did read on, wondering what would happen next. As for the movie, it was fun to see Orson Welles play Mr Rochester. He certainly played the part in my imagination as I was reading the book.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And now I've moved on past that part in Callow's biography of Welles. Tonight I watch &lt;i&gt;The Lady from Shanghai&lt;/i&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-3332852168694255339?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/3332852168694255339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=3332852168694255339' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/3332852168694255339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/3332852168694255339'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2009/07/jane-eyre-and-feminism.html' title='Jane Eyre and feminism'/><author><name>Mark Wilden</name><uri>http://www.blogger.com/profile/07153901140004937121</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://2.bp.blogspot.com/_yxWAn7EZVVw/SZCRYVuSluI/AAAAAAAAABE/lAITHBIT3p8/S220/mark+looking+up.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-4146258115194560643</id><published>2009-06-27T18:36:00.000-07:00</published><updated>2009-06-27T18:55:58.867-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='prince of persia'/><title type='text'>It's hard to make a game easy</title><content type='html'>I'm just getting to the end of Prince of Persia. It's considered by gamers to be an easy game - too easy, some say. For me, it's just hard enough to make it rewarding but not so hard as to be frustrating.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The first computer game I ever played was Zork. Now there was a frustrating game. I spent literally hours getting nowhere, simply because I didn't use the right combination of words to get something to happen. That, of course, was the challenge of the game. It was a difficult puzzle to solve. It wasn't particularly fair, either. Logic took a back seat to obscurity sometimes. On the other hand, finding one of those obscure combinations of words was tremendously satisfying.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another way games like this can be hard is to not permit escape from prior bad choices. You didn't pick up that item in the room you were in three weeks ago (in real time)? Too bad - now you're stuck. You have to go back to that point (if you even have a saved game from then) and do it all over. This is not fun by anyone's definition.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But both kinds of game design are easy for the designer. It's actually quite easy to make a game hard. What's hard is to make it easy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Which is where Prince of Persia comes in. I don't have a lot of time for gaming. I spend perhaps an hour a day, and a few more on weekends. If I choose to stick out a game to the end, it's because it consistently gives me more fun than doing something else. Prince of Persia does that by having puzzles that are just hard enough to make me think (a little bit, at least), but allowing me the freedom to swing across vines without worrying about painting myself in a corner.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Of course, the game is famous for "not being able to die." If you fall off a ledge or get beaten in combat, your companion Elika saves you and you start again from a checkpoint that's usually not too far before the point when you died. Some would say that this isn't challenging enough - that there's not enough "penalty" for doing something wrong. Good! I don't play games to inflict pain on myself, and I don't like having to repeat a sequence of events over and over until I get it right. (This does happen in Prince of Persia, but it's nothing like one situation I was in in Halo 3, where I would spend at least a minute gathering weapons, spend another couple of minutes killing Brutes, die, lather, rinse, and repeat.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But easy resurrection is just a part of it. Much harder, it seems to me, is the ability Prince of Persia gives you to follow paths wherever and whenever you want, without fear of being unable to get back to where you are. Although the game is essential a platformer, with narrowly-defined places you can go, there are usually at least two ways to get to every important place.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And doing this without making it obvious takes design skill. I suppose one could win the game merely by trying every path in every combination. But it doesn't seem that way. I really feel like I'm exploring, not just following a script.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-4146258115194560643?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/4146258115194560643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=4146258115194560643' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/4146258115194560643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/4146258115194560643'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2009/06/its-hard-to-make-game-easy.html' title='It&apos;s hard to make a game easy'/><author><name>Mark Wilden</name><uri>http://www.blogger.com/profile/07153901140004937121</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://2.bp.blogspot.com/_yxWAn7EZVVw/SZCRYVuSluI/AAAAAAAAABE/lAITHBIT3p8/S220/mark+looking+up.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-7520173049788066872</id><published>2009-06-22T15:37:00.000-07:00</published><updated>2009-06-22T15:55:46.154-07:00</updated><title type='text'>Assertion as argument</title><content type='html'>I saw a thread today in which someone asked whether they should add NilClass#to_s to return an empty string instead of raising an exception.&lt;br /&gt;&lt;br /&gt;A well-respected member of the Rails community answered by talking about concatenating strings with +. He said&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt; First off, don't do that. String#+ is generally the worst thing you can choose. Second [...]&lt;/blockquote&gt;&lt;br /&gt;I had to wonder whether that member would accept a statement like that himself. Don't we programmers tend to examine assumptions and reject arguments from authority?&lt;br /&gt;&lt;br /&gt;What he could have said is "String#+ creates a new string by concatenating its argument, so if you're doing it thousands of times a second, it can create problems because of memory consumption. In ordinary practice, it makes no difference."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-7520173049788066872?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/7520173049788066872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=7520173049788066872' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/7520173049788066872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/7520173049788066872'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2009/06/assertion-as-argument.html' title='Assertion as argument'/><author><name>Mark Wilden</name><uri>http://www.blogger.com/profile/07153901140004937121</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://2.bp.blogspot.com/_yxWAn7EZVVw/SZCRYVuSluI/AAAAAAAAABE/lAITHBIT3p8/S220/mark+looking+up.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-7106991655453176942</id><published>2009-06-21T10:33:00.000-07:00</published><updated>2009-06-21T11:03:09.288-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='sierra on-line'/><category scheme='http://www.blogger.com/atom/ns#' term='oop'/><title type='text'>Discovering OOP</title><content type='html'>Before I'd ever really heard of OOP, I was simulating polymorphism by using dispatch tables in structs. I'd define a struct for a listbox, e.g. This would have members for the size of the list, the width, the position on the screen, etc. There would also be a linked list of the items to display. I'd pass these structs around to functions that operated on them. I believe this was called module-based programming. The data was encapsulated in that only certain functions in a certain source file (or module) were allowed to operate on it. So far, so basic.&lt;br /&gt;&lt;br /&gt;But sometimes, I'd want to have different functionality on a single listbox (or on a group of similar listboxes). For example, when the user selected an item, maybe I'd want to display information about that item somewhere else. So I'd define a function that was called by the main listbox code when an item was selected. But this function didn't belong with in the main listbox module, since it might be particular to only one application or even only to one screen. So I added a function pointer to the struct. The main listbox code would call that function if the pointer was nonnull. Different listbox clients could define their own functions to get the behavior they needed, without cluttering up the main listbox module.&lt;br /&gt;&lt;br /&gt;This is essentially polymorphism - using indirection to select a function to execute at runtime, based on the inherent "nature" of the struct, rather than its incidental contents. Of course, there could be many such function pointers in the listbox struct. Today, we'd recognize this as a dispatch table, implemented in C++ to support virtual functions. But this was 1985, and I'd never heard of C++ or polymorphism. I just knew that I wanted to paramaterize this data structure not only with data, but with behavior. And it worked really well. (This is all obvious to anyone's who's programmed in the last 20 years).&lt;br /&gt;&lt;br /&gt;However, the solution wasn't perfect. I eventually came to want to be able to further refine the behavior. I wanted one listbox to act just like another listbox, but also do something additional when an item was selected. This is where inheritance comes in. I ended up adding another function pointer for these cases, that pointed to the original function, and that I could call from the new function. The new function could call the old function before, during or after the new code, or could even completely ignore the old function altogether.&lt;br /&gt;&lt;br /&gt;However, this solution never seemed as clean as the first solution of using dispatch tables for polymorphism. It was too obviously hacky having to maintain these chains of function pointers, and too easy to screw up and create bugs.&lt;br /&gt;&lt;br /&gt;So imagine my delight when, soon after, I got a job with Sierra On-Line, then (1989) the most prominent adventure game company. They had actually created their own language, SCI, that was a very pure implementation of OOP. I'll never forget that first night reading the documentation on my bed and just being consumed with this language that did things I wanted to do and even things I didn't know I wanted it to do.&lt;br /&gt;&lt;br /&gt;Ever since then, I've run into lots of people who talked about the difficulties of making the paradigm shift to OOP. But not me. It was love at first sight.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-7106991655453176942?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/7106991655453176942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=7106991655453176942' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/7106991655453176942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/7106991655453176942'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2009/06/discovering-oop.html' title='Discovering OOP'/><author><name>Mark Wilden</name><uri>http://www.blogger.com/profile/07153901140004937121</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://2.bp.blogspot.com/_yxWAn7EZVVw/SZCRYVuSluI/AAAAAAAAABE/lAITHBIT3p8/S220/mark+looking+up.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-5256199642970745646</id><published>2009-05-04T16:32:00.000-07:00</published><updated>2009-05-04T17:24:05.749-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Listing the contents of your git stash</title><content type='html'>I had a feeling there was something in my git stash that I'd forgotten to apply. But I couldn't figure out a simple way to list the contents of each of the stashes.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;git stash list -p&lt;/code&gt; should work, I think, but it just lists one line for each stash, not the diff with the parent.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;git stash show stash@{0}&lt;/code&gt; shows the contents of one stash, but I don't want to have to do that for each one in the list.&lt;br /&gt;&lt;br /&gt;My coworker at Rupture, Rick Fletcher, came up with this, which works a treat:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;git show $(git stash list | cut -d":" -f 1)&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-5256199642970745646?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/5256199642970745646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=5256199642970745646' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/5256199642970745646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/5256199642970745646'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2009/05/listing-contents-of-your-git-stash.html' title='Listing the contents of your git stash'/><author><name>Mark Wilden</name><uri>http://www.blogger.com/profile/07153901140004937121</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://2.bp.blogspot.com/_yxWAn7EZVVw/SZCRYVuSluI/AAAAAAAAABE/lAITHBIT3p8/S220/mark+looking+up.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-7002515389432270889</id><published>2009-04-22T16:53:00.001-07:00</published><updated>2010-08-08T11:03:59.087-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='tinytext'/><title type='text'>Rails MySQL adapter and tinytext</title><content type='html'>Ruby on Rails's MySQL adapter doesn't grok the tinytext datatype. The following code will use that type when a text field with limit 255 is defined in schema.rb (which is what the adapter generates when it sees a tinytext in the database).&lt;br /&gt;&lt;pre style="overflow: auto"&gt;&lt;code&gt;class ActiveRecord::ConnectionAdapters::MysqlAdapter&lt;br /&gt;  original_type_to_sql = self.instance_method(:type_to_sql)&lt;br /&gt;  define_method(:type_to_sql) do |*args|&lt;br /&gt;    return 'tinytext' if args.first == :text &amp;&amp; args.second == 255&lt;br /&gt;    original_type_to_sql.bind(self).call(*args)&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Put this code in &lt;code&gt;config/initializers/mysql_extensions.rb&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-7002515389432270889?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/7002515389432270889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=7002515389432270889' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/7002515389432270889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/7002515389432270889'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2009/04/rails-mysql-adapter-and-tinytext.html' title='Rails MySQL adapter and tinytext'/><author><name>Mark Wilden</name><uri>http://www.blogger.com/profile/07153901140004937121</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://2.bp.blogspot.com/_yxWAn7EZVVw/SZCRYVuSluI/AAAAAAAAABE/lAITHBIT3p8/S220/mark+looking+up.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-4685261859875081416</id><published>2008-12-14T17:56:00.001-08:00</published><updated>2008-12-14T18:02:21.667-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='os x'/><category scheme='http://www.blogger.com/atom/ns#' term='gem'/><title type='text'>Going back to OS X</title><content type='html'>I recently discovered that the ruby on my Mac was outdated. I had installed it from macports and never updated it.&lt;br /&gt;&lt;br /&gt;It seems to me that if OS X comes with ruby, it should also take care of updating it when necessary, automatically, the same as it does with other software. So I nuked the macports version.&lt;br /&gt;&lt;br /&gt;I also nuked all my ruby gems, which were installed somewhere under /opt/local. I've been gradually reinstalling them to /usr/local, where the gods of Unix intended them. I had trouble installing the mysql gem, however, and the various blog posts I'd seen about this related to macports.&lt;br /&gt;&lt;br /&gt;The following command installed the gem:&lt;p/&gt; &lt;code&gt;sudo env ARCHFLAGS="-arch i386" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-4685261859875081416?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/4685261859875081416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=4685261859875081416' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/4685261859875081416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/4685261859875081416'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2008/12/going-back-to-os-x.html' title='Going back to OS X'/><author><name>Mark Wilden</name><uri>http://www.blogger.com/profile/07153901140004937121</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://2.bp.blogspot.com/_yxWAn7EZVVw/SZCRYVuSluI/AAAAAAAAABE/lAITHBIT3p8/S220/mark+looking+up.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-3898314063104904001</id><published>2008-11-22T16:03:00.000-08:00</published><updated>2008-11-22T16:15:25.218-08:00</updated><title type='text'>QuitTime</title><content type='html'>More for the vast historical significance than anything else, I hereby announce the start of a new project. QuitTime is a "quitmeter" that helps you quit smoking by showing you how many cigarettes you haven't smoked, how much money you've saved, and (theoretically, at least) how much longer you'll live as a result.&lt;br /&gt;&lt;br /&gt;I wrote the Windows desktop version of QuitTime in 1997. It's still getting downloaded, over ten years later (&lt;a href="http://mwilden.com/QuitTime"&gt;mwilden.com/QuitTime&lt;/a&gt;). I'll say one thing for Windows, it does at least try to maintain backwards compatibility.&lt;br /&gt;&lt;br /&gt;This version of QuitTime will be a Ruby on Rails web app. It's hard to imagine a simpler application. You tell it when you quit smoking (and a few other things) and it tells you how great you are.&lt;br /&gt;&lt;br /&gt;For example, I quit a 3 1/2 pack a day habit (yes, really) in 2000. As of 2003, I'd not smoked 84,000 cigarettes and saved $15,000. I'd love to see those numbers as of 2008, but I'm on a Mac now.&lt;br /&gt;&lt;br /&gt;Hence the plan to whip out a quick little application that will let me have some Rails fun, show me how great I am, and maybe help other people quit smoking, too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-3898314063104904001?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/3898314063104904001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=3898314063104904001' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/3898314063104904001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/3898314063104904001'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2008/11/quittime.html' title='QuitTime'/><author><name>Mark Wilden</name><uri>http://www.blogger.com/profile/07153901140004937121</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://2.bp.blogspot.com/_yxWAn7EZVVw/SZCRYVuSluI/AAAAAAAAABE/lAITHBIT3p8/S220/mark+looking+up.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-4689674601075881871</id><published>2008-11-22T15:59:00.000-08:00</published><updated>2008-11-22T16:03:23.221-08:00</updated><title type='text'>Why do people...?</title><content type='html'>Why do people post blog comments like "I'm going to try this out right away," or "I haven't used this yet, but it looks great!"&lt;br /&gt;&lt;br /&gt;Why do they think anyone in hell cares what their personal plans and intentions are? Or is it just because they want to say something - &lt;span style="font-style:italic;"&gt;anything&lt;/span&gt; - and that's all they got?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-4689674601075881871?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/4689674601075881871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=4689674601075881871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/4689674601075881871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/4689674601075881871'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2008/11/why-do-people.html' title='Why do people...?'/><author><name>Mark Wilden</name><uri>http://www.blogger.com/profile/07153901140004937121</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://2.bp.blogspot.com/_yxWAn7EZVVw/SZCRYVuSluI/AAAAAAAAABE/lAITHBIT3p8/S220/mark+looking+up.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-4523298374905310387</id><published>2008-11-14T21:30:00.000-08:00</published><updated>2008-11-14T21:39:00.567-08:00</updated><title type='text'>Appetite for Life, a biography of Julia Child</title><content type='html'>&lt;i&gt;Appetite for Life&lt;/i&gt; isn't terrible terrible, nor completely amateurish, self-indulgent, and scatter-brained, but it comes close. A book like this really makes you appreciate good old, everyday, professional writing. On one page, Theodore H. White is "Teddy;" on the next, he's "Theodore White." There must be a thousand people mentioned in the book, many of them including some completely Julia Child-free trivia about who their third cousin was and who he worked for. You've got to hand it to the author, Noel Riley Fitch, she's a good researcher. The trouble is that she doesn't seem very concerned with being interesting. It's like she took notes for five years then dumped it all down into the book. She loves using square brackets in quotations.&lt;br /&gt;&lt;br /&gt;I know this isn't a very good review. But I just had to say something.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-4523298374905310387?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/4523298374905310387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=4523298374905310387' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/4523298374905310387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/4523298374905310387'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2008/11/appetite-for-life-biography-of-julia.html' title='Appetite for Life, a biography of Julia Child'/><author><name>Mark Wilden</name><uri>http://www.blogger.com/profile/07153901140004937121</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://2.bp.blogspot.com/_yxWAn7EZVVw/SZCRYVuSluI/AAAAAAAAABE/lAITHBIT3p8/S220/mark+looking+up.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-8727662006249383157</id><published>2008-10-07T12:17:00.000-07:00</published><updated>2008-12-14T18:09:12.905-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogs'/><title type='text'>Undescribed code projects</title><content type='html'>I'll never understand why some folks announce the newest release of their great software project - without once mentioning what it actually does. See &lt;a href="//http://continuousthinking.com/tags/arext"&gt;http://continuousthinking.com/tags/arext&lt;/a&gt; for an example. I'll bet ar-extensions is a great tool, but I just don't feel like digging around to simply find out whether it does anything useful for me.&lt;br /&gt;&lt;br /&gt;On the same note, why are there so many blogs that 1) Don't say who the author is, or 2) Don't say when the post was written, or 3) Both?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-8727662006249383157?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/8727662006249383157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=8727662006249383157' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/8727662006249383157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/8727662006249383157'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2008/10/undescribed-code-projects.html' title='Undescribed code projects'/><author><name>Mark Wilden</name><uri>http://www.blogger.com/profile/07153901140004937121</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://2.bp.blogspot.com/_yxWAn7EZVVw/SZCRYVuSluI/AAAAAAAAABE/lAITHBIT3p8/S220/mark+looking+up.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-8440566330826948574</id><published>2008-07-24T15:18:00.001-07:00</published><updated>2009-10-05T17:10:03.134-07:00</updated><title type='text'>McCain</title><content type='html'>John McCain wants to be thought of as a Maverick, but he's more like a Pinto.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-8440566330826948574?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/8440566330826948574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=8440566330826948574' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/8440566330826948574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/8440566330826948574'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2008/07/mccain.html' title='McCain'/><author><name>Mark Wilden</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-7835013634837669493</id><published>2008-06-01T10:34:00.000-07:00</published><updated>2009-10-05T17:10:22.042-07:00</updated><title type='text'>Soundtrack Pro: "Could Not Create File" error when exporting</title><content type='html'>I'm using Soundtrack Pro to digitize my collection of reel-to-reel mix tapes from the late '70s and early '80s. I edited each song out onto a different track, then tried to use File|Export to create .aif files and send them to iTunes to convert to MP3s and import into my library.&lt;br /&gt;&lt;br /&gt;When I tried to do that, however, I got an error message "Could Not Create File", with the text "The export file could not be created. This may have occurred because there is insufficient disk space, or there might be a problem with the directory permissions." (The error monologue window had the single, inappropriate button: "OK". Clicking that button was a blatant lie; it was not OK.)&lt;br /&gt;&lt;br /&gt;I had plenty of disk space and the file permissions were correct. I started over from scratch, and after I'd edited a few songs into tracks, I tested by exporting, and it worked. But when I finished editing out all the songs, I got the same error.&lt;br /&gt;&lt;br /&gt;The problem? I had a / character in one of the track names ("Willin'/Don't Bogart That Joint" from a live Little Feat album - I told you this was late '70s-early '80s).&lt;br /&gt;&lt;br /&gt;My Apple Discussions thread on digitizing tapes to MP3s, including this problem, is &lt;a href="http://discussions.apple.com/thread.jspa?messageID=7087866"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-7835013634837669493?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/7835013634837669493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=7835013634837669493' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/7835013634837669493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/7835013634837669493'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2008/06/soundtrack-pro-could-not-create-file.html' title='Soundtrack Pro: &quot;Could Not Create File&quot; error when exporting'/><author><name>Mark Wilden</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-7359386122339849830</id><published>2008-05-11T08:59:00.000-07:00</published><updated>2009-10-05T17:10:38.124-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>Adding an existing Rails project to Vim</title><content type='html'>It was a little unclear to me how to add an existing Rails project to the Vim Project plugin project file using the rails-vim plugin :Rproject command (if there's a less confusing way to state that, I don't know what it is!).&lt;br /&gt;&lt;br /&gt;But it's pretty simple: just open any file in the project first "manually", then enter :Rproject.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-7359386122339849830?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/7359386122339849830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=7359386122339849830' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/7359386122339849830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/7359386122339849830'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2008/05/adding-existing-rails-project-to-vim.html' title='Adding an existing Rails project to Vim'/><author><name>Mark Wilden</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-2119037696636235915</id><published>2008-04-18T17:01:00.000-07:00</published><updated>2008-04-18T17:16:06.474-07:00</updated><title type='text'>Self-labelling debug output</title><content type='html'>I probably should be embarrassed to admit it, but I often debug Rails code by inserting 'p' lines that dump the values of variables, e.g.:&lt;br /&gt;&lt;pre&gt;a_variable = 2&lt;br /&gt;p a_variable&lt;/pre&gt;&lt;br /&gt;That lets me see the value of a_variable in the console when I run the program. Sometimes there are a fair number of these lines, and sometimes it's hard to remember what value goes with what variable in the source. In these cases, I have to resort to&lt;br /&gt;&lt;pre&gt;puts "a_variable = #{a_variable.inspect}"&lt;/pre&gt;&lt;br /&gt;That's not very DRY, and I knew Ruby must have a better way. I finally found it:&lt;br /&gt;&lt;pre&gt;def l &amp;amp;block&lt;br /&gt; name = yield&lt;br /&gt; puts name + ' = ' + eval(name, block.binding).inspect&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;This lets me write&lt;br /&gt;&lt;pre&gt;l{'a_variable'}&lt;/pre&gt;&lt;br /&gt;to get&lt;br /&gt;&lt;pre&gt;a_variable = 2&lt;/pre&gt;&lt;br /&gt;Pretty small potatoes to experienced metaprogrammers out there, but I was pleased with myself. :)&lt;br /&gt;///ark&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-2119037696636235915?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/2119037696636235915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=2119037696636235915' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/2119037696636235915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/2119037696636235915'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2008/04/self-labelling-debug-output.html' title='Self-labelling debug output'/><author><name>Mark Wilden</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-3274431910012227599</id><published>2008-03-24T10:41:00.000-07:00</published><updated>2008-12-14T20:16:08.987-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='svn:ignore'/><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>When svn:ignore doesn't</title><content type='html'>Ever since I started using Subversion, I've had trouble ignoring directories. Sometimes it works; other times it drives me mad.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In this particular case, I'm working with a Rails app, and I want to ignore the &lt;b&gt;tmp&lt;/b&gt; folder and everything in it. So naturally, I do &lt;b&gt;svn propedit svn:ignore . &lt;/b&gt;in the main directory, and edit the text file to include the line &lt;b&gt;tmp&lt;/b&gt;. But sure as shootin', an &lt;b&gt;svn status &lt;/b&gt;still shows ?'s for &lt;b&gt;tmp/pids&lt;/b&gt;, etc. I can &lt;b&gt;svn update&lt;/b&gt; and &lt;b&gt;svn commit &lt;/b&gt;until I'm blue in the face, but those suckers just won't go away.&lt;br /&gt;&lt;br /&gt;Some googling led me to the suspicion that perhaps &lt;b&gt;tmp&lt;/b&gt; was already under version control (maybe it was accidentally added when it was empty). Ignores have no effect on already versioned files/directories. So I did &lt;b&gt;svn rm tmp&lt;/b&gt; immediately followed by &lt;b&gt;svn revert tmp&lt;/b&gt;, and all of a sudden, the ignore took effect.&lt;br /&gt;&lt;br /&gt;There's a touch of cargo-culting in this solution (why didn't reverting put everything back to the old, undesirable state?) but I'm OK with that.&lt;br /&gt;&lt;br /&gt;///ark&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-3274431910012227599?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/3274431910012227599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=3274431910012227599' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/3274431910012227599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/3274431910012227599'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2008/03/when-svnignore-doesnt.html' title='When svn:ignore doesn&apos;t'/><author><name>Mark Wilden</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-4852158523170510743</id><published>2008-03-20T16:03:00.000-07:00</published><updated>2008-12-14T20:17:23.624-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='iMovie'/><category scheme='http://www.blogger.com/atom/ns#' term='time capsule'/><category scheme='http://www.blogger.com/atom/ns#' term='import'/><title type='text'>Importing video into iMovie to external disk</title><content type='html'>In iMovie, you can't import video from your camera and save it to a Time Capsule. This is because Time Capsule is a shared disk. The Time Capsule simply won't appear in the "Save to:" dropdown.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Neither can you import to an NTFS-formatted disk (such as one you were using with Windows).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Since my internal MacBook Pro disk didn't have enough room, and because my external hard disk was NTFS, I was hoping to import video to my new Time Capsule. So I copied the 223GB that was on the external disk to Time Capsule, then reformatted the external.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To reformat the disk, I ran Disk Utility (in Applications/Utilities) and chose to "erase" the disk with the volume format "Mac OS (extended)". As explained &lt;a href="http://www.lafcpug.org/features_file_journaling.html"&gt;here&lt;/a&gt;, journaling is not necessary for media disks, and will make their operation slower.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-4852158523170510743?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/4852158523170510743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=4852158523170510743' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/4852158523170510743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/4852158523170510743'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2008/03/importing-video-into-imovie-to-external.html' title='Importing video into iMovie to external disk'/><author><name>Mark Wilden</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-732321636201186054</id><published>2008-03-15T11:14:00.000-07:00</published><updated>2008-12-14T20:15:13.268-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vi'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='textmate'/><category scheme='http://www.blogger.com/atom/ns#' term='macvim'/><title type='text'>TextMate is the worst program that people love that I've ever used</title><content type='html'>&lt;p&gt;I really gave TextMate a good try. In fact, one of the main reasons I moved from Windows to the Mac was because I'd heard that TextMate was so great for Rails programming. Here's why I disagree:&lt;/p&gt;&lt;ol&gt; &lt;li&gt;You can't split a window, so you can't look at two files (like a model and its unit test) at the same time.&lt;/li&gt;&lt;br /&gt; &lt;li&gt;You can't bop back and forth between the current tab and the last one you were on with a keystroke.&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Undo is at the character level, which makes using it an exercise in frustration as you hold down Cmd-Z forever, overshoot the change you wanted to undo, then hold down Shift-Ctrl-Z until you overshoot in the other direction, etc.&lt;/li&gt;&lt;br /&gt; &lt;li&gt;The project drawer is good, but a bug prevents you from removing items from it (you have to set up a regex filter).&lt;/li&gt;&lt;br /&gt; &lt;li&gt;You can't search a subset of a project's files.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;These are some of the reasons I've gone back to vi - specifically MacVim. I'll keep posting as I think of more bad things with TextMate, because it satisifies me to do so for some reason.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;There are good things about TextMate:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Cmd-T. I thought ReSharper in Visual Studio made it easy to open files, but Cmd-T is utterly awesome.&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Moving text directly, without cutting and pasting. At first I thought this was just Mac-ish eye candy, but it really is a good, intuitive feature.&lt;/li&gt;&lt;/ol&gt;///ark&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-732321636201186054?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/732321636201186054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=732321636201186054' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/732321636201186054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/732321636201186054'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2008/03/textmate-is-worst-program-that-people.html' title='TextMate is the worst program that people love that I&apos;ve ever used'/><author><name>Mark Wilden</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-978463554744601802</id><published>2008-01-14T16:59:00.001-08:00</published><updated>2008-01-14T17:01:15.518-08:00</updated><title type='text'>Mission accomplished</title><content type='html'>After two years of looking for my first Ruby on Rails job, I finally got one today. I'm joining &lt;a href="http://www.blogger.com/www.twistage.com"&gt;Twistage&lt;/a&gt;, a very small startup that sort of lets you do your own YouTube.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-978463554744601802?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/978463554744601802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=978463554744601802' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/978463554744601802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/978463554744601802'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2008/01/mission-accomplished.html' title='Mission accomplished'/><author><name>Mark Wilden</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-5896193708974436720</id><published>2008-01-01T19:36:00.000-08:00</published><updated>2008-01-01T19:42:18.790-08:00</updated><title type='text'>Zed</title><content type='html'>&lt;a title="Rails is a ghetto" href="http://www.zedshaw.com/rants/rails_is_a_ghetto.html" target="_blank"&gt;http://www.zedshaw.com/rants/rails_is_a_ghetto.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The predominant impression I had from Zed Shaw's rant was: What a loser. Of course, I'd never tell him that to his face, because he'd hit me. He's very concerned that people know this.&lt;br /&gt;&lt;br /&gt;How many programmers are ever homeless? We make a jillion bucks!&lt;br /&gt;&lt;br /&gt;Did I miss it, or did he actually say anything about Ruby on Rails? Seems to me it was all about the people he had it in for. The 400 restarts/day is ancient history.&lt;br /&gt;&lt;br /&gt;I can't wait to read how Pickaxe killed Ruby.&lt;br /&gt;&lt;br /&gt;Fun to read his opinion of some Thoughtworks programmers. Problem is, he thinks he's talking about the whole company.&lt;br /&gt;&lt;br /&gt;///ark&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-5896193708974436720?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/5896193708974436720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=5896193708974436720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/5896193708974436720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/5896193708974436720'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2008/01/zed.html' title='Zed'/><author><name>Mark Wilden</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-1786799442304712388</id><published>2007-12-04T17:26:00.000-08:00</published><updated>2008-12-14T20:15:33.558-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='helper'/><category scheme='http://www.blogger.com/atom/ns#' term='cache'/><title type='text'>Does Rails cache helpers?</title><content type='html'>I'm testing a helper using Watir and it appears that Rails is caching the helper such that it's necessary to restart Mongrel to get Rails to take note of any changes to the helper. Leastways, that's the way it looks to me.&lt;br /&gt;&lt;br /&gt;///ark&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-1786799442304712388?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/1786799442304712388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=1786799442304712388' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/1786799442304712388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/1786799442304712388'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2007/12/does-rails-cache-helpers.html' title='Does Rails cache helpers?'/><author><name>Mark Wilden</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3082589280007776602.post-4972976905743680650</id><published>2007-12-04T08:23:00.000-08:00</published><updated>2007-12-04T08:27:38.110-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='aptana'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>"Please select an open Rails project in the rails navigator"</title><content type='html'>After selecting another project in Rails Navigator, then Go Into it, I got the error message "Please select an open Rails project in the rails navigator" when I tried to Run All Tests. The project clearly had the Rails nature, so the results I googled weren't applicable.&lt;br /&gt;&lt;br /&gt;The solution was to open a test file and run it (Ctrl-X, U). Then Run All Tests worked.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3082589280007776602-4972976905743680650?l=mwilden.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mwilden.blogspot.com/feeds/4972976905743680650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3082589280007776602&amp;postID=4972976905743680650' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/4972976905743680650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3082589280007776602/posts/default/4972976905743680650'/><link rel='alternate' type='text/html' href='http://mwilden.blogspot.com/2007/12/please-select-open-rails-project-in.html' title='&quot;Please select an open Rails project in the rails navigator&quot;'/><author><name>Mark Wilden</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
